From 794968f7a457b866318e8abf767dcfd1c88ec8cf Mon Sep 17 00:00:00 2001 From: glasstiger Date: Wed, 30 Sep 2026 13:15:11 +0100 Subject: [PATCH 1/3] feat(qwp): authenticate third-party browser apps with a subprotocol credential A browser cannot set Authorization on a WebSocket upgrade, and QuestDB ignores cookies on a cross-origin QWP upgrade, so a web application served from another origin had no way to authenticate. QuestDB now accepts a credential in the upgrade's subprotocol offer from origins listed in qwp.browser.allowed.origins (questdb/questdb#7683, questdb/questdb-enterprise#1246). The new `auth` option on QwpBrowserWebSocketOptions and QwpBrowserClusterOptions takes a fixed credential, or a function the client calls before every connect, reconnect, and failover attempt. The function form lets a long-lived session pick up a refreshed OIDC access token rather than reconnect with an expired one. `auth` cannot be combined with sessionBootstrap. The credential travels as questdb.qwp.authorization., the unpadded base64url encoding of its Authorization value: `+`, `/`, and `=` are not token characters, so the padded base64 used for Basic cannot be offered. It is paired with the dialect QuestDB selects -- durable ACK when requested, questdb.qwp.v1 otherwise -- because QuestDB refuses a credential offered without one. The query path now builds its offer the same way instead of passing protocols through. Without `auth` the offer is unchanged: a browser fails a handshake whose response selects none of its offers, so adding questdb.qwp.v1 would break older servers. A server that selects the credential has echoed the secret in its 101 response. QuestDB never does, so the client treats it as a server defect and fails the connection without retrying or walking the endpoint list. --- QWP.md | 67 +- README.md | 21 + docs/assets/hierarchy.js | 2 +- docs/assets/highlight.css | 7 + docs/assets/navigation.js | 2 +- docs/assets/search.js | 2 +- ..._browser-client.QwpBatchTooLargeError.html | 4 +- ..._questdb_browser-client.QwpBindValues.html | 12 +- ...lient.QwpBrowserSessionBootstrapError.html | 10 +- ..._questdb_browser-client.QwpByteReader.html | 4 +- ..._questdb_browser-client.QwpByteWriter.html | 4 +- .../_questdb_browser-client.QwpClient.html | 12 +- ...b_browser-client.QwpClientClosedError.html | 4 +- ...-client.QwpDurableAckUnavailableError.html | 10 +- ...questdb_browser-client.QwpEgressQuery.html | 32 +- ...r-client.QwpEgressQueryAbandonedError.html | 4 +- ...ient.QwpEgressQueryCancelTimeoutError.html | 4 +- ...db_browser-client.QwpEgressQueryError.html | 4 +- ...ser-client.QwpEgressQueryTimeoutError.html | 4 +- ...r-client.QwpEgressReplayRequiredError.html | 4 +- ...estdb_browser-client.QwpEgressSession.html | 22 +- ...er-client.QwpEgressSessionClosedError.html | 4 +- ...estdb_browser-client.QwpFailoverError.html | 4 +- ...er-client.QwpIngressAckAbandonedError.html | 4 +- ...wser-client.QwpIngressAckTimeoutError.html | 4 +- ...db_browser-client.QwpIngressNackError.html | 4 +- ...stdb_browser-client.QwpIngressSession.html | 32 +- ...r-client.QwpIngressSessionClosedError.html | 4 +- ...ent.QwpMemoryReplayAppendTimeoutError.html | 4 +- ...ent.QwpMemoryReplayBatchTooLargeError.html | 4 +- ...ent.QwpMemoryReplayFrameTooLargeError.html | 4 +- ...ser-client.QwpPoolAcquireTimeoutError.html | 4 +- ...b_browser-client.QwpPoolResourceError.html | 4 +- ...estdb_browser-client.QwpProtocolError.html | 4 +- ..._questdb_browser-client.QwpQueryLease.html | 8 +- ...ser-client.QwpReconnectExhaustedError.html | 4 +- ...owser-client.QwpReplayDictionaryError.html | 4 +- ...t.QwpReplayDictionaryPersistenceError.html | 4 +- ...browser-client.QwpReplayRejectedError.html | 4 +- ...questdb_browser-client.QwpResultBatch.html | 4 +- ..._browser-client.QwpResultBatchDecoder.html | 10 +- ...tdb_browser-client.QwpResultBatchView.html | 10 +- ...db_browser-client.QwpResultColumnView.html | 24 +- ...estdb_browser-client.QwpResultRowView.html | 16 +- ...b_browser-client.QwpRoleMismatchError.html | 10 +- ...tdb_browser-client.QwpSendClosedError.html | 4 +- .../_questdb_browser-client.QwpSendError.html | 4 +- ...db_browser-client.QwpSendTimeoutError.html | 4 +- .../_questdb_browser-client.QwpSender.html | 32 +- ...ser-client.QwpSenderCloseTimeoutError.html | 4 +- ...db_browser-client.QwpSymbolDictionary.html | 8 +- ...questdb_browser-client.QwpTableBuffer.html | 12 +- ...questdb_browser-client.QwpTableWriter.html | 10 +- ...QwpUnrecoverableReplayDictionaryError.html | 4 +- ...uestdb_browser-client.QwpUpgradeError.html | 10 +- ...stdb_browser-client.QwpWriterRowError.html | 4 +- .../_questdb_nodejs-client.HttpTransport.html | 12 +- ...b_nodejs-client.QwpBatchTooLargeError.html | 4 +- .../_questdb_nodejs-client.QwpBindValues.html | 12 +- .../_questdb_nodejs-client.QwpByteReader.html | 4 +- .../_questdb_nodejs-client.QwpByteWriter.html | 4 +- .../_questdb_nodejs-client.QwpClient.html | 12 +- ...db_nodejs-client.QwpClientClosedError.html | 4 +- ...-client.QwpDurableAckUnavailableError.html | 10 +- ..._questdb_nodejs-client.QwpEgressQuery.html | 32 +- ...s-client.QwpEgressQueryAbandonedError.html | 4 +- ...ient.QwpEgressQueryCancelTimeoutError.html | 4 +- ...tdb_nodejs-client.QwpEgressQueryError.html | 4 +- ...ejs-client.QwpEgressQueryTimeoutError.html | 4 +- ...s-client.QwpEgressReplayRequiredError.html | 4 +- ...uestdb_nodejs-client.QwpEgressSession.html | 22 +- ...js-client.QwpEgressSessionClosedError.html | 4 +- ...uestdb_nodejs-client.QwpFailoverError.html | 4 +- ...js-client.QwpIngressAckAbandonedError.html | 4 +- ...dejs-client.QwpIngressAckTimeoutError.html | 4 +- ...tdb_nodejs-client.QwpIngressNackError.html | 4 +- ...estdb_nodejs-client.QwpIngressSession.html | 32 +- ...s-client.QwpIngressSessionClosedError.html | 4 +- ...ent.QwpMemoryReplayAppendTimeoutError.html | 4 +- ...ent.QwpMemoryReplayBatchTooLargeError.html | 4 +- ...ent.QwpMemoryReplayFrameTooLargeError.html | 4 +- ..._nodejs-client.QwpNodeFileReplayStore.html | 18 +- ...db_nodejs-client.QwpNodeOrphanDrainer.html | 8 +- ...estdb_nodejs-client.QwpNodeUdpSession.html | 4 +- ...ejs-client.QwpPoolAcquireTimeoutError.html | 4 +- ...db_nodejs-client.QwpPoolResourceError.html | 4 +- ...uestdb_nodejs-client.QwpProtocolError.html | 4 +- .../_questdb_nodejs-client.QwpQueryLease.html | 8 +- ...ejs-client.QwpReconnectExhaustedError.html | 4 +- ...odejs-client.QwpReplayDictionaryError.html | 4 +- ...t.QwpReplayDictionaryPersistenceError.html | 4 +- ..._nodejs-client.QwpReplayRejectedError.html | 4 +- ...ient.QwpReplayStoreAppendTimeoutError.html | 6 +- ...ient.QwpReplayStoreBatchTooLargeError.html | 6 +- ...-client.QwpReplayStoreCheckpointError.html | 6 +- ...-client.QwpReplayStoreCorruptionError.html | 6 +- ...tdb_nodejs-client.QwpReplayStoreError.html | 6 +- ...nodejs-client.QwpReplayStoreFullError.html | 6 +- ...js-client.QwpReplayStoreLockLostError.html | 6 +- ...ent.QwpReplayStoreLockUnprovableError.html | 6 +- ...dejs-client.QwpReplayStoreLockedError.html | 6 +- ...client.QwpReplayStoreQuarantinedError.html | 6 +- ...nt.QwpReplayStoreSegmentTooLargeError.html | 6 +- ..._questdb_nodejs-client.QwpResultBatch.html | 4 +- ...b_nodejs-client.QwpResultBatchDecoder.html | 10 +- ...stdb_nodejs-client.QwpResultBatchView.html | 10 +- ...tdb_nodejs-client.QwpResultColumnView.html | 24 +- ...uestdb_nodejs-client.QwpResultRowView.html | 16 +- ...db_nodejs-client.QwpRoleMismatchError.html | 10 +- ...stdb_nodejs-client.QwpSendClosedError.html | 4 +- .../_questdb_nodejs-client.QwpSendError.html | 4 +- ...tdb_nodejs-client.QwpSendTimeoutError.html | 4 +- .../_questdb_nodejs-client.QwpSender.html | 32 +- ...ejs-client.QwpSenderCloseTimeoutError.html | 4 +- ...tdb_nodejs-client.QwpSymbolDictionary.html | 8 +- ..._questdb_nodejs-client.QwpTableBuffer.html | 12 +- ..._questdb_nodejs-client.QwpTableWriter.html | 8 +- ...js-client.QwpUdpDatagramTooLargeError.html | 4 +- ...QwpUnrecoverableReplayDictionaryError.html | 4 +- ...questdb_nodejs-client.QwpUpgradeError.html | 10 +- ...nodejs-client.QwpVersionMismatchError.html | 10 +- ...estdb_nodejs-client.QwpWriterRowError.html | 4 +- .../_questdb_nodejs-client.Sender.html | 61 +- ..._questdb_nodejs-client.SenderBufferV1.html | 49 +- ..._questdb_nodejs-client.SenderBufferV2.html | 49 +- ..._questdb_nodejs-client.SenderBufferV3.html | 49 +- .../_questdb_nodejs-client.SenderOptions.html | 10 +- .../_questdb_nodejs-client.TcpTransport.html | 12 +- ...questdb_nodejs-client.UndiciTransport.html | 12 +- ...ent.addQwpDurableAckWebSocketProtocol.html | 2 +- .../_questdb_browser-client.binary.html | 2 +- .../_questdb_browser-client.bool.html | 2 +- ...ser-client.bootstrapQwpBrowserSession.html | 2 +- .../_questdb_browser-client.byte.html | 2 +- .../_questdb_browser-client.char.html | 2 +- .../_questdb_browser-client.concatBytes.html | 2 +- ...rowser-client.connectQwpBrowserClient.html | 2 +- ...rowser-client.connectQwpBrowserEgress.html | 2 +- ...owser-client.connectQwpBrowserIngress.html | 2 +- ...rowser-client.connectQwpBrowserSender.html | 2 +- ...ser-client.connectQwpBrowserWebSocket.html | 11 +- ...browser-client.createQwpBrowserClient.html | 2 +- ...ent.createQwpBrowserConnectionFactory.html | 2 +- ...browser-client.createQwpBrowserSender.html | 2 +- ...r-client.createQwpDataLossSenderError.html | 2 +- ...createQwpProtocolViolationSenderError.html | 2 +- ...b_browser-client.createQwpSenderError.html | 2 +- .../_questdb_browser-client.date.html | 2 +- .../_questdb_browser-client.decimal128.html | 2 +- .../_questdb_browser-client.decimal256.html | 2 +- .../_questdb_browser-client.decimal64.html | 2 +- ...owser-client.decodeQwpContentEncoding.html | 2 +- ...browser-client.decodeQwpEgressMessage.html | 2 +- ...questdb_browser-client.decodeQwpFrame.html | 2 +- ...owser-client.decodeQwpIngressResponse.html | 2 +- ...ser-client.decodeQwpIngressServerInfo.html | 2 +- ...decodeQwpIngressSymbolDictionaryDelta.html | 2 +- ...uestdb_browser-client.decodeQwpVarint.html | 2 +- .../_questdb_browser-client.decodeUtf8.html | 2 +- ...browser-client.decompressQwpZstdFrame.html | 2 +- ...r-client.defaultQwpSenderErrorHandler.html | 2 +- ...db_browser-client.designatedTimestamp.html | 2 +- .../_questdb_browser-client.double.html | 2 +- .../_questdb_browser-client.doubleArray.html | 2 +- ...rowser-client.encodeQwpAcceptEncoding.html | 2 +- ...questdb_browser-client.encodeQwpBinds.html | 2 +- ...uestdb_browser-client.encodeQwpCancel.html | 2 +- ...uestdb_browser-client.encodeQwpCredit.html | 2 +- ...r-client.encodeQwpDurableAckPollFrame.html | 2 +- ...questdb_browser-client.encodeQwpFrame.html | 2 +- ...estdb_browser-client.encodeQwpGorilla.html | 2 +- ...er-client.encodeQwpIngressCommitFrame.html | 2 +- ..._browser-client.encodeQwpIngressFrame.html | 2 +- ...encodeQwpIngressSymbolDictionaryFrame.html | 2 +- ..._browser-client.encodeQwpQueryRequest.html | 2 +- ...uestdb_browser-client.encodeQwpVarint.html | 2 +- .../_questdb_browser-client.encodeUtf8.html | 2 +- ...uestdb_browser-client.flattenQwpArray.html | 2 +- .../_questdb_browser-client.float32.html | 2 +- .../_questdb_browser-client.float64.html | 2 +- .../_questdb_browser-client.geohash.html | 2 +- .../_questdb_browser-client.int32.html | 2 +- .../_questdb_browser-client.int64.html | 2 +- .../_questdb_browser-client.ipv4.html | 2 +- ...ient.isQwpDurableAckWebSocketProtocol.html | 2 +- .../_questdb_browser-client.long.html | 2 +- .../_questdb_browser-client.long256.html | 2 +- .../_questdb_browser-client.longArray.html | 2 +- ...er-client.qwpDefaultSenderErrorPolicy.html | 2 +- ...questdb_browser-client.qwpGorillaSize.html | 2 +- ...browser-client.qwpSenderErrorCategory.html | 2 +- ..._questdb_browser-client.qwpVarintSize.html | 2 +- ..._questdb_browser-client.readQwpVarint.html | 2 +- ...db_browser-client.readQwpVarintNumber.html | 2 +- .../_questdb_browser-client.short.html | 2 +- .../_questdb_browser-client.symbol.html | 2 +- .../_questdb_browser-client.timestamp.html | 2 +- .../_questdb_browser-client.utf8Length.html | 2 +- .../_questdb_browser-client.uuid.html | 2 +- .../_questdb_browser-client.varchar.html | 2 +- ...db_browser-client.writeQwpFrameHeader.html | 2 +- ...questdb_browser-client.writeQwpVarint.html | 2 +- ...ent.addQwpDurableAckWebSocketProtocol.html | 2 +- ...js-client.bigintToTwosComplementBytes.html | 2 +- .../_questdb_nodejs-client.binary.html | 2 +- .../_questdb_nodejs-client.bool.html | 2 +- .../_questdb_nodejs-client.byte.html | 2 +- .../_questdb_nodejs-client.char.html | 2 +- .../_questdb_nodejs-client.concatBytes.html | 2 +- ...db_nodejs-client.connectQwpNodeClient.html | 4 +- ...db_nodejs-client.connectQwpNodeEgress.html | 2 +- ...b_nodejs-client.connectQwpNodeIngress.html | 2 +- ...db_nodejs-client.connectQwpNodeSender.html | 2 +- ...estdb_nodejs-client.connectQwpNodeUdp.html | 2 +- ...nodejs-client.connectQwpNodeUdpSender.html | 2 +- ...nodejs-client.connectQwpNodeWebSocket.html | 2 +- .../_questdb_nodejs-client.createBuffer.html | 2 +- ...s-client.createQwpDataLossSenderError.html | 2 +- ...tdb_nodejs-client.createQwpNodeClient.html | 4 +- ...client.createQwpNodeConnectionFactory.html | 2 +- ...tdb_nodejs-client.createQwpNodeSender.html | 2 +- ..._nodejs-client.createQwpNodeUdpSender.html | 2 +- ...createQwpProtocolViolationSenderError.html | 2 +- ...db_nodejs-client.createQwpSenderError.html | 2 +- ...questdb_nodejs-client.createTransport.html | 2 +- .../_questdb_nodejs-client.date.html | 2 +- .../_questdb_nodejs-client.decimal128.html | 2 +- .../_questdb_nodejs-client.decimal256.html | 2 +- .../_questdb_nodejs-client.decimal64.html | 2 +- ...odejs-client.decodeQwpContentEncoding.html | 2 +- ..._nodejs-client.decodeQwpEgressMessage.html | 2 +- ..._questdb_nodejs-client.decodeQwpFrame.html | 2 +- ...odejs-client.decodeQwpIngressResponse.html | 2 +- ...ejs-client.decodeQwpIngressServerInfo.html | 2 +- ...decodeQwpIngressSymbolDictionaryDelta.html | 2 +- ...questdb_nodejs-client.decodeQwpVarint.html | 2 +- .../_questdb_nodejs-client.decodeUtf8.html | 2 +- ..._nodejs-client.decompressQwpZstdFrame.html | 2 +- ...s-client.defaultQwpSenderErrorHandler.html | 2 +- ...tdb_nodejs-client.designatedTimestamp.html | 2 +- .../_questdb_nodejs-client.double.html | 2 +- .../_questdb_nodejs-client.doubleArray.html | 2 +- ...nodejs-client.encodeQwpAcceptEncoding.html | 2 +- ..._questdb_nodejs-client.encodeQwpBinds.html | 2 +- ...questdb_nodejs-client.encodeQwpCancel.html | 2 +- ...questdb_nodejs-client.encodeQwpCredit.html | 2 +- ...s-client.encodeQwpDurableAckPollFrame.html | 2 +- ..._questdb_nodejs-client.encodeQwpFrame.html | 2 +- ...uestdb_nodejs-client.encodeQwpGorilla.html | 2 +- ...js-client.encodeQwpIngressCommitFrame.html | 2 +- ...b_nodejs-client.encodeQwpIngressFrame.html | 2 +- ...encodeQwpIngressSymbolDictionaryFrame.html | 2 +- ...b_nodejs-client.encodeQwpQueryRequest.html | 2 +- ...questdb_nodejs-client.encodeQwpVarint.html | 2 +- .../_questdb_nodejs-client.encodeUtf8.html | 2 +- ...questdb_nodejs-client.flattenQwpArray.html | 2 +- .../_questdb_nodejs-client.float32.html | 2 +- .../_questdb_nodejs-client.float64.html | 2 +- .../_questdb_nodejs-client.geohash.html | 2 +- .../_questdb_nodejs-client.int32.html | 2 +- .../_questdb_nodejs-client.int64.html | 2 +- .../_questdb_nodejs-client.ipv4.html | 2 +- ...ient.isQwpDurableAckWebSocketProtocol.html | 2 +- .../_questdb_nodejs-client.long.html | 2 +- .../_questdb_nodejs-client.long256.html | 2 +- .../_questdb_nodejs-client.longArray.html | 2 +- ...odejs-client.parseQwpNodeClientConfig.html | 2 +- ...js-client.qwpDefaultSenderErrorPolicy.html | 2 +- ..._questdb_nodejs-client.qwpGorillaSize.html | 2 +- ..._nodejs-client.qwpSenderErrorCategory.html | 2 +- .../_questdb_nodejs-client.qwpVarintSize.html | 2 +- .../_questdb_nodejs-client.readQwpVarint.html | 2 +- ...tdb_nodejs-client.readQwpVarintNumber.html | 2 +- ..._nodejs-client.retryQwpNodeOrphanSlot.html | 2 +- ..._nodejs-client.scanQwpNodeOrphanSlots.html | 2 +- .../_questdb_nodejs-client.short.html | 2 +- .../_questdb_nodejs-client.symbol.html | 2 +- .../_questdb_nodejs-client.timestamp.html | 2 +- .../_questdb_nodejs-client.utf8Length.html | 2 +- .../_questdb_nodejs-client.uuid.html | 2 +- .../_questdb_nodejs-client.varchar.html | 2 +- ...tdb_nodejs-client.writeQwpFrameHeader.html | 2 +- ..._questdb_nodejs-client.writeQwpVarint.html | 2 +- docs/hierarchy.html | 2 +- docs/index.html | 10 + ..._questdb_browser-client.QwpArrayValue.html | 6 +- ...db_browser-client.QwpBinaryConnection.html | 28 +- ..._browser-client.QwpBrowserAuthContext.html | 6 + ...owser-client.QwpBrowserClusterOptions.html | 24 +- ...rowser-client.QwpBrowserEgressOptions.html | 46 +- ...ent.QwpBrowserSessionBootstrapOptions.html | 12 +- ...ient.QwpBrowserSessionBootstrapResult.html | 4 +- ...r-client.QwpBrowserSplitClientOptions.html | 4 +- ...client.QwpBrowserUnifiedClientOptions.html | 4 +- ...ser-client.QwpBrowserWebSocketOptions.html | 36 +- ...b_browser-client.QwpCacheResetMessage.html | 4 +- ...tdb_browser-client.QwpClientFactories.html | 8 +- ...estdb_browser-client.QwpClientMetrics.html | 4 +- ...b_browser-client.QwpClientPoolOptions.html | 18 +- ...uestdb_browser-client.QwpColumnBuffer.html | 10 +- ...browser-client.QwpConnectionCloseInfo.html | 4 +- ...uestdb_browser-client.QwpDecimalValue.html | 4 +- ...estdb_browser-client.QwpEgressMetrics.html | 4 +- ..._browser-client.QwpEgressQueryOptions.html | 16 +- ...wser-client.QwpEgressReplayResetEvent.html | 8 +- ...rowser-client.QwpEgressRoutingOptions.html | 6 +- ...rowser-client.QwpEgressSessionOptions.html | 20 +- ...wser-client.QwpEgressTransportMetrics.html | 4 +- ...tdb_browser-client.QwpEgressViewQuery.html | 6 +- ...uestdb_browser-client.QwpEncodedBinds.html | 4 +- ...tdb_browser-client.QwpExecDoneMessage.html | 4 +- ...tdb_browser-client.QwpFailoverAttempt.html | 4 +- .../_questdb_browser-client.QwpFrame.html | 4 +- ...questdb_browser-client.QwpFrameHeader.html | 4 +- ...uestdb_browser-client.QwpGeohashValue.html | 4 +- ...b_browser-client.QwpHandshakeMetadata.html | 16 +- ...rowser-client.QwpIngressEncodeOptions.html | 6 +- ...b_browser-client.QwpIngressErrorEvent.html | 6 +- ...stdb_browser-client.QwpIngressMetrics.html | 12 +- ...rowser-client.QwpIngressProgressEvent.html | 4 +- ...browser-client.QwpIngressReplayRecord.html | 4 +- ...wser-client.QwpIngressReplayReference.html | 4 +- ..._browser-client.QwpIngressReplayStore.html | 18 +- ...tdb_browser-client.QwpIngressResponse.html | 4 +- ...b_browser-client.QwpIngressSendResult.html | 8 +- ...b_browser-client.QwpIngressServerInfo.html | 4 +- ...owser-client.QwpIngressSessionOptions.html | 36 +- ...lient.QwpIngressSymbolDictionaryDelta.html | 4 +- ..._browser-client.QwpIngressTableResult.html | 4 +- ...ser-client.QwpIngressTransportMetrics.html | 14 +- ...uestdb_browser-client.QwpLong256Value.html | 4 +- ...browser-client.QwpPoolSlotReservation.html | 4 +- ...b_browser-client.QwpQueryErrorMessage.html | 4 +- ...uestdb_browser-client.QwpQueryRequest.html | 12 +- ...stdb_browser-client.QwpReconnectEvent.html | 6 +- ...db_browser-client.QwpReconnectOptions.html | 14 +- ...browser-client.QwpResourcePoolMetrics.html | 4 +- ...db_browser-client.QwpResultArrayValue.html | 4 +- ..._browser-client.QwpResultBatchMessage.html | 6 +- ...uestdb_browser-client.QwpResultColumn.html | 4 +- ..._browser-client.QwpResultColumnSchema.html | 4 +- ...db_browser-client.QwpResultEndMessage.html | 4 +- ...browser-client.QwpSenderEncodeOptions.html | 6 +- ...questdb_browser-client.QwpSenderError.html | 8 +- ...-client.QwpSenderErrorResponseContext.html | 4 +- ...estdb_browser-client.QwpSenderMetrics.html | 8 +- ...estdb_browser-client.QwpSenderOptions.html | 22 +- ...estdb_browser-client.QwpSenderSession.html | 4 +- ...b_browser-client.QwpServerInfoMessage.html | 4 +- ...questdb_browser-client.QwpSymbolValue.html | 4 +- ...browser-client.QwpUpgradeErrorDetails.html | 8 +- .../_questdb_browser-client.QwpUuidValue.html | 4 +- ...ser-client.QwpWebSocketConnectOptions.html | 10 +- ...estdb_browser-client.QwpWebSocketLike.html | 16 +- ...uestdb_browser-client.QwpWriterColumn.html | 8 +- .../_questdb_nodejs-client.QwpArrayValue.html | 6 +- ...tdb_nodejs-client.QwpBinaryConnection.html | 28 +- ...db_nodejs-client.QwpCacheResetMessage.html | 4 +- ...stdb_nodejs-client.QwpClientFactories.html | 8 +- ...uestdb_nodejs-client.QwpClientMetrics.html | 4 +- ...db_nodejs-client.QwpClientPoolOptions.html | 18 +- ...questdb_nodejs-client.QwpColumnBuffer.html | 10 +- ..._nodejs-client.QwpConnectionCloseInfo.html | 4 +- ...questdb_nodejs-client.QwpDecimalValue.html | 4 +- ...uestdb_nodejs-client.QwpEgressMetrics.html | 4 +- ...b_nodejs-client.QwpEgressQueryOptions.html | 16 +- ...dejs-client.QwpEgressReplayResetEvent.html | 8 +- ...nodejs-client.QwpEgressRoutingOptions.html | 6 +- ...nodejs-client.QwpEgressSessionOptions.html | 20 +- ...dejs-client.QwpEgressTransportMetrics.html | 4 +- ...stdb_nodejs-client.QwpEgressViewQuery.html | 6 +- ...questdb_nodejs-client.QwpEncodedBinds.html | 4 +- ...stdb_nodejs-client.QwpExecDoneMessage.html | 4 +- ...stdb_nodejs-client.QwpFailoverAttempt.html | 4 +- .../_questdb_nodejs-client.QwpFrame.html | 4 +- ..._questdb_nodejs-client.QwpFrameHeader.html | 4 +- ...questdb_nodejs-client.QwpGeohashValue.html | 4 +- ...db_nodejs-client.QwpHandshakeMetadata.html | 16 +- ...nodejs-client.QwpIngressEncodeOptions.html | 6 +- ...db_nodejs-client.QwpIngressErrorEvent.html | 6 +- ...estdb_nodejs-client.QwpIngressMetrics.html | 12 +- ...nodejs-client.QwpIngressProgressEvent.html | 4 +- ..._nodejs-client.QwpIngressReplayRecord.html | 4 +- ...dejs-client.QwpIngressReplayReference.html | 4 +- ...b_nodejs-client.QwpIngressReplayStore.html | 18 +- ...stdb_nodejs-client.QwpIngressResponse.html | 4 +- ...db_nodejs-client.QwpIngressSendResult.html | 8 +- ...db_nodejs-client.QwpIngressServerInfo.html | 4 +- ...odejs-client.QwpIngressSessionOptions.html | 36 +- ...lient.QwpIngressSymbolDictionaryDelta.html | 4 +- ...b_nodejs-client.QwpIngressTableResult.html | 4 +- ...ejs-client.QwpIngressTransportMetrics.html | 14 +- ...questdb_nodejs-client.QwpLong256Value.html | 4 +- ...ejs-client.QwpNodeClientConfigOptions.html | 8 +- ...db_nodejs-client.QwpNodeClientOptions.html | 6 +- ...db_nodejs-client.QwpNodeEgressOptions.html | 28 +- ...-client.QwpNodeFileReplayStoreMetrics.html | 4 +- ...-client.QwpNodeFileReplayStoreOptions.html | 18 +- ...b_nodejs-client.QwpNodeIngressOptions.html | 26 +- ...nodejs-client.QwpNodeOrphanDrainEvent.html | 8 +- ...dejs-client.QwpNodeOrphanDrainSession.html | 6 +- ...js-client.QwpNodeOrphanDrainerMetrics.html | 6 +- ...js-client.QwpNodeOrphanDrainerOptions.html | 24 +- ...js-client.QwpNodeReplayDataLossReport.html | 6 +- ...ejs-client.QwpNodeReplayRecoveryEvent.html | 4 +- ...-client.QwpNodeStoreAndForwardOptions.html | 32 +- ...estdb_nodejs-client.QwpNodeUdpMetrics.html | 4 +- ...estdb_nodejs-client.QwpNodeUdpOptions.html | 16 +- ...db_nodejs-client.QwpNodeUdpSocketLike.html | 4 +- ...nodejs-client.QwpNodeUpgradeRejection.html | 4 +- ...nodejs-client.QwpNodeWebSocketOptions.html | 18 +- ..._nodejs-client.QwpPoolSlotReservation.html | 4 +- ...db_nodejs-client.QwpQueryErrorMessage.html | 4 +- ...questdb_nodejs-client.QwpQueryRequest.html | 12 +- ...estdb_nodejs-client.QwpReconnectEvent.html | 6 +- ...tdb_nodejs-client.QwpReconnectOptions.html | 14 +- ..._nodejs-client.QwpResourcePoolMetrics.html | 4 +- ...tdb_nodejs-client.QwpResultArrayValue.html | 4 +- ...b_nodejs-client.QwpResultBatchMessage.html | 6 +- ...questdb_nodejs-client.QwpResultColumn.html | 4 +- ...b_nodejs-client.QwpResultColumnSchema.html | 4 +- ...tdb_nodejs-client.QwpResultEndMessage.html | 4 +- ..._nodejs-client.QwpSenderEncodeOptions.html | 6 +- ..._questdb_nodejs-client.QwpSenderError.html | 8 +- ...-client.QwpSenderErrorResponseContext.html | 4 +- ...uestdb_nodejs-client.QwpSenderMetrics.html | 8 +- ...uestdb_nodejs-client.QwpSenderOptions.html | 22 +- ...uestdb_nodejs-client.QwpSenderSession.html | 4 +- ...db_nodejs-client.QwpServerInfoMessage.html | 4 +- ..._questdb_nodejs-client.QwpSymbolValue.html | 4 +- ..._nodejs-client.QwpUpgradeErrorDetails.html | 8 +- .../_questdb_nodejs-client.QwpUuidValue.html | 4 +- ...ejs-client.QwpWebSocketConnectOptions.html | 10 +- ...uestdb_nodejs-client.QwpWebSocketLike.html | 16 +- ...questdb_nodejs-client.QwpWriterColumn.html | 8 +- .../_questdb_nodejs-client.SenderBuffer.html | 45 +- ...questdb_nodejs-client.SenderTransport.html | 10 +- docs/media/QWP.md | 67 +- docs/modules/_questdb_browser-client.html | 66 +- ..._questdb_browser-client.QwpBindSetter.html | 2 +- .../_questdb_browser-client.QwpBindType.html | 2 +- ...browser-client.QwpBrowserAuthProvider.html | 11 + ...-client.QwpBrowserClientEgressOptions.html | 2 +- ...client.QwpBrowserClientIngressOptions.html | 2 +- ...rowser-client.QwpBrowserClientOptions.html | 2 +- ...uestdb_browser-client.QwpBrowserFetch.html | 2 +- ...lient.QwpBrowserSessionAuthentication.html | 8 +- ...ient.QwpBrowserSessionBootstrapConfig.html | 2 +- ..._questdb_browser-client.QwpColumnType.html | 2 +- ...b_browser-client.QwpConnectionFactory.html | 2 +- ...uestdb_browser-client.QwpDecimalInput.html | 2 +- ...db_browser-client.QwpDoubleArrayInput.html | 2 +- ...b_browser-client.QwpEgressCompression.html | 2 +- ...estdb_browser-client.QwpEgressMessage.html | 2 +- ...r-client.QwpEgressViewCallbackControl.html | 2 +- ...uestdb_browser-client.QwpGeohashInput.html | 2 +- ...browser-client.QwpIngressProgressKind.html | 2 +- ..._browser-client.QwpInitialConnectMode.html | 2 +- .../_questdb_browser-client.QwpInt64.html | 2 +- .../_questdb_browser-client.QwpIpv4Input.html | 2 +- ...uestdb_browser-client.QwpLong256Input.html | 2 +- ...uestdb_browser-client.QwpLong256Words.html | 2 +- ...stdb_browser-client.QwpLongArrayInput.html | 2 +- ...client.QwpNegotiatedEgressCompression.html | 2 +- ...tdb_browser-client.QwpNestedLongArray.html | 2 +- ...b_browser-client.QwpNestedNumberArray.html | 2 +- ...tdb_browser-client.QwpQueryCompletion.html | 2 +- ..._browser-client.QwpReconnectEventKind.html | 2 +- ...wser-client.QwpResultBatchViewHandler.html | 2 +- ...owser-client.QwpResultRowViewCallback.html | 2 +- ...questdb_browser-client.QwpResultValue.html | 2 +- ...browser-client.QwpSenderErrorCategory.html | 2 +- ...b_browser-client.QwpSenderErrorPolicy.html | 2 +- ...uestdb_browser-client.QwpSenderLogger.html | 2 +- ...rowser-client.QwpSenderSessionFactory.html | 2 +- .../_questdb_browser-client.QwpTarget.html | 2 +- ...estdb_browser-client.QwpTimestampUnit.html | 2 +- ...db_browser-client.QwpUpgradeErrorKind.html | 2 +- ...browser-client.QwpUpgradeTimeoutPhase.html | 2 +- .../_questdb_browser-client.QwpUuidInput.html | 2 +- ...db_browser-client.QwpWriterColumnKind.html | 2 +- .../_questdb_browser-client.QwpWriterRow.html | 2 +- ...uestdb_browser-client.QwpWriterSchema.html | 2 +- .../_questdb_nodejs-client.ExtraOptions.html | 4 +- docs/types/_questdb_nodejs-client.Logger.html | 2 +- .../_questdb_nodejs-client.QwpBindSetter.html | 2 +- .../_questdb_nodejs-client.QwpBindType.html | 2 +- .../_questdb_nodejs-client.QwpColumnType.html | 2 +- ...db_nodejs-client.QwpConnectionFactory.html | 2 +- ...questdb_nodejs-client.QwpDecimalInput.html | 2 +- ...tdb_nodejs-client.QwpDoubleArrayInput.html | 2 +- ...db_nodejs-client.QwpEgressCompression.html | 2 +- ...uestdb_nodejs-client.QwpEgressMessage.html | 2 +- ...s-client.QwpEgressViewCallbackControl.html | 2 +- ...questdb_nodejs-client.QwpExtraOptions.html | 10 +- ...questdb_nodejs-client.QwpGeohashInput.html | 2 +- ..._nodejs-client.QwpIngressProgressKind.html | 2 +- ...b_nodejs-client.QwpInitialConnectMode.html | 2 +- .../_questdb_nodejs-client.QwpInt64.html | 2 +- .../_questdb_nodejs-client.QwpIpv4Input.html | 2 +- ...questdb_nodejs-client.QwpLong256Input.html | 2 +- ...questdb_nodejs-client.QwpLong256Words.html | 2 +- ...estdb_nodejs-client.QwpLongArrayInput.html | 2 +- ...client.QwpNegotiatedEgressCompression.html | 2 +- ...stdb_nodejs-client.QwpNestedLongArray.html | 2 +- ...db_nodejs-client.QwpNestedNumberArray.html | 2 +- ...js-client.QwpNodeOrphanDrainEventKind.html | 2 +- ...stdb_nodejs-client.QwpQueryCompletion.html | 2 +- ...b_nodejs-client.QwpReconnectEventKind.html | 2 +- ...dejs-client.QwpResultBatchViewHandler.html | 2 +- ...odejs-client.QwpResultRowViewCallback.html | 2 +- ..._questdb_nodejs-client.QwpResultValue.html | 2 +- ..._nodejs-client.QwpSenderErrorCategory.html | 2 +- ...db_nodejs-client.QwpSenderErrorPolicy.html | 2 +- ...questdb_nodejs-client.QwpSenderLogger.html | 2 +- ...nodejs-client.QwpSenderSessionFactory.html | 2 +- ...nodejs-client.QwpSfBackpressurePolicy.html | 2 +- ...questdb_nodejs-client.QwpSfDurability.html | 2 +- .../_questdb_nodejs-client.QwpTarget.html | 2 +- ...uestdb_nodejs-client.QwpTimestampUnit.html | 2 +- ...tdb_nodejs-client.QwpUpgradeErrorKind.html | 2 +- ..._nodejs-client.QwpUpgradeTimeoutPhase.html | 2 +- .../_questdb_nodejs-client.QwpUuidInput.html | 2 +- ...tdb_nodejs-client.QwpWriterColumnKind.html | 2 +- .../_questdb_nodejs-client.QwpWriterRow.html | 2 +- ...questdb_nodejs-client.QwpWriterSchema.html | 2 +- .../_questdb_nodejs-client.TimestampUnit.html | 2 +- ...uestdb_browser-client.QWP_COLUMN_TYPE.html | 2 +- ..._browser-client.QWP_COMPRESSION_CODEC.html | 2 +- ..._browser-client.QWP_DECIMAL_MAX_SCALE.html | 2 +- ...t.QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE.html | 2 +- ...ent.QWP_DEFAULT_EGRESS_INITIAL_CREDIT.html | 2 +- ...DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS.html | 2 +- ...nt.QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL.html | 2 +- ..._browser-client.QWP_EGRESS_CAPABILITY.html | 2 +- ...tdb_browser-client.QWP_EGRESS_MESSAGE.html | 2 +- ...uestdb_browser-client.QWP_EGRESS_PATH.html | 2 +- ...b_browser-client.QWP_ENCODING_GORILLA.html | 2 +- ...wser-client.QWP_ENCODING_UNCOMPRESSED.html | 2 +- ..._browser-client.QWP_FLAG_DEFER_COMMIT.html | 2 +- ...ient.QWP_FLAG_DELTA_SYMBOL_DICTIONARY.html | 2 +- ...wser-client.QWP_FLAG_DURABLE_ACK_POLL.html | 2 +- ...estdb_browser-client.QWP_FLAG_GORILLA.html | 2 +- ..._questdb_browser-client.QWP_FLAG_ZSTD.html | 2 +- ...uestdb_browser-client.QWP_HEADER_SIZE.html | 2 +- ...estdb_browser-client.QWP_INGRESS_PATH.html | 2 +- ...wser-client.QWP_INGRESS_PROGRESS_KIND.html | 2 +- ...nt.QWP_INGRESS_SERVER_INFO_CAPABILITY.html | 2 +- ...owser-client.QWP_INITIAL_CONNECT_MODE.html | 2 +- .../_questdb_browser-client.QWP_MAGIC.html | 2 +- ...owser-client.QWP_MAX_ARRAY_DIMENSIONS.html | 2 +- ...client.QWP_MAX_ARRAY_DIMENSION_LENGTH.html | 2 +- ...client.QWP_MAX_BATCH_ROWS_UPPER_BOUND.html | 2 +- ...rowser-client.QWP_MAX_CELLS_PER_BATCH.html | 2 +- ...wser-client.QWP_MAX_COLUMNS_PER_TABLE.html | 2 +- ...ser-client.QWP_MAX_COLUMN_NAME_LENGTH.html | 2 +- ...owser-client.QWP_MAX_IDENTIFIER_BYTES.html | 2 +- ...browser-client.QWP_MAX_ROWS_PER_TABLE.html | 2 +- ...client.QWP_MAX_SYMBOL_DICTIONARY_SIZE.html | 2 +- ...owser-client.QWP_MAX_TABLES_PER_FRAME.html | 2 +- ...wser-client.QWP_MAX_TABLE_NAME_LENGTH.html | 2 +- ...client.QWP_MAX_ZSTD_DECOMPRESSED_SIZE.html | 2 +- ...lient.QWP_QUERY_FLAG_RESET_DICTIONARY.html | 2 +- ...owser-client.QWP_RECONNECT_EVENT_KIND.html | 2 +- ...wser-client.QWP_RESET_MASK_DICTIONARY.html | 2 +- ...wser-client.QWP_SENDER_ERROR_CATEGORY.html | 2 +- ...rowser-client.QWP_SENDER_ERROR_POLICY.html | 2 +- ...uestdb_browser-client.QWP_SERVER_ROLE.html | 2 +- .../_questdb_browser-client.QWP_STATUS.html | 2 +- .../_questdb_browser-client.QWP_TARGET.html | 2 +- ...browser-client.QWP_UPGRADE_ERROR_KIND.html | 2 +- ...wser-client.QWP_UPGRADE_TIMEOUT_PHASE.html | 2 +- .../_questdb_browser-client.QWP_VERSION.html | 2 +- ...client.QWP_ZSTD_MAX_COMPRESSION_LEVEL.html | 2 +- ...client.QWP_ZSTD_MIN_COMPRESSION_LEVEL.html | 2 +- ...questdb_nodejs-client.QWP_COLUMN_TYPE.html | 2 +- ...b_nodejs-client.QWP_COMPRESSION_CODEC.html | 2 +- ...b_nodejs-client.QWP_DECIMAL_MAX_SCALE.html | 2 +- ...t.QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE.html | 2 +- ...ent.QWP_DEFAULT_EGRESS_INITIAL_CREDIT.html | 2 +- ...DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS.html | 2 +- ...nt.QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL.html | 2 +- ...b_nodejs-client.QWP_EGRESS_CAPABILITY.html | 2 +- ...stdb_nodejs-client.QWP_EGRESS_MESSAGE.html | 2 +- ...questdb_nodejs-client.QWP_EGRESS_PATH.html | 2 +- ...db_nodejs-client.QWP_ENCODING_GORILLA.html | 2 +- ...dejs-client.QWP_ENCODING_UNCOMPRESSED.html | 2 +- ...b_nodejs-client.QWP_FLAG_DEFER_COMMIT.html | 2 +- ...ient.QWP_FLAG_DELTA_SYMBOL_DICTIONARY.html | 2 +- ...dejs-client.QWP_FLAG_DURABLE_ACK_POLL.html | 2 +- ...uestdb_nodejs-client.QWP_FLAG_GORILLA.html | 2 +- .../_questdb_nodejs-client.QWP_FLAG_ZSTD.html | 2 +- ...questdb_nodejs-client.QWP_HEADER_SIZE.html | 2 +- ...uestdb_nodejs-client.QWP_INGRESS_PATH.html | 2 +- ...dejs-client.QWP_INGRESS_PROGRESS_KIND.html | 2 +- ...nt.QWP_INGRESS_SERVER_INFO_CAPABILITY.html | 2 +- ...odejs-client.QWP_INITIAL_CONNECT_MODE.html | 2 +- .../_questdb_nodejs-client.QWP_MAGIC.html | 2 +- ...odejs-client.QWP_MAX_ARRAY_DIMENSIONS.html | 2 +- ...client.QWP_MAX_ARRAY_DIMENSION_LENGTH.html | 2 +- ...client.QWP_MAX_BATCH_ROWS_UPPER_BOUND.html | 2 +- ...nodejs-client.QWP_MAX_CELLS_PER_BATCH.html | 2 +- ...dejs-client.QWP_MAX_COLUMNS_PER_TABLE.html | 2 +- ...ejs-client.QWP_MAX_COLUMN_NAME_LENGTH.html | 2 +- ...odejs-client.QWP_MAX_IDENTIFIER_BYTES.html | 2 +- ..._nodejs-client.QWP_MAX_ROWS_PER_TABLE.html | 2 +- ...client.QWP_MAX_SYMBOL_DICTIONARY_SIZE.html | 2 +- ...odejs-client.QWP_MAX_TABLES_PER_FRAME.html | 2 +- ...dejs-client.QWP_MAX_TABLE_NAME_LENGTH.html | 2 +- ...client.QWP_MAX_ZSTD_DECOMPRESSED_SIZE.html | 2 +- ...js-client.QWP_ORPHAN_DRAIN_EVENT_KIND.html | 2 +- ...ejs-client.QWP_ORPHAN_FAILED_SENTINEL.html | 2 +- ...lient.QWP_QUERY_FLAG_RESET_DICTIONARY.html | 2 +- ...odejs-client.QWP_RECONNECT_EVENT_KIND.html | 2 +- ...dejs-client.QWP_RESET_MASK_DICTIONARY.html | 2 +- ...dejs-client.QWP_SENDER_ERROR_CATEGORY.html | 2 +- ...nodejs-client.QWP_SENDER_ERROR_POLICY.html | 2 +- ...questdb_nodejs-client.QWP_SERVER_ROLE.html | 2 +- ...ejs-client.QWP_SF_BACKPRESSURE_POLICY.html | 2 +- ...estdb_nodejs-client.QWP_SF_DURABILITY.html | 2 +- .../_questdb_nodejs-client.QWP_STATUS.html | 2 +- .../_questdb_nodejs-client.QWP_TARGET.html | 2 +- ..._nodejs-client.QWP_UPGRADE_ERROR_KIND.html | 2 +- ...dejs-client.QWP_UPGRADE_TIMEOUT_PHASE.html | 2 +- .../_questdb_nodejs-client.QWP_VERSION.html | 2 +- ...client.QWP_ZSTD_MAX_COMPRESSION_LEVEL.html | 2 +- ...client.QWP_ZSTD_MIN_COMPRESSION_LEVEL.html | 2 +- packages/browser-client/README.md | 85 ++- packages/browser-client/src/index.ts | 340 +++++++++- .../client-core/src/_qwp/_core/durable-ack.ts | 62 ++ packages/client-core/src/_qwp/_core/index.ts | 8 +- test/dist-types/public-api-types.ts | 2 + test/qwp/browser.e2e.ts | 191 ++++++ test/qwp/core.test.ts | 71 ++ test/qwp/public-api-contract.ts | 35 + test/qwp/session.test.ts | 638 ++++++++++++++++++ 636 files changed, 3293 insertions(+), 1676 deletions(-) create mode 100644 docs/interfaces/_questdb_browser-client.QwpBrowserAuthContext.html create mode 100644 docs/types/_questdb_browser-client.QwpBrowserAuthProvider.html diff --git a/QWP.md b/QWP.md index 65e6ee7b..240cc9a7 100644 --- a/QWP.md +++ b/QWP.md @@ -928,7 +928,9 @@ unhandled rejection, and both still reach `onError` and the metrics snapshot. ### Browser ingress Browser applications must use the browser entry point and a same-origin WebSocket -route (directly or through a reverse proxy): +route (directly or through a reverse proxy), unless the server lists the +application's origin in `qwp.browser.allowed.origins`; see +[Third-party browser applications](#third-party-browser-applications): ```typescript import { connectQwpBrowserSender } from "@questdb/browser-client"; @@ -986,6 +988,65 @@ const sender = await connectQwpBrowserSender({ }); ``` +### Third-party browser applications + +A web application served from its own origin connects to QuestDB directly when +the server lists that exact origin, written the way browsers send the `Origin` +header: + +``` +# QuestDB server.conf +qwp.browser.allowed.origins=https://app.example.com +``` + +QuestDB ignores cookies on such a cross-origin upgrade, so session bootstrap +cannot authenticate it. Set `auth` instead: the client sends the credential with +every upgrade as a WebSocket subprotocol, which browser JavaScript can set, +beside the QWP dialect QuestDB selects (`questdb.qwp.v1`, or durable ACK when +requested): + +```typescript +const sender = await connectQwpBrowserSender({ + url: "wss://questdb.example.com:9000/write/v4", + auth: { type: "bearer", token: restToken }, +}); +``` + +`auth` takes the same `bearer` and `basic` credentials as session bootstrap, or a +function returning one. The client calls the function before every initial +connect, reconnect, and failover attempt, so it can return a freshly refreshed +OIDC access token and keep a long-lived session authenticated: + +```typescript +const db = await connectQwpBrowserClient({ + cluster: { + url: "wss://questdb.example.com:9000", + auth: async ({ signal }) => ({ + type: "bearer", + token: await identityProvider.getAccessToken({ signal }), + }), + }, +}); +``` + +The function's `signal` aborts when the attempt is abandoned, and its time counts +against `connectTimeoutMs`. A throw fails the attempt with a `QwpUpgradeError` of +kind `authentication` carrying the thrown error as `cause`, without trying the +remaining endpoints; reconnects retry it with backoff unless the error carries +`retryable: false`. A returned credential that could never be sent, such as a +bearer token with a space or a non-ASCII character, fails without a retry. + +`auth` cannot be combined with `sessionBootstrap`. The credential is +base64url-encoded, not encrypted, so use `wss:`. QuestDB accepts it only from a +listed origin; a page served from QuestDB's own origin must be listed too, or +keep using session bootstrap. QuestDB creates no session for the credential and +runs the connection as the credential's own principal, so `serviceAccount` +assumption is not available on this path. With authentication disabled, a listed origin needs +no credential. QuestDB never selects the credential as the connection's +subprotocol; the client treats a server that does as defective, closes the +connection, and neither retries nor tries another endpoint, because every node +of a cluster normally runs the same build. + ### Transactions and durable acknowledgement Transactional auto-flush keeps automatically emitted frames in an open server-side @@ -1625,8 +1686,8 @@ const db = await connectQwpBrowserClient({ }); ``` -`url`, `failoverUrls`, and `sessionBootstrap` belong to `cluster` in this -unified form and are rejected if repeated under `ingress` or `egress`. +`url`, `failoverUrls`, `sessionBootstrap`, and `auth` belong to `cluster` in +this unified form and are rejected if repeated under `ingress` or `egress`. Side-specific timeouts, WebSocket factories, durable-ACK settings, routing, and compression remain available as explicit overrides. The original split object form with complete `ingress` and `egress` trees remains supported for advanced diff --git a/README.md b/README.md index e629354c..67adc7f9 100644 --- a/README.md +++ b/README.md @@ -427,6 +427,27 @@ credentialed CORS), otherwise the browser may decline to store or send the HttpOnly cookies. JavaScript deliberately never reads `qdb_session` or the Enterprise `qdbServiceAccount` cookie. +A web application served from its own origin authenticates with `auth` +instead, once the server lists that origin in `qwp.browser.allowed.origins`; +QuestDB ignores cookies on such a cross-origin upgrade. The client sends the +credential with every WebSocket upgrade as a subprotocol, so use `wss:`. Pass +a function to supply a fresh OIDC access token before every connect, +reconnect, and failover attempt. `auth` cannot be combined with +`sessionBootstrap`: + +```typescript +const sender = await connectQwpBrowserSender( + { + url: "wss://questdb.example.com:9000/write/v4", + auth: async ({ signal }) => ({ + type: "bearer", + token: await identityProvider.getAccessToken({ signal }), + }), + }, + { autoFlush: false }, +); +``` + Browsers can request durable ingress acknowledgements without custom HTTP headers. The client offers a QWP WebSocket subprotocol and verifies that the server selected it before sending data. Browser keepalives use side-effect-free, diff --git a/docs/assets/hierarchy.js b/docs/assets/hierarchy.js index 5cb4ea4b..fd87d045 100644 --- a/docs/assets/hierarchy.js +++ b/docs/assets/hierarchy.js @@ -1 +1 @@ -window.hierarchyData = "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" \ No newline at end of file +window.hierarchyData = "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" \ No newline at end of file diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index 7146b745..f0d8c56e 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -21,6 +21,8 @@ --dark-hl-9: #4EC9B0; --light-hl-10: #000000FF; --dark-hl-10: #D4D4D4; + --light-hl-11: #000000; + --dark-hl-11: #C8C8C8; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @@ -37,6 +39,7 @@ --hl-8: var(--light-hl-8); --hl-9: var(--light-hl-9); --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); --code-background: var(--light-code-background); } } @@ -52,6 +55,7 @@ --hl-8: var(--dark-hl-8); --hl-9: var(--dark-hl-9); --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); --code-background: var(--dark-code-background); } } @@ -67,6 +71,7 @@ --hl-8: var(--light-hl-8); --hl-9: var(--light-hl-9); --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); --code-background: var(--light-code-background); } @@ -82,6 +87,7 @@ --hl-8: var(--dark-hl-8); --hl-9: var(--dark-hl-9); --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); --code-background: var(--dark-code-background); } @@ -96,4 +102,5 @@ .hl-8 { color: var(--hl-8); } .hl-9 { color: var(--hl-9); } .hl-10 { color: var(--hl-10); } +.hl-11 { color: var(--hl-11); } pre, code { background: var(--code-background); } diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 0c2d9445..188de35b 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "eJzFndtyo8iWht/F1z2HdnfX9PTVxgjbROlUCLm6escOBQVpmV0I1Chlt/fEvPtEApLIA7nWSuyaqJuqKP3/t4AkM8nT+vv/XHH2F7/67epvfx7ZgWdfr364Sp/yIqtZefXb38///bWuXg6s/re0yFnJr3642if86eq3q12VHQt2+I9NJ9/IP/z3J74rrn64+paX2dVv12bvTy/7m4SnT3FVTZN6y4K6ruoLIi2Sw8GCMMpl8I/Xv/7vDxIvL7OHpDiyA41zlkH+rXTFDoe8Km+qih94newdrsxiBMXwylnEkowRiWcZwv9znXMH/1YG+PtKUUN4+4ZCN+DrF9WBZfQHoqkB2uRYJ18L5qXf1mXynOSF+BcdO2wD8INtzQ6HT0dWv5KAPR2e4H1NyqwqXe7roAue7idlyoo437HqyEdFoDvhoxgFJrLe4lrJVxmxfZG8RuzPY167P2mDi0b/obW7+u0qY/uapQln2ZUppK56dAijU6IuvPuta80xZAKwb5O8qJ5ZTQdKSoASlk10XvptxDs8ZIJmO5dnswWOO0/Sb87EsxjHcimospTEcS2qgy4AfcZ2Vf3avtrefs/KzPmJ2q0IcYzsWtqtCHHc1smOvU0cuhUQx7KqCi9tqlrnBzLggSBH7FAd69ThojU1RKsrXqVV4UDqKwFK02xOWXJgJMRFBvhHLK3KkqU8+OspOR64yxs84AGSRfGa5CnPqzJx6csYHYjUJasP+YGz0qXIQGaoWCL2T5Y63ndNDxIPx4I3VQuRdNbhCROWVtQPQl2O5z3k7MUVJrQokl8Vx13piLqIUayoenEEdUqIUhVslh924gY4lD5VDdBWrMxc+wiKFkEilrtWgvJt4nBu2QY8EGQ3FtZ91AVRruR197UqLlUmjaWIAVYsxi1ujo+PxMLQ02EIDuNSPR1AWJc1S8WHlVCMbzJhOyie/bZOMoe2si8EGO2NiaoXOkWWAhyvrpPXZoj1wshLzurHJLVjLkpl0PmXD9rYb1K/+m33SPoYw4FUPYRrDfxC9MLqxV5IDmSmyQQHbocdxnElDxxWHbEeF8CAm1sobXv8RpG0ZshA9kXO2wHkkbdDM8IFsC7zx5xlbxGCyQoXxGf2dVWl39jIAFQbAO4n6ROL2IHxGTscki25ftEMIGCjvE1SXtU5I1+lIkfBZozXeeqI6sQokPgud3x6mgEEbPrnao8ByeppQcypOm/6gWH5WNFpmgUAnbA03yWFU3PX1wKYtvZ2LBySGAVqxjkcS4fugEKevroPjAfP0qQhBau64NDVkefldtT1yh4obNcMjcLKHihsXCflYV/VrlWN2QWFFh/PyjQmhXmWQ7BSDHFkYqaffnU9LYT5i6WTqmSOjZEiB2CniSCPc7bbk98ORQ7BxOA0GSFEGON7ZUEDwf7esKhBg9yx6ik5PDlVyX0tgLlPyuzwlHxjM8aTLOEJlaUZAMBuRqctoY61hskDiRVffk41s2aAAzpWT7Iah1rWVRviiMuTPHDYU2OVVnXmSO1b0KCPrBYD6iO5nQsFveJVPQ7bOGCRh31VHtx5rRwHE2N2bh+mmgEWWD+z2qWjqxlggWO6LEYTJFgZopywgl7h2rxwYcTt+N6IR9xzQCJHdtcGbAD4tCq31798cGpD+1oAI74hV0XFRYe9fk5chvIMFgD0skrLseemGWCAYpkUO5CLTV8LYC7zxS7NmKzGohxrAlUP4tr1A+JZO74GBgsYeiy4+2C2qkfhmllTx2KpO6CQ7QiLG6zVEjCr9IntyBW37oBCBmU26lZe9ACunX0c1TE3WOCg8lwOCabP5dggp76QX5XN/7szFSdUCI6vvSRGgUY9P8qT09YRUkDGlYQG0Kl75/geaAYQsOlaOVWXPSkA6U95ThhP8oL8tAwWEPSYZ07XdRYCgPNciD+qZR2wwcKn+TfyFUpiCNRMJLs1OX0tPD+crRiX1g/w1z28M6gVKe7/+d//9eMv1zohft0zor+QYNxPc8VCOzD7C/MGTagRdN8QI0OQXagxjISTqbdMWs2HpTUyPKWrx70jf2Ilz1PlEwhLNdqQozhPiPtV+ZhvncNQfBBxtC818X26iFCE08xeOx/7SgIpWgSvm9sLy/2RE1B9GYZSHcWOMvGNQSYpUgStrUP8arev1b4LiNO0aJ7WdUGyzD2WYY6YXfKToviapN9Ez7SuCjLT4IHgd5MO1CfYlyEoyjj1R/FLPMygRjFznidF9wLNqozyGHUxisg//EyC8A8/Y3z3zz9TH9BZg/DvBs2oiL4MT/lc1RmlJe3LkBSnOkkWIkhztq14LvYUjqmbLC6oGMTWjHPoJK6kRLPmx91XVrvReloEr91JW+32BSN2TBQlgiUPQBKrJ12MIkobFcR8bEH6YjAboMnddoJTg0EGK3o0V/mORdJMH7EmRm+gx08429L6WgY1jbmsijx1JLZaNG9abbek8tKXoSldp5rebTXJEdRY7Eik1NqtAOOc79iBJ7v9usxJgL4OwemP7hDrEVWKp3WbNZZP0p5CLLCvxjCPeUZtXM8ahH9/qIV4B1UpmhZVL2RMVL2g/dWpByTCON+gUz4vN/5iup7NN/GXZXChPCd1LqZ8LSRZKpN+0iGzZRSsVuFivvEXk8CnoxQDADgJ/HDmTTcz7/fNyvem5GvTDEDgrbeexpvgToS5uVnf3gbRZrlYTDer8A8HvNWOFkw4D+PQm278KJiE8chQZDNaIKsgegiiTTi/XWzicBYs1vFmthoZkNkUCmwdeTfTYOP5Hzefg5vVwv8YxJtltIgX/mJKjsjqBoTSXYbvLb2bcBrGX6h0zQAHnAWrlXdHLpmyGodaevG9I0dIIcjcX0zC+d3mbhGF06lHJil6LG49P9VKwcSZ2TcBwLdT704U/iAS1eGM/iZrBjjgNPY2qy+zm8V0Mwn9OFzMvYhcSG1eqDB6r9hyMSW/okYTDNixUPW1GMwfq5hciM5CAHAfeJMgcmqHelIAEs7d3/W+FouJFu1fPoZz8o0zmiDB/ebGvc62u4GhdE3wYj4P/HgzW0zID9bkAWBn3l1I7rg1ItD4940XRd6XzSScBfOmkzcN5nf0gjTsRA+B3C8xeSCwN17s32+ixefVZr1cBtHmZrGmF+lhJ0QIfjCdrjaNQli4sBULDLT9eph7s2DE09Zd0Og23Fi0CO7kngkCHE6CeRzehuI2fYkDpyKmeiCwTZEYdbGyAwKpNfJOzc+wEyKEJtSx5UszwYLb23UbeTOnq1Y9EFjRExDfref+pPMtNzsBIXxaB9GXtk8SBasgHtFZtFgBQUTBqUELHoJ57NQ7MHmAWBHlzFt9HHHVRhMAvArmon8WRNEi2vheHNwt6GCjCQW8XExDfxy2tQChTW8pWtArsZ4UgsRevCbXzK0KsI696C4gf7a1KsB6vbyLvEnQ3U2XYq87IJGnQZflvbciPxejCQB+CCLRuaKiOhlg3tR9bft+GXKcBg8B+ZNz2AkVQjh/qxBMTpYQkiyTzn0+r5Q8HVV4ieLxWDYrjIajAM3kQD783Avkay4fCgXTWoXNsqKFL35vt2vXjGmryYiQARcb+pUzEuSVM4td+pTUFDvxe5tdVaYJFyeuH0iuF5ndXEyaq4sliSCTBQXarroYBW0tKNBuQdMoaudBwaqH6DlQTYfq2aHnqmIU9+xiQ9cs4WxUeTI6UJDDKz0d6Paln9ZAHB610QGDnCQ8mVbtDmJtUxABbPDB4E9N0ENeFc3a47Fx2AwxAY3l43BZQms5xO9tdu3i3x+vfyWZnlWw9fUvHxysr3/5AFv3V12indWll6pxlbF2/TUXWxjE5ri83BI5Rg8MdmD5MQFqWYhsRioHrxBQhtNXzIjBgxEIMOvpCFas6cQCOnjo2AI72n6EgEMU8DkC5oAekjqnNYqKFISs+SO1DulUgHW7MPbTy/6PA8+cSqvuYEU+JseCyxWytk4TAx72seIP+bYUC4PPS9BoVE1ugzUbMkj+jQK0VBYKY30Na4Qlc1Z2ZdJLU7Z3qp0HLDBQ5XAvAstwtJcZ0WYQcmK0UhSkZllOqgsUKQZyGTRYVkVBfm1tPhi8OxCNuKvqvChI1bmqxWC6mt+vdrucu1+WbkOAj8ZSgWo7NzoAoyEmIPNBKoQAhk9TMQPpLbUiBSHUlvqislg/FgnnrDydqE3xV6RWSJXwn65p5o0EMqV9SnQSi+m23ShHMe0kFtO8JF58I7Ab0i4817euyYb7Z5rf/tlqd3i7sWzIyxJGUdH6GOL3gB3xq7iTAKbkN68w7wOTjP8UO4SbrqxlxwuMstjY4V1Tucr/RWoAZKUdYd0+hEKBW4hUZFtVO1zURWgB1CzJnJoSSYgFtPv7nDGt3AI7PFU16Soagc2w6QyQHBuFxZK7fKxxxCfakT/+OmXllpPakovKZn3MM5LpMc8sds9JTZ2H6iQW0xexIWboFF8YYJAjYPT3RlZqiH/0IGWVsX8eOuGFoWXEln6n7AUyJ8S+53x/PnPx4qzlWpGdJZXM0XM3U5Iiyph3S7etY9DZtjGZrnX7N010bbR/mzzXmvWbp7keILxzlmuN+s5JrjXe++a4tuG+S4prWwDvmeHaxn2fBNc24jvntx5Af+f01gNRvFt2azvv7ZNba7x3zm2t8b5XamsL+H0yWw8B3zyx9RDo/fJaA8TvkNZai+D/J6u1NYzvl9TaGgY5p/W8ythtfsqYqCQGgNkGOQK4qPdPSTmpk7yk9QY1MQK2zvYOr5WsBDD0xOAa7/3zghuR75EWXAe9dVZwjfCOScE11vfJCW7AfteU4CD/XTOCD9BpCcHPNdK4xsZqhA9iXFNjNcIH4T+x9Nu+ystRt0FxIeCruj42p8COwssuePwYKBF1eyzo9aRJj0dOxfSN65ulOtCw0+owqkBJHjT0utzX1bPTOIndCR/Gp2NSJyXPXT6ILDb4AFZsu2Mlf4vKxWQFBnI+gY8GPcvwgEmzSI54caoajxNH+zmyhBQFao/pciNdtChUd1ghndMJIUhVsFl+2InLp5dBVQzAxAyj4/erIkWAaCXOtGVgwLYJw7VjMmCBADuhsOZjLodyHcoKJhJK0QKoJmGYmjsZpvRkGAB9bqQnAwDrrNlWsq2TnXMrMeQBocuapWKMsc26NvIrCHaDwumdLkkC93QA4kF8GVWlc1Vo0gPI81GMZJistGGIFSFcC7a/aF+Qhx+JxicZGnDtBrhGA35yA/wEA7S8Gyh/Y7oN2T5OHSbI+yKb+brM8jSn+ys6oORjk8NpBR+dFe6m2YZ92YVI5KhygOYn6RNrkqej8kXpU86qHuI1ynZnZc6AXEcDE9xnNYqFSiM2QMJlEWt/K4Y3URmcBlg9PcRruuFqBwGH6klByqkINV0+OOWsAaY5AMwuF4rL+9WXApTTHj2XciFpUZxmrNitYOgGKOJp8PLAMHlBganwkwmOXB15Xm7HXK1sgaJSUhTbp8ApVFqW3gEuMUfvJeWMsmqGgDyrIVaz7SBTdl3hQD0pRPmLpZOqZG6tj6IGWKfVBx7nbLenvhaKGmLJO2ZwBH1TjNlXXYiJdzetwdQYXZYhl1q4LwUoYi/m4Sn5xmaMJ1kC5fbWUJoe4HXLCAgpW4dWIlBStp4k4mvHpTLW9DieW50ki3GkU3qoERcnWeCop9YprerMDdp3oDEfWS1mIcdhOxMKWVksQacalksME9WzAmg40ykBQyzx+diO+7rRLnosTz+QgMYzH0UwzBvRPTF6ILn20w9IePjcg6Eo4nbkzP3x9gyQxHEdswEXgN3lS3NpM/tSgCJWCXWLvJs8m25lasAFzR5LxfMG8uCiebYUuCaesrTMrQANG9EjcL90sxEigqHMv2iyNemviSitsHO/5yYbKt39qk02NLpLD8pkQaOictJDXFxueiHq5lC6M8ciJg/VotkmGzQ9aqd0Xl1vuMEFwW5XdJXZbVW/JHXmXtLMRogI1tne/e26iHEk9+u7iHEkbBr7wTW32Ez2ze/bebl2ZaDbe6NaIKjn3fLud1W1AKhiNHpVVFwMANbPicOlGhwA5mWrkdtokKbH8LSzRfAo46kiGkXOU0rkyGIsya2UqHKQ1i7lFs/ZrVoxOMDMY8Gd5+BUOYrWLK9yK5C6AYrYTtI4sVopgaKmSCSzjMkSzcSgzMbcx4scoHWnQYwY6DM44JjycggKS18OYWOcRliaMy7/otYqw0aoCNzedkmL4ox5dpSn5tYFlrQg5zRk5PYCaHqI14zXuFSRPSXA6K9QmjCe5AX1SRkcIOYxz1yu6qwD/M+dJH9MQzrggmU79GQlLcTpZeulYnpSG6W/4IiC6Otgf8NSHyxiYLWPTAn+4nWilQAlh7Ds3pco1lr+YCCVuGyMTiAu5lxXjHO0s6RBAuLX/XDCa6O9UCDM26JFs79oUIDBk+JhjvVceCOuW5Riz9s9tJQFm7l7cjm7lQpSlAhYcDrGsjnTV2o1IZomReO0RhOHMreVwxixMsJPiuJrkn4T/aG6f0gVDmmwwODpNY2iQkC6qXliEemrEBBlRteaSB6aDkamkg/LnOdJ0b2esyojlBNdiwJKpzbCDO3MRrPt/vln4sM5SxD23SwTkdBX4SGfqzojFOS+Cglxqe1kHQI0Z9uK5+J8lxG1nsUEFYLY8D3VD5eEsZIQjWpPA3SC9aQYnGHmglZdDDkg4O1hStVuXzBOepqKEIGSR/BoV6hrUUBpU6B2dD4MNenR4G7v3qkRpHIVORqrfBXiYKZPQhPCekAphALPJoWQ6mGvBKDpgFcLjvRJoqjQkG7EhNz/Nqkx0MebJP3WVLnHmpHvpUGNgjaH4uVFzkmwiwoBicWWOEL71/4eY3w6F3Vd5hT/vgyB6Q//0OpFVYmHdRs+l0/SgS9IXl+MQR7zjNhFOUsQ9v3BGNrtU5VoWFS9UClR9YK2V+cicATjBIQGcSnTtAL9eXnKpx5/WdpTuSpXIitlkJbftJ+M1F9MAp9MUvQAbxL44cybttnEfQ9IHqzzND3Iu/XW03gT3IkoNzfr29tAZDheTOGM3Ca61Y0WSzgP49CbbvwomIT2TMRgJLIXLY4uHXM4v12cU//O7EmXwXjMnlBc66jJ8O75Hzefg5vVwv8YxJtltIgX/sKeb9cQkNUMiKS7Ct9bejfhNIzt+bR1uKbH8WbBauXdUQulLMaRll5874YRSogx9xeTcH63uVtE4XTqUUGKHEtbz0+VUWBPuG1B9j0A7u3UuxPFPohEJTgjv8GaHsebxt5m9WV2s5hi09sPoo1WqCh679ZyMaW+mkYPDNetPPWlGIpI1O2CEDrA/z7wJkHk0vL0lAAjnDu/4n0plhIt2r+Aae4tuL4HkttvYJyrabsZGEnX5C7m88CPN7PFhPpQTRYAdebdhdQ+WqMBfX/feFHkfdlMwlkw75LTz+/IZWjYiB4BtRNiskBQb7zYv99Ei8+rzXq5DKLNzWJNLszDRogI/GA6XW0ahbBwQCsOGGb7jTD3ZoH7k9ZN0OQ22lg0As7gngeCG06CeRzehuImfYkDl9KlWiCoTXEYc6myAYKotekuDc6wESKCJtKRRUvzwHLbm3UbeTOXa1YtEFTR8IsP03PP0fV+m42ACBbR8t6bbyaRF843wUMwj13a4gEXHPvWC6ciWPFuzANqd9BsApA/rYPoS9vvioJVELt3hi1OQAxRcGq4nW+7yQKkiiBn3uqj+zUbPQDuKpiLHmgQRYto43txcLcgc40eFO5yMQ39UdTWAWQ2HcJoQa6we0qIcbu58fyPzZu+jgLHSzOawOTm68ulyyxpIU7sxWtqK9uKAOfYi+4C6gd3KwKc18u7yJsEXWFxeKN1AyTxNEy2vPdW1FJn9AC4D0EkOshEUqcCvJuGrO2mXYaHp8EDuW0YNkJFEM7fKAKTkSWCJMtGpDqVgwC95DikFHhf820ujkOOX6pDu8xAHI8skpLZM5/LEVhcrGz5XFMERj/MVHasSDdO/Nzm9srt2ToVt1duy9EJ5kqU3YA8iWlVpgn5OfVUdm+xBkTaQk+DaHI0rV2z5Exr5WhatwDQGdfp0Tz1iFEiznTkqIW2zuzZSW2odWZLUqr9duSFnR3QzHMd58w8O9iYNUu4djIyDOrJQHdRdXfbyo17upA0sw2G7vaS62o0a3hJPBFrXyA/HAG9tOpqLMvp5TAaYIinFv8hr4pmB/TIImXzw8QzEk+hGXbnIEEDm3MkRpaQ+gLi5za3dsPFj9e/UjzPItgZSjdvdLYnnO9+1F+JjjVWl6OrvlXG2v0unJW82QSbl1saxmiBoQ5s+MAzLVs/zETlpEY8yXBco5kweKYanmU9WM1KNZ12RuYOHXlmJ9vPH6MHAR9CZo4HkU98gDyQT1xlrPkjseboRIBzu1Pg08v+jwPPXMqpbmAlPibHgsv1vLZ8HMEdtrHSD/m2FPskzsvuSFBNbWM1+94o9o0AdFS2TSBtDTsmJG9WdqXRS1O2d6mQBxwwTOX4XzzKcPivmdDmtHZBtEoUo2ZZTqkBFCWGcRnwWVZFQX1bbTYYujMPTbir6rwoKBW4KsVQurrer3a7nDtflO5CYI+lUnlquzaWb/TDxGM+DwnPHz4Uycwjt8uKEmQQ2+WLyOL8WCScs/KU0YNgryitjCrhP12TvBsF5En6WugUFs9tuzmY4NkpLJ55Sbvy5vd2P9JV5/p2Xdlv/0yy2z9b3Q5vNu0AWVmiKCpSd0L8HHCjffB2CsCT+r4V5s2vku8+qQ/ysFl7JC4BM2Rhof4pznhoesmWbX4g2OJiZ3fN8Sr/F6WZkYV2gnXDJIYEbppUiW2LQL+ki87iX7Mkc2mvJB3Wv91G7Upp1VYWr1+l3dPikEYSzmRgIR7SpNR+T/mmMBvYiE+0ccfm9za/pkdFMWwEFkfu8I3LEV+2R/7465SVW05plC8im/MxzyiexzyzuD0nNXECtlNYPF/EdsChFCmgv0GNYJGrBFmoEf4h/vwfQxSQYA==" \ No newline at end of file +window.navigationData = "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" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 036969ff..4083480e 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "eJzMvVlz5DiW7/lVrqVeu+Z2KjJz8vbTeGiJ1JSkUGqJ7Mq2azLICXexg04wQbqWvDbffQwE6c4FoANncflLV1eU8PffAbEeHBz8nx+0ei1/+I//+j8/fE/z5If/OP63H3Kxkj/8xw//z19rWVbJ0/98Mn8i9T/mWSrz6od/+2Gtsx/+44eVStaZLP/nY/N3j/2/+7+eq1X2w7/9MM9EWcryh//44Yf/79/aX/nx+NfN7/z+WnwW1fz5XqlLoZfyTGulN7/SFPf+irO047f/7YdCaIPvN2yL9/OP22qYq7ys9HpekUAd9eWiAN2y3Vr99+OfNtxP5i/v0r/l5/dKlhTotWKZ/i2fGkVG+pV4+0xuwEq8cdswaNdpnnwT2ToSf1PqENpxHwbdfrc1ssU8/uX4x59+6pCuO8MMiNEKENH9+0/bj6plKVFsrQADWymrz0plUuQYwFJWTxsVJsr3SmIRrQQP38mzQPWRUlZzK8HDdyrQ9ZcIxvo7lfN0JbIfj3/FUnaFWFmPf/6FhtUKsbL+8hMNaq3DRKrWTxm6jbYiPIznmRKoobyU1aLR4CH8ItWzKJ+RjMuNCg/lBW6yLmWVcs3WpawuVb5E4mVWgo8PP/hkGxUeyut1liERcyvBx0c26xjSPcw8HWZ8A+gwc7cDqlmog8w4ExlimnHU8HKPpXfPSmNH07LR4CG8T1eyrMSquErnWmH2tYa1atVWrRoz9bXI6aDzRoyH+WGdJkjStZXg4fsm9By/UXrZqDBQVuohzatfZ1qLdwxnpdZGRzQ6NKRDX5EtdSfLMlX5Z6WqstKiiPeGTugcgj9pFx7awzRVjx5v41ysy7jdym4rGsktf1Um/0jLf6T5s9RpJRNOezJVyhOVUNtkZOdW9kPsqv+J1KRG8UOs0bIsVF7KzyqJG512WtUqP1nlvfQhLSv9LmJ3/QGmbGU/5CuVUr9IfauoDbO6Wn20ZX+qnMWyv63ux1hWiWpd0g+AVvcjR0BLcCXLUixZjFttpD/EPrO2Vuvq5llQT8iNctEof4x1+v1avlVneVKoNNJttttA/Z7Lt0puxT/ERmMRqV1WcF+2DM4i0/JeFSpTy3QuMjMJ3Mr/lnPiL5eW1fZHzIyg2x/5OKu1yEsjwmhz+xMfYvFw9/VeyVspEhm3mdmUOoSdVR8GvY/a1ogvwiQ6LmNACI/BcLEN2nChyrRKVdxZ+ACwo8HCqOVKpHkaeUIxgOyKEFF2fSjyrZBzM2VhGK2IzGHeqJ2MWorkc7q8yKtIr/SoKkXylC7TRoeP9CElQl1zs2L7eM1J28+HjPVB7qdjLOViI8PJif/qi40ME+dFXv0Ydx7loEwbET5G/BdPc9bvfZFXcUeRbkTYCWQQ4UNK8anXzN/6IaX42Gvmr/2QEnzuNfP3rhZ4RKtBtJ4cr8L/MIv96IWvLXUgq/AODMUqvKkR7yoyk/myijvdHkBuFIj4uu2uMPHSsIGmi1jL4EaaQM74ocbJCR9rAjmje7ITE9yXpynBJ68DTvTJ607SV/O/QjcPXdRaCLt7CGOFbR9csLj9QwgtZAMxJsXsIAIogVuIESdyDxFKSvDtkbuIAFLQNmLEyTjit5QE351xvG8pUcN9C8k02tfy+Dm+luGc4zecBJ+cc47fcOI/OuMcbykBW4oxJGJPEcD4p9SKYBL6u5Wh4RzsfU7sZiQC0pY4gD1PBwS73zkZ4g32OitZ6XQe9S27dNviBGTddvaktFavv6+ljlrudtmsxF+NBAvfncwjT7jGgGWrQUxYB5eBW11TmJpJ5XnkyeegL+TDU00ol3O0ODFmJ9EhoqPCBzOGDJlohpNuNXlr9HStTZjZbP79IRcvIs3Mf4uuWr/KAdTxDjhsZU/UIFXc7U4LqKJuAbZAYm532kMZcRtvU2y87S5zqKJt4y0BRafuMoc0NjXeJlhk6i6jaONSoVbFRqWGWUUVkwqwChSRutMq0nhUqFWAaNQwwwhjUeNtg0ai7jKNOg4VYBk8CnWncfQxqPH2RUag7rKJKP40yA766NNd1jHGngItxkWeBtjLE3ca1k77e46zpZZlGe016BQ7gF3FkAa7jehWim+trVZFJmOjOx2gHRkOTi3r4hdRi+gRZqMCu8rrphzFoVaplljKVoOHcV3K8lsqX6N8fyNKo/LSqFBxdj1G/yXK93x+UUktKqX/N4q1lkobKSZeoVf3dkGCQ9WraiPDwvkq0uqEptvXWhx9v+87FPlcRi1ExuNTK8HBtxApjq4RYGFL8zQuX8eYrpXg44t2DnogZaPDQbrUIq9OtExSXAevdeatDgdpWp5G7vlHkGmZDDf4dHyZqGSd+5OgNo1WnYmUtUaLdfl8K2vPB25qN0J6K8TNamZ5Mt4XK8bBrGUmRSmvRCV1KrL0b5nUDQS5jKpFVx3Rp0aU0QZT5WTspsp5metPS13vtej+6r3+Oap6r8X2Ue/VudK3ssjiojqdxNVCad1K8fCaHQnBpoaJzyxDz5U2beBUixS3qDViC6VNG0gaMaodrddnMXsSuZlx40+gvSKH5c9wsBF6NwbVx+RDcNlA5VHwW+BtMyf1nqbZc2LazVjosNqOh4+w/TiqkqkN+WyhakfhljRehiuoF8hnSaO7wvqFpi3x9gpMRzjAts/S3FlbOEOjDjg5xcNudEhJve2UYNw+3BGbc6zexyjNNz7vY2TmG5NjRmO7t7mVf63NYQawnTtEDqal+9ho2rqr+uhbu9cGgva+wwJXm2lSDcXb0RQ8mLbR5aFpD23VeNuAiEt96eBsNcgIh68R1cHD2MpsRbgon0WelM/iO8Dd0QPt6nCxAu5wOEgRVzkCOXO5VFUqKpmYg0dN0cuPtprznia/DX+WVXIpXyBHkh4L/i6rJGsUufht3OZFvlBIbCuUWiE62t4ZtfWGIEG3KjyU0HPp/niGPJnexRh7F8g35LIRyrcC5FvuIW5EeBhRZ789UJLT3x20hZZG61zpG6WyW3uUhORuNBdKF0pleqPJY0F7dQ9DDL7+F04IDKIaYyLjqHaw2shM2FnwYIFohHDnwDtYy+d1lajX/Fzpzo0z7IzViC6Utn/HO6IB7jq6dw3QK4/eHcPEngt4AdKncWg7MerrkN66m7rThlp8jS0w/0CyDAu61Xku0ky9SB3dRHoFD6BdjHmwjaFfNZ4WIKpKrooqar5woHZkeDijb5K66nN0eRRL2G+LF3ndfGfz7/CDc5/GAbTQSTRsY/XWnac9LLRanZdRe7FpfiO4KEHbslj2yrwsXt0ZX2Y+j2rU0yZY3XKry2+JIv0GlWL8Ar6+Cj3yciscVD8lP/Dy1Jpvbpl/z9VrJpOlTHCtfWxIV5umxQedgRH0XMc5GGG/ZTvJmzQAc5C3m93Zc6/F/Du0z27KHk5v7SMR9dNtHXnPZ+w7YnjgjhIbrc1MRPPRj6wY+GrGFLOzvQIOEfslD6etUh4jDmrHe07QHe/PtVhJxCDcd8d3hBdGmGAcZjhzdFY9+NAxlBN06uhCRR07htKuxFsda3+X/h2fltZFvRJvdbx9mf4Nz1AbTB9/aupkhh+bhpIW66fMXGuj7YgbVcZeiDqD8nZBPsZCZdk27wC6hlWWJVZN1Gpc1PZL1q2DqFUsGi1e4ntTNege2IhVrdg+mE9lVglS8KRRZKLXcpmWldS1k/c3pdCNuxWse+SzFWRiN0tHksZthJhb9ob1j7R6vjEfeC5iL9hPor+m1XPR02W0hKaDGiXu3rmlJemaW2TmfjngZmg1HTM+oO2wGbQ3W5pbhbPOvgVrRXO3UPQlefmbZQ0RerJR41otxp+ee3bL0ONzL+ekvwF4gO4VOTgvBPURur/6KM/Qd9mAOUQPsqDfZq7kSul3Gxo/KwozWgJPRaaVDqD1BABim9CO2vS0I+O9iHVahBhjnBhQ3wXMEt1crmAxpxXfs02gM5MQe1BnJzBb1iXTtzHCe/gu/rGrdv/dK3VpTtRQY9dY6cDGLg8g5djlqE1vNIZYyRO1jks2G2JOrTxvlPdkDXYk9tlCNRKHW0IyEvvMIR2Jp23y9/jat0HS48dKB9bjPYCUPd5Rm0x9xGcMVR8Jt6QQ75kCPIQeYk2jvWeLSHq9zyTSXj9tU7/Xm1sjs3n949DNiUfiAPr5FBm2g/sqzh8TotY67jxvEr8jyM0OWqVPwqOW5wH04zZ+21QXqHX3Ch9Iux4zUbTofjVRRY37eKGR48Gk0F7ngMX2Ny/voK1qVam5yuLbabfgIbTREQ+6ffaqxluDdfKSy9hrkNtSB1B3AxhsxXVqhCqjxJAQnE7CyUYRLzUkRMVKhVCi8x4MicmSHsTRgzIe+NlR6Q5CyGG5DobAuEQHbk5UXNRoDIDGRO1mi76BPWQDX78OZIu+e+0EBF+8do+f/VnnVjaHkGdvz2JdVoDTQY/EAcxHU2TYyclXcYQ3KyfxMXcsI9mj183T9Q5dPQdQD9u28SqcpnMTgiEAaTedAgfRrn1c+FbtqjK6duHnhreKHcTTbeJG6tJECuaALfYurQNsKU5E6kYzqlOu9uOxhupV4Bi7XK3MPmcHmlFHxQ+mLY2paJpPv7KmThYhVwy87OjrBRH08VmAvdjwRMA7eIftuFxnVfSTFZ1iB9Fu+zT49rqtFM+Xru8JwdrpgNXeOEK1z520c5WtV3lkwxzVaavBQQjKHjtiROWLDaFUr9FRD2NI9QoOcAhgrMOTryNvK4wga5UceFXBTdnPZSdxlWjLc5CZMtjvS9lLvOP1qTQPhUMHyqb0YY3eXSjCQbytqYnYBvNnt/Av3wNfNddICRrCmHyQobRU+mm7fqWgt5pJV5PTgqLI3k/E/Fma1+KgY0LfACM5N5K6kWTkT+r/mQJ7o8ROG5uDcZoYmogxnLrzph0FdudVO27uUla1i/Zu/ixXUZfC/PClrGqncdlqEo+M3vkGUf+m6GHNNBsiwmmmriDvaRDFjmFLTblrmOa2637Msrdb10aLYvUbwgydzIe82El8mhW789nSUu1+dvDi9kAdXJp90DQtdje0xaXaEU3zvogsxbeEVoWSs3870vQLou7FyLlQ+kzUC3s060JpKeo1PSMvfFe8BcXvjKcIM/Gu1njIjQwXZ+fdXzRsX4uLWMdnyPfMAuCs+MGk8J1alxO/OZukJOj05L3dubo+qYdB2PJ6W/Zg1tcDJJoFdqeOJn3cF3ki3yiYzX9PGzFK5uGuwFyruJH6m8jWgL4/5K7lCqlfGjlG8hy0qBoC4xZUQZwqv15nGXDNOuJVeb7OMuTCNYS70HKemsDKz2lsUJELfCP3lEJDikLJ4TuEITR+ixDCW85FXGISN2wrw0n6vnpS2dbfewda3ozAa9Wtx7dELXRC7KjeCwLuRoWUE70aH0KiluNBjDOtTQzLSuZ1/g+anreUlTC6SavL0g9dlpCsgzb8OC9vEPXn1HQaMuynWm4f3EplUgB28S7ojRYr8XtFMGwYXCvEyXryLAjWzktZza0QJ+upnKcrkT3k9RQGcD85sBOrud5qslqg1pHJxfzgrRQn73mmBM0ovWiUOGm/SPUsymeahehSVkurx7ESHZBfEM2FKfvcd6nyJQlqZoW4WY9//uUPpWnGiszqvVo9TvK7Z6VpWkTZKLHSVjolahVlK8XKW28kaHhbKX7ec6Uhh29e6IXSmMOXCHJSbHbmh2rxK9kqeV0tft3DGvlhnSa/pUtAbLSLeZ0mz1aMm/kS4vz2IGcYJ/hu4rQ07jk8bVrmVoeNtPEkErmYG08ii4/ZR03T/brk3H3Q/NDntFqJIjq7kQd+nWVPtSA4o1Eou51zibitGD9zM7HQtJR2ZuFuJfVxR0lU01aMo6adp3+36hVW2U3Bgzn36/LQHPq1VTMdU4ckbTW4GLV6Bc4YPUytXpFThYMU7e3uIaJc3bvpSPzcQ2BSJ3egDfjuTuTe3s2L8W0PgSkc2wHEUK/2CBfr0g5gBfmzR6AoZ/ZuSpgne0iJc2PvpkT7sIfAZA7sAHag93qEjHRd7yYF+q2HoEin9W5OlMd6SEvirt7NDPJVD1lRjurdjDAv9RAS56IOowT7p12waOf0bmagZ3pIi3RLB3ACfdIjUKRDOoAU6I0ekSJd0aGkEG+umxXjyt1NC/fjDmnxTtwAWrAHd0SLdt+G0YJ8ty5YlON2ByvUa9vjxLpsdzCqBZKvFiBjG3p/VCav0nJl3A/x+YOGhQ/BC+RkQnuCRtVElmvKw0uWXCqY3CTQPIm9Ru6hN1qji+TcFtT/hIdvZPbHrWWl32OfJfTAd7X2Z4HNDmv+nMAEK6bVh9jwp8rpbPjbiu3RhjpdF1EntmJ778X2Z69kWYolnRmrjd7+LKnM+yJxuym3CRshvnmreXHi5jn28p+H2MoVz8M7gOx1rt+v5Vt1lieFSiNdGR5T9Hsu3yq5VdyfNYYdb4FVYaUenDal5b0qVKaW6VxkppzNA0hgS1pWW2UzR+hWec/2aZGXpiS1da3u/mwb7AjuZJ4A3+8dFD2A3YCLCLsXGFYQ1U7AzUq1Dwilhrwr7CbHvCY8QTturXHZ52yJA2mbRFnmmlrwjlfdN9YhyX+6qF0tTOqfXcwrWel0HnVw0sXcFicnK9ZPWVo+46tyI0Rbj73MduZ8/iQ6UUrvgxsJeJKUHXxR02YPC7Qg3kVzHef27APlMFfnNJMNWMB9QqvB9Q2bGAUkohVhY3yvJBLwvZJcdHORz2UWmSCoN3/UAsBEITvYnoXG1ZxRYKu52HeDemDQN4N2MKnVKgWPa5vS5FT1oyaIFUo+3IyQcCUC2zONAlf7auJvfjz+Fcm40WEmPf75FxLS459/YSb95ScS0F9+YuYkodwL4718A/fvHmdlhahZ68AwZHXWGly1WUeEfTrGITYirIwEhHx86zIqzqFPZgtzMM3y5IussHu2WkrkiQlzYdu1NbF+uK/ciHB95zRH95RagpEPTcfGVrwgJz+jwEXXxBriABsRTsYZ3rdhZFj9G+YH8IhcdIWWRuRcafsEd3Tuz543y4otlC6UyhAJQKeZo/N+dhnB6T6nmep4V9xnriW4vrMNc0UC1hpshNFhsj02cHDsNFUVG5XThapGYTg0TOlKlpVYFbjPuZHh+qIm9hOHaBS46F5FWp0rPescZkAxjdRCadGXouY1Z33g46VNaTyV8/ytPqq7tzEfoFNjh8TBnNC5yWiO7MYV5zmXpTnB85hCe6QXbJMNayK3xsru0w77N1eAs0qfCfZfVojjy0n6cR8G9dpD6qe0PZM+soPiDWon2fhbYgbiAxyBWYbekH79tF4spJbJbGUu5Efn9XCzt6KiFgXn9wi1AdRWHTVOGYbEOqYyDKaBo+ggK3YU+KDsIfQ8FxK65w3ryBtjU0bmFHfjQnOIT3H24kWS5FbO1Yvp0HhakSS6o8ZGbaJLU1mea7XCQzdiCyvGxryU1Vc9SwhqeSkrpUXCWsPxPionKtxbFchZ6XU+F3HpP9yoHSU22jol1oygXmshYPyYn3UwH9wb98/neraPIe4UO4BZYEiDnQC6leKZ+ev/wCA2AkRs+DcdHXWYQd9zDGKEvHwygsQ8euKhHI3nJ1qCgn9GsPWYPq/V4A7DAGpzESgySm/cPOVbBQzUCyCMnnnGHx466YTQqSx7EvPv2DpsdfjqsdzkcrqLfZdnRFtu0jiBH+cJI27yDd20jyxhqZsIgqKjx0KepXMZ++z9mNeoaOBj9555yTGj/xHtiO8UO5QZvUNDMqM3leL18wJevx1xol6+dVNiXmoc8WHGop1k8V1jgAbvFeNv2+8VD3mzaTV/fCuLzKTHbJfH0T7I3WoH0IcCIbFdK6Bmqbx+wRZR+QHjbBu0uGKpRSLj21an3CG0oiEOur1064WsZYwpoccXQXyQLDQORmcCGkLO2FwzY8RRmhlCOlBGmTGiO5kMIScsb8wY1JMyhpw0NjuMj3SUGIaSFJQDxkHqTv9CTgrI9OKDdSV5IeSF5kgZ43rTo1DSwjOhOIAnkqAQMkfmOxlzDlOd4Njos5qMiUMSmlBbgctd4rRhR9oSZBvpr//sjuRWvUavAPslD2AN6ADCrgIHtUO1DnSSQleCgYy1KzfWceCuUqMEdR6E0UJe2HCxYp7YCCMF+WNcqCiXjJf1+Odfur3dPlZhTuw2uGleSb0Q82nibUFsR+/V3uaZjhLHc9QTiq6+TrV4QO0LQkjIjQgN4ODbfm5yW9RXy7sO6zDYYXHS71xvIRMKoqONVHQljirIAyuHqzwMLmaVFwpsrlCWz+J7bKd2E3fV2JDTfKllWZ7KrBLDMICz3AyFNK2l+Z3E/I692JJsfkdufofbTG84G4FpQ6s4zVmJXCxledFYVcdG1zNO7MjotqiRbw2r5WUrz2eU3egSmbAVowSeSNOCHks5URNZ6FTptEr/lqPNM4a8K8w0xA5DLM7qVnk1yKSGMWIpK1mLIvKrRRjQdNtzLVZydFEEaUfTZxdGG3NbJN4c4g/SGLKfL3LT5qxj+SabjHh7+ypF9x0ZDH0BfEgmGNRer26a0Ofem5MobqvbNCLwO5ShZpgpkoS7EeID/Z4WTWWf1IVJ27pRb6rc/ilXWx9suGzZk2xdVlJ/LSrAPtapQb/1uh/dAMHi2bWD+zoI8BjbXZ9ef1b9gTgMs8ofZ9pCpJk5zX/QGaFZreraqu7XpEKrSs0VpT1dyf0aU26vMVG2OyP7cY2ulKVxn31WyrzjJgpKu2rlp45y/KAcY0r34AtNPzwE28e3eJVPd2r+XVbnwhxcRLsL/Na8yqeyVl5slMm/hXuWtLsn1CTZkzi4OXJMxzdF9ivTO0OuCm37Hp1FPU1o04nFv5QvEtilp23IGmFmQyhWKk5D2BYqQYbh1ykOo5iWKUEGNXuIa7lUVSrMn9J/tOY38u1vfNj3W4m3eufbuy2AtW8l3uptrwaGSccYgFxVOug5FpVBpmhZ65yu6xje2fw7mUmNcmKVRa28V9MIlssOs7hWy4EmUSyWnVZNrJX3YNjglTWsOY631vZgBHj977CAdvkfhE+z+nfYMrn434Nhf3cDfrHGUD0HucMA92bmbtD/UdsajxjpBkesq2eZV+lcQCJDdnMejX4AOvH7qta3BpUA132APa3unswwkezpXM7m895dczp7mh8Qc/A9dKBh6TIXwOF42qBWeE+GgCeVSSuAIdbBJoQNX/Z5cxrzrBbp4MXROTqYfH2jqdfJGxsM5rS6+zGDrGN0baDtFyMDPN2iyNLKHk/iJvSRDrGzsna8krIdbUXBlT6uPV98Zb3WouXfaO4L/w7jWZ22onQ4WHGr23DjGvcUrVlbUf6v00ZccnyeTWDix30f8xoArVGN4v5NKfuvzZIYs9HciznuaeQhTxepTAgmEpfS4UwlXjqCycRZhwzTid8G9IQSbwJqzNplCf2gFWMgalrxm4afWABGMH0mtsklxkT49OI3jHiCiTEHM8X4DSKfZHaY5J5m/mjdxKgpZqhycGEVTkC+yIpRrbIe6nuM4zvXDzUPf7TvNo3pdD/ULPIDfreVoWf8PEYiT8XdJnEcjIcaRHQ27jZs+nicxyCCE3G3MVyH4uGGUZyL+2wjCyMNNQfs2nRbQHuWHGoEzXGy2yLCcNIJcwbrnxMxf5a3JrHuMNtRmEWj8qRrnkUmlrF92k101EqhW8y4xkISsaHYoQnZglEL8Z4pkVzKfFnFHgB7mBvJrJXcX73XaaKvRBk7s3kMqeVWVo7vC9QJS04AR3Ie6lpvfATHXfcvUgO28x4btmKsBgxHxLqQHd/T6Ivsg9LER7dmq3yXqcpYol8g4ScuvmYPXmaq0j3h+OY+qDvCO/dOcPCV+1DQOnH/72up32GOKjd1rfqXUXU5qDhMuIP4bibgHV4bWuyyEjp6KHS27UaIEtQ1YMBuzvfKfnySoDEOIkNQv14mMOPvuXs4gffcg0BNd4VOBz3QrRAPaDOY40G3QmSgzp5jHniHuV1H5WnDPOd/rVMNdrm64Y4aVZQPa1xvvlxWal3K71KaC/0XhvpFZFSGdLXTRpvZnDTJqD+HkdzPt1iJt8t0Uf8YFfxKvGWNJDN8vVgxf3cl3mjYa0VzmrUSoISSAPQUtnqbQE8RK7cAdDsCk1a7ldxHvXfgqSq+A09f88O5qU7MOnglL5C+U5R2TadWq7SqZPINkkBzhHW00YPn0uxVky8vqeu5Kigz9r2qEOCl77UqKDTFc1Uh4Hk3dS4UFpo2NwhwnUUfpTkIGxUWxN77vlBC6PO+IYDVe4EHbERYAEHpfceI5IPSaIRvs1KdmD3uRb5Q0cwjBeLxPon/0m6kI+hzGa5a8jreRQkYLD3AGzVO5FdRnmRSkEG/inLe6BFjDxpv8wQkJPt4tyitfxowwY9gjsAze69KfIfQeS0f6xcbU3aEqEAHXxiTIbVXljbHvMzS+hn4bWu9VlW6aO6q4kGPNr8w3/xCPviF6Brv16XPNK2KgtMwq78Hs5wtqT7FgPnZxgLU96nViZZJGuvw93CZ+9Nq3goCa7VXXR7wpzRPIGe2Pm6jB742GYd9Y4/nCcGLjSIzOlHrPWq1GHHTPK1SkZE27kZzH+27Dn0AJ9r3GVCr4lLsh5tQAd3FPniUr3gS2zlo2/dH68CFsxcJHGiGIrR7lN5zTWgs+MtNngrzXRKC5c+fIsdkzo+DL7R8SdW6BD4CMGVEK70/Y5qY4QvYXOS2otFMEbNRKL59NhPgPJjit6KpFaU3wD3UqLXJ149ZIfYlSIcZUC4tL5Url1Zc5fYriy5Hkx8Z+jLrDmBnW2iCnTBtoS9B2haeaseeOcW5i/fVeumOrKw5XYJ6b52V550387nMTrVIwddm/KZY8cSIEyxYAg3a7Gsv07KSuRkUn9TbiSjEPK1gi0enbZvfyZrfSc3vzLe/w2omfknvMopoUR9mAiJVqd+CFTJVaYwBKu9MbmQWqFzXqrpRZTWhjiGg7/i17N66vJZNZyTj7yqyom+XbfQfYbt64/wSzom7fkC5UBoYjuoWOXwHspOY0ZM8qub9uZQ9pjL5licMdba/b6l8rf0bINs2pamjZgoT5Bd9NOmCOuqpAWt1W0sse+IBMcFm2AXcC9cXryKtTkgrupbkqu3+FYl6tUzSOFolLtSlFnmFWHsOeGs57KJzJ3RankI3wgPetExQu2An6mAcy02kRPIZctDQKUo8ggHOmIYwR/CTpW6VTN8gRUNiTpHcmMPv+ybnpjnCrjsPSn/4ZWcXD91V52Fd0V10dnJDrzkHYqpCapumJD6Azsm7EYQG0wWCY25nO8HJ72YHGgJe1riMwC1rAoHVazlbLOS8ig4ZcjOr11Js9biwwZfJndC0V8kDTYBdJHfyE14j98MPZpnzJjXTrKrkqoj9DIPSpLMM8ODThYQ68RzWkA/XvFhPwtoIEYIOv7mOj76vy3z4KmJLQbd2sLVBulrsYCKWiSFgoKl2jEc3wU5Cg4f7DjHtID+JCxvaO6yEA/oQ1NWlf5MiPndCp+RhdO8Oi6OTx1RXUx9cPagL6u9HdMC43tOl9fQhOlREz+lyuvoPCnLQa77Y226QuwndorQxA2kV221GLEeNSHSt9SrEH9Nl7wZ+piDdqBEjD770byJPymfxXV7JSiSiEpHgo/LEbrO8knlV+4Xic4y42Y4aUbkVja7bca35jo82STrPcvP/xC6YPCZs03PKjSyfEW20gYnV+fxeRV8M9BjRxhuYWJ2nRpbPiDb7rDnLgz4E7TFkK418DzrYmL9ei2+gmcRjwV+vBWJKCca2x+q3KvqOmQfb6mkFu20Wif1n/AnIJDY0GnAKezC4X9jEy9atDgsFdElQD/GLVK9kciXe7t5XTyqLdi56GY824ivxVtbiMGejsyK94RELqU/qvAxkdtSa81aTFx96WWSCHnVTJAZ+qXSaZbFrGD/5Vo8a29NTjYsLck1kVJ7W4whw4bmJ4E68cQ35ViuguCkP7laMD1jLslB59BUcD3FHjQ/ZpvE5o2sWVpC/cVRSr9L4F1g91B01RuR0JctKrIro+EYfdSsIC2qcAneParBIxn5h4ryA33P1mslkKZM7cwiZz4G9rxfC15Utt7LQGt4VmUgbhukyiCP8MtK4upmx2VUPOPs26UYr++wKl1VF8wP7MowyRNZpGHlobJRhPE3Qau+1AdqfZGt+Vn7PjS8TZYVYh/QsMFrYJcgO3JVcKf1u775ciTeIN81FbmXt5RfjVoN60+KNeChlwmHFupQJsxmFzI3/t3lH6d78HworGtnGRVu1srxG2I9B9SEaUfsl9vMVrAH14RS5BYtWldsEu/Mi/wpWdl/fwf4agwGc8OunLC2fSVfzG03+pbxtprPO9qHuCITG2F/oblBsp9iTaTdtXfLYtflUezKqUpXIZvPvFJ2k1hJWixO3HpU234EKvB6Uio4quwl2oiC2QG9F2Q24A3t3PfClhIWrRIBv35oka/LbI2zull9vD8i4ZavGidxGrJJRLzqCrOD1AEw+zNhxfV/jjDWCeqCxNuxppLEmUA41Fn8PY81VZ3c5K4rt27BknaG7zxT1L1TbX9iXaZ/F/HsdK7LW8q4S8UnVg8x76vxK2f4Kp4nXgnCOyPcwO9y2+Sqa2wFk8JtEGGIrvBdDaOe7jRl7mfg2RpR36/lcyoRu/N0YUpYdaSZjzM33NF+OxzKK79KIj4cx2q/jPsxr3ceIKIWeBOnBHuAeq5cJfJnVWVEcwQoOZny8QhA2LmTBwU0QtRAEXqJcDw5wAmdDEDg6CsDBThMI4MN3Dx9t2q+50sCe2lWgvZiD902N2I6oPFK9eiO9k+dFR9zQm4aebhkLqfEfoBE51PbRxSNvIm0FMlzvmjIDfdNrpxlT7eauUhr1UWoBbHvpZ1Taetvvn7VaL1G1veXrxhlVG2Fcddvq8xlSLy6p4FsxdmAbTQ5Ofj9tgI0mJ4lsDjAI8ty6jx/84no4bpKWc6ET2lbfiO6lxWOn0Q42yRS6E3YzXAJXh05s3RVlNoCpsxrp/XbVQksjaHf79bU5IlMaYTv8PDXCjIZoKYBvzPgsMIpUi8od6EUm5pKpTTXq/M3Ks9zBbL3b0vTXQ2DZ2FxY9o7IaqMHr9Wmplh8AX1kkuX7DtxKVGvw8N6DbZW4UCtELF0fFR0+50B196s7mSe3slxnQKfmtjzXVYUV2OE6YDsai0Krt1NrU6FZNgyYBr4vyAeOGx6G1AQDhBPZ15iBT9qMytNmDkdmQ3DT0WRDGNccUzYEjxErimwIU0b4WgrinRinBvXwB83u74cz4x8qr7+77nx5a8T8+1KrdZ7UC7xZnpwr/Sqg7m/nuzebnyjNT4g8WWx+gte4uWmyD8WJKL6I4irNz8ybuvXY/EeaJ+qV8qvVv7Uu5qJYimKV5nLzW6/1b+3hW9K+kDNlK/0TOVGGbkfqf0pZCHOxjPJTbkfs7638Hr5eva9g+mC19n6/UfuOkW0qV/EvzU+Y075mZLVXwJfno8whm1f9LxvRzK1BxowCP06lSLI0J+1G4wiQpPmVPfQmuqtsu0xb4W+0hb5KtQ10pjNF5dvhbg8mIG5DuumxVyJDwdtAAkr2YqvJjY9zzPmeM0OHxYTi32FTergtoEnsEWiELp5FpwtfpeXKDPtX4s38oylLOfran9v27VXzcyvxljQ/t4dh2FKwbS2s/L63FdBn6SYMQb1LFwmPDEhw4xvRshElN8DjHBgcoJzKLDpB6JQU7SlEXukUvATx4h1tdcG17qxGv5tfx7+vsduMWheV/W6XGe42VN+rxzjWOwKk7aX+DxKio0YKWrHdKtrhjK5f8xNzuDd9xN4qVz1lWlM8LQP30qVHhdb9+CRy816Zvbd8K/IldIBxP/q40a9jAHWrD679wEctBe1Nc49tDJfNg1/tZMmNtb83SqHmUqUq2mEpadaiD3mJddpOrnxTkaYyf02GDFShBtL5jty2EXuPIGYhEyPttosiQ1KoYVRZhtxWkaYbApmEyTsUYBM6AVGwUYR5Vjx2UadaCTWNKgOI2yzSVCDxJsEv6u8yB3lhP8oUZNaKCVMo0lfEmUKQAmLKHqpcEACjWNoaSXaIKGOo00RMGMeSLwJsLFXiiECDSTNIRBlNlJlhwk7KFA0w0zC5GkIMQydtgJmFzd4QYhpJGoco82xYHSLDyYRZ9k0YbMKTUHOo01O4DWPJUzFh4sDNeKny5fHPv0AesesWJXUoviodXccjmKNWJboOe1XirbgbpbK7TFW30rRKSOi2Q4H0aq3KZy8izYyzmYjsSOWiIxlds646895OyqSIjhPwgm/lOKErM07UgxQVd2XGhFaRGr3foH9fS/1+Br+lNCpPm1cA8CCsm4ju7edxjdFl3PGwQ9PtBKOuCL/9EeJ6WjAwJlODB5v8WetgY7SsRaJPtj2GNHKwA+1gaNCdOw8x/NZdMC74IWQPMu2T4sFmwB5J9thA+NT4lAGuGefWtlGIHU1R0nnmKc0TcOPoAh0ZJfAr2b2qmUCF3T13wyJunYfigkaJESh8fNiB2F4W0DKJfpdyjNpeD2jVWJD/Mn9zDl0c9XhrqfHiiBAWNb31WPEz2w7U8q/Y5+/GkFaDCm8weG69Y4Ack/3CtNFA1kuIBzraKkVX4aByvPfy1tE7TBdoq8OEKfOkUCnFNz7qSHHBFmmpkvgLPE5aqwWLDw/DBezMXKTQbVkYZKHlS6rW5RldQ2gl+RsEPCenixuZjdOL7BtcYVe+h8VJB9hmWWFOuNRiAa9V11XGJyuKrNzddxiBh1Vu9pV4wxxNRWDT1rmJudpTfYNv9njJcZd3ItBtULH8bxtkSMZvY4m7smxGqBy1RBteNHwBxg+E4hYqLVVOkabAbYLVJ0tNMGHWaFAv1VrPpfGKw6LpHQq0a2fgeY2P6wh1WuOqL99KWkthTjGpuDt6nNj1mVD8+s8DvVHjRF6Jt3S1XlExb+VYodOcFHojxwldRxxQIbdinMBNJAEV8laOGHo8LK+zaqa1eIdEIQyL0+biSlcyL0HrDgfVUU8OUqv9ivKdDJj/kQZ4I0UJ6/z+dVYT2MHzWID2RKDOtwKLEvegHdlEK4i4cEel+fBVEpvBx0ttpRhhIaf8PlqyY/5wfJA3yU0P9yiFwmIOzn3U5Cfn4eZAzxZ8pqBOGMKxwafRPm7a4+hwQ2Dn0T4rCA+kJ01wzkUnKluvYJbYoh99BX/EMr58j6rMpoL87up5ar7e5xTg4RuSb9SeUqh/bzey8UTgK7lVYUGs3gs8YSOyl2aAWIZ2kbFL0BHkRJe/mz/LVWzulrHAIXX/DhE4A4ejingaaRd21FQpYJ3f/ixPMBuPbXHagNc0N5cpENuOAdhRrYjfdHSqi3wVP0KmXcPvRgev4IfkuPX7blD86n1IzLR2320KbuU+NINg3b4bGblqHzJzrNkDjKhvo6lXmq5q751ZNbZ6x2wyhsDkWwwn/mDGaRJI5nOVSFhsgUOBdN5ZKp1mWewiyEd1tJVD17Kr7nzredyjRl5rKJ4zmjbD3V4ACUc7JWnPKIsiS2Vyo7J0DqzXDdNRI1a0YtDKrOvHG+VXyaWCtoEta0eHAzORlbmKnMziH3EYobZaAvh0QwDuQqvVeRk7Eo9IjcyiBCXTC4Bs7h8BV9Ej2EYOs4QOgP5rLbTIqzSXyY2IXtuNoDtyhYC9ORsAbW9mw7ZRI2Qrhrg8Fgx8V183MtllaJjt9aUnq8eBXa8Ur+NdAiPeWgjqEAgBVQSjQ6VIxwb/3NqmJT9ReSXfYhf1fqFDnHldiKQT8bAyWSc8pzWE81+gMejp0GkHzewYaALZZOk0hXbuDDSJYLR0GkM1eIaagRtL3SYQDK1+fOdIC4u57JWlHU/XlTrP1uUzJFfjGOvI6C2MHjg7Y7+efPsZ8zR5rK/MgbvR4cOMj0bzcALj0MJAmyRQFFXakeKBTcxr41omALedg7dVg7rtgpDlYmGC7F/kjLi/bYT31PHSHPLyjgN8K8QD2qRVJarmRo23bttEsyTNuk0ry9mqba5I0+go6timh9yocSObHKQmUyEl+GKryYhvGshNm12XCN/8YdHRZMa/q8SSlL1sBRnBO09qlCdqtUorkgmz1u48qlHOO9pk5jhXo5jTF5ZHfNvZEU20XYjCK3HH+QrB0tlNjJxlQrEvDOiLyICeBzd72ohifA6hBoAnSjc6bqrcBW1ukoDfjHRhG0Hcc5Hh4DafKR23dRRzYtcbu7qVQF8Fd7DXonVbQT0KHmTA9l1lQgO27YXfAFkf7uKZNzo8mJmCbc97jFaEB3Al3oz3DhTk5EBdiTcj7IhwooTuLGei7w86oIdyZNDOVVHz9iEIuylLuyoieoRrTEj79Fa/9qYySCAe73YYsaJ4tDsMHuG97SNvhHhASZ53cXDTPeriM6OXS7iecPHUrQwPZFMn9YOGBE2jkatauT1AQ15r3UWeNJo8+CZnE1WFGy3m2t7iElX1lnlf9VyD/5FWz7XnaQ7J9b7bjte0ei56+txmMVq0L2PMhupcmd3ZZirHm2FEF0qLviirAc3umIw92ejRYQ+Xi2Ybe5EvFDToa1CedNk4F4V4SrO0in/r2g12NFAEVOuwvry793VZSR19G8LHbeVg1yHCodWqfv4oVfmJSuSciH2rOm9U92LCpXyR8Tu3XSZkjSqfCbJQ8/htspO7leKDhVwS88CS3RILhgdcE/OwQ++JBaPmKpFUg4nRYh5JMPfaPNTkF9uCjdEKMKc7bWiU+OrduqX/EFl2LXJVmqR60dnaPexW+lVkWd6T5jMGfD3PYwHt/bxgM2C33Tw2EF53Czbgb5WTjT1Gi37sGa5q6/tdkDRknZK02X6jq28AcgSstE5N+HoZIFJ+CNdoEOENvuZDsdQikXWs6qmsRBr9CqhDgXifEp+B3scET0Pvqqeps8WT+MMtP3RWzwiwU64IcMCKzcsMXbNF4GpZ6XeAS8DL3BXkBLeT/W38wsdLbhWhC6Bo9D9VToz+t1VkRa/vnVH2S6u4h45pfwjmRNpBj7hBGGFAE05w8xz/XKWXv9EsnoFvVsbg6/dr+VYB35bwW6Dfc/lWYd6XiDDCIBOBWyli2OHCZJ0mkEXmphzpIuQ5XcbutPsgR41CfKVt6sEbofKKI7MCJGCDb/iHfLpT8++yOsG8FOJRoV1kmiUWNJJqCtAu3lDhVL5anL6rw2OM/bd9mmNi5tWL1A86emcyaUqru7a63GYUWlVqrmht6IpyG1CfiXK0qfpEdI8NKn4enMQHzoW7oX1j6WX6PXZO7JUlHTefUpPi5z4+peEY6chqQXMa9uvHh7teLKSWyWwFcHy6kBs9sYI+YhqE3fZzPHBHiQdVS5G8m5QhBA2i1iobLTLcXmyBSJL64aHLtKxkLmMTSDmgRZLUzw9lW0UedEjwm4MXHPwWBFnEX292tVrg3eYgRC1X6kUStwIrup+GYCZQPHGjwodoQqlORFa/n0eDayKo5ltFHvRK6lWak4xnXSk62MEywRxSaVB29m5R0kXC4+NfrfpFXqyj590h11Et+Fr/c9oIxtdnt6K8mQTKdGk+WL3yrd/URLNvNTfvdP7jRy4DAB79MTHUlR8CiMmDPyZF58EPQYbkwR+jgvPghyCu8+in2ceEjQgV4PG//6//+8efj7tj1ec0T+5kVXUmXLP6n+TclsEOUR6g3l4mCMeU4ICxf3tS/+lZnQ1j6D/bjefV4Aa+yAmI+yLcyDhWdshzWXUiF0Ph6lJ8UE0M9GxdPcu8GkbJh0I6VdihPytVlZUWxYnKF+kSSj2QYcC2Y2ncwLQtwwJU+6xSlZ+LedXNGxzANSjKgHcq5+lKZP215k6ybikOKLU297XNY3+xYIOSDHB2ajjZBmKH042KsuENz78D0YjuTnixvqXytd3Xmix/uuOnC0R0SDDgfpHqWZi8HlGtr1uKAaqZ4m+0qv/zn90Ny042R2EWxLRKRdaMXFfdAJIAwmFZFsDql59imKpffuLAKF5+imxcmyIMOJcqXx7//EskUbcUH9QfSicRC81uKSYoyMTUL8cAdi2XqkqNrwQxQU2IsCCXlUw2NROD2SvIhna9Xj1JDYLrFGXA+30t9bv5OJmM20QMCjKg3com8KE+JYibo8ZlWQA373eatcRvIk+yGK+Kuzwb6K167S55YjkHxdkw++FngXAksWcOpE5O6ZPhay070RyFeREHCfhjAG1RNrxLtVzGdI1uKTaoxpUQvZt2lWaAvBd6KSMWBvbvOUDaI5OHrod7N0+3GANWN7A1bnYYluSDu3eFYIfydQtzIK7TJHLtuSnCgNM9wYj7nMOSbHC3naDfQKpb9cqGM3gUOJCI5iXgTx2eP24eT75ePlxdP97/6+Zsw/MidFrnXPEz9UuSHn9/vrie3f4LCdNEx8UfyA20Hh/rADsf6tevl2ezazSrUpkUgJQ2cbD/usd+4iPYM1RRmCe/zW6xmPNnAYgfisI8neFrMwHFtsRhnp1cXM0ufzz+FQ1r/f1WaQ/Ixz//QoRslfaA3PEq4ohrIVbgrw+fL/Httz5p2Qvq4+z2doaeFCzwo2i8OZzY55dfZ/dY3kWmBCCoJAr0y9nX32Z3v2FRl/bcgxn24hpdp6Cbg3GQN9/QA0FavHCPAZdfr79gMTMFiTSOxqTp/QZ2L33fIBNMX5k9xmCGvfvt6y26U5XPSnN3q7t/XX3+eokmrbN8MKPeX1yd3d3Prm6wtFUnjnYvwI/Xs+uvd2TYj3V6Jmb4h4eLUyzxeg3JaROF+W12S7G3eRGaZ3szcgxc3dye3d1dfL1+PPl6enYSDT4oT+okuJ39QcJzpAXgNrdTbvrr/3l3H99IncR/lxW0qe5EHrSBZl/zeDX7z8e7k1n0jmFUnrQN9HakeCzsDnesOt0iertTOnzoigGIH73nnaYH7nwD4EdN+3z2cHn/ePbFdInHzw/n52e3jzdfv14+3l38Gd/QJ9WIfbaDX7u4vri/mF0+ntyenV7ELuUmtXi5785uv53dPl5cn399NAuQrw/3j1exa48gTWo7Hm5ntU/i5J+Pf5x9vvt68s+z+8eb26/3X0+iV6jTYsTkTS2dzG5mny8uL+5j91Sj8qQDemeCIuHqpkoGDStj2ekx8feHs9t/PZ5fzr7ENmOPAX+ZWJ3HcTJiLgP+/HodO/R5yGEZysKQ3Y366uzubvYFiN8Upm3Os5Pfzh5vz+7OYgdlB9TRXMyf5aOWpYRttAeaOw5hZtcnZ7EjmZs6n0NSlEcDQ+Y+J7CWCeQiXyzw2X+enTyegrtbj1m+yfljguxwYdh2hDu7vf0au5F1gdvhzWRihO1nAei3Z78/nN1RtBQLr2VdjB//9uzOrHM+z+5PYp31LnpdR9891i997Q3+7Dp2DzyBDkrAEAveWU8SkNvknY9pvlAs6O6J8WZ2D2wxpiT1CvT65OvpxfWXxy9fby8uL2exYIPiXHQP1+1i9Cy6ybo0iDnNEtNsfc5ujVfnKnrmG5Xn4bu8nz1at/3j6cXJ/cVXQGTPlBQLdWc/dvP1MnYR5NTg4IT1n25RDiqAm3NTjpjnt7PZ6dktxJvTKUnMdHENHpK7Rbmobr/a/+efF9ETtVODdDs1O/nn9dc/Ls9Ov0QPyX64I9yTbF7tHTEt2/GBwaTmpbbHDzHt5uHz5cXdb5T2bF5J5TTC0yW6/kSw12xajLSTdFoWPWS3ZaG+hec3dn+Uxjn99fr67OT+8erraezQ7pKgHaXu/nUde1TqhToS5XsOeKPOpznddb+en5OBq8ViX9ikFc5c34MGfTX7chHLXpchXgCYY7M6xOrx9OLq7Lo+Ib48u/4SvUjxC/ETx7rcXRIMlLXD5vH26x93jw83N2e3j5+/PkSvrvxCDMQnZ5eXd4/1LwCcTQ4FDkYbyXI9uzqDt9SxCBuprY37WXzUtVODgfPi9Oz6/uL8wny0f92fQXrTUIKBsm7+mKrsCzAQjpwUkB2oX4iBuK4JZFcaaXBx2o93fju7gtTpUIKB0ngyTDzKxvUH/f5uIWLi7Ym1PaiE++kmlIiZb8/aRdbZt7Pre4i3wiVBuw24vz+7url/PJ9dXEbvhb10R6Kq5KqoHs1rHMD9sFN8x+GqLUBoR5PjY38m9DyyZ7d3F3f3pqT5PA+3sb3Tb1dng/xYmNdRTS5z+7nWGnY8izT24Xr2bXZxCZgtw6xc5+JFpBnsGUCYebZPPX79dhZ7Bu03yXaoR/PCzb7MuLm9uDKzOscXKnS6Evr9I77OpgjhcKHl3geMTZGL6FtSAXaAHmgINmQ0X5rp+Gp290/47O7UIJ7X786uzbFLHVzyeDK7P/vyNZrTqUEc1WVCo+IndT9ZEyQFndDdwjtvr88eL7/exe7yJoxIRCUeM1XCAhVBRmx3Rl9msVetpixJ64S7ZvxcCtjNK4g5F9f3Z7fXs0tQdNWEOXVC+1xkiDgriDmXF1cX949n/3lydnZK2VmydJVWj/JtLmWyxx5z/fX+8Y/bC4jbYcKYXFWP5mEO8AQNMeVmdnt3Rt3KCqFLuecm1gbJP367+Ho5u48PG5+yp3n56/ElVVmbpn0/Zt2d/HZ2NXu8uri7AvhfJ2wq6wRCj6u0XIHD/kAGnZ083F7cw+JGp+yR87VOK0wEKcSch2tzak/Y1ta5OajfXwMz4xj5AFC/L8T/JabWjDdfLy9OUCtGq0DrCfo8uzZx3qgpsMN1JJ5EboK9Cea+RnbXTuj+9gI77XUN0LKy5fdtwOPX+9+ifQa7zXhU1TPQbRBvzP3Z7dXF9Sw2LNFrRfPIGuyKRhD+qMfWsR+3XwENalOStIc2jhgkTetzAVbkVizMa3RilgYP8bseN/Tj3CwI1tDNTij87dnN5cVJbMzqCFrLIkvnghn27n52fTq7jL+iM+ItK5EnIoNe0JlEHvau+9n9Q/Suvi50GF6SLQrWLWKVOF0IHVYKn0EQMDi+r0eLjOMLQsX5Mzq0FA6MEGCcx6IDTOGiCAHG+CQ6uHgnRAjsV0yDVYztFOEO6RCi/R8hqEjPQAeXxBUQhIza+3eJCTb7YcDQG399WtxNvyBUxD6+g4reuHtQByuT+9ntl+iL8LYQ7X78Onal34E4Ejlsgd9oBK3tEXiYPUgQImwF30XELN59iIOm9nDz5XZ22vQMSHjQWIC2CT7c/2YiJU8gPmsP25EYvikaX70O6V1pItq7G9A5yWfNXBTiKc3MeI+ao6JN+u3+3px2/7+QAAafMc9VVTxq+d/wAIZoM77ezH5/iF0U+vhVIf5aw5aG0eBml0td/1plcs/13+SeIjKgsu+J7An9dnZ9dxOfFNYLr0VeFtD8sNH430x039dr6gHpxUTzqZx/NPLMZW0ys5vfZnfQft3TOLwZbYxHOan11YMCXunsaMK+OA0YtJumG0Sa0JQiDuyqI9ntPZZtBtLLs2/RGab8QizEF9dExC4hLPEv2+YqksS8e22derP59z/k052af5fVTRPEsIFerPPaT+mH3qlFyL15oycUzhagJFBRlWP+nPbXq7LSovj9tfhs//5u8FxrEJNHhJLUvvsTzPReod896/x6k+869NfNn1P+usrnovr8XskyBmJbipbFzCPbT31i/ziKy6XAyWjfEcYwWgVOxuZpdAxkI8FJad+vxEBaBU7GzYSBwdyIUJJqKSqJ6TpOAU7C5rLA+KVTAOxQi5E7vpk6BTgIT0UlLlVZdh7QhXA6ZDho2zXXtzYGFYk9pcfBj8TloWte3QulMX9O+evjRwsCGDaF6Em67w8Ekxz//As9SecpgWCQX36i5VCJaXgnKjf3Ns/yuUrsVa0ILKcEB6VdFV3JshTLqBbtFOAgPNfmHwBkdUEOomaRdivLQuUliG0gwUh5Vx8iX9gzZCjnVoSTtH5V63QTBHUqs0pgoF16HPzfhE6jFoGDkuRMD9UicmZoChGT2IcTfn8t/iyrBNKPxwKkhAuxzqr+GuE3kSdZ1LpzSoaUtkyXuahkct95zy0cclSakq19wzUYpy5ATjBr3mWMw6hLEbLIvOnds/lcFpAFgEeBg/FzmicxHot+QQ6ik/a1h2gkW5KFqX3QIZ6pLsnBtHWv36gsix1dp2Q4aMF8bERflE6zLGaBMSzKQdWsXU7UapVW4EobqzCyYim5+YbrQCyvU4+D/3fzOMjt5m2QaN5ueQ6+6HXvoCQ5U+S6d1uIkGSRmfxauZm8I1cjg5KkTEpUn46jWOoS1AxR3pmmBCHD9n35UIamBCFDmsd9ifrvaX8/6ivUf0/5+/ZR+uCfL15If70kC3LYJUVIbR5xjyAzf07863EO3qYEMUPseLopQ8jx12txavf7nc3+jcrSeQzZhAota7NQvUv/jlnw9AvSEnUMPhGVXMYdSLoFaAnt2iS+yrblCHm0FAlkpdUrx8VzvV49RbnKHKUJ2cpnGx8cSlP/PeXv1/uCGIC6ACFBBfAMVgz+wHW1+PVS5ssqZqm1LURJsk6TGIZ1mhD++ovQkWFnTQlChvpmXutH+U2KuKAKR2kGtujhrV8QS7QN2938ba4S+d9l+6ct2Eol616wbu/PHBid0PDjX7fXg6qquO9caLDiTTGfeK9QoMV9K7YwP/+4NXmu8rLSaxPOA0c56qvEYPXVfMH0z6pE1NRRU3zLVZXJP9LyHyZBW32h5380/5Dmz9K0rYQKPFNLBLct/QHYhSjLV6UTBHtH4iMMQHWto9FVo72BN28BX6X5/bNW6+VzscYY0sit0rzqyn2cYfeba2hIk1z32fZoTKXfKUyp9PuHGlJnRJAIEzYCHwBfZWXnGnk8e5WVg0vk+0T/JnW6eMfhv7QaH2GC+i5zDH5T/gPQ16VJBrTCtPuOxH4MOP73n7ZLyHmmSgx9W36ETk+6ubWIWFuO7j1y0S5l1XjmZutKnWfr8vlWvZYI+qWsmgghsa7Uwihqq8hvTWmft4cP7XnATffA7tfZ/5joEXP9+V6pS6GXsh/bvYPTWfhj90N+JMy+yF1LngHtyfyl8T32r5jBwWvBMv1bPjWCfOwr8faZGn8l3pgtGLTnNE++iWwdB78p9PHtt4+Cbbfb2uiMTL8c//hT987XOg+eFZyEtjwNW3fU1LKUGLK2PD1ZKavPSmVSBC+7HHilrJ42IjyM3Yu+MECrwEJ30vXIgugany4L3anA1l1zNYmHbnzxCMbY1eEk7Z5bY0itDidpJygDA1rL8HD2g7xhkK0GC+G5CRjCAS4aCRa+L4PwIxDhNoaJhfECNSmXskqZZuVSVpfdMBgQXBNIw0aHHm62sTYsjNfrLMMB5laBjY5qhjGc/LNMhxj96TvEzC2AaMbpAPPNOoaXZNw0tMxj591zxKGTm7KNYWHh21z9ukrnWiF2qoZ0EzeyasV4ma9FToacN1osxA/dkBMQZxO0wkL3bRCSAgLcxrXQM1bqIc2rX/vBnvGUlVobGdHIkHAOfT7vlbztB9QEcG4KfbzPp4+C9flsa8Pno4z17Q34wH48F9nAG1WoMq26OdPi8ToSHIRarkSap3Er4AFiV4OGsdtz5Vsh59VZ+JGDg9BqAM4dgghN/OnndHnRuwIBqUaRPKXL9iYFG+dDSgO6ZiZF9uuakrRvDwnPB/efYIzbW1SMlOjvvb1nxUN5kVc/Ru10HIxpo8FGiP7W7S0tNsKo7a0bELSrDeJ7SAk+8pr3Kz+kBJ95zfudH1L8h17zfunujVkgoJWgWS+OV9h/mIiI2GWtLXQQK+wOCsEKu6kN7yox69+6iEfcCNDQddtbYc7TQUNLF7BWQY0tgZTRg4uTEjy6BFLG9l4nJLT/TjNCd/IDSuxOfidnfZkEuC3ogtY6yH1BGCloY+BCRe0MQlgBW4MxJ2JvEMAI2xyMKHG7g1BO/FfH7Q8COCEbhBEl3/jeMuK/ON/o3jJiBvcWkWdsr9XRc3mtwjiXbyjxH5txLt9Qoj8331xuGeM3C2NE+G4hgPBPqRV+wvm7VSGhHOxpBhnjdyNGZYjn28t0MJD7mJMh3GAPs5KVTucxX7HLti2N5+q2ryeltXqtU2oByazCX40CB90gZz4Er2wlaPmi7qsMW9vorgoJUdy9lHEPCHuLazeVc3w4MTYnsRcjRmUPZNQYEpEMIN0q8tbmNj/TQy5eRJqZ/xZbrX6RD6/fHWjIip6oPc8Z71yso/r5Tv5Gb0sOuCsFs8Q0rxOVkFpjNOdWc/8W1f9EZ0wjt3876kvTIi4WeZcxXc39W2Qfer9VpCZZUa0+1KY/VU5v099W9ANsqkS1LokHBSv6YaOC/fnhAyBUZq02uvu3rMmrcPMsSKekRrZoZD/ALv1+Ld9MoE2h0qit5E7T9Hsu30z4Tau8f+uMLXQWWbW9WDHYxablvSpUppbpXGRmaL+t3w4ntC0tq+0vmHFet7/wQfaaa99GgsvaVn//tg52FfbNo1hfQKfUh+8bhizIjUK3QnzrabUqMhkZY+nA7KgwUDa5hS5iFsojyEYEFMTtZhzFglaplkjGVoKFcF3K8lsqwzNnuBiNyEsjQkTZ9QD9lyjf8/lFJbWolP7fGNJaKW2UeGiFXkXmm3KC6pUr3RQd5atIqxOSrl5LMfT3vhew/9gMZERqFRjoFiJFsTXlOcjSPI26kTVmaxXY6GLdfB5E2cgwcC61yKvB20IAzlpm3sowcKbladw+foSYlslw005Gl4lK1rla8DVppOq8MZy1WZikUrJ2ZaCmcKOjtzrMpGY2p6J9sVoMxFpmUpTySlRSpyJL/5ZJ3TRwS6Vac9XRfGo0+Sww1U1Fbqqblbj+qsR1Xmvurc7rXyOq81prD3VenSt9K4ssKrrSyVstlNatEgut2Wzgtys8dGadea60+fqnWqSoRavRWihtvn7SaBHtUr0eiNmTyM3kGn1a7NU4JO+Eg4zOVzGoOh6fgMsCIg+Bn9/bWuwbmc1OEtFixjqH1Go8dHQtx1GNPK3HZwlRCwq3o3EbXAE9Oj47GtkV0sczbYe3NyA6wMG1eY5mztmy6RtzwDknGnUjQ8npbZ/4cfpQR2jGsXkPozLbeLyHkZhtDI4Zfe2+xbxNa04hYO3boXEgLdxHRtLGXVVH3sq9FuDb+Q5+V2u5k2UJOU1oyh1Iq+jSkLSEtlq8X18k8a6BHmUrQcU3zAFdh/AiK7LVYGJ8FnlSPovv8e6LHmZXhok0/t6EgxN+fSKQMpdLVaWikok5JtQEPftoKznvSbJb8GdZJZfyBXCA6OH/u6ySrBFkorchlBf5QuGgrU5qdchYe2fJ1ruBw9yKsDACz4/7IxjuBHkXYeTNG98Qy8Un3wqIb7gHuNFgIcSc0vYwKc5pd7AWWhqpc/OctMpu7fkPjrqRXChdKJXpjSQLf3s7DsELvWAXzgcLbBpD4mKbdpDaAEnQqe1gCWh0UCe2O0jL53WVqNf8XOnOzS7k7NRoLpS2f8c6hsXfJXTvCIBXCr27gYm9FOyCoU/isHZYxNcNvfU2dXMMs8Aa85t/oFhqBd2ZPBdppl6kjm0cvXIf3iLGNMhm0K8Wz7cXVSVXRRUzOzhAOyoslLG3NF11ObqYieTrt8GLvG62s/l38PG2T+LDW+YkGLKReuvN0xIWWq3Oy5g91jS90VuUkO1WLHllXmWr7ow7Mp/HNOZpA6xsuZVlt0NR1n+l+Grf10OBh1RugQPqndRHVJ4a880k8++5es1kspQJqpWPzehKk7T0oFMrfH91nFzR9Vauk7dJfMTB225yZ3+9FvPvwJ66KXoofbQPRNM7t/XjPVUpC5VHLZ/cuB0hLlabzIfkcx9ZLehliCliZzuNP/LrFzyUNkp46DeoGa+Hvzu8n2uxkvBBt+9K7+gujC5+3KU/IXRWO/SIMJQSckboAsUcEoayYl5bdjFTvLQczB59wukkBh9xhnIW66fM3Bwj7X4bUb6+hzk38nY8NsJCZdn29j62dlWWJVZM1GJMzPYj1u2Cpj0sGilW3ntTL9h+12hVrdYeiE9lVglK7KQR5GHXcpmWldS1m/Y3pbCNutWr++Gz1eMhN6tDikZtdHhb9Ib0j7R6vjHfdi4ir6pPgr+m1XPRk+Wzg6RbGiHmPrllpeiQW2De3jigpm8vHSP232q4zNmXJc2tvVlnU4K0obm7J/qKrPTN8oUGPNmIMa0Io0+5PXtg4DG3l3LSgwA76PZqHJhfgfio2191hGfduyxAHHYH8fdby5VcKf1ug9JnRWHGR9h5xrTQh7ebADxk49lRk54WZPwRkW6IEFOMWwLojYDZoZsLDRzGtNr7tQhy2hFiDebUA2bJuuT5LkaX/5v4x6vakXev1KU5BsOMV2OhgxqvPHiE45WjJr0RE2IlT9Q6KvFqiDG18LwR3o8tyLHXZwnR2BtuB8XY6zOGcuydtsjfz2t/BUU/HwsdVD/34BH2c0dN8vQNnylEfSPcjkK8Zyr+ke4QWxrp/dpD0dd9BlH29WmL+n39WiXyPDVJk03Ju0pFXYhxlP7wXu1jQnZlV0URnhZ6qeFHhjuIe/fdto6n+2et1suYPGRe9I5qtVHltKJey5KQt0rstHfvqyeVnaZz47EUUReQdtCXtXLSVWa0JvbM1t9LgQe3EaxJWs6FTghbeqO4l1Zu5j0K5kaHmfRWLqQ20QIkg6FR1F1FZnqO3ml099s3m2uUdqsfm2XSa0ejagcbaL7JCCtMQogbu+yjwDdyxUaOlbvIxFxyNKVGmr01OdaMX3XxLPI6aWXUs4+jsgexXhwTEawW+1VEvFZ0EONWil5a7CzvqlvEHB/EWc5Ffq1irh97SI1QriD3j8NZK6FjHHo+0kaGktPR7x+SIj4+ul8Q2eNHrhJoSKmDiiSkdFBNrMHSLhsog6VDbUGHnboMIQs7DbVinRRXoNF4SL5OCtxo7KbFDsVDTMw4vJsQGsA50RTAwWJhxKDANhcuKrAtjBUXhOSCpglCiqKPD0KaAIcHIQX2uOggJGefAwcheSkH07RJvzOb1+5kYDyJR+HDl+pTXMgFu6/S/Ffx1FpHzXCT8B09ZnJIaMUkOiamIoB93LZvm7qCtOpe2YNoz2MigpbcryKiVBw+WmA6jmBOYF9zoCJ7mZd20Ea1qtRcZdHts1vu49vmiAbbLnvV4q29Op/zZWTuuG2hD6+3AQqy0jq1QZRqd8gHzbPrJCO4nDrkw1xMDWHEJoUd8lJlhI1jh6SD9ZNjcsGGcIMSwQ5xUVlg3ZSY/fWo3wP31rvJYhNVDsmgWSoDyWJTVDrxoPkp3eNlf4a5lc0e7OztWazLKv6Khkfhw+eeKS7kROSrNLpkdJPwiLR0keSxq+LpOgeujQOYh23anNttTxfjW7Sj/AG0Zx8VujW7qousRfipwe1hB+90a7iRujS3sfP4TfMuqYNrI05A4uYyqk+mluOxZdSIqjL5R1r+I82fpU6r2m1LbJWrfd3W6Zkhs+eo9IG0ojETScPpV9TU5Q7AwZmXHHtoFsEe/cCZFxr8xtkOWlf7raNcUPcuJ3UOpE1P0ZG0bl81ko6J01aQDoiR9gAuawSYhLirAbICerUhwBTszQagPZV+jzxaDLJlK/shrQ1yehNgF+YMJ9gO7xiMuks6qXNIYzDPTdLpaqQfg71W0I/BzBdjA4xC3YsFWYKbTRhuxYKsIJhNuO7EAu1BzSZ+W1yzCbEd3lH35FnOvxcqzTHL3oHIIY23LjS6wXZYe/QjrZuffpgNtCRJtTTVFnPysMuarib/t0D2YqcFTAvCCYv8/VlpvS6MLwfTn/siB9WfHWiE/XlQewz92cnP0J/DLMH2Bpc1RBPahAXe1o9o8wfX0jnaN1erJjvc2E2JbLH07TS8dZ6vs+hwMFfxQ2qlfSi6lrqtK/rWOmSmH3130uN2eAMDaDZ2O5kJ9nMDcMJtXAA9atwYkbOs+JxWeMeTSzX/Dj14Gwoc0pgyxKIbVbo1Rj+ujLnpR5YAC5B7tJEVRPuzAPJnlSVS36Qxd5imyK1ekUJuMMWRI0eXETnT+OKxZHKEuVQlxjfUkzi0UaYPRjvObOuNZ6QZsvOMNTutIBhtBpYQjjc76Qn67YCeaFfhpZ/sqw95odWL+XVkjx0IHVq/deHR9t5hTfL0YbcdPD050CKC/uy0irBXB1pC0LedljDOzROWefv972uhRV6lgBeqJ1QOqcc72ei6+6gC6fu6xwL6jh5qC7KXu+0h6uKhNvy1+btTDmu28nu2Czluua1hGrSmbPKOWHdyuZJ5RRDr41I6pJHLy0c3ejkrk34Em7CEfhSLsWkl3po/R/gl/datxFtp/0cCJ2WMXcC02UFGIfNmAy1Cjmt+c5jGtl22Dce3cp1VsXk1O6UOYNzqs6DHqG2FeFpEnWQNdNthQGqztWFuOexknatsvcrjuuKoPlsJBj5zliLL6iLOdzogbESADtPdjOo1Pj5ziKhe4bGYOwnrdF3XIuoZ0RFiLZIL0Buibsbe/eqlRFWgLc7ApVXUjW/XlyXsG97R+VTOVRKVrXZc+JDG6i4S3ZDd1tKOjJu34G/ew24TbuKbwJi7n27/qVT6CZR/2cduJVF5lyP4iyJ7PxHzZ3krS+g40Mc3inOjqBtFPvqk/p8JoDdC3KwmjQUZ74sV42PWMjNJL4igG7U9UJeyqlN23M2f5SrmdWY/eimrOoVI2UrSjoXe2QVe96bkIc0rGx66SaWuHG8+IILdwJaZcEcwTW0X9YhlbbeejRTB6jaEGDhtD2mR0/U0KXJPs2Ul2tfsoEXtbjqwJDucaVbkPmcLS7TXmaZ9EVlkTJCDtBUhpOznBTbdgaZT8VEulD4T9bIdS7pQWop6xc5HC97pbjHRu90pvky8qzUacaPCRLkSldSpyNK/0b29L8XE26w78WN+K8PGCd6BdSnRm65JRnxHp+7hzrXzST3ugRbP26IHsnoeAJEsnzv1M+mfvsgT+UZAbP572mgREg9X/OYA6kbqbyJbx/f3IXWtVkj90qjxceeQhdMQF7VoCqJU+fU6y2Br0hGtyvN1luEWpiHUhZbz1GTL/ZxGJo50YW/UnlJg2shQbvDqf4iMXv6H0JZzEXkO60JtVRg5B+/l3UEWMSPswUt5JWY5E2JF9V7gqRsRSkrsWnuIiFlsBxHOtDa5ClcyN32apr8tZSWMbNLKcvQ+lx0Uq50NPcpLG8T8OTV9hQr6qVbbA7VSmRTx+3IX8kaKk/e9wg8VBtbqMJKePAv82ngpq7nVYSQ9lfN0JbKHvJ6v4h1JDujESq63kpz8ah0bNeXDbpUYac8zJUhG5UUjxMj6RapnUT6TLDWXslpaOYa15oD7gmbeS7nnuUuVLylAM6vDTHr88y9/KE0yPmRW7tXKMXLfPauod2O9xGUjxMla6ZSmPZStEidtvUsgoW2V2GnPlQYclnmRF0ojjkwiuCmhuYkfqsWvVKvgdbX4lX8N/LBOk9/SZXxcsot4nSbPVouZ+BLguvYAZwgX9m7etDRuNjRrWuZWhouz8QfSuIgbfyCHj9jHTNLputzMPc/8zue0Woki/hKHE32dZU+1HvziRhi5nV5pqK0WO3EzjZC0kXYeYW4f9TlFSVPLVouhlp2ndbfqFVTRTbkDOafr0pAc0rXVMh3hhuNsJZgItXqFzQ89SK1ecRODgxPrq+4BYhzVu9kovNRDXEoXdaAF6C5O45zeTYvwTA9xCdzSAbxAn/QIFumQDiCFeKNHmBhX9G5GkB96yIhyQu9mxHqgh7hU7ucAcpjveQSMczzv5oR5nYeYOJfzbkqMv3nISuFs3k0M8TQPSTFu5t2EIB/zEBHlYA5jhHqXXahY1/JuYphfeciKcyoHUMI8yiNMnDs5gBPmSx5x4hzJoZwAb6ybFOGK3c0K9sMOWdFO2ABWqAd2xIp1v4axQnyvLlSM43UHKdDr2qNEulx3EKoFjq4uT0U29OOoTF6l5cp4E6LzLw3Lfrw/x0mE9emMqogqq5KHliqPUjB3pkp5Enkh28NupEZXspn5639Cozcqe6MGZUFyo5PmPQrlL6V+kdr8Od4Aq6XVR1jwp8rJLPjbau3Pgvp9ZJqua7X23Xftr17JshRLMiNWG7m92VGZzGBR+yS3ARsdtlmqedz15jnyap2H16oVz8Mbdtz1rd+v5Vt1lif1u2gEhuj3XL5Vciu4N1sMOZrfinAyD06I0vJeFSpTy3QuMlPOvraOtyQtq62wmRN0K7xf67TIS1OS2LZWdm+WDVb8dzJPTswyLTpL9KDkh6/2XTzItf6wcohW+m5SonV+KLP5k4t8odDc5h9SK0RYv+NWGpWbzRY4iDZJk4OtqQHvCCXm33P1mslkKRNAspwuaFcKkSpnF/FKVjqdxxx4dCG3pam5ivVTlpbP6Grc6JDWYS/rmzlEP4lNMNL71EYBnFxkB13MBNmDgix4d7FcR7ku+zg5yF05TWQjClAfz0owfb0miAAHaDW4CN8ricN7ryQT21zkc5nFpdPpzRV1eViKjR1kz0Kjas0IcNWaWQpAsZqyxERqtUqh49imMDVTnsftPgarkHy4yaCgSgSyNxoBpnbVhMX8ePwrjnAjw8t5/PMvFJzHP//Cy/nLTxSYv/zES0nBuA/Ce/kG7dM9ysrqEJPWcVq4qqwlmGqyDtD6dIwCbDQ4CfF8bHTrMiYKoc9lyzIQzfLki6yQ+7BaSeSJCT/h2ok1QXeo79toMH3hNMf2j1qBjw7LxkVWvOCmOSPAxNaE/KHwGg1GwhnaS2FUOD0VRh8NyMRWaGk0zpW+USq7jc6B2fNIWa2F0oVSGTwR5jRxbP7LLiE07eU0UR1uivrAtQLTF7ZRpji8WoKLLzZItUcGDU2dZqoiI2W6SBXwFeYdROlKlpVYFagPuVFh+pYm+BIFaASY2F5FWp0rPeucPgAhjdJCadFXIqY1R3LQo6BNYTST85ysPlK7t6EYkFNdh8KBnKS5uUiO1saV5jk5JTlp8xhCevQWbJGNMqK2xaru0Qr7N1fxJ4o+A+y/rOCHjJPs454L6auH0ztJ+yN5vMVkpAWCa/wVEQPvwY24HENtSF9+Wi8WUstktjI32mNzYbjJW01Ra0JzYoRaAGmjjtomDAriHEPpB8/AUXOQBzoGe1D04/ubCwjb34b14416KeMyaLthgRmzpyh7URxJcivn6sX0YjSrSBLdEeNiNqGdqSzPtVqhkRuthdXiIl7K6queJfgaXspKaZFw1m60r8kJCvY6BVJWep3PRVTKDDdoR4iLtc4YNcPXaa0Di+Tykw5G/3vjyflcT+sRvJ1SHz7mD1mQw323QjwzfP0fCMCmPA0Z+gVCR/1lwNcHgwgBr3mMEBEPeXgYR6P3iZaQcJwRaj2Cz2sxsNMvgNnctImLlRs3S/lWwcLlAvhiZ5nxJwdOMCFsKsuexPw7sv5aGbY6LDfZju4i35gZsZabREfQh2bCeJusPDftW0FI5uZ8v+jIcXBn6VxGPr8+pjUiwEfXPXOQY+b+I9aF3il1GDN3h4Vi5m4qxOuljX+bdUSJeZfVzYh4V3BEhxh9dnJFd4gBGLgvjL9qvy88JMWpqMRSi9W9UpfGax7rO/RJfHgvmQRDdhlvvXn6T9L8ceRbYdMmtKJAz0esDSvxdsphxkq87dmSuJFimh42bMQSQ8bfaW7MYBxCPxhn8sbfZX71VhaZSUbbbrKjR5ydYh8/9oQhYkeh3bVKdEIQbA/RmUGcZYO2Viy1SOLnsU6xj28/QxhsS+nWCVWbGDMCDzeD6ACZoRyEzqRQdJSR+Z/GgKPUT3RskCxPY0B3gic6SlAupzGmJ40TNWdkxiYf5yhZEyEnJC+Tg9OdkomaMz77kg/VlXiJjhaYuWgM601aRMgKzk/kwJ1ITURHHJeFaEw5TECEIiPPNTTmDUkzRGwDKqOQ04IdyYRwraO/wvsmtXFiQpOFuop/+IrPC4Vc+TnrimgFOMFMtA+Ioq9LXYm3phCNIfXfrMTby0aU9QsAVrlT8HQpUGOsiFwF+w0YrYb52SGrZL8BlOlQY6wAraL9ZpAmRY23g7JDW8X99GbQHmEXOlFi1yg7IHuICTso07vG2xG/x9hlCl2S1xhrgHsQvzHECVSjbAHvUSbMIU+jGmNR3B7Gb8VwL8NCTr7H8dvDl1I12kbUHmjSQpbEqrtaX3+PZE9+b9Vr7O6oX/DD90UOHOSOaFAzRHshJyfQHx5IWEfFRR4KuqvTCAHPAsNYAW94ukgRj3iGcULOWV2gmNNVP2mnh8clpT2EjLRE6Wg5c9FSJ6Jly/ZKmuqVPM8rUZJXqgyvuPSuhLld0YldGbKmkqVMJc5JSpKQlDDjJzrdJ2leTYKkmgz5C8mSFzJlLiRNW0iecY8o3R5hrj10oj22LHvEKfaI88ORJIcjzHOFTnJFn0OKKoEUZfYofOoowrxR6KRRLBmjCNNFseVjIk7GRJmJCZ+GaceIqtXqROWLNPj54d5AqtVq3pYmpjrLX6BIsi6K4xnvnO0loW8/xlG1pQ5hJ91jwe+oNxUymRUFg7hRGDlCC60qOa9k8j8AntEw/ExF9ok+uy3+EeCFKtMq4vDTRd/R2JMJNC6EvhVoV8JOzsgV1QAP7eMPpYx2OQxBh64HNlaES2IwdnhdE2zs82c5/34iCjFPq+DcPs6h2QjNt0If0QXna21kbggGk0Zqakyh50f4I/r0fr/Eftjj/RUT/CO/BZsNYH9Gnx7t19jFCdyr9ynde3a2ugXs5fu84z09Gyt8r99H9u75+cgBvoAB89gnwEYL8BX0Ycc+Az5WjC9hQD3hU+DjV/YvriVqWVUpu8HJ5Z4WVy33t5QG/CXdF3nt+7hvvzWGvVaqOkr+xRVqR+bzHxyD4I8PyH9wTOs/OGbwHxzvz3/gxYf6D4735D/wgqP8B8f79B8cc/kPjmn9B35O2CrumMV/MEEJ9R8cc/kPvKx4/8Ext//Ay473Hxzv3X/gN4bAf3DM7z/w8uP9B8fc/oMwdrD/wMVP7j/w2oD1HxzT+g+8nDj/wTGn/8DLDPcfHHP5D7ysaP/BMbP/wE8O9x8cs/kPvLRw/8Exl//Az0rgPzjm9x/4+ZH+g2Ne/8FObrD/4JjZf+AlJ/AfHLP7D45D/AefQPCfDsh/8InWf/CJwX/waX/+Ay8+1H/waU/+Ay84yn/waZ/+g09c/oNP0/4DPm7Yqu4Tiz9hghLqT/jE5U/wsuL9CZ+4/Qledrw/4dPe/Ql+Ywj8CZ/4/Qlefrw/4RPZPYkoVrD/wMULvzexixnrL/g07S9gaxc4/8EnTv+BlxnuP/jE5T/wsqL9B5+Y/Qd+crj/4BOb/8BLC/cffOLyH/hZCfwHn/j9B35+pP/gE6//YCc32H/widl/4CUn8B98ivYf0G7RRg6Fr4VZ/QQ/NNErdAjuhC4K3pvQ1oZnU2veX0TgNcUZuJYyPPmRC6wpz0C2riLvjfbBbHEWLvUIuNU6pNuKcDI+PsW8JjxJ+gh6RDiWN80rqV9E5LrFh9xRY6WOeXFnmhjy9k4Q7bMqMR29KU7PleZp9fi0XjzGvMnrABzq0JP+9+t3BJ8tTU8V7eftUQ3dvFRUK/FG8VEHMjyc7VtAFLBDLR5i8/8+ZjJy5zGC7cgwcK6zKp2LsnqsKsxoPtShJy1EWb4qHXnfuwfZkWDgUxozcjfFGbi0qtQ81sXQZ9tK8PE9vsRl853gfASm8Q3i/es1cmfYQ7Sl6am0rAs/rtL8sXrWar18LtaY9ugV5GNv8swSQG+VOGgr/U7C2tehJy2rJEufHp+rCtNi+yr0lFVWPs4FAnAjwMOmlaowu4auBiPhI8H86BTjYX6ROl1EHleOWDciDIzqO2rh1pZnInsMzpjqY3uMTpYaQYf6sBsFerp1KXX9/8LxOhIkfCSJenqE2Hw9AYzRaXtGgODsPTvotCxV9iJn60qh5uZaRVgVNspTaR5eF1VsEisXa9LVouk5nbOE+3lRp0WP2eR0y3zsScKIBHOQ0KsKihSiDjpIItEgrrh0os56gyQVDWFbyupULsQ6q0znPTdu1tsIf+2YdSmrxAqaflz7bSFu2xD2UoY/bDQGbUpTUHX77EOepPM0utsOin1sz3XBYDrvsE4IvPBOxJEfnuLUNxA+wtXsZOeIKQ5Ej93DOPmde5d9GoHsbGNX4B7hGw/KVZrfR3uRnMY0gqs093iR9m/cfZzvZsosl/tmrwZV+p3GnEq/f7AxpZyvdfCqyWnGRuJDDKiy8mSG4q+ycuDJ2i/+tyivjM8Eh1tmn2bEeG7cJox8N3vEj3VROC1wOil4jYDvf9xrvNEWiJE2blfkW5OONkZ8xMi9ktOCkO0Sn0UxOyjP0B+/iZpg+/mXDdrvr8XMXPH6JrL1tlHXMUsLMfdj9soht1G9ISJJVzIve1GdEJqjnk5UxfWrxIP5Yv5HJOJGgwRv8FU/p7nQ7ye253ZPnoNQh6Upv3A9+iUEPEcbpdgKHFWOB1UOn+ZEwDqf5KTFNS+ClM/ie2RHdvN2xbiA03ypZVmeyqwSd/VNj9O0LiD0+1lublOQtJPmZxLzM/ZCSbL5Gbn5GWYjh/YRGja0idGYlcjFUpYXjU21d71+si9yLHTb06i3ZtXqslVnM8k+ZExjwFaLEHdi+YkdPRlBzaFNqnRapX/L0RvHCO6uLs+gOlyOntXN8UpWOp2TNJOlrGStudpoMuI3nfVci5UcPTqFs6LpqQsjDX2ICmQM7cdozNjL17hpn67k+B6bdzH39UWKNF9SsDc6bJhaGrWm8Xw2T0mTUFvZpvk8NbJcRvS2kQhqyG4yBvN7WjQVfVIXpmzjRrypbvunTG28v5k6EfNneWtufF/ZCT7OlFFxyu3UIhPLyHHQzXPUKqFcIs7a8qDX/0RB3gjFNoBg0EK8Z0oklzJfVpEDh4e4Ucxaxb3VeZ234EqU30nMqNVWVo2t9utr9SdqHbt89DDXcvNGbm/1PrwAgLHAdQOAHn84BtaFzoWJTEhjd0uDwpTjn90l3mWqMnboFxHv7XLRHVndMlOV7ulGN/NBvdFt65zY0F1dKKaWopK/r6V+v5MloEU7mWvRv4xouRFlNcA6LsjQy1aOCbqshI4d/JxtutEhxHQNEqDNWa/oR/ubxzBwZ3O/TiYgo7dSHkrYVioI0/RR4ODfw9zqsGA2Yzcac6tDhensLzdKZcNUJhHIneKU/UbM/1qnWjYROFckaEeNaBONs4JXbbfOvIGO61J+l9JsGC+aLAxEZnSl2wQPvMakSUb8KYziXr7DSrxdpov6t4jQV+ItaxR50es1ifm7K/FGQl4LFkplKxF9RwkGnoJWaBPgKXx1FgBuh1zKKreKe6jzDjpRpXfQyWt9OBPVyd8+9xNOh7F3SpKu29RqlVaVTL4BYi1GUEcbOXDYRa+KfOErNlXo3Vxksbu5EXGjVTZaHLhLqZ5F+Xyj5TwFbOZGyI1e0dHjwO7FEAJRIfccQ/HWWYZur60IB2AvywyQD5JdJhCvei/QeI0GBx4k9msMSD0Mjcbz9ljjxGxcL/KFiiUeCdCO7kn0N3YDHTVS8fU4riGv01yU8YOjB3cjxgj8KsoTk6udCPlVlPNGjhZ60GhP7YwHCEbtliT1LsdP5COUI+gM3qsOX0h9XqtH+rfGjB0dIszBt0UE0fSKkgYbyyx9kVom21Z6rap0kc4FwBszxjza/MB88wP54Adia7tfjz7DtCoKRrOsPL9RzjZUnz6A/GXj8qQOs3WlTrRM0khXvYeqTsk5b/VgNdqrKg/2U5ongNNVH7WRG5+uckDf2DN0OuxiI8gLTtNqj1opPliT0DQVGWWjbiT30K7r2ARovLUPvxZFRVqHG1DB3L0+dIyvdxLaOUjfyiIT73VowdmLhA0uQw3S/YdYx563T0AdtXKwih1VFul9lCluRAB1HHqh5Uuq1iUsEnzKhFZ5b6Y01+MvQDOP24ZGMoXPPaHwJpRF6nh3wBS91UytJjm+e3hRaxO1jVgF9hUoh5ZK6KWENfAx09FGDVix/YryIP+tcthg6AButIhxna2gCUFCtIK+AmUrsO+7mLOXu2hvq5etec/TnAgB/a/OivPOkflcZqdapDnw6NlviNVOjDZ+YRJozma7epmWlczNMPik3kbPC2It2/xM1vxMan7G+fggvZHoJbvLJJpFe5gBK/FW38/o3flH8q/EW305A5IiLRJf5Z2pjIpf5boWHT86R29AfdBP3t1r1X11dC2HWS+Q9F1BTvDt4oz8A2zXaIxfwTlJb1JQIHy/Q41DdwI7efm8waMq3ptb2GMoj394wkxnyzOP9NU+C4hlm8LEMS2FibqLPUx0IR31xGA1uq0hjr3ugBe/yXXh9t/lfhVpdUJZybUiU033LybUC2KKZtEKMYEutcgr+PpyQFurIReWO5HT8hS4wR3QpmWC2d06QQcjV27CGZLPgGOCTknaMSv+bGiIcgQ+EepWx/TtTCwi4vTHDTn8sm9ybpoh6ArxoPAHXyB20ZBdHx7WE9nlYSc18OpwIKQqpK4XPffRIW1O2o0eMLwtEBtx39mJTX3bOdAM6OLFZQJq8RKIq17L2WJR56+kIFavpdjKMUFDL2c7kUmvZgcaALqY7aSnu5btRx/MKecizdSL1LOqkqsi8hMMClPOKbCDShcQ5oRyWDs+WJNhjIK00aHDHH5tHR33Xhf54NXCloFsjWBrgnI92IGELwRDsCCT6hiObCqdRIYO7h1e0iF9EhY0kHdI6YbvIaarG/8mRXQGgk7BQ+jSHRJHx46oqqYumPpNF9Pfe8hwUX2my+rpOWSg8P7SpQS+RutFHPSVL/ZCGeBGQLck6bl+WkV2lhHJUaMRW2O9yvDHWdmrd58JODditMCDb/xbm2n4SlbCvF4ehz0qTuv8yiuZV7WHJzo/h5vsqNGUW83Yeh3XmO/AZ63NKDKbfwelU/YY0KiK+Xd49uRgE9p4ABNF8/m9ir145zGhjQgwUTRPjSqbCblcqio1zxeaowkNyZvkMWOrPO8ps5ny12vxDTJvePj/ei3gE0gwtD37vlWxN7k80FZOK9CdrkjoP6PPLSahgbF5U9CDwbzJ/Gld4qDAPJcC8ZC+SPVKJlfizSZlj3UQegmPNtor8WazsoMchs5K9IYvLKQ+qZMbUFlRS85bSVZ44PWMCXbM3YwY9KXSaZZFrlX83Fs5YmhP/zS+KsDFjFFxUq9hvCPOzQN2xY1rx7cqgcQyeWDhaceDcbUsC5XHXnjx8HbE2IDL7csSJMydtyQ4sSupV2kuIsM4PMwdMT7gdCXLSqyK2EhDH3OrBwovnMJ2j2OgmMJ+Wdqced9z9ZrJZCkTWNpzB9tRVxWR73xQZXsJh3SZwxAGGWla3cC4rKoHmT0bdKNV/fdcNhWN/p7MIgxTdZpFHZ4aZRZL47PS+2x69he5Gp5V32+zy0RZwVccPX4jhVxs7IBdyZXS7/auyZV4A3jGXNxW1V42MS4yoGcs3oSHUiYMNqxLmfAaUcjcOHFPrUv03vwfAhsa1cbRWrWqrCbYD0H0ERpN+xX28gUsfn2oRM2/aEWZDbDbKuovYFX39A3sj9HjM6K3T2bRrdc3kuyLdds+Z539AeJVMZcp9ge6GxDsy2IxhlG8lea3iuyxtDCTKlWJbDb/TtA5ailhpRhh65Fo8w2IsOuBqOiIchtgJwZafr3V5Ma/g/poPeilBAWURGCfbg6dqZr69sCZucVDnrL1UoNfro0AbmNHqZgXHT1O7HrEpR5a7Di+p7HFmkA8uFgL9jO6WAMIhxcLzz++XHX2jbPCLBSb2/JUnaC7gxT1D1TbH9iTYZ/F/Hsd0LHW8q4S0QnFg4x76vxI2f4Io4HXgm5OyPlng9s27UMTmU+FvkknIba6+zCDdHbbGLGPaW5jQnm3ns+lTMhG3I0ZZdlR5jHFXCVP8+V4/CL4Jo32eOgi/TLuQ7jWCQyPJ+gpUB7Ixd8S9RJBr4o6K4khrMBBjI4sCIJGBRc4qPHxBUHYJcad4MDGOxCCsLEn9g5ykkN7H7x7yGiTZM2VhvXPrgDpZRi0p2lEdkTkX+rVGeXdNy84/CbcNPJ0m1hIja78RuMwW0YXjrpxtJVHf5lqygjsvaqdRky1mLtKacwHqcsjW0o/C9HWXX7/rNV6ianpLV03Dqja6KKq2ladz4x6/UiE3mpx49qIbmja92l8G9FNEWEcYA7gQXAfPfRN8HDYJC3nQiekrb3R3EdLR06ZHWiK6XIn6maAhK0AndC6q8mLz9NFjfJeO2ihpdGzO/j6ihqNIY2uHXKeGl0+M7QUsJdUfPxGkGjhuAO8yMRc8rSmRpy9QXmWNYgNdVuY/GIGKG+ZC8rezlht5MA12tQSx/6+D0yxPN8BW4lqDR3Oe6itEBNoBY9w64Nig9ocoO7edCfz5FaW6wzmmtwWZ7oosII6TQdkR2NNYNV2amwqaMrG45Kg9/XYsFFDwv/P3Nt2t40jW6P/pfOVV5d4I4nzze043b6TOBnb6T5zZp3lpbaVRM/YkkeWO93z/Pm7ahdISVBRFknQM5+iiEZpA8RLoWpXVYx5+KYgAm6bxP3Ktuw1T5o5e1h2ARlbkuwC+6M2TnaBli6kyC5wqAttc6R/NRRRROINr2dO+3ZotOMNyWYvj1tb3pfp7T++rpbPizsocSeLu3fL1fdpT/O1WNul+YUn+oXp4u5L8wujdu2W5urnx9Pp40/Txw/zxRmVgsVm/Ot8cbf8nvCN4aeeH2+nj1+njw/zxaz5qe/4qfHfY9IqMId6mrwMTKdubvbmv8xmj1OK40r4Gjd79D9q6eO/OVwbxnlZEP2q76eu08Oz5EPnaugHOlNX62HRD/2qo3fqTKpTtL1yT5KT9Kiu7JEz3s6md/fzRcrls8/SuAs/Mv4qShY49lLHhsePHVtxaUM4TtaR5WKzxY3fgf5RhzL2gaGHx8KuXf4JkT9uRI4MfpCRra1I11DiyrHgrwamx5DxJ0mScWQXVo/fplsL98P86YH2+Q/TP+hLaptwv+Vf26zoh/BrD9M/7sKvjb/xMoixLg8s/ZUvDj0LrR3oxpBKax2hD6MOyOBJ5lOQmRp+y6U/cn+8nd13TaB5SFJSL8JivZr3VTZawb3ZiO074uIQthvqV50rSrzcCYgdkivupU7Iswfx6gOM41vtU84U/JMCz5sgqeegbg/PCyZl1Kab3va2iO8hrwWvdwQn7UjLnBhUr7FFSFJT4m/TBZXh4qjgy+nia89NRS5e2IgHM29Vi+878keWZpwmjeFu6Vn6MO6jK0+OkVXq1aps9u1solQ/L/QzZdaff0cl0cO9HClXU8eOjvsm02dvOrZ7yaxBcs/S2oP6dGpYYqGXe5Ugw9Cx3UqUp0fuU8qEPb06NCBzzxE9GprC5+gupctY0tKrxElLju1YonwacqdSJtbo3qHeIfAvdWZYKHynjgzLA3GgIwkSQnTryPC0Cod6kyi/Qo8ujTHLUmRc6NSVxKkXDnRtjBwMvbuaKBnDkd1NmZWhU5fT5Ds40MuEiQ/6dWxABoRjujU0FUK/Tg3MiXBMx1IkR+jUOaa99c8XcqBTXAllYPqQYzuTOOWD3K0xcj8c6GBkNny/XHzVruhRom27ZUoD4fflquv47kF5UwvpOn47w9E6aBfLu9kp2pxSyZivvUibLUKS+mx6OPgPwXrTCOw6rm0jdhD4VZ9aW0fgf+pdaatjN+aLkfoRBL9aRx6Xy45VMQ7CD+JGBs2EiISwG4FjAx/CMjjcg8EMg45d+T777Wp5+49Zx8vTwU58n/32VMtMD791qx+4yf/Hbe+pN/bX2NJH2syP28aTgN7IGhtuyqFOeN68AP5++q8/T/vQklqQk7z+pKSjYQ85INMejaMeiqmPw6O23zPMvd7b707zpEyGr52NgjKeN7WkDap+pev3R6sN+vP623I1/1ePGNC2LkQSX7UrPWPTDnRFDkwbuSvcpCs9raUX/AcRKW30DiyfZmlfBkT+e95G32rPbT0ZVOO5D+z3s99nPU6lw9jvg9ARO4DTOvE0YqH/lolUO+E+r7p6Hlo6Uwt8Xt2/ake+zaZ3nZ2ULX3YyHo1+HWc2+Xye5o+1OFtKxY42op4mP7Rq2x7O2ypbPvIo/+4Wq6Xt8tES2Bb2qt1YTWDjL4Bay1dCVJbItZG7tLTxgmcaKd92jh7X3ebXU9XX/vYmYQ+NKJeDTxhToGc5bwa7Ma89256u152Td/V0ofGvvelEfpqHfrXctHRDdbSiSBoTODCVfndnAIFmtioXjEA7XJSXp63aRKflvfz2x5z5wDKN9vyH2v5fU7oliFtU16/zW7/8bicL9afmMCYtlcb8Y+N+PE7dTdfrUMa6LRz6Q0krxrJr9AVOmXn952zT7zYkW2543eDKtSeNnOhRyTxS/2hH9hMtr5Bxd071pCKR5hsDaX49aZb+Mmr2VfK6TZOf542wsfvEJdBHMAdfKlTXBxxKGWwZ8eGMgWP6lwSgmDfDnaPOziuTz1DDnp2Y7P1EXOaxnGEPm22vy+bH3n1Do7bs9fpUmC49aLOvdShILs/Y+6o7rysavd2T8lykvqpBiVCegHjmwQZkA4M5+vdHvaS+Y1xe3jJ9N0szHPqxe/T+9Rva/ML8/ALr/TG7uarWU8TwaH+bIt9hU6kuz3sJ+RLeHs4whCeRBHYs4anUwNe7kJQqsfpSVCqX69DlNLqlpw6f76drqfvl33oRof6RPmtWP7ddD29X/amIL3YLeGsDKz03mfkbvv/AA6HACgpiSMasHFYHGInRqBxHN+ZAZ6Its6kdkUc15n+TA6pH4mpHMd2YRiXQ+7ICGSOI7szmFUgdmgcWsFxXRrGK5C6MwKx4Liu9GYWSL1ISy04rgNDXPRSH5L76I/rxgAnvdSL1F764zqRwE0vdWYsP/1xnWKybaoThaX1yljXDXLi/XYMcsGRnRkakyN2J0k4znEd6EuPkHAn5UccB78XQULCno4hcRzw4RQJqRcjcSSO61I/koTUjYQsiVbown30I+cvXk3ni9mqN0lCkpL0bnq7nv/eY6Bbcb1pJPbZZsRBO3R56LFJtkNvJL4G9F68jcPY+3M1uoBPlrvwcIfSJi/s3cnx+/fqXZs/wUiXdu3sSB29C/irtPgbkeODT5Iv8qXupEsY2bODY/fttbtFhou0c66RODb0e1LjkkJvJI4N/Z/Ps+e00BuJY0NfzdarPxMf81syx4b/dDtd9Ke+tHeB5A5ku3TtRnL8IwF/6RrR27klSUl5jdjUkvu0vL8fQixoRbpVUe5xeX8/mFogDmxbXomBdeUOdyxJabnOXfqdnEejdYmkv3qX/ri9f76bXd0ve5igDvSFxT6x2LE78TD943S5uH1erXo5jdu78TD943Zb8NgdWS7Ofk/cheVi9vtrge9dP+ulLgwrodW1I6vZ/Wz6lHxNBLGvtCZWy+X6bX9u14FuLJfroeyuLh0h1WGcw5Ekv+qRuKZklUiUmXpurSlDJSSPN710bquNNW41m65nvVMZtfeEBQ9LaPRSRw5qjMN3YEhIanDmvL6JQL3ZiBs4uDxU6YmlMuyEm85B4LPH+dPyrhcfWwYeBKbYYg4DH3zwboNOc9geBIyvEuENssaE+5DAIbWFeCNuTNBPiXSyLeBJtbGD4IlS8LSePjymW4yNyDGW4+GTJcVpGWSkPF0S+AS3USXzCNbDNeJq3MGdbD3uA99VnWh8Eg/36KDJfDSEuNWGnuQOqgn+cjf21yTT5Gs+/+WMErJ375IkJal9sL8C1QptsBIlDt0Bp+l0dderUthLvQiSh8SBdOnKajZ96rNzt3ehkTg29BAxQ+EhKfEHsV9Y7AidaF23dTxOz4uaIOQ/atXuI0u0aHfHLe0dohX6EC2xA+x/Pk9XU7KezwbYvFo7sZH+im9ikOLe2pXhunuHLgxS31u7MFyDP9wFYeO52iUZ93YpynL+s2LKD2A8HFPenyLaMrwjxpgf6uQLMeav1c1bymD5+fF0+vjT9PHDfHH2dDu9B3Hn1/nibvk99bvF7z0/3k4fv04fH+aLWfN73/F7vVdbx24nCbU/2NGXQu1f6w0PUBUO9U8+o16tU3QL4wtZ4vcGyctG8vhTcUhWgYMdkbMKvNYbmi/m6/n0PhRz+LC863EvONS9ID+EYD6w/PHfFrII3/7j62r5vLgLvp/EMxB5heufuNv8xOt0rt8l+qX+7F2gX2saDs4U8ULPWjNFvFYHl4vhXsVDfVyGzZAn4gCSR9duDU+IcbhbBxNivN7bq7v51+b2N1ZH/7n9C6/wBjFtrgbyKg52jU/pFPyKF7smXNc+3z32Dh7btP1P8LFEaIb5VraGpS3M/Pm3+/nTt9kdLe2vq+nDFcVWL257zPwYeSP6Loh+2ogepzNDStFLPRhcgb4D7Hr8U0JvBn58+EQE7FMUuhU7m616loFuBS5vHb2tO5u2KbeOb8unfjNgN/cGS+k5dC+rcs2GMf9Xv80iVt+a2coCRwL+fL+e306f2NZASBNgr2XOt2SODP963SMIvxX4et23jtDLkJeLnhbtGO1yMcSI/TLQfj7hGGWQMg7Ep2HpC2Ks7XkLBoKWt1lOvvB+/o9+a27TfOBmu0Nz+K0XI20fzpvf+tPRdscmLYlEQDqEP3IU1D5+cwFnb2f5USBJwUgCMwgaEej6Q5pTax/5OuXZ1a0r19fvk3di0Dkmwxd2ssevqym5FP/P7LZfusdYQlLlsW/+NhGUmMGtw6jGQ9Wa0mm6fn467WWYlnGzxNv+puhu0D/Mnp6mXxOjf2iEJu6AMKl/rXMj9b4LxRL+A3LDipCE7LDHD+reMI2TD7YFeGtG2HE6MCBjXHsH5Jxx6TvArfpk6ZOx89/0ztN3POxhuV7bwI+Q7fXoLg3O99rSqXEyvh7brWE5X+UujZD19dju9NYb5J4M0xuOBT0k16uMuyXba3roA/K7yshTZ3g9tiMJcrzKHTqc5TV9RwYmSZU7MUaa1GM71CtRp9yNdKk6jwU/PFmn3JOD6TqTdCPSrj8tl/cU/M1x4D0UQkFASgPYcnHy+3R+T2ssDa43y8V0S2LX0ZXGqwV6yK+QCPZG2oiQNwkBEqHe5AFID3x3Iv/1majTZILvddvda57ygvjlfvq1454t43lTSxq61+2PVrKQ6BbkPeOhjwb6kO6tv+lv2jga7uP0z/vl9O79bPF1/S0J6CDxvpb4alMkaEJdL7Mt3QjSel1lj4bMFqwkeBtRo4Fd01F1unzuamNqAQxxt0Hcq02S3/tchFp6kK7gxSH40vlyyZOzRy9Cy5SnCrn0+k6LbTjwDe5PiA4jWA/LAaCfeHdKAfWxETUW2D47wx7M3nvCCwBruvxqdjcf/OprbnwtbAzA/6S/eddTBdpBC0n7KlA6qEOOsh2kg0+xF4A+/bPj5XkfIotIBC7aLImqDPNnD5r5btt/e9oqAc6AhFXRwLSG2j13vTdKMGsx44CcLe4QtDYc55akkaD2y6AlYh2QO+s4sN1vXBLOntet4yA+rma/z5fPT2fJpkAtcfSp0DsEXEI9LPK7FXDbZtrL+R23TrmhBu2BwtyWX770HlEpWu83ljlsYF/2z5zwTp4E+cP0j+lG3Iigk453iCF8hbEmHwz9TTLcd0Hg2MDfraYPG6ZKKvRfSOpqW+pYXeiVxVnG3T9787FgH5fzp+UiQX4BuQMsPlU6gQOd2tvEn5bPq9sZ2bR7xYIJApLqxv28LG2o3gzxsUhj1aYpU3bezuU5WlFviRsRNBw5nXW8FsiNsBEBP0z/mD88PyRCvJE2JuT5IiXkRtqIkBFYlghwLWtEuN+n84QrbyMtLeT9bfj5fn2yWk3//GV6/9x9t9tpnTZP28Ns8dRHvxAwvdmR1mNEdwepzaZPD5PAbSQlhCq++R8pqVAvB/F++6S2fJLbL7i5BdgbiBwQ1CwMWBv45V1HAkwrZpY0HtQenvg2rKlc8ceD72MZkrH3tg4dC3WAe7sNc2r/9vGd6ekVaOvIEN/A8aD7eo3bUCd1Gx/fjV5+47Y+pHMcH+yAePKcLu+fH3r1g1umPG3wzzAkb4KMNAMZBqfd3Hw7pxf347y7pS7G3Qj7bd7TTvcyYDItDB7gWsgYANd/Pg7GF2S8xgTor2huAx6oZO5BPLDMr26/zR6m/QFz+/+cJb+FZ3/hdx/EMDyjTM5tqHtTNAFU8a2fLe4GXCo2rZOSTucLSnzT/0oRwXoDgYMvFFtDlVpH3wOcVEN/GXhf/TzGPUg7fxnmYN08xjuOZv5yRwbp5XEnhmvlLwMeppPHiEfQyI/oAhkWL5ffkyxQCFuxsLHGfMAFIoab+voggo/Ol1DCdEG5Anr5/wUBKU+Zr8vV/P6+o6rThunNRtrQEZbGrU1b//Pht+X92zn8sNOusVytfWGxd9tiu87xw52QZ0r3bFZbDZN6FB8f7+ezuz4Z8WNEb4IsIft9p4HE2LRy7tazr50j+faQbokZAeTdbD27Xc/uTjrHgO4BrUVN+yU7OALsl9Xy4d1Tx513DydJ+fLUJ975CIgh0KeflrwHNUgboCIfAXmr9sunaVf9bQ/ylrTHaaS8JYOM+L9+YXl7gFlW/wCto+FeIa6H0rUmQcxhQr+xuBFAQxm86HzJ30MLOT2v+MfAXA7fEdbLlPtB+yl6OXt6pFLvp8vFevZHR5W9Xc5/3hkrAUx55MYDOebhJvYl3Vl3ZFeGHn1iL5KchEd2INXBKHYk6Tl5ZIeG749iVxJtl8d2YtDuKXdg+GbaDl7cW3uxH3eaJt1Bn9fLd/fPT996FP3YB0U5xJZfSFzfQqC7Y3QoDVdHq5cAtnfy/qNBduaHtaDsxww7DiYTeFMM55akUaDezb7MVqvZXXfzm4C2FtbT/HYU4NmXL8Ru/312knaVNXJfZ7nNF1+p/N5g2Bs5o8CkUojzxdc0QxyEjTqu4TeSTOcga8zZDGs1ZnGC8YWwL42wkQG/m87vn1dJYX/ZiBwPPE2NT3WhljTgaYY8bokcF/zVevo1JfKnWt54sK9X08XTlIOSTpcPD/N1isMRotdbom+3RKfqjKhvDvCajJEruD4Jh+LZqJq9B/DlJLsDD20Z77Az5VjQfUuJHUI+XwwoHtYNft9DUQY+6Fh8CTKFbvTNrymBJnmD0moeD/sKttlkqNnUOyJo3NgwP3qmAhWQQyZmyZDk10fBv2tmSTr4m5kyOvzZ4rZzDQABcSNmFJD3y15X7h2ELGMUeA/TP8gK14d8JAB9mP5BcgXmUULIW1pL1/g8AXIsLRVkUfe5mj11J7/sNE2q+9z+Y7H8fj+7+zq7Q0z9EPPyNr4325IRVz/YtlyP3KEsDBSyNf/XrLd6tNMF5GGgiK35v2bDNKSXoPe3v+4CbuSMArO5o6WdKY3YsabJ0KpYAua+FbGOghgG5JoO0eGTIkhb19LGh/x2dr/uRT9rx30XRI4CHnnc0ww2srePOtIbsGmGeYP4lcYYsH+dr7/BinTbI7/5y734Pl9/e9wRP3KnxuvPK3WF7krvlnTvak7twZ0gmV+Wq+muzDHhhztvKuR3jbhkoGOVkG6n54svy55UrKh5StXwdvo4/W1+P1/Pu++LEqw3kcDuQxqPVeuN/PlpPVt1jUFoQ83SegUhHA95+fC44slCNe1u0yDfCL0NQl+jA+9nv88638le6sB9EDpaB2aPy9vOl18RdS1pNKg9grFaoKaKxjoaevdwrBbkPeOxjgZKLRNtIPR34+4eA6LHWjCnDh87uiurZffTW+xBEDTamLNd+dfp/f3FdLF8oqRzXXOUtyBnyd+n9/eLHcmjdaVvCFwL/qQxcEd3oldMWUsP0gWVHQ3/X8tFqv2GRCXfb2K9FYFUPdJ1bTVMmvW269BFMN70G7CtUWhbW91Z6jG0ICINuOg9hpK/4Iy+na2n867VBQUBae8gnbOutyHqnXpdGqNDvsDuRanbId9j/+/lmeoAu7tW1oq4p17WAexqtl792f2S34p4W96IsPlUv+ys3rTiZoE91ZzOwP9nuUgL/F8scEzgPUvEtwMfUiG+M/BeBqEXsPeP0esAP/j8P33rXGixFX0Q+fitX7XFLuBXf17M/lj3q6LQjn/152L2x3pAJYUOXXjuWsS1Ffbzqo/J5TDUWAF5nt/1UCObZimVjW/zrx1vz7sw3gQBnQesGYNW/sj3Qbi4fQpY0dtratqeDqiG0SIkqRpJelRPftMheKygDSE5tY3g4ciYUbrC371iZ+ra9Z9XXW8dBztSi31e3b9CJ3pWZT/YA7kw+yjwB5QwP9iF9irmo3Sj85l3EHy/c+9lyG275/v5PzqefztNU+6Uv80pL85153R/+4DesKie+f52x6YN7POXL7PV7O7kobvxUgIcxE0fehbePAp0vbgHw90SNArQ1Wx69yel3Bg+FSDqKYhKBXbH/z+9u0NBnffzp/VsMeuYbkmAPL27Q1md+43AUYD3oKMJaPvS0Y6C+Ng5ZFiarf3ihY8CuJo9LH+fpX3/LPNVpgCdlYPxBiGjASSC0+n0HkXgkoAlXtPtRuAowNez1cN8kWIH25aUDGqkDpBfadUnJ/l2y5TKwM3NP2vh54vH564nbIzqDeR9x9fzIK/zWG4PUmtM/tP8K70raLYoBjkU+UZkU1/y/1Ejwe9ujd/H29MMfwy8AZnf93EOzfx+DOAemd/3gfbN/H4MwOdF16Lh+/iCjETwtncmZjL+CN24A8rtZgP3pF1Fj+oKdd4k99C8gZzbWk6ncdsZkTaYXd6ogK7zyzwO1EUnS6KEa9HdlngMtN+Wy/vZdJHgxQZJ473a2+cVCfm0fJp3pHrvgw2yHjeyksO9m93OH6b3CUY2SBpvZHegXndjTrwAtw+J4hjIX+6X0+51ZPbBQs54IztfpAA5X4wIcTV7mg174bWE5NCe1qv54muCAWRB440h57ceBrEWkRzcuiNpYx/bug9N4yhotVKf4B03ssZ7zeslP7+YDTvN10s2eS5mo5zpNcxf5olw/j5PB3RPw0WOncflqvse1LRMqed2tQtKUPqZBePhaAPIXo7BEBsxY4D8Olu/nX2ZUj3SnllcRNBfZ+s7FjsoncuRnehoHxQR9zEPHoLnS+V0g/Dsj/VqGjv/yfPTCnK7RdJ8Bl9nW56gbhDe1I07jdJO349IANIRU4+8H8cg+uf3x76IuGkKRPE0er/8+nXLyHAQF//t4B13F8Bfvz/+OF/cXc3W62Nx7DQZB86ON/YYMNQgPZRwLesCZtNkDDg4OObLxbvp7Xq7SsjLqKKW6cG95bvnrtX8JVzbjUaAtHymPE9k9uoIK2qYHtoZcrCebqI9j8a213IscDEb9zhgaaKyW0GRYl375CjT92rr7nccQEHCCGA7awdRo5QKwhOUmv4w3jQCutrajzmWn7rOfwHe017sWjp8z3dHqg0iNm49Bq7vtYt1ALrvs9+eahmJMAqL4afZ8tuUUmF22YK3G6Vfn+ecA/vTaol//7Ltf3wJmdB2DIDz9Zzswji3P2xHdLyML246Brx1YTsgWhd2BBCPv9tuk6ppkR7M++Xiq3ZFNzzbjUaD9OtydXf8IbTdaBxIPfSx3WbpYV3Mvi7Xc+I69NfLDsgYA/DTenbXDEsHkDvtxgJ28fzw22zVB9pWyxHAUQHL1eO36eLtajpfgD3XaetvE5Ae6l+fZ6s/aQrdz9ZdZmHULj2wy1kwX3Yfvf2mY8CjkrZIikmK/s/Txd19B91Xbj4WzMvl9+3bSEeUUeuxQO6Gqh0HLUWcmgCIrbOIsjuN66S+BExoOyrAqBheB3jccixwXQyOUaOxIIWUcV1tWlLjESB++XF6+w+c5M+rWde3KjQeAyJyAFKauS7QNo3SQ7qerr52uJnyn48Ao3ZMf97mG76IZrtVelDbwcKdzs+44WjQrqVw9iPRbbcdAeDz/K7b1aFpkR7MNpO004uMG44F7XKL+ngcpsvl97HAXN1+mz1MO+LhRokh9dgVUm4JZmtwfv10c/rx/ecPFzfXf/t01mD5fbqaIxNu6wDtNkxpLf7x/OLk8m/DoIRAyM5WxUjUzQ1CKduAfvz4/uzkYihS5s6ODPVv1wNf7pteNbs7gTz9+eRyIMjbb9PuboJOIN+eDB7Juz4hTd1Anp2efzh5r3Q1FCq7R1nQ+IC1K9IAZkHjA96yQQ/CCzljwv34+cf3g+ctnNKvAfTm5PLyZOgRwHBvpsEIOCLod+8/nlwPRAsy+rgwfzr7+PPJ1c8DgX5lv9i4UM8vho5nn5RP3SB++mXo4p8//j7yun//8eKngSDvlz2CyDuDTLLiCeprrHcCPPyoumdH17hQr37+eDl0KT19Y4b2mDD/9uHHj++H4uwVRtEN6PX5h7Or65MPnwZiXW9FSb8G3JuLk4uPV6lA3yBL9rjQP38+fzsQ7/NzjxTDnUD+cnKZ4Nby+3Q1ysVl76L/4dPl2dXV+ceLm9OPb89Ou8KOmqe89F+e/JoCzZvVtHvaPVHa4ff+P1fXnSeniPdfT+ueU/RFwNHbDzeWmw8n/31zdXrS9Taw1zzl29+5Zg4GNfDWui/08FzYuXImA99TM+gJvus99jD2frfZI6DvTel3J5/fX9+c/URL4ebHz+/enV3efPr48f3N1fn/dJ7gB4WltblGP3Z+cX59fvL+5vTy7O15R3XtoKhRUV+dXf5ydnlzfvHu4w0pGh8/X9986KhjHCUycS8+X57AxnD6l5tfz368+nj6l7Prm0+XH68/nnbVQQ/LSos7DNHpyaeTH8/fn193vC3tNU+5gW8dRylQbVeh6rOV7Es9vAv+9fPZ5d9u3r0/+anj9G2B/08iQd3sV3oaCf7/fLzouNm14O6VIP44wPJk/nB2dXXyUz/woW3SaXxy+vPZzeXZ1VnHTViA9OZ2evttdtMrQYIg8gXXycnF6VnHvUvGvLjtUfOtM9we55wIdzW765GDqSvcs/8+O71523eR7SCe/TG7vbkbtsyOA8172tnl5ceO11MJNm9oVPqi1y21B/DLs79+PrtKMEcY+mqGVqODvzy7InXmx5Pr046Gdgn7CmTGGxREfy3oZxcdb7YHgPfJj9kV9pbKOBw310m5mS++LMcALh+Cn06u+80VaphYx7w4/fj2/OKnm58+Xp6/f3/SEVbUeiRsny9qdfOs61SVRKRFSUok3WrOLslG86HrKbfXfBR0769PbtjkfvP2/PT6/GN3xs0hSWNg3rpoffr4vqOqI4oYAWWvVbPdcgRM3U2VTbO0aH4+O3l7dtnDMrPVMC2i84u+G/B2y5EwXX7kD38573ogiyJSXpNOTv9y8fHX92dvf+q6AbdDezOoYn2r6BfYJpstIX2HQiH7m39Hxz59/vH9+dXPCXvz+Pzb/fzp26hdaFkK20bBvtavw7JSLo6tOZUc4vacGvIeWn7i5RcSbMsfLy7OTq9vPnx823ErlyQk3Zmu/nbR0a3ZCunN9OnPxW2/YRZEHl6wH9+9SwV7+eXLK4FOOdjjjnU0kT+c/HTeETmapD3qydEF2tPN2/MPZxfw5b4/u/ipqzLSLmd0vB3N5ZKE9BhhfLm5/Pjr1c3nT5/OLm9+/Pi5qw7VLic93tOz9++vbvAD3c1GgoAREDLL5OLkw1nvGbovYyycPBTXJ50Zz6KI9CjP355dXJ+/O6f39bfrsx5rKJaQHiNm/YBh3G2fHt+ezaHHvbJdTnq8GIZhC2hPxEgo+b29uzz50GM8YwnpMZJhgrgijf2u55uX5aTF+/Hy088nFzdvL0/OL27Ofjm7uO5xnW8RkvTOcn51+vGXs8uu98VD0N7czZ9uqSZovytjm+gXLvT052l7QXlWXrUL22bKs8ur86travnu5Pz958uO8/xwzzZ3yZvH2eoJFdfWN1TK9XnVyz85vMOfL05+OTl/3/3MObqnz4vp79P5fZ+s9v27SC8v6aykl/Sak/I9EZtSduCesv69Ygc+XZ5/oNN9nAn2uJo/TFd//nsm1+XZ9eXfzrvG+Rzsz2q2Xv3Zp3hk705cnZ5c3CRfJk+308XNa6+Vq+uTy+u03VhPV+uRuyBrLvxGbq7ounHRlWAky0irYW2Ye0zb6u3PPCAoLeLLs9pU1VchlCQkNaJeX599+HTdazm2YnszXa9nD4/rActRlP0C0YwbpOtFSCD3ah1IqQ229yq9Kjiwq72P6eP6OPCc7tG5sAnSJStVh3gh3dAV65U6MViJau9MIg2qR6eaJuk2idXstbeJpklnPfCIXvRUBI/rxt7pSGfvh5Orv/Q+yUURac/wq7MLYqSAXHtzenJ99tPHrihFEWm57EQJ73yAt+MK5PCeh7cs98VcOyc37z9edbSQH+jC3XQ9vblfPvUKy+jVhY1h+aeTjkHjh/oxRy0V2jG/TnvFkPfpzPnF9dnlxcn7PqzyA51Bea3F9L4/v7xPZ96ffzi/vjn779Ozs7cJF8n9/GG+vpn9cTub3b3eSrn4eH3z6+V5D2fNga4slusbqhzf9zDu05FPJ5dXZ4nn1+N09TR73clVRwDe/HL+8f3JdeewuEO9WS3Xy9vl/c3v8+X9tE8F476dujr9+ezDyc2H86sP3f3UB3r0hByLNw/zp4e+gQ69unN2+vny/LpXjMyh3sxun1fz9YBomT6d+XxBDMZ0s+x5QaTFV5tatHelXva0dY2/7A9php8+vj8/HaIXsoCktp0fTy4okm3IgbeF6s30t+mCwtmGn3RB6su27vOBh9w2fDJ0z5Ocb93g33y8/rmrJeDlTtws19/6GQO6d+X67PLD+cVJR5Nwax/Ws9XDfDHtFXp6FPi9dQoG7OXH7lOpaZhyXQbTyjAstRWl3yBuZB1nBTolJeBz5zuNDPnmlo7+555XmWOhX559en9+2jE+Zw/yavZ4P7+djgv16vrk4u3J+85Bx3ton9bTxd30vmfI8UHA8Zp6d/PjyelfQKf5fHnW7/gTZaRcaX2UjHZQb/rrF7LQF/Skk64BhYewf5/2C54/Fvr+/ICNv0f4xk7TpPrQp0+dA573wbyZPj72jHXeFXb47X84+9DdzrgP9mH2sOx5SHQA++ns8vzj2640ewHu42w1X97Ne0UHvAA4nqDXJ9efuxob0eY/wXC7ATLQUsuCRrRrbiFNYMg8Cm7foKwdrMOCr44COsjEuoU1gU31GLiDjKhbcBNYTY+BO8BMugV2sF30GKgfB0zU5Xjzs799dgvfUIPsMUCHGSu3wKawTh4FeIg5chvvcPvjcXB7pl3ZxToo3cpRQPubFreADrUltgCN9I/rk8ufumYe4zZJVeKLjirmFoQ300UvxTKIOMrw0B/cAPPIUQB7mRe2AQ6wLLQBjKbY508/XZ68DeuhB/dwv33Sqff5+meiiZ72cJm1IHszfV5/my3W89vevjJB8kvZ+OqQ+p7nT1tfbqePoWLioPOoc4d+vr4mXs3/14Ml1daVb+v1481q9n96s6Q6d+Ljp5O/fu6o9rWhXz5O//ncS/nrDJtMb4nHfrW8n73u2Idcvmngr7nC4+sAvzy5uPrUuYZGK/TVdPH02LOcRmfwvxBh+ONF4k3odyIILxej70AtJ1edFvrTzydXPVfzjoj/tPNrH1zCI2xX+FHc+WS9CGzSEeFHMyZM/24dCI3S8kURa8zZBTZlG96f/dI1oqZdzhh4zy/S4JXkDMRbbKbp9O7ur98f37Jt7uT2H7/Ofrui4ML1p0CUaiB/eV7A2NgK+UVR6VD/Nv86X6yvl9ffl0+ny4fH+9nDbLH+8c/17Ol4vAeEpEQaKqkeDYr+PuHvL7u8QvrrhL/NNU+P/e0/10MrTm/9dqgIdORv018n/O3l4nbadTZuNUqKhA6Nv35/vFjezU75L7tA2ms9Frazr1SwoC82bj0WtvPFIHCh+VjormaLu1mXuS60Hgvb57vHvsA+3z2OiGrYoDUCxkLYHJ19ETYCEiJczabr2Y/PX750GritVqmxkLYxXU/fL5+e+HWcBQtzJ2yylBGw9tqC9xuPhSxEqy0X76a362UXneWwnJHwdl7B+41HQtZnexHbj4CvVsV/qaMfhi2cQ+JGQD8M7IjYrrcMU51gNQ3TIbqbdtG66a8T/vZ+JcKXETRtkuPYLip4LA7tiuQ4tuoDHgujsElRLO9oBZwuF5SZ4Gxxu7zjsOTjQYkSRsDIqvyH2dPT9GuXeSy2HwHfuxV90R0X2o2AJ9wuLmdPj8vFUx9kkYTxMF6Br3DOdIWeKDcyRsSJSthvG27d29n9ejoAsiRuBPS/TFfzLrpl1DA1os/rL91OgdAmLQ4uhPjX74//87S+67F299unxPdl+ny/3lVNfp4u7u676I6HpKTE+jT/upiuZ3fXW7XXj4a41zghsuUzMwmPBYO/T/37J6vVtMOVaatROiSzRVjQJ7e3s8cex3yLgBEQ/jhf3HUwqO22GwHPaV25sSsgbjgGoro4Y2dEaDgCoo1n59Py/r7jXnpIyghY+6IbC89Py9X8/r6DEhG3HAFTUE9Olw8P83XfAdsXMh7SgRhHRhereQPRiuJGQP9XKvB52dT37Ip2u/kI6LrqtFHD1Ii66bSbNulwfLmnTJALOqO7aRxRw5SIltO10V2QoEFiBF1sLKFBOgRfZ8tv06dvxyMIDdIhmC86vQP8edJf7zL++POEv/74e5cff/w95W8/paLPvCQpHeb7ZZdLAf112t/uZJYNDdIi6Lh3Nk3SoUAQ145f73S5+DLv8F7aJKTD+M/vj2/ZuLBlWfi0vJ/fdhi7A0KSIg168tX8Xx2Urt12SfFs9fZ0up597eRRldsnxccKUufh2jRLh2Y1m9710PV2mo2E5uL54bcuxjihcUpk69WfYcV/XD1+my6u7pedBkxqnw4f1QvYE9/ByiO3T4jvWycPLf484a/jQtfh5/H36X5/3d1uu05vrX1ef6nezxZf1x2U5U2bhDie53cdEDzP79L99u/TVTd6amiQDgECcmtz18+zaSeyitA4PbKuh8Fuu354/jf7Yb64m/3xw3/93x9CmM4P//WDnpiJ/yH74ct8dn/39MN//Z2hZj/cLh+IMP5D9sPd8vYZH/83/NkvM6I+0R/zX/+/+Q/Z3/PM5RNb6kxluprklf/f/83+XkvBX+jMTqpcZyYzE2eLzGZuUmifuUxPtCmyIrMTrYqszMwk91VWZeXEap/5zE2qAuJqKJCHb/D76ofs7yrPCjfRRu/8rqr/rmmpdlpqaqkyoycqVzst9V5LvdPSUEudlWqi1G5Ls9fS7LS01NJkzk60NTst7V5Lu9PSUUsr/abD+KqJc2XmMjXJc5cVmZpU3mWKBthYl6ki05PC2EyVmZ6o0mSqysxEqSJTPnzQObXKy0yrTE2K3GVah1baZGpiSp1pW/8x/RQeFZmZ+MJmuszcxBmT6Yp+lP7GU3NfZiYPrQxJtnmRGUJsC5PR308KozMSNdH0jcvMpFJlZkiy0SozJR7pzJBkZ1RmPHU4DGEzYm5nxIrW91vsjXWx07L8Ifu7zTNbTQpf7bQs91qWOy0raqmkltVey2qnpaeW4pzyey397gqgBWGN1FTl+2sgWj60Jqw4r5SwgHZXkKJlYZ3YmB4ZR8u+0Jml+ViUNrM0R5SmEcrcpDSZpclXFmXmcpo9vsicyuzEVyZzmNTUwvDfOsuNI0y7a1PRgnMypv3VqXaXp6I15wqx8f4CVbsrVNH0c6XY2O033p2simagq8TG+9NV7c5XRZPQebHx/oxVu1NW0TwscrHx/qRVu7NW0VQslNh4f96q3YmraSoW4pzX+xNX705cTVOxEGe93p+4Otr6ac4U4qzHI5flE58r2j7zSekL2jXVxFSKNjA66krat2irxXalJ7nTtEvlmO3GZ/nEaZNZ+uNSW57/9DeW9i1FOyVN7rI0WUG7nfZlVhT0xyYrIKZ0WVFlauKrIiuw2dGczsOjEih8kZUQQ+eCIci2ykpbf4NOlFlJcitvs7IEiDIrq9CrkgQbb7MKgq3NKlV/o6kPtsoqEmxtkVU2NK8wKPTHJLnwWUWCVWWzqhZc+fAnPkcfMq8Ccq/DL3kTxHlLf+t85l39TVF/KHlIPI1EpYrMY/iKTOUk15oqU3ktWeUaQ5CpnCDTVqJyyDZlpvIwGion4dqqTOVBusqr8Hsq9/UnleM9q0wpjHVRZErpWpoy9Y8qG34UU4Ver8J7pJ9RZSOt4pFSCgOTKRy1eKRVGBCla/yapJdKZ0rb5s8gXvlMaZLvCvoOM8VVmdLoQU7f+dBPQx3wymUKZy6EGHSgLDJl6CeKoDBtVsnuVqqh5xh5mezvpXp3L9Ws64g7sd7fTPXuZqqh7xhxK9b7u6ne3U01zn4j7sV6fzvVu9upLtFa3Iz1/n6qd/dTYgj/XRlxN8Yz4VTcOwxfPAMzRQrKRPtMWZUVk0L5CNXuRq099Ed5s/UJUZlwjCsrntZ69wgwOWCJk8TsnwFm9wwwUP6tOEnM/iFgdg8BgwuALaW7g9m/ApjoDoDFQRtuMdE6+m0DldxMbOF4PEtnMmVJHfa5zZSjd4c9wqlwE1J0OkwUbRLO0AvNTaaczYqJpwXsHH8XYdpdcsa2qrxmf8WZ3RVnsOJckVk1sS5qvb/izO6KM1hxdAMpJqUrd1vvrzizu+IMVpyrMltMrLa7rfdXnNldcQYrjvQf4VXsqzBmd2UYrIwiz6yZuDz67X0dxuxOYIsJXKjMuUmuoivd/gS2uxPYYgIXWmy9P4Ht7gS2mMCFodaV3R1zuz+B7e4EtpjAhRVb7+/uNrrIYqoVTnrfeFbSVb8oHA5QM6FTs8BNkY6kAtcA2kYK2mSKqspo5heTnE7gklaHUS4CsDtdLaZrqUQA+9PV7k5Xi+laaummZvenq92drhbTlfa9alJFP427I122jSPllO69OWsFdmJph6SddUJnvCpxOScdoyzC5qvKknZ1WvEl3c9Jyyw9jCdlBGl3DVisgSqXIFU1JK0Mft9Myqr+ffpt/n1bKPy+mVSVDr+fuyJTFe37TtlMVbSpeeoPnQKTnPSOivpjlcpU5VhyBHR3uVkst0rcs/Gs2S8rGgra3VVVwgyUqYqPJPpVsgxp0rB8nhUTQ1qQV813mtCRtcMbfhph2l3ELm/dN93+Gna7a9jRovSets3C7Vq+3P4SdrtL2GEJe5s5PamK6Kf3l7DbXcIOS9g76QRz+0vY7S5hhyXsxTfh9o8LF9mjsP68qGK5/fXndtefw/rzoorl9tef211/DuvPiyqW2z8u3O5ScTQhdS7eeN3+ceF256/zaC1eed3+ceF2Z1oBY2guqmHF/lQrdqdaodBavPQW+3Ot2J1rhUZrUZ0v9udasTvXCug0uaipFftzrdida8Sh+bvOxblW7M+1YneuFTBx5uJcK/bnWhHZAQu0FudaIZgCd+daUaK1ONeKst6v6PJL25VxKuxNlm6H2JsKuqRjb+LvaG/Slcm0yrNyokubaUVPTWzOLHbnbVG1GzT3p22xO20LbLt5mVk/UWZX0yj2p22xO21LTFvZ5F3uT9tyd9qWmLZKnLbl/rQtd6dtiWkrm77L/Wlb7k7b0rQr+eX+tC13p22JaavESV/uT9tyd9qWmLZKnPTl/rQtd6dtiWmrxElf7k/bMjJhY9oqcdKXghV7d6qV2CKVOOnL/blW7s61ElukFjfYcn+ulbtzrcJc0+IGW+3PtWp3rlWYa1qcqdX+XKt251qFuabFmVrtz7Vqd65V2CK1OFOr/blW7c61CnNNi3Ot2p9r1e5cqzDXtDjXqv25Vu3OtQpzTYtzrdqfa9XuXKsw13QlrTF+BnXYwTvldEaqaFXAGaRhDNWaVNy8rDJt8uYTPfXOZNpQ+7xQmYazyNJDC9WVviK7hSFHFdxFJf6sbL6rmu98/Z3NyeOUkQ2w/oau3mRw09bw30f9jZw87RtxJbh5dhdHhcVhybwy0VXUen9xVLuLw2NxyPYSPDMa9wdHZl+HQSfToZ44MidC4deFx0DS5cKGkfTKY6wcFH5tqa2lI4o2Tv47WIMqFY2M3119HqvPivsGnsFWTsZORW+X7M8wihTOyr8PQ4kn3I6uUpb6Qqb2iVOZhvWJuqidxV1FZ9qx8zBCubvKPVY5ifHki9xFqQNKQ0NEllNHJjDY0CtF1nA1sWWYnXT3oWlnJ466YWHs1gYdMJMcXlKa7M5n2pEP09J0dnCPVvSQ+l5VLtMFOUgtiaO5Chcn+TvJe1pk5BTVE+11psnNOqGBKVzzsGiElM139BNkqcbLnti8ynSZN59wK6W/g/sAiEv6ibJSmcb9UPnI6e53tzqPra50ktEEz3C1NMXGVEijYyYFBoB+35U+0yW/6EyXmGc5QapoOGmhl75WlCqaBfQedKX47yJwuzupx05ayc5UXHrI5UJmQxqvvMywwZTGM1pTmAyDqlyYp46sclhGhjYJQ67KHNtQiRmIN2QmlSky4IUsjYtxTqBhWtXRHdTvbuDetW4qfn//9rv7t8f+LV+q8YyNurnmHlpy84Aa4I2DW8Dym6no9m9oLlVVRv/39RNPb89rlWnPK7fMNDTZikbIU6ddbOv1u8eEL9t7uK+R+N0911ft1km/v+n6yLnu262TXvCvxw72vN08yQ932299FwSodhsjP4wFRI72XLebGflhLCDyiuem3dLID2MBkWc8t+3GRn4YC4i847lrtzfyw1hA5CHPi3aTIz9MbnNksdsYynarIz+MBUTO9rxqNzzyw1hA5HDPfavtkZ+9hvGRf2kLFVglsvmRn/377I9qj/ECJcW3cF7U1uFVQgOt6HyoRxJKqeJ9nr/T3rH/LdO+Ps58yX4x7ek0K0kJIAvhxOsYW7TOVTspTSlhmcfkF/BZTJ6Ly1ziv8QEGHBaTK5oq8t91F5Y5TEHBrQWQweNsECYIaPx1tnPbSeWHNNQ6TydShX01yKDCJz+Jqc/K4g8llseX5ND6afTKi8w0jGqaOsAX8bIBiQl8Wtigg04M0a2ISmJYxOTbMCbMbIZiR9iXIjtpphRl+uwKxGxwSjoHPREkQqUa/pOB/uRUTRErqpiENHeAf6NUVZkS/JDIkAUlQsaLx04UIly8FPUhPRr1oFNgdWgJtazcqRIESLEpFFicasJmRBY8fO6gJquJqTCsmoLJQ/KMDH68jx8Z5i0SKuAqB4TTyQbogNObE59pRaeNGwQF/GdprYYCdJQQFehi139FNqJp+9s89QFldpgtIl8YegmOqmIF6nDb8TjGe16mm9cPnNm4nS0mQsUJhVxmBRoScbkWZEThEiAoBdEPCYFxgYNn/RGtbBhRBQPBdKGMaKuzA81nZaWLIe1oZMGtmwWcOUrvGM7yZXN6NpUTGgnpFtjmJ64owe9aQtKtPWAAWKIDExsp0hJEhgjKqKMKJBAjBFtffyQWVfbcHOcI6UOewr1zVRND3y96CwtPzq2jVXcqxhLtOOAUmJkvgU/bHgWm92v3s0yY004kw1oFKYkDLg8e5sZW9AWADRl84mOS0xt6/m7GGG0pYG2YpxM/NONG5OWoMYVlwBaOs/wK462ITqUjaNtqDJ7IxLtgIH7IvNUdeOjzK0KP0hbgbNZxf0DASKncXDhlDVEZaMVHv9wtOsFeou8d2u//cPG0dhVRHIu8uYT6VGkTBWaDnqaIgVmjfPxL0f7A+gqRuYZ8kPN5grbLC5GoFwAgA/QZckyBQDY+gts+M5nhhgmk7KKByFiyihwX+hVSWuDH8KsQvwz6GWlVbCmWFwbQVCcFJp3ZzchpyNPOQ/Q9F0Zb5cR30YZ5gTL69Po7eEAGEtzD2AKsgwAjCkdINiJJ9seXQj5Uz0OmSkKeURinjB2vkLWCYygKkVkGwX+jCnkeYWHTL6vyZ7QX+r3R2/ZFmVmyjxsr6SL19/p4DYypOdPCh2r3xF1R4GMY8qWiYaHGLMy56PPTgr8Dn1y3mQGCrgjVRd3gLLymSmr4Fg3sMRgmyINH3QlA0uMNzEZO6IFKRB9jGyL4YfQe8ikWfEELGCaMBNyirHuUNFhDU3aV5mpTOBEmco2n7B3m1gNjFhGyrRbIJRAM1IRz0iZql05FohGKmIaKXCHjGym4YfYBhzbzWhLcsFOQ2uCdKtgAsWw0BZMmpSliyRsfnZSkr0PFpqCtmv4JD1tpGBOONrFKj7UYl0x4jUp286JUAKxSUXMJgWuUstYCdQmFXGbFNhKxueZI5UxukgI7CYV0ZsUCEvGy9x0geCkIoaTsu1sOmUFdSQiKCnrDoyAYO+IKEoKpCNDRrZyUrpIuxRISipiKSlQhIyXT1zmMMHcB7+MJ/4c7ft8GNWXdWHKwRRIBzG8NphTnu7gCOLxrp5nHrcYH2/DEW9J2XZnirLCmoroRApUnrZRFkIQIuqPApunbZ4J7B8V0X8UGD1GJsLwQ9yNYC7mM55OVqIzORC+yyKD8T2neAOFEKyivj8RxZ+dXgpLnN4X0ZqMx9Fb+sx4D8uzymxO78XlPrM5DNz4DpYL8jbRJQotcCWCh8HmrmlbNJ/AuqJTIIcBhraVvPkNRb+R5/GuH7GalDtgxhBoTSriNSln2l+qQGxSEbNJgatENiHxndgQMGcLi0C5ko4n3HI9h77RICJADXo3rrtVUNHgB6NHxNKlvZmuvSWI/WriSXflw55eIVmx2DMDGc5quNtwUeb15OiiCRcRmbtIydLY/claxN/BGD/J6T6g4KVAWAnNCAyPstjqy8wyFE/f4WJR0d+VAYpVFCBArH8KIQhtcWlGW63C71oE/HmTWZ6r9I1tnrG5Lj44Il6Ycu2ODCUQw1TEDFPgelldSKZEV9SXOHIpbWyYVkNrobmrq2DDpPBRM3FEWofDhmxJlr6HJdQaHdjtxtQhaYbNSzG+aFcFm4wcPrag4zYCKGgREf1MgVBmjROtBgIBTUUMNOUOuJD5IQWL0CRGJEnhyUNK5hwNU2YO3R7RSvT2YfIhDzhCUsjWinlOVzCPyKEqbFRacYySqzQFKbFVqOTAUEthPDTD6vCbyiPUJp/4yocYGsJBMTSK5gVeHsWxOFh6KWzIwoKbI8JAI86K2mogDj7rHLuQRkwSLiieBZewvTIiuifnsEpZDrtRCnNXIeoVdivaEzJrELZEwcgIKyW4FoNBUiyGgz8hfob+zuKibjNrsZ7JVUm+7PAJGzZdkNkCT6Z2mqRkzaSv1YS4dxYRYOSctA6/YGxmnaqbYm7TfZc8xfVTbBl0q3FNL1zRfFfWAIgCG1o0vSjwUjFZFYK0yIelsY9lFH0bfrZoelG45hMGSlNASPMTCEljwYhJow7B4gcpJQf3mgyh4PiJsvkJxKXRi7dlGKh4lkcHM7iPtpTNQXhYqy3G41AqJaWZXZO0E5Lxz8K5S+F7bkIeeVvWarGFo4OCCGyVw9JgMnKT0hKNLSkRK1OBZ2kr+W7NnE06aDE++ATf02bzKoO3gDGQ75u4DyEaB+4NetGVC4YgS6oDKQQxrOgQBoETe59gii90GEDEmIGbsEVzYKOv0cHoy0Y/ig1HPKCGWRWHFSkJtODVxBeuNgPT32rYM2iWsCE4kHYUrvJ8gBE/wcLmSq/BwuZKHCTLIeG+wGJl0oSFzkQHNL0UPckRQlwGHoOt6rhwW/mQQcD6mlJhvWo+6frXvKnbegu7e3zFjuivCoRWS74eM9HaRaMp6CQRA1aB09pmLBY4sCoiwSpmwcq0FSXQYFXEg1VgtlqZ8K0EJqyKqLAKhNQ2C20hHH0Rg1WBlGq9bAHCw1pXBm3GqjpydktZBjXDGpqRZJ3kkE49KUjFweZKC6sCT4Y4NnAK0t5ooOMWZFvQirVY7AnhE7ZvchqwngVzcMncKAqBq/VtC32bpDg4LMjTB3WbFGUHdZvmoYO6Xez5kyNWrir4KM/pnWoTKRMCL1dFxFwFqi3tw9KsKutd0tUJG6xjUpPGrh9OBD50fMWrvTSaVzvpQ3Qiq0mpicHsauUUEkpapTgkHSmG7PdRsFzrSW5UOIcpSBZ3H7Ya43iBiwWOedKzyyJ8xcosjB+5Y2kOr5a/KptPIDcRkYA0HP6k8uZTrcs6vEdSaBxvN3hqm09M8qKoRujfZOvn3Bj4VEEpor+j3yDmuoO+7Exs5YzIzgr0ZSfzV5VAd1YR31mBwexkCmv9ENtsES4gUKzYmU7aOvReIj6EDZdWATiPObnO4HqjTRz0ALDnsETIl07qlMLk1gjPJjWDfWuk8cBLhxa8WIhPYxAcSt/xFYOuIRbHMB1hvESKXGGN8GWD4uKJB0bTzjafXJDi4I3jT2XzlBYfbXwOXSviaB4Vcb5VeYCdpgTWt4po3wpEbmdk34hA/FYR81uVBy5BAvVbRdxvBTY3bSTSTiuwv1VE/1YgdLsWvx4e1ql28D5yZ9jmTlZ2xbYC3B+YDGhx7NoJOeVNbX91uC/Rbzg4+PYUkohUrsoDph6BVa4iWrkCUZyWtnR6CMRyFTHLVZW3k8iUwC1XEblcgS7u5Lhyftiwb9iInRMns0KmHbr0e/gd6TDZ0BsUaMu4mEOryxyIsGRngGKr4mGNOOuqOmBsEUjrKmKtK/DQnc3FuSbw1lVEXFegotNhLQoQVkvEXVdgo5N5RBQgLJeIvq5ASHctOXCY3A6dsnRbdwTQHi244aAjkB0GimRVFqIR3eJVkYpJb4Y0gzJzFixP7TJn2UMZOyEisryqDjghKkGHisjnCnxyyqElmYUF/rmKCOgKlPLW1yUso4iDrvwhk6kXllHEEldMBbfyMvLCERkRuJU/MOW9MOUj9rICYRhGTjexLlLmvTDlI4ax8jzlK3EMvTDlI7av8jzlvbiX4SEdwHRI852KeMR1Ui/oX96EJFqkAsO+qEFQJYuHDiYbctnDZEOMNeh0GnYZnO25CgSePOQcITaCCTo0vPCw0FCDEtYLh4VCNqIyqBaUuIGXzEbhK6sCTkRKQlObFkkpgH2ocD4od/TQOagWFVFC0SVKhsA0KCJrwgJSWp85B8WQ1pgDbYf8kbCactuy+VQ1T339XZHX38ECUpE7FjpQmROT1AS9yMEEgl9DRh5a767Rh10RfiN+q9E+5NtzjikvnNoRQ1qB9OyKSuQD4SEgFTjXod0yG6siw4xms5MDjVvDOsRHDwUBGMQV5KZW1EpkobOBAu7AX3d0mSk4wRuNCPa4ivxPuEqTraRk+yl90vAJmMyBdQtlANRO/g6MHzrSSih0+A4KXRHrzxHRW4G63WZfFajeKuJ6K7C32+yrAttbRXRvzXRvMUufFtjeOmJ761y122e1wPbWEdtbg7ztMN57Wzw/ZLMWbQYWfDgydbG6QAvNwSvsKn6JTNFycOKTadEhnIL4RrQ/CGQmHZHHNbjgLZYHLZDHdUQe1+CCs914UtpYQO2Poe3EwMIZstDkStUBC1XYrMr60lPRA74I0fbE1kpKUMh7FHFWsAzIElAhPVLFChhdUirQDSkBlwY9kFZ+VW9gxI/QfP1x8CKQNdwHWyopGWzLdGRkQgYtGmTEV6Gtgw2Z3LZsuMWWgs1P8SKgTbzEWwhNYVIDoxk5tpBhp2J+Ir2jovkEOyw9rAJ2V8Hg4X3m0DNwo3CJow3aeV3/GK5zEIx9uCTaGy70RC4F54LJnjDq4cc45xaZq5B0q4xTz+iI369B1y/ksHp+CDWLolQ46Cu3CAAKMTJVMLogb+SkJBONY+KVwZFhYLolg4BFWh1WwYisR9t++M7jRqlo/wT5ne4qOXKPYk9FkE7lsiK3Ielkwaw/PCXJNLcKuECrooo7HOWYQmxAkVeSRZAf6kCUDUFj8OSR2QSndeHC3C4NG15yZPALU4YPaTLVwyWsEbED1TVv/I5GhU0fuYIgI3jF1CSn3JtslKn4RKCp48JaIEzsJsyZykcOZlW7CWnVsSOkwhnIP8rTz2Nw8frIewq7C21GBewuxE3GQvCGHuJwpQR2xF7hnHa8dhWp+ph0MCbCtEO5jrCX8SfPT+N3EGXqQnhFoaW4A34GQ0XFTi4KVYKC5HUYe9hQ8iL0gYe6CMNKJm2NTGmGA9gaa4oxHCCgw9CRG75EH8h6jY3F2zJsHSSE7YK555uyhoLGQ0eBlwXMkbS9FpojXU0Gph2MOAWbKD095Wy5VVbASsItymAvKWAl4U/BJhOPXZSnDJElhWzk4IebTAbb540O3NnNyUNDxlTfAm7VijLQwk5AJDZKEgvaW4wnylCGmJKiJWFcvn9u6ygIRSPQo2jJGafyrcCOrYAOvAV6jXUsIlHtOdqwvn9DPWLfC+0riE8oOPSPvjLMTIv3xyjsRCtOWOkl3U4LuVZ1FBuiFSetFOc6p1uF/41OfPhxtOFbABNMFOh9PMVx+6UJpnVNSSC7NjMR8Fo5ryTdNVhDNvUUh+GYz066P8OsR3ZTy1HV3kDR4ChjnuJ0phQg4+eYujDtesxhmlEGc1iDR1qwl8dnhcVRkdMnHI74ZOH4KbLCsnePPhX1L9gybGIFrM34fU64RoJdja7AitVFnC0vCqTRiIspZL4sP8TxQ04IjDqdVdjm69yeyKzMbmeiYeAhBVZodIhipDVUd1I/DGdeJgIkG83JkI7rCgUXMVGDdAO+TZGTmhUUomnyLkNmb4trEp6CPkKfgiWdaOKQAp8eguLprCxs853DdCATDF+2MGguSCl4YuATJkFFsf4VgjmoBcKYFYWI5GFQCqAnhaPAZYt9iYjDoL2hYNqKzYqi+Q2OY4aUsvkEx/xeDsEoaEkjCIngCrdxfsipRfcXRghhMfWZSm4GvgHTxFdQ+Xx9A6Y1z+olDT/HYmOmFi6sAj5dybZi+GSk/YR5M772MdHJzB6Ritznm7WkqvoSj1daWgf9kpyiFY5Qtu/DPI9g9wKqEhQQdrD4MGL8ydeLBNe3nNYcLo3wVGOBV0TxBfkMiwTuLk1/5hh7POyRxocoq4L2zf2LFj/kXF42hIHT7bO5v7Ka4pDVCy6JxpRA+cLZeEpsDhyYdFFhvxw5Ilj1QxbdrRtsc28F8RB7ArjMObHmEUyoMRg1WaDANYjusrDyTfIiKxB9hgZwwNuYJaujwDKNODFMZGlT58RDCCAP7D8f8kGSkpTDk+7LsCl7ulVg6lXOhVBsIgps3eE3o4I5RXdzg/4gkKnK6zt8fdPGXUAjoNvBg0m3dER3hU4WzaeyHh9iiNB3cccjxQvxbS0uFi0ExOkoIE5z2ulKTpMqJJ7WUTCbRjBWS/5+Ife0jpNPIxarxcWipfzTcQJqzkDtZf0JD6HEVc6+ZFcGc1PvWJgLJIwie0vhdfg7nK7gWBW46JAJkHx/eBqDjRNeH6h2IMSJ6TgVMIK1iJMhJKrTUjLgOBswgrUKzM59m4aUDzhOCMzRXbLVWUspgeOcwAiAKuScc1rKChynBUZEUyGnneOHeOEl0cT2Mkr4Mtx0sRV5hHGBYGvKMAEoW3UBci4ywMKElpvwrssqK3NsWJRdBVqoMbGGH2ci1u0ON62FJRbnDEY8U5nLZhstrLEoAEojCqlt1gj5fXUUtqSNOjBrhBS/Ooo50oj6KeWUefywWaSGj6E6R4by/M44UUpVs8OatbrxAfFLI3Vusy75ZcFQm4fw9RhpnGzbtL8sIRxJR+FI2thDYy0ssCiISCN0p6RJKLxtIQOwjmJ9tCkOvSxhgUXxORrxNqWcYzA8jCMUEDREWZQ5NJ9WzVbQAhgLVV6ENEdkKONkMnipzVZc5kXYYkEhFrbTKBJImwMrS4gE0lEkkDa8skT/kRayDusoPEfbAz44LcTn6Cg+RyPeppQD0vkhj3EV4lMr1SRXQjIjsrhtpYVxmO9MREJUGflyyjp7E/WUMzqVKnwXw4vWrT1wXgnRPzqK/tGc3Vh29Wsh+kdH0T+akxi3vCEh/EdH4T8a4TylHIMQHob0Ek0kMFPbuBSAg6WSsw4VTRhqjohiHRJOlIj7V8i3ZZvvnBT+q6PoIm3bXVVaCC7SUXCRRhxPKSc35IeNkWUT6VynFcGNBs4IzkRmQyKtkO9pkyqqyfxE2j9/R55DIQeUjgKL9IHAIi0EFukosEhzMmIxDoGfvW4cgo4Cl7TL291cWghc0lHgkkbQTgvBWgupi3UU5aMRtdPCe9ZCmI+Ownw0wnZaGMrhYbgswUXildq6NjKnje6DTFvz5K0B4YwCcohizD7Ljb+TKcaIY+JZp5lizPdGi22ObldMMaY7m63qG6St6hskU4w9qW0UKMNPQSL2iDGvwq2yVF68QkaxSprDkVqca0IeZh0F3GgE0LRwSLUQcaOjiBvNUTUyh1QL2Zh1FBKjEeFSygk/w8Oald0UQ0CGJqKdsW5VIr5ChXjkAimakPxUq+YTrRRP6jcZcOjNx7CiHcAd2AGEOBsdxdlod4BvpoVczzoKYdDFAb6ZFtI96yiyQIPSX8oZRfmhkNgNc5tMg01atqC1Ulw58SE4aVuhONWOg7PFTnKQUWhGU3QYmffMhO6e8IdOyj13WBRuoIsDJ7aQXlpHBHtdHDqxBYK9jgj2Gnz5QqbUhIdkXioP5rbh4L2d3DaGLeBFsM7QrkF6D3WzRNoQPSHLuYG7i1INBzsfWWFs7allOx85vti1Rn4OcgFz8huyj8NnzD6enPZUpvFqHUzbZOJhMzZxpXE4IkcOG+uQhAMWdYq9KTmqgj5g1yJiHMThk6mFlFCP6SdKZsDF3DUdhSDoop3WqoUIBB1FIOiiOPSOpcI80U6DgAKinosLotzKMArCX1krH7kOLD9yYjRKq+EENkYHVw+FWRZIlkaLoUQWEvL4lDiRcZkjEyYFWcU4o63nQK5uLSTr1lFcgAbNv5QjLbQQF6CjuABd5u3B41pI2a0jGrsGK72Uk+logcauIxq7Lg/sB0Lebh2RuDU42VTrQRoCgcStIxK3LrkMCcWHTVwZ+ecFEreOSNy6bA/g1wKJW0ckbg1OdmnFZGxaIHHriMStmadtlchEErJ464hxrcGgJnuUoMMKjGsdMa41CNTkK7CIgIwECNMwYlxrEKhLmZgbHsKTrTJkFiHH8VbGF7DPaWuj7B8OMakUGV3nSylDdiYqNIeMTRGYiL2tQZxumZFCbnAdEa01iNPklpHUVU4dTuxLOozBI1Icf+sMVw0k6hCCWcEwRGRuKGSKvPygA5kQ8UR5MhF+S9Z6HFPkRwOX06JaJ/uz4NfNS8Xl+ujwQGgshcigrF4VcmECBNeVo6M/VJMr2deV49quILwIKXfySZWr4PaCFxOl/bwvQ/QPHL+WSszBl+c4bMsh3zBdihyubuGTDwHBRNZRuMLSuUh4S2QooFqLBSLY84nDZCuDOI7gpVBUi8p5nr7DzxIUC1BVyYF9VAqvQOAV/0bBhQWpIiKiiqlKJYc2UwkMjszFJzidHD3Fu6CT1OEniNUAYirFOYf0fPTJhN8vnQ2E19JhyKgamGPiGn1CfDH9hAPOij75+rsiD4gpO3mQx5G5eGrCz4I5xl9xBUMqOFY0Qsr6xxCZy9/50JSrRXqXlSgXSWNcls0vYOrwp+YncLeCkLL5ibIZKIRpYxhLXyNG4UiMQKX4/cRrKNrVETtQyvmA+CGTiMtQaZMixICUqgIjHt0GfgO9HvbUEs8RceB1aTqvw1qpYKwnObRNVOFvAJWYGHDAU+CT5wqW9WKpyzkiJh0Tj7QAXjWmCBqh05ySJ29yq+cT8stxODsitLmIZsVZ1klcHYgVgtgDg9pDCPnJPf86r5gCyS91KCFqUMESvDZUmHRwjvqwjJg3AKchh5qXCKzL4Q+knTKsNq5SiUweJbakoo6SL0xYY2ResvCPQxXCzEY5QMxYRNPzVkEbIQpsYtxD2UuN2LkceawcZja1Je8sD7nDiMGExfUuixJ8DnrnDmotb34Ffo0mOB0/NNswAcmX4rOSEwDQmq2wzZFmxrkDaOKjLil/Kpu/41FxWcm1Sek7jDvaYtxJQomNhICW/A5owYeNhJ42v8HpBvC0DFVBS181fwcHvnJZlefhaZWr0LYKWx59MgFBxZVKydKRu+Zp0XzCCyyKjCKwc1i0q9zXT1GrlF5lFfIs6KxSzW9wrdKCarva5rt6wCt+bfhU1ljwAn2c81dHYT8aUTyVXCREC2E/Ogr70YjiqbRYvF0LYT86CvvRCK2p5FBLfqiZXWFDvfE8ZHEhohGzdEoTPAda1ecdTWo2dXuwiLFiieIBMxNZNUEftaWrSZQUSskXN7I6YQFSfAKxcQ1C5A0oMghpLJhZyCcVMRvqCFRK58pxp5T0kBOxVD6rOHLJVVnFqVh0mVUcE0JxupCmqUHZNKjqUH3UXyf1r8KdD09RuIB+tTLhJ+JBjpRQxB9VLVeuqtyu2MaZa8kExsn6KL+2tUWo2VZHCYbLliHnTV27rcINi/6qwg1rL7GcjsKgNKKaaAGJk0fQbaMwKI2opqrFulMFAy8daZ7t8ghq0Zyrx9eh5jRBQPP2RIwCy5rorMzvQQggqFOkATChqyp4DmieNWX9CaG2iNNm/grpuQUGhbSmEgGyqN1sSGGmq2llattkZarmkw80rgo2dPwdSHVk/6ysFrkdUXyX9u2p37QQ3qWj8C7t1YGbmxDepaPwLo1wrcrK71aI79JRfJf25sDVT4jv0lF8l/btabC1EN6lo/AujcCgtqufUM9BR5FE2hcHrn5CKJGOQok0wmqorrQoQLg7RnE4GmE1FYVkkFc8siAIcTg6isPRCKuprLzAvK+5UeDShcxoYDNTsgbYrahoN/ZtcKh1YNZhA3VWSprGi43WtCk4h2kZlhh9siaQtZlJSve0wtU5IUjL0EgjX4I1StcAihXjXGgVqBpUtbKydS60CrVp8BSFkVUZH5hRXJHJ89bbuBHiikwUV2QQJlTJnFQjxBWZKK7I5LyuxAPXCFUkTBQIZBDXUzlxYfJD0rwp3i+kPN3kMt+kaqW7I5KaQn1kfjkdVcwWr1Dz2BZlDCUqdZxzijepjoIRylGYKFzF5LxCKTJuUpio7G/eJIumG2dg6pG+zz5NmqAoOUQ03pA5pAibvg5paZnbz1t9FVRvzRdTmDUoRJGpyp4oSZhWFFhUwUlVhClHgYs85TylPIFWQoaFChOXP+Hg3xuuqDwzAicqOQkyP4TNmmwKyCOnM+YkU9oN5Jgg0HzzD3GnlD6KF2UR8gShGrYKjzjzk9d8yaKk84gfIUWUY1vKkPhf4QYfVC/iSYKGWmETAOfVcR2FzdBy3jyDOE1kduIYFcvJRPg7KHGwIVS8PdDQYt0brGfOQZVVzoefqFCCiVjbFUIlCUDFyTLifBMmikIxeXtItxGKgpgoEsMgEqIqRBXLCEVBTBQ6YRAJUcmJpvkhFAhUyChCgQ0QDHH5RYAUGUSgwyKlU1Oag+NG6YJUIcMyRbpT7TbOkAVtBl75ij12rswqhByWMcPeRNEaBvERFVFESspzuYtZCdthFFBhEB9RlaL2b4SAChMFVBhw/qtS3I+FYhsmihEwoKG3HPJGKLZhIt66AaGaSLhC1XOh2IaJCNgGbOSqlOeN2tcyTERfNoG+nDkYJaP2QtX2iAVsVNl+oqkdDggrpmS9QhyqrTJakcwBQWBY+FQEGkuFimD8qWqe+lAlrEKOtkLFcywiGRtwhimhmXReCSRjE5GMDUjDlUxx4IeblOVNBnIOEgKxDFs3KR8lUqQTvaNitxIVk0MRG8qYVFWiBdtEnGUDCjIiGAU4OiSUp4IzNoOdHEU0KNBw4gv6FRpdXUTOKxMRmw24w1Ulun6MUJXCRGRjA/JwVYkFIY3ANjYR29iAPFxVoivXCGxjE7GNDcjDlZc1HYFtbCK2sQF5mOJwRAHC0orYxgbk4crLM0dgG5uIbWxA5kV8lCRAOFUi9q8Bm7fyYrUXI9B/TUT/NWDzVnJ5cSPQf01E/zVg81ZevAEYgf5rIvqvAZu3kvPFGYH+ayL6rwHJlsLfRQHCTIxYuQYsWzIjiwKEmRjRcg1Ytl4OizYCLddEtFwDlq3P5Zko0HJNRMs1YNn6XJ6JeMhJKY3b0HNQrSqn4FjUHTJ1VQiicPJG52CR4hxHmUcZFapP4aHS517FoKLZDUKtz+W5JeTiNxED14BRSz4NUYAwuyMKrgGjlqyhogBhdkcUXANGrZdrQhmBgmsiCq4B59XLFFx+qJGo1FoulUvKakPzQSgXcWvBXUN6Ka58oULcjwm3WfBtYQAnZqKHFsykB89FpVx86kRcXANurZeZrPyw4AlEkQkBsEK2RYRyQWG37HIAfdiWXLKtDNlNyQkBJdTBHwdNgSImVF1fklIwQmwMNFqs4PB6uVR4eAjdlLgwoHk4lDQPxVzwgyXnNiXTPXQOZM7Zp9OaiC5swP71crVufsj1jHEogpSuw/uiZGE8NJSSgyNlieFS2JoPS0NiJ+Sa4LfoCVYlKkARCdmA9etlGz0/DJGRJYJYw0SziAgNCVyZJe8N3xPILonLGEUMckYC+Hy9CnGHynMCHxMMo3ylq4Mht0IbESuKrANViDvk9KzEo+IcFmUIiadEAA5WmxDg3kT9lk1cf+V0AFXB9EMkowruUY87SYUsujrzGvEbtMWFsHv6pEOopEcwiHYmHtZoSwUZ2su8PH7IuR7CLZoKxyFMmApwanYfW75XU9oPzljigl+TYr6wykGSRlIHLubIf4PrNHnrqrJOFaFUkBjyoTiuqK24ejZyiiAhkue/KxqPfBWcFbS3c2pOGwrohE/l5hO85BSEiJQnCK3MwUsgg35uwyeOJqW/C970QgcvNfxOmrujg5OCSiOhaC5aVMilDZuG3XxX1d85F3pUwYlOPeKbOv6u0PWnBqkPhgu64RbNdwgTt/SpCvI83CRE4fMGnIX9VRUdXvbAfd8KZ1dETTegmiP8q5zk8cWPees4bUl95JJbOtcwWtDWkJHnO+xO5AMKnyjdgrV7+1R06oFFTtYjwTbPDxtlQPP+UwYeKXEX2IiHKkJFXTHIqsDGDQkhNvcemskV7j3e7w1pdJi6A7ZRgcxuIjK7cerATU8gs5uIzG6cPnDTc3p7YDbc5Y0qxHc+W2z3vYQTrKrClY8e8pUvJ3MKJScTBibiyBtnDlz5nOl55YtI6Aac8rYrn0BCNxEJ3YBT3nblE0joJiKhG3DK2658AgndRCR048oDVz6hLoOJ6OLGVQeufAJf3ER8ceP8gSufwBc3EV/cFPmBK5/AFzcRX9wU6sCVrxBWQUTiNoU+cOUTWNwmYnGbwhy48gksbhOxuE1hD1z5hDTpJuIom8IduPIJJGUTkZRNURy48gkkZRORlE1RHrixCWnSTcQeNkV14MaGh69wY4soyabwB25sAiXZRJRkU+YHbmwCJdlElGRTqgM3NoGSbCJKsgHFGEl3zcT46JQp64oI3gXWeKjDxrHAGnlRSJNgT05V1RmQSAfjTV9ppl8YZNKscHITa9xji6brmMehSoeD56xIMeXeRDRoA1azl7Mi8UPKSjIh7bgJiuWUHvl2KThSurjyd1PVAlkxGBZHZRJ1kGKX2RvgTVk7CEyokhFDjZZu2V4wzQh8axPxrQ0nzZajA4xAuDYR4dqUHF5QSgRdIxCuTUS4NuBPK4Rk7lvkBcK1iQjXhlNcF7mUFsMIjGsTMa4NCNSKYlMEn4LAuDYR49pwjmtymAsChBzXJmJJG2ZJk3PP0TyIBAirLKJJG85HTTn2JQHCGRJxRA2IZjQ5hdhmIySkNhEzzYBopgqRqM0PkbO0KGpdjkoBoSABXfwpoS6Xu1RwaqFaCwp25pQxDEHNJq7sYCJymwFXTdFdTsIgTOaI3GbAw0IqTMHDXQmTOSJuGU40TXnM9lXqmrfFucpRCoDToRUhLlXBRoO0wE10q0K2Rq5OV4bo1iakV6F4TRWzBk3E2zIVJ5aTspjxs63ig5z4wmy5IxkCihkhyQ0p7AwhB+E2pFoA9ZZT2CvWuOm2x8Ym4vmh4kEZp2wzEUXMgBjljWw9wUNODlhkh+IbQ63eKqR/pz2ZjB9cg5WSHVpUqShxNORxaJGJ2FnmADvLCOwsE7GzDMhWbbuswM4yETvLgGzVkjjHCOwsE7GzDMhWvoWGgoe4zBvUpaTfAdsSJipirnJWtZC3naLrClRG1BNfJzeuCzrpCdHSHUL0iDPLGUA5y1lZk+ww+endlV4HI2vJ2Q7J0eg4o6jKPIJTiWTnaxpd5q1pPtnmk2s+1ZQ+ZIMM34nplUzEPzP+wFEq8M9MxD8zIb24mCSeH25Vca/VGc40RYXMOKs9pX6mbRxuy00mYTAiiePjXS5VJzYRl82AmtaSD9kIXDYTcdkMqGmUpFHItMoPNXLFkjkkSWbkGE+0h4Hp5sk6uZ/1ix/WUYimDiZswhA542QFyi44ar7MPMJufeYx26i8O4LZEZzrYXIh0opH1g3+DmbgGGW0e3EebOKg0ouOUQqqRMRXs+CfkTYsdNMKhDUbEdYs+Ge+EH1fViCs2YiwZsE/o5ATEcH+VmMjwpoFa4zogyKCfVXCRjQzC9oYWVKEpDj8kLmLlPgH8b9lyP/omuyCVYgi0YhdQaHPCelXnCKQXCQFOIVk+UfaZyKEsQcH6VS9DaXKAkeRjFylDwSzLeJYZQI3zSMXHsnz7GvAp6K23oOz4+Li9TYiyFkwyLxc3tzm+wqMjShnllMgy4kNbL6/7G1Eq7KgSXkkEt07aPghVy2oSyKAZA7OdrCbq5qnXSgTMkeQ+Zp52g7liou6cByXL6KEmkzKo7sfexdou+PSVMrgHZgJZUVmop5B9BCqlJNRmYsq0ZWvrEuBedzGyFTtWacqMnLb1Q2KpkHZfFc1n3y2Sea0NVBlNFBVezI+K/DHbMQfs+Bm+aplofraTeSDG4OMjZwhnaqhwXVU6U1YPU47lJnn/LmUABnp7xCnpUEY5ASclK2KU3EbdotppZltn5Ox1IT82ZvAewc2LxiHyD8Khw/T1uAt4OqVBjsqi/XwQlFsjkdaD4pu8cg46TJUGqXQSA/V0GgXj1O0I4KCRgm1pXESOGs24qxZUNC8XAHeCpw1G3HWLDhovhL9jFYgrdmItGY5d20llpiwAmnNRqQ1CxIahZKIAvZ1Exux1ixIaF7Om2gF1pqNWGsWLDQvV3a3Am3NRrQ1C5qY9+L5bYXklTbilVnQxLCcS6qXGQmo6piYvAqHQZ6HzKeuciHTLP08a7KUci2ktbFNOZUihBvBSad5+agtrjH0HWIHb44M3sIQyMfOUFVvXNB9C/CJzfYx4pHABoeCb44MX3OMPVdwt2RbRN61OCWRjdhyFnQ1giLoafywJhmzg1PZDXGYRwWVdTEqFPAZMvGGoHDOqRy8yhR/DK8y6MGI7qvzlKPy7BZjWHESWho9G3Z7DpekdcgZ3Em9YqYrBZNaVBikUjkhJy9lDsapgJhzLpjsuY4MFz7lWikoocjBZFVN7qb7dxGyaZN7tAisZI8oA2JVe1SURLroHOmLKM4oR2JtOn0VSlmgxrHKc66MWsbvIdqmQOhTeS76p62Q29RGFEALRp/K5VR8/JTLuob817ST4iBA2krELVJOKx8uQNjbXR1JpYmBzeUNzNYBzXs7m/7xAmyjI+sq7O3EHuW9nU5Jj8ODSirwjk48e97TcdxiU6cWKkeCP5QMQfpcmgTxCEQbLSdMzXN5oxRIjDYiMVpwElUu83uswGK0EYvRgpSociVvlQKN0UY0RgtWospl7k54ilomHpdt0mu4PijU0lCgAS9Wh/dKZopNlQqosGTr26o6wfVHaLtB6OJuYQnLxauQp5l3tSZFOELbkbqR0kHwJlBUgTRA6lAVarSWYQpQ9no+3in3tmeCAK0oxODTMe0Rg8/fVaGFyjnxEe00OXL2oFBLzioef3QBo8o5NLPExzrDvMrRHXKcqFxxGRITv4jozAK7U+Vyjix++h+2oFSIeHppaWE0VRH3PzpyQU5tqfzLD7H7UmGOUAG4DNGS2xWAOQJMOxN0a3bKEIRNnd8QhVmYUErGgBmnOL9SOC2V2S7zW6DwZSVV9OXzk/IpbQLEPFJuU3CaQhlq3PlUrnUIDFM5h+xW8XEZEXQt+LZyCJMV+Lk24uda0G1VLtOQrEDQtRFB1xo+KLQTNzmBoWsjhq7lBL1UNjmnWkKRAEGhjRi6FoRb3HYrKsISCRC22YihazlvLupCSH0QttmIomsNb7NaVqoFjq6NOLrWHMiEzw+bHJhN1shNWVDK625hnjLsKHTlVu0RmOIoWTjZ4lAKniKEQ+2RSkz2aSMKsGWWL6ppkQoY4St4GhoQ1oRM/U1hOa7bRAwHyJogOIxLdlgQzeBaRkUL7JlbqRebNItOsXKltpLTc8glfVfBLgs3NifQpCt8zmV/CVBu8mBJVXnIoRmvsohpbEEcVrlcCpef1mVhOEUY2Q5htpigmgJQghiIjNx4ExVHq4fMeeQHIU4UvxOVc+UbIEcEt4or49qIzGwPpBO2ApfZRlxma3y7udcKXGYbcZktqMktNUGtwGW2EZfZgjPcko/YWmEfiEjGlhP+5rKjm5+y8V5lZZ3FMyQo3qQ+rDMVG2T/xAUGtWJIFbZc18eprWRvii5aQj43GzGLrW1Pzm2FbMI2ogdb8HJbnC5WyCZsIyKvtazIyaWH+SnMf5SbZJMjO+IwHE6WDY4scQCkGgVbFW9hpHZlfOJHHFl7IMGwFRIM24hkaW1Yt7IBUqBZ2ohmaZlJ2TbowrKKyJIWJMXWSS0sq4jVaB2fr7IHkZ/WSaBBzLF0x6954pzIkxLNNGmTETlMUfHwv5KhS+KLM69fx+5NG3EmrWvPh2YFyqSNKJMWVEVKMyVknLdC/l8bcRut46PbykoxnjJPX+PeXWGpOrDgg1ue6tQ6UuwUMmNPClzxKN9c/dHyxxhJtD4dqwBW3n0EAqSNCJDW8QK1smlPYEDaiAFpXdGuDgoESBsRIK3jBSOXVeanzZbQMIR4y0Q6UaTF3ClRsrXoOWu+qwNJ4GPPbRXigBVcXBxEnMMrSCmFFGVVEzhONmJeWk7USyWNROTCSo2olxZMSnK4SucXHtYe+k2V+4Yepw1XJ1PB60LZUKHPc24aRV58LnmvcmQnCN+KiWpsROq0Rbu/3gqcThtxOi1zOuU4aStwOm3E6bSgaLYkQ7ECp9NGnE5bHIhztgKn00acTlvw6nIi9Y+fcll22PVRm7lEXJOZ5DQh2WtAOjPue7o21qmiCDomZUmynM6Wap1Bi6xwa4Ma7X3QMW3InsSlk60LHjuVOw7AoVkN56pCoWyHREWYymBs5GWsyUXsU8sZcsl7IU3lwm35hjdqS+MSRvUvZPzhDPHQLKGtUPXr7dAo08RZWc9BXISxDphSOSoWViqenBHX1RYH9hyB6mojqqsteM8pRMaxDQl5c1h0tAkp5Qyn31OcA5NKLHBGx7oSgkK58No9pINbrqiHjRMXGk55WTYpL33GCeAolRmXPCf2O0wHJkPON19xKo8cybEVsqtV8NLmIRMfR9IgByYXGyN2kUZuwOCFypF6PlTpU2xPUEgzjJyVuKyhf2Rz4ox5RBeh76nsaIkdJgdDqMB3ZNUvUGZOISkijEAU86U5j2SBt04dDfnvyFAMwwtcvaXP6wbIXAffFKJ7yOFbcX33os4YhoAMzjhKYW3oRQG2QRFa4MbCnj6crQq5qDHJQklDzDT8osoLt/mIfHhoxkkpadhy+BwqGNKQllJBWJk3zdiSiGawr1B4l8KJUn9rNx/dRsLm17jwKv1mzuNDbyrHAPEfVJtfq5pAqZwTppJhPq/Cr8VTPTqkOKVzXsnWFiGps40Y1LZge02L+1CgUNuIQm1L1idb/IdlXntY6HiHo1aFrC2oQFuXoGRHLafAyyc0rQo2eCpsuhp1tIPvhS72HL1HtXPgVDE++FRoJcCeZurMdfR7IXaPUk9zGUrSUuHOUHS/zG2oWI1qisigFip7lnVZQgp05PRqilORGpQ7DN5dsopiUqICt8pRus5gunGVNYVX7ZtvodeEj2rzUW8+Gv4YDX5EP7cl+0S8PAE4X/amogszKzeqO9m+OUnVJuoTqhSl2GG9A2XCydiB/Bgq906oA2IjUrs9kGe7fgZ6QvgZC2O/yj3FtcLa7cvmU4VP8Q9G6gAn5pZTk1khMbeNeOKWE3PLqZf4ISYVJe/SCGMuUJuSeWiblBpkK+IE0OEaUPDb9HUiaQqFELJq2Ih3bkvXnuWaH24q2DT1eDTTbUCyD5WDKZsYm4UQf1XWbBHKUIkMqmS8q1x9dQuo98qb2ojWbpnWrnJZp8DTUAw9ZGSiaF1o+JSPBxqQCTVoaXl4FJckOkuFSxXxZFWoiU5KFhu1qP4A16MmbaqANc6gGgEyTxEnC2Z40q2UQpF1bMB0wvJfKsofHDQphTrrpYrvYREB35btkZVW4N/biH9vy0NXfoF/byP+vWX+PSkH4ljXnF8yjOwv9mZy8K3Ko2opIisoz7Njjgn0vVDCiD4itmJ/jkY7f3XgFiGw+m3E6rfVAdavFVj9NmL1W2b1y7EVVmD124jVbyvTHlthBVa/jVj9NrD6xdgKK+SbtREl3zIlX46tsAIl30aUfMuUfDm2wgqUfBtR8i1T8uXYClsJ8ztiz1tmz8uxFVbIemojSrutfHtoBD9MHhphIwa7ZQa7HBphBQq7jSjslinscmiEFSjsNqKwWzDS5dAIfvYaoRE24sVbkMDl0Ah+9u8LjbARQd0GgnoLuQFPbRGSesJXZFC42YUyDi+d5x5+LRwiMGbuH5IR49369tI0Vki4aiOSuvUHStNYgaRuI5K69Xx0tVAthIyrNqKVW864KsfmWyHjqo0Y3xYE7jbNTGB824jx7XI+ZZRoiHMC5dtFlG/HlG9XSVukEyjfLqJ8OzC4Ec1IzDQbCcBD1Gutj1tK4VLAzkgOVcr4HgwjSpnaGqKUDeUnlVKhgA99LEKxK6UU/Bz0oZLsJi7ilbuc/UFyYhV+WoYqT7h2EV4YoOjm4rhYhUPxQ7ruOFj26XJWh7IUTTppJIYODNeatUD8E0pHatgCxkRkMhqhaBddbYpAS6kC9UMhyz1nClXIVM9tKT8A5xQPdypk5VSaCzCSOocsKeEjm05pUcLFi51DAUf4A7f5WAQkSiGpLy72CrGxtnLx6JpodMGrp+4WTSLJzeDun/Qu4q47UNEt1K+JjjT68BD3Bb8dp2WYZ2+3810UNQtmk9sCYieI5EDSWtiFleFQGB8DcxGwor1ooxM48S7ixLuQatSIu0x4imwTpHyTxk93DbpI0R5siSWasyGTXEfwU9M5hukxIS6TUvBeV7mJgZQREHZZG/E2HJ42P88WdmM59Qz5XostIBvPDsaxmGiFj471ihhIFQFhjd2IGnt46kINQb4d6XCE06WIA4eQKBrFVKlG3uatK2XK2t6vEAUN3UdRIQsSGEOLtlPF2yndmvYJsU7gi7uIL+5A/26JoXACX9xFfHGn2AIgu9j4KXi3OoQoEZuLaxWE6BXvQvAKxaBzGWW6t3IZc2JVMCeZkjpzYDwugBviB68WCubjtMcU9s7jS2VrkNOJigsoZQOdgz7qzbdm862tCSHKulDcUylcR72JX0VEe3eKN2zZOcZP6dQgsobbnqQIgnd0Z8frL2gd4YzBQY/8bFS2Uikb5nCMI9raFOtNVj44lN0pp7DJM8OeCqJro5JjAW4y2xZcCGrj6o5QQ8kOwDonxtDlkqPKRbx8p1iDcmLeCn4qDZEL6by3Bwak5XpvsZvV7VDCU8dAok1Ssb3DiXlt+SnSahEBv4k+2a/lCCsy+RlAW+Q1zPmdqkBXpcm0VawRJEEqzsXTl7YHiwlfBR4WZ4lyiOCiekybAo4OFhVKXb2p4FhWTLIwoegGuSd9aUMtR9jUiahB562rCzEqxWkmaA78/+x9aY7szG7shhqFnIf9b+whIphSNUX1tY3P18Cz/xzoKKtVKikHJhlD7t1YMznLRUKfnfdn1/0B0sAw52diaFMZ/im7lYScBjIhg0hNjadAxQc4LCmM4AS7CKk8LyvFIXncpU73MziU6eXD3bYFYaNckRf4dOfQQjN/t265yVpuRpg77zflAoykK75SUeKoksOXhISqPs3oE+QKg8JcuW8QACRGvtp3CMbXT35XO+BfsccgiC5OAGKnTol2qtRxZ4bQCgQ1/e0m0y+z0KLeweiT+2vFTWNecdM4QVrO/DN9gMl4lDfyvCMzphlrf0w+bqkUBQN5KAii+wH+3B90RyzoIhbkWHHaWplFNBs7IjXKVYOiMOBBjdNRdUqibRjvBX2kXkwLuTm3E/V25CWJwcvstU0gW05/IDCryFQ/XLdnsc9l267rkDo4fKTcLdvh1KH78Y4T0cWJyISpf0rxP54rNQYhJgZyT25ZgAB0cIcbOZOArGiUOAve6+LIedyUW99FUyDH7pE0UCMF+RC6Tyrp6cWAfSSqZDnY/UZyTeE6Y7MigqPGkiTkuPmBz2U/NFkwXQLi89YJTmLoxiRC4W9b7AfSKaVQDRdwvW1dYeuqOZMQgMJElpwk5sIsPcnMCIBxeSHvgIbb+l6OrtJ8nOjoGF10DPBooycl1YFM/W5SG2FEyEfG8cJUxpFf5VJS9Mw6s2MAIAxmxzAfVEPVFUa+3NghYOEjxZ5BjxSzwpiHV3oKtOM8MmgV2COjNCM7MG3H7ZGxwsHyLxTD+MjMrgKPTCZ49sgStyi7mUOVPTI7SzTlI9x3VJQuKkoGMzl4esaDxjKAoSyN0gvprHiavo/UwsAqIhUiFqMzKzbYaOaSRMDH5p5hBQG1ED/sYNH7e3QBjOgsBbHmM//RA9Hu7lgaXSwNuB1Gv5KFFhZKjfUKfqmGU6kHZXktGrueV44KpaZtLJB8+ZN7U5pJgenPZ1cxiAVwgUyvVC5MlRILyTjDLWuMDSvnWi9pnPcu+qD1ktyvbrJZiOHISu0aWenqJZkhGnuJvmELF+1XFUft6GJvlFgZTK3XGiBQ+apfi4Fs0Ga3lTjRh41AVUwKjLXKnrb1wK62MuNQTuSRLuojjDEb+xrCdu088k8XbJuzhjoduxSFGaAkWtK8D9f5KF4Bz/of7+KSst5T0T0gcXRH4ugicZScoqyfWpesrMtXgQl1+S5hCXpYo9O3firHWlA0dph8xUlSq1llz4Vrj4YZSuyftB8v2a38YopgYx4tfmw9i9/RxCnEr4IG2bgZgftqpwQOyoW5MP22eWdTUpg4XJBgLjzckUBmdwyUXvMfKyAb/7eugI5q08mcyaWkqHqkVlqkpzMCdSRa3SD6A2WFShPm9kn5WN1Dboe1XoqqLMGWN4WdATyA8AtRvNg9JonYNj0YIfJyIY+KaVtQ9NoH6l+5yJ49+b7pGEBdDKBSQhCaWoVvqT9kUmPzRHjMotqxJUq12AMWcjSlRbsr/d5QXPsIFIgxL12yEoebje2ZujtmGG2c1jSNa0xFu18ZV7yJxik+lzt1Wsq4D+fJuBamTplFLaTDNMz8pYp/ycNrO6Bs2/C2Rd3xnnptf0REbPy/iOjr6bloo/Y/IiI2/vsjIsf76lXxTGze2Y/3A9iSFtFUuhHhoNrODXhH6YpDWN94+M20t+ATVm1MjZNKAcG6sdRQ7MWiRtMEGcOjoAY30/tF0UrnBAFFDr30xjfJIaPUH99/q+edT53cdkF76SxG66XPer10YMj40rOlIbYAaBbg2FlFFyAXZQgPFOk8F7HW+PCJVkMHoqYAMp/+2buwqM53t3g1ah1SYoxrZrd1Hdae01zfCk222we6DJwnrdZeqjaNPqvnqGVd1LK3oDggl3VHLutVEQr02oIsNluZfoDLk0Fjvoh0S3T7yVdMLhzXAEGgOmHK6tKsUORt837/LE5wMUSqO/5ab+mPwJ2N/xe4d8fZ66TgvQbuMiAhw6788GdiNNTjVMxKCpX8H4H8V6huPnv9O4VzReiCnDVITCnrSQIoM2S9k3eOFa+5aH1fh9ThU7TOMoEdNh36H++CIfmWxCKjaoxwXcyvozJ4YTpowm6AvtIM95cLyVjWhacO/Q25KEYUw5edRMAx7I5j2MUxfNtJyIPExue1EH3tKESU3Fdgtvk7/tX2Qcl9INkKiQjB73TrppiMBSyhoAbKVkZMfLj3SvfDP5mfxL0DWJxAzeGwnDvs97TR293e78MRYe26Yy52MReJnQz2OgF3sTvuYjeDCEB50icN/yqeWJDuuItd3MUSG3aq9b/1Jf7wuwOLme5Ikr1peYBM4FMiT60HKXnjpe4bbYxmQcvlIkyMbC4jHQo18BDcoOKw3If1Pox3sI6L2cXFhHxioBOgVrmRUlwLmxSgpaEL+oGdCdQelSHg/zkRTQCv3Nc6kmXvf2DV1PhFX2bFG7M509fclXzxl7nB3v1LJpJSE43Vq1ygDHAI+6hak+VSiNMj9KUIqPdYFhyts3dtE2cKu3/A6+yO19nF63zrEj2Yyxwfs5NdiegyILT3gI7ZHR2zi4759tiDVKBjY/auSQBomegpjAtYj7VH2JGKPsKCMVzBMnb/47OZy5hVpsY4NKtHHPafSZZTLnPo0N+Vm1i6TSyhImYPXC6641p2MieZmmGexV0gCAcd1bJ3jfcZSrn0wOaiO0ZkJ8ORm9T8cc81IER2R4jsQ2HLDB0eesCI7I4R2Yd8ANJP259cXUgcMCK7Y0T2UY/m7EJ04y4Q9G/HiOxiREK/Lepdo1nohf0+N1BFtHBiqcoBgTJVtaqygfUDoVBIl1WCQBvriyCGS2gJs8FgYgDYfYSmleJkTBaKLMkFy7gCSoU2TiF0cCPTrbCWRpw/H599QBgPnS0Rzr87mmQXTfKtHwcuHd0xFzuZiG/9OKAudkdd7KIuvvXjwKajO0ZYlxNH3I+DgeToYH3sP/txMJAcHayTofTWjwNHje4oTX3mP/px4KjRHfmoi2BE/mHQj2cwlBybqM/6R/pW/hb/S9O3jjbV51/puvl/6Tr39NyMM/9K183/mXSdI3r1+We6bv5fuu4fTNc55lmf8688WcA964571sU9e8uTsfXfnidz9LYuettLnszYbf/r82SOe9dX+itPttL/V3kyRxzs66/9a0Ac7I442EUcfEtLrfI/lJZy9MQuemKJ6f094Cd2x0/s4idCiDJK+gQExe4Iil0ExZgi2QOCYncExS6CYsEMki9Lt/sKQVTsGIpdDMUSC4z3gKLYHUWxi6JYiPx7iA32gKPYHUexi6NI/eWnvHZfQWDsGIZdDMMSa4z3gGLYHcWwi2JYYpFxa+X2H6Q5hpkfcAUwcAdV2OQqgrlgEOgAY8kM4O/8MCMAl0cQHfx9uNGzyx8EANEYF75oKvZt1L4mSxMsIPg4825y2e1oYhXqCmC8ZaQhyPvwd+EGh5iJgOGETyMYHI4v2MUXBIQgvEIwOBzBrxvBDxpPwfLKVirlyGSFWnaYIPh0AButcjsHOYYpR/or1nLEAvRUFMTBawN4Z39HbrSJMggwRPibgtHmOINd3jUvRKeAMtgdZbDLiQZd7SnB1gPKYHeUwU4GIKfLYGkLKIPdUQYHCYDIwQaZuhEwBodjDA4SAHNN4VgdAWVwOMrgIDkv11gfQa2UBsIehlLW03wzx6EEgWswpNhvMTOQ7QiqBN8gdPczATQeioaxS+Bur0j5VEdV7uL7SARB8UesmErBJ2KOrw0o46gs4eZ+bTWpraIwZxDnzcB5kLzIMKf3a7cED3QLnPtcJ3CGr5gFzrru7udsTcwAIfqpSUCt7p9ucU+36umGC6NaL+VqCsXUGktY59v449qf52XPB3pJYghhLbfYkNIS2n+Xa9Od1r423dohJOMkndiPqH7FfkxwKfi7Nt0Azp/Yb+M5HDOWjIChngdlMvE4XCajnRm7P8XjhyMwDvIRc42F29UqmkjeD8caYowW5Mm4i8PXXore2ozDtaso/iNhtJqrgZTX8dR+P13bxzGNB81w6VxPgAzEIFHuL3zO/+rhaqM1IJxG52l7kOIm6VBU0YrDpgfpn15zT6/r6YVcD7X6p/d8aLceOlNCuFr49P7lM1M3e3lm9epP/8Djez4oHI77Sc770CyC/JPs7kkOPclwhVIrNs1aArFzBaqv/WCboHMKv8WRJnl/5qLfbShO/G5o0uFWS2gHNxyFdYikWimK86gOqZW2aayrHAgp52wZe1zk3IsUZ/fWlHKQ0jQe4y3hWIuZ1Pt7m+7exFuNJdXVKnQdUtffj+48MK6ErP98P7r/3PNa7p627ullOOxfz+soWf53PS+3+ovhWktIvh0Bw3U4huvIWv5j8XW1ymrqEjfKRkhjejZxOeZOUDbI5XjA7NN7ifomtw/FUymWoRbasth789i8QLWAKwT+b6JkZZhyJDLAi99WN60dQQuk6KK25E16eHZYCdcEIiFXRps6ZKJDHzCZXx6W+wMyL+Rhu8/2+3Doz/xTdSGRaL81losegU/UcITZIcJsjeWXR2AUNRzVdZBf+iJcOgKjqOEIqUNGUTlSaVEbH1yn3T1yGZRKpjEFdUGBIcFmoNGvEtD1RtURPMMLXedvwU2gJE2+SByrkTPUmofaBfUNSol9cAPoIaLBLmqtgCWLH2R8WECHAnXi4aiag2RIFPIT6KnuJp67hOHIk4M8wBdNDTUe1cBhgaxYtYAyM1dlYqXIcNF5BGuqEn69ae3tkuRnpeXIZ9bjcFVpxCe3pivvbBKY7YOxOcVxwNWY68ORDPZg7kGTEQxzSXmI7Je1Nvct+Q7dZjbVWNxu5TdSDrC2S/ivtsMWhCKNdA1zJQ/d2nukBjgcl3Jkzcqx3vMIyJTDkSlHMUpFBBAdgUnTcITEIUJibWEFc5Rg5+TYg0PsQTFknz8iMDkajlU3xKqrMZ99BCZHwzHLBllcrGM8cl4jsDgajvU1xPqqwJMFO9CA9TUc62uI9QUnsPA3sLXJMuBgmEY6/BaFicUip8aQAC9VygGojEo5AL2t1S1ZI39DbryLUQU4STDzlWDAO1bSECsJ2MXoAs+0wHCspCFWUu1xHBRYywxHGBoiDNUeRy01fbPCqFWYmZBiDEyhRZJDaJjKEd9O3WGRdlIt531nzr94w6JNAIJJiUJwnFgN/cCzd7K0CcgEBHEqBYgliLPPJhy1ySyItWXWK31HWM6q/WIOV2o5PnLow1GUhihKCKyigarWeeQaGG1s8wQUVxgscUl7DTGpEr+ceb+KWxrpPsz3YQljOEcLGqIFobIZ3l35N9+dm2BIWkG4+kwmqy2rSJZ/MoceairTZM0opQocZz3yZqwQQhlN+652OhBqzZNRBMwucmUUTw171K5N5B7KrYGc/XC8miFeTQUI71nxUOvt9iAJkcUuLQU5Af0gn9BztuIGS7LMqHSS5bhsEAZIDQNsI5uEqysBf49a83D0lSH6CgpS4fjs355ARxnm8gb6koZhOIB7IKKIfYRB7ODQ7VaSvoVjbrkYo29W2VnQ9UeCo7AJIy2zCi5QqSvI0jKxo+dsuc/W67sZANrZHnmtD0eSGXW8u3yMw5FBndAQKMN0yiEtoopVsnTDzEJOIKrgdlo16mbRy8Gi7CK98MIdmIFRdj2Zg5IuVEmt9SQRDEtCd8l8w0rWPAmumi+MxI0qqaqWU0cBg1b5hoXIrFIBIXg8bjGSfxJeUdhRgtXIUVBG/UOUdQQMlOEYKINsjxc5rxHYGw1HDxmih9QYajUCf6PhuBJD/kaY6cYnbff3nMCpSjd/ZDV/jLSQMb50xTr2EXznk6D1TFHrxTCBHXpf2++VdOjvyk3d4ilAeywIIdnYi8lwSAoS6t+Et6AcJYZ0q/aFJgBWV74PS7g/cdSFIepCXSFuRa3s973cIAJp8VBUhpOJZcCvRV82gAe5gk22xPIQDci9BHBHisZjNy64Y6YnGiVIUGlbx6hvcTtO2RVqklMDviTZLlRxjREx4C0QBUZNpypPQR2O+3Deh+s+3NehBMc9rGA4vsYgMeKFgaLG/14GynDMjPEnM2P8DzAzhmNmDDEzalyVHQEzYzhmxmiSI0jxRDB/aX1fbAXxnQGeSu2s1geWgAhXK/O4JN6Z8JMr0zdqQQm/B0hnOO7HEPcDYK3wV6L1d10FNqeWCFfcTGeGy+8+0yMBQmks0HSGHdsyzNolI7EdJcB/FWL+VbL7n6zJlLvkUqW25R+aWyNEQ6k7jmLl5HUMXFXzA2mCzwgMddGnKbklgHU6ynYdqmt4PMQqNcLJBjQngNb5DDyuRsFFxAWNWhI8pwz9TyM2YJAzzqrDyPP0CnBbMnYi9oFK7+3q1UeHo7IMUVneAky2XgEmwhBFk3eE+cW+ydOEysO48htyw/hu6zZHYEwwHPNlkFfyQoBVI+Z9JI3kQyKl1LnIwIeVCUxFDa1KKj6V5mS5bcbhRCRovI4fGn30VRSLgXEvP5el2ydKspuLC31aJ753Sqg5sWikOi/7KW1Omq02um4x0bjK2i/GlpV5YTzQElc2giinXcR05IDG5y+hMJq8ypt5XUDVcLBUW2iE2e27iF2g8JysMOA0O1nJQpRPlVa19n2OmOLGV0wBenlu2sNhfIk7ZkFRBQi80iwSQJGpOX505Qfw9DMNVOTfUjEF6CxkuRAGYzeYmFbPOBJ6EzY5SgPirxhzfobvz45xNMQ4arHbuFpZTUf1lebSYNZwChpS+YMp3LaSMyuA8PRlN+CWXcq7l5gF+NOlqZSOio2KBMe4momGfWb3cpX2uRjD+bNauuKHeExJ+/KR9J8mn5MjSAMMXqH6WNUcUiQqSdNmaGIO3TUywuu0SiwQqaIlB3musCxdEttWpWGH7t2oQgGYaG4sTfCzsq/HBXJLnObRIVXtIJCOkCW7Arcm9oGqs/5luWBP5C6EcOHLqv9qvwQgxrbEMMXKv/ZLIAKucJfUttK2639sv9S41Z1eV3E46togEw2BYJuAWbvH0ywWZhQpwHsWpYdO4nz3mA/OC8+2j8RuV/mvSZFzbs0Rc1IMiUdyRx8mm1fWgVYAt87qGSVwxzr6kZMXQRFzcQigssxJUMCpRCnC3E1+Epua69lADJO4iHolZb4eiAsrRcVDKT3sMP2EM7tYR6FQ0JVqYP9oe35lDr6EZlkjoBksi2ToAOogtINXoCJcMPuKFDLZV7ogwny4bZ2+0kQvKOZMbH1FKJp2chPqK6wxEE/Dbic8TV5+s+SIhUPUQfTs8HEMm+xokMbRgr0JXzwAwVwZxxHrRTQuZy4rjvbS5IfGh8CJmP8mrpZlmLQlpkF1pq3QR42l/lYmR8TXaMCFx8zr4m6KDbDKHpnoA09CI7kx8oZKhg5PPNck08q0OF4DKSm0F8PftXb+FvETakmZRTushPuncU1u+AuuyTC3aSrnkgxUzNIS8uj6Qc3MyLBZl0IqkKTptErEB3umef6CU+gHFQDkcuzcIsMCTjC0gMP1lub5ta04xWeb6/kTat3ql2STJNN8y1ked98kXKtD+WQ95lu3Y+l/FQMCxudwjM/R/yoGBIzP4RifQ4zPVuL9CFvLEuwhmzAwwoWewHTFCKVGv5JyYAI8PaaGo4gOcj6BCQzEaUdAEh2OJDrGH/magCI6HEV0kPEJHE60m5Cj5nEG+bJvJ1hncp8lr5BKYavZj4A8DuQEhelwn2JRRphghHd4MQe8++E4qIOUUuzjos16wEEdjoM6yMkUQPm5iRhB5c2ROAcpmcAYhM8oKLw5DucYmgpf0CMBiXM4EucgJRO4pSc5YQQUzuEonIOcTOqUI4Hif0IwNhyJcwwbG/FsHpA4hyNxDnn6vdAGRsDiHI7FOWRMF9MGRsDiHI7FOcTixPiMfkTA4hyOxTlm/YN4MAJTuOHYjYN8vZcBO4PO6Ph9Q/w+QLvD3xD0Rse+G8a+i4kLYwa90XHIhnHIYuLCCDhkw3HIhjhkyOiGvyLokI7hNeZfufIZ9EfHdhokAGGnHGXrA6ux4RhDQ4yhFltUjIAyNBxlaBhl6GVIBGZjw7F5Brk5b+M6IPMMR+YZh8wTd+iAzDMcmWeIzPPWnQI2z3BsnnHYPHF3Ctg8w7F5htg8qEaEryLokI7NMw6b5+VVBB3SsXnGYfO8PMmgRzo2zzA2z8uTDNg8w7F5hrF5Xp5k4Bg2HA9niGrTYmru2EGXdByaIQ4NDAWCMCyg0AxHoRlbeLowDgwINMMRaIYINNgnhT+hGxEPPm+scFixBsWji1EkE0No0W36xJBbJNDL8h4cw/Flhvgy7QWUuM31wZTwCs1jksn81g/yk5N8JqRvoEd6ffvSvWXBa7L3WRuOdTPk1IWUXBS47PmrbHbfEEsf2GkXln1oArqPbw52f4IWZmxsIPbiAzjH3RlbcXnEN1Ybawgl/9yIYz0KWqkRSYGsD2e5T+/bhAKxed8XMjm3RsrZ9BG3IwIN8nrajKNBNiqpM75Ymnw2yBMICtXWgRuDjt3mVCkKPi1CMUgYtRNHIjcdxr6tqt3f4e9pYMqcrLUw8aRW32+/3t7tV0IJ4k4SHslhpMufXvT7HqYjK02RlWILSTVe9d8vGxfCd3P+tpNS0h/RCkcU7N310notP7vOA5NJWTCy6W8suxvj/BRbU6rxn7ix+3ZU9AtMkKbjD03xh1AtCV/bc+Kbjk0zxaZpMdRSrfxxkFJRtT31e79FTeJPQ4mM4wPdb9DKDPW5MQ/HXuClxsrwrYLWWDt9VCan46xMcVZajKSc6bnaT8fVmMbVQE7r0+t2F7gazU+Lgj8QcZjnhdzgZkKH6NKThX3WPNlTxPWcjp4xRc9A2SqYCWZ6xgzTkSimSBSth1HHTM+YYTrKwxSpIY5BZ3qGDNPxEiZZBqS4r09x6/0MaAnT0RKmaAkAE/ZP691d4BkwTIfAn7LWArEyeIr50pdUjZSZZdgGY+XofVjteaGGhASU8pZ6mc2D1qeD7k8C8VHXDfDiM0DuT4fcnzKpamHGaAbI/emQ+1NWUi2Gj6q1m0rDcXMk8nMjy81suMn11M9Aok78FgjfsBCP9GVT3R0H45gJcZA/zYSmQ/VP4ushUR8ghtVILe1lujkUueGaD97M1wp3AfU0azZiuWk8M1H1NDXDewLKLdZUnA7wP/MfOb8ZIP6nQ/zPbENwR2TpmYMh6PDtU/j2NsKd6Azw7dPh22dJ73nHGeDbp8O3T+HbCSwNfkSAb58O3z6Fb0eOOPoRAb59Onz7FL4dueXwCsFgcvj2KeeUNqK4fwYA9+kA7lMAdzgrBOHqDADu0wHcp0HYR7yAludGcjpE+hQiHQKG4T0EPdJB0qcg6UjIh1cIeqTDpM9iPTLM8MwAkz4dJn0Kk45SQHSFGnRJh+SeVfa2cY+sBweIoIlTFtBRt4saaV4SsWFNuH9Z2N7qnoJfUPSHkPV9ZhAUqjOqF4FB7XSg7inYNiok4U8tR+9qkjtbOKfeNm+0IED1X7JE5MxhAqQLXpM40SwmLEqBIplMN8aElGhq0zze/I26ASYMN4KX8EarLRWVDp1CrA67DcgJUWUDe4tBhDRQK4PGv4WEeerIUnezUWzzsQ+aDrw9Bd7GRii8n2C8OmT1FLK6xYDZWYPx6hDJU7L9LYarzhqMVwfanQLtYr8VdtRgvDrQ7hRot62XsRKMV4fandKNR88PrxCMVwfbnYLtNrLOns8hgO1OB9udgua2GJk6W7CEOIjtbBpIK6wEzRYsIQ4dO4WOhV9HeIX6tbXOVd4pZshOnOXq5jZ/q9DJBLSDo5sO5lCmi0QfapNGZCY0syiE5O/R9Xpph4PxF95j0OsdeHQKPAp0U3iFoNc7cOcUuBOKouG7Cnq9A3dOyW63HSZ2ZiC7PR30cgp62XbogTpb0OsdDnEKhwi4SniFoNc7dN8Uuq/FSMbZg17vkHdT4DoEpdGT7EGvd4isKURWXFKagQT0dCih2esfG7BAAXo6GM0kiuRtAxYoQE8HO5nEXTAcb5/lg/xAAXo6oMY0oEYcv/agO7rK/ezWHePMR1C6n650P1mJn3GJdgal++lK95N19Zc6yAy0mqcrxM9hnTFeDqXkfEkXfm2N7hmqSmrjB0LFgoNLtBxgFKBpTtl7r6PeBg9X03SD7EaUfnHl/sny/duDCur909X75yh/VClmoAk9XT1+DpHRYhUitR6HNJph5fGViRvDTNMkFgZhhk4LZbrLd0AFz2E7yg2Sh5yPud3V+ae0pnt6eTjBUHKF/sm6/QC2+Vk9mUGhf7pC/1ShH9iaQPJDrdppJwI7C5G6X/FyM2X7QsJlG9arEjLHnZKGeOy0H56oDkjqCxFpT+tEpD2F+vfTYQomMQIvkmszABVMByqYQ3wnKB5Gv5atBBwPIp+Z0EuEuy0oJyWyEdU3CgFeYOEZwAs44CHsVwP2NZF0RAnvBAy00LCNOSVsO6CAJoWrwmA+EXxUCELuAKgQrQV9VYQXiXQYCikQH2/CGAg5OlHQmEmEvEY6fwsfnxmPZ+aPBxG/HInEnOEvRmYrtn78NmKeiYnC0STiCtefRGYh0od6qHRl+eYkIJzEJiRAj3DlqhrEOmePW7MJaejWiIy1KzRyjmrVvGJ/1XWfiJa6mEgNEw/3Y2jihz4TtZTOH2KH57fnrkeos/O+1jpf2/lbp/exmw5LMoUlwTXCgRrM1g5LMoUlIb0l6HlslUpzllYX3zaBw9k2qhmCH1IxLSZVClB6pdgCilHqEot8F5Z/4JCAgf1JlbWoSvL04hwP3CApV9Wy6SmbPH1m5/t0bIJ7kZM9tZq4NGSfwXOQl2mQF6Cmoh/6y1ZDef3xvZc1UGdmN9Q2XSUB7GrvGeVrHvky2ujlsulABj6aUhzAZgpgQy/w6HaLHO0LNXWLIMtdKt6LIPRb7Aro9W4vBqAxaYMtAO8uZVwB2bEVrtJWM1SmpL1r6aY5LMY8BJKlMAss8eBfQOUJj0ZQYDmZb5UaBU+Wi+Ge5+URCt/JsltQXUZ5rT1NWabDDU3hhvDWoy4v+XeumsgFH3XHZVrH9kZl2HKKoLBZN3+NXtMx4IA8WiDpOB0KaUpjHaWu8EWRuk3wfPoeJsTT53ZUC2gmX6UmXg77oNlDpiYn6Yb4M6SWqzwwE2s6HAWZKuL0eMj01eQ4kiY7OcbiGXGO7ywKwXYkd/nn6LDfh0OH/qe7RV4Aqh5X52cAoJoOQDUFoOqxZNAMAFTTAagm4VBvMXuAn5oOPzWJhnrxjZkBfGo6+NQkGmrkkFE7A/jUdPCpKbFoxCfRQ1jJ4N1r2gBHmc4A2P2HXNdy5HbGWEZvMSg3a7aJHCRb4BEQodNh2TtK/nUt4zadcoqQ4qIUFCEZ8AcWBhSbEal+WZNoIkA0iGexDMdNxWnim4GRr1S/hJC4uC8oyyOJl1W0IoGmUmuQJIetjQDw1O2ni5+Et7TEYyoWIyACGNIP5zkurPVECzySsDuGE5l4mOCHWHz4t4vNyHWd6p3ZazVOB1ebSyndEGqsxssY4EY+pJvfeTAQN12UkdOHjMImgvC4t0FXWeiqPPv7c2sHoW34sQHOV41QI52kAQ1Gypjv0XfGZ2GF6K38bKRN/Re5uZgQuLfBJ3ls47hnilYAJHBryumnDlCeJP5YTg0ehGyVxUBi0c+mN1XjVP1guU+HxZvC4vUWJ/FWs53VONgUauuZ5M6NnRHvHbIUehes9CNwNaAMUCLj4wWZp4P1zdX/AA+pVUSMzuB+q4gIkgRxKcb74gAAzS+btJ3UrLgD4DAltUtSWOReLFO5KSLZtqP2ybw4owE4jJjq7OgWpiGrL68GxPSKzfEEZudra2BT0cBjyUIACvXCcxWpYdHH+zNB/uvUArPDZWFe7tqe8LAn6n7wMN9ny31o0aF/xG4dEe4xBEbNAPU4HepxCvXYX6rPAepxOtTjFOqxx+JFaiXpY81sG7U0vqIzUZZK+4rJbnbWzcmSatnS5CDStrhLF/c2a9Mv7pLIbXz/KIIZd6lc1KXabupSvqhLJNcYd4kCauQu8awYS+Rud4oaFW+2Ph2YcwrM2XscJLD15s/fU+MtX3A7AOZkwJvDmrhzRjeTXukQTKWDJfbyuEG3/AorChZhFMCx9QqwrxfGChgCbJo0lPodVc9t1Lc7qv5+hcPeBpZfqHyMr1gaSrFi0E2uliuN3+/yX7xAKcIytAYTRVy9jCC3Sbauj3TF3iOHAbdDwk4hYV9o8tZKD/htjmN73htDkeQxlo0a30zEh/pDXI9hANQoHARCGeJUbf3Eh2eYDj4oNoujaFsB+a124t1E/T4y1USXF+GOcxhHhDjyMNfJWlTW8OuHw+5OInHHS2VCAvuUO2g/DIIAIgFvDcJkTMbUH47KJD3r9Fl7H2/4KkYrZbA4y49i9juQhFU8hguS6f85oddW6JX445V32Z3dKpHyick7caqVXQq6Y5cHCuIAJW9Qg5Vl0ug/3cxzfrpoffix+TBih8zuQdRRXgX7UAqaYNEevCVNPUk7liTPJ/ovVcm0oJPynessb4HoTcmTG6+WWSx59ZDbT0sX3lrO5ciT5zmOPDmd6yVPzrNFPEGqqJR6vq1T4Rp134zoyaCdnaRVOzvusyTjIUbrJP/ZB/Z1lpOzzk57Lr7/uMBIyG2mBqI5pf5HxwyditaltPE6ep5j5j8zVCRQkdevUYN5lkMFh7aj9L/aRV1ybIBPTThsyHI2qeMTdTGLLcTy8cNUqgXZhsagEU4ykxZGjZZq0C7CNfzNuKhL2PU4JNgn5oID4WG8cuSis5BviQaOsmkqE2kX05Rotg6gzmq80aldV6omJoDkmJFfuf/ClQuXNyRxN2M3SjpIW2KnZkzajQCUhFugAThl0xbNiLFIcGvw72xJV4x8iSoggBcRHuoDmhFYQuE2CiFFl+ADgOeyCABpVeMOkCnuGCdzXAooMf8x4YOEXTJTt1kkzD9MZ2IjD9vPH0wzhMxndujFBCSoK5OYe6UmSObeb9MDkrNHl/4Dpz1i85iGxVfmLskOdcZ5rkADA12hT/nD4bPLXqDvIC5mFHugv4AN9lVhINn5ztLI66GdSI1eAAxbaur3MBWjHs9WCz6Im4PDlPaRW/qH/WdsiUxK0qOaN9U6SdRfyxhjL47Yxh0hXlene6ayNqvGo9TFusZliNFlojJQoKSaKWBuxipPUwOgkVaDzsX8rTWxsrCLyWpAzHEpWMpHVKVT5DfLhphDAanKzFVwXxkIPBGMrExBHa2CjUe8LsUa0znSkmgGY4nCEaYVjDwfk5UaH/QMNHkI9XZTWsE5/k4GH4NX5oiRFYfGCfL1ncomSBEoyYA+O7oWtW4JBdzToGoaFD9MpAUisVrL9wnrUOWeq9q5JfWZvH42n12jXGJjPociR2NdhwsPa2HFUj2C5s3U5fh0jg4+uc2eMez6WTkT1kq6WSriaF9/L5MQflTuevwoV2HaFSpE2D7v4OgpU/SU/gIiCLxlpqOUzK3NAm0ig3XzcEq0mTlEDeKWGQJIVbcU094wTbq+x5HPhvtJIE83HXFkiTjSY+8htXKRBl4ZwXSn6CVX0i6bwr73cU8aMKo5h8hfYNxkpKXnY3eyHH1kGX0khZmMFXjdLMfzWMbzYP7rAexa5nUjqT3uUtYJUWGAqpwheSUybkRX0lYds1ntNjtJEwwBsHTzJ1cgXm62n0XfK+CyGYKYMR9JULwOHxyYFOuoeFa5MyazZOz8q4VLDxaE2D7ow8ILDPqwzM4PzPtwHZG+IR8WnztbjnuyxD0ZsQ+LWi+hEW0C17doqZmXjrOPhziKQm6Azy/pjy85Ei4PRCdyP0h+GH8ij/plCvCtRvKvJEi0DQQa0LaB3Dxq78ezg8Yr9AISCvIh6rkcpWaJUgOkZPhg2EpJB24FCEGD/Ugh6wznGuthWN8vxILoZ0h88eYMpYDoY8gMFpldwhj8zTV3c/1dQUeNxcIzbRyW/IbgxKAoDyg6LnK2xqFG9b1Pw6rVbbGbppfCCbmc3YcZ3GZLrue0jnCYthNc0NrXBs/ExC41lS27GYVM1+6Pm5O+19f2Dx1K2y6teiifVf4eYA7NYLP3e5tYuRBxp8BFA0HmvXW0xQ7wM2b7MqvJ/MkIBW2vp8WM9gP8Kma6GLZhewI5oEyvSov18Jmke89uIyhJFklUsTJB/5q07KK/tnEUfOHhELUDoz7Pc4GRr/2a8v0ba+Ao135tMHNjh0WHvit115WGaHEv/Xx8b2IMZXzvYm6p9whcrH6vn86TbXZ/N8PdzdTdhEvqCqhVy1GrFolSU0xo70exAmbVcsyqJTOZEZvJrIBatRy1asnyZcSiHSvgVi3HrVqkSr0Yg6yAW7Uct2plIzuGWcgVuJssR5FacjcZseKFWr98fu497BHwZ11LFYYuSVRk+a4dbk4Eb7EKTUbes/S8HOlqiXQ1YgELtQap1ZuXVKnHip55Eqp3zYkQCAkHVgPhITY0kN1gnfzBSlqO1bXE20JhKUFAzN1gPzf4m1oqLsG0uB2sqlOAqfWrLCSKA0IOluI+kIfPo4YFouX4XCuPd7rUys+KwXJ8q5XnH3SpFRCuliNcrfyHyNIK+FbL8a3W4VuF1JIV8K2W41st8a3iraAa5a7Q66VNfYv4I03RqLx2vybNengnSr43airfizwDhPEIeh2Nax0aV5hIUuvBv1PHHVqwggzNb6FdQTywCuseuCqxeqL+vObdn8vRQx5UKXh2bUcUW4coFuLfV0AUW44otg5RLMwyr4AothxRbJH3hSxIgF2wRnttlY8Cw+auv/4HR5emAkrlD+xvg3DM8c+W8c9iNsoK+GfL8c+W8c9iNsoK+GfL8c+W8c9iJsgK+GfL8c+W8c9iHscK+GfL8c+W8c9iHodaq6F4aTFmfA70WRE6fDT99cq4miRMye0cyTHqQJG/bssNeyO1xdSNFZDaliO1rZr/oG6sGizIjm22jG0WEy9WDYaPo4Eto4HFxItVg+HjiFvLiFsx8WIFxK3liFtLxK0RC6SsgLi1HHFrGXErrq6tgLi1HHFribgFKEN4D0FHd8StJeIWkohBslyt9ZCLhkx2fnI+YQFzmUTh72IfWuNoRDOwt2bU4ZrE6fld4hsBpxJoeSzHDVviho0YJWWt99rEFAWqN4Wk7zz2j0xlMPsTKwft0K+pTSrzSEsMADU+mdEEdVme851jnS2xzoACju4tYJ0txzpb5JCB1B71goB0thzpbIl0NmLEywpIZ8uRzpZIZyMWS1ktGE+OErbaX3b2K6CELUcJW+0PO/sVMMKWY4QtMcIK3H+eEU1ACFuOELba/IPVsQJC2HKEsCW1/VCWbgV0sOXoYEvC8zEgcQVssOXYYKv/JX61AjbYcmyw1f8Sv1oBG2w5Ntjq1h3jiTGggy1HB1sSjX5xwLLWf5vH1HJcs9XNsCkesMZE+/fdnRtGUkgOHbDUxjT52D9UEyWq7aitAheIfBJOlEe21BHelghvL7YCagWqjftOYD0HbSNoBzA/e/tdmqPDLdHhyo4f8jySqtOybu1Tpe8MhabNeltXNYXlmM9m8hosa2AH/He7Ydz/GMYBj245Ht2SyO2OH0wwih2Nbg1bU+JlPRC0XY7htkhYQxcLYKBqvC0fhi3HymAkUvx18I2/WibPReIw9MgbrcNgSESqHhn0euz58XIdf26JPxd7PK2APrccfW6RtfaiW7kCOdvlaG5LNLfRQuSXWh/7XwmAJSvsVnlO1GwKWI0GNYTzVAJroZ/ObLvAr3m0HeYnHH9ujb8WwoA/txx/bok/9+JftQKh3OVIbWvMdzLrCkhty5Halmhro8ellLFOpTkdMhswDWJOHdnyamDJC3o3DDUFSW9m4anqT+BCGlelucgtIDE7IWQewQQGsclWYGbeTfntbah3VBaLaacvy8cjmpX5A8G2qkNbFp7WC6o9t30Eykl7LIbhGKKjYR/Kc2mNn0ngAomfKtqMRrsNGuCKv6YiMOvBvVzYTpBIjgkHEetWHvjJoxOZhJB7CFyD8u0gB8/OsgiAwsMglpd1ICbj7eS8P3oAKHnILIRnWRy3w/vLqKZuh/eXEXTFHzxYGrCz4z57f9tY9yFBV0gVjWlmX76TuWlWDDgUx8NOtg9PCknIq3Cn+8CzJnpTeEEmbLP1A+jplSq6Tv4q4R1/8MYZrxKo0ukjANKkQFdAdf3yEfgqzKWtYpuK7jAYw45jlnN2MJ9lZ9t9tsui0D8Mt2aIzDdiJRK1Fpq8Z3NDQdVH6lkIZfSD6Zta5Vxgv7cb9hilyB8EMpWOAmZapQougSqkJQ2mjjY7FbXmWLSkbRkO3W9wPL0lnt6Y8T6PrQVPLpV6jJeW3TlROcLFpmy3zqij6AXtc5tVNlP0B0l0jJpkGGS9liYwrV4Lz+pd6JCpxM03RDc8O2QqPfvu6mh9S7S+EauLqFVku3oMtIcMIqFCGL6qrzdEEC0ATd9vo9CICrMZrSfQozDwqRaid8TsEgkNg7nR7H2aluPgLXHwxksCadZvx5LDRGQQDBA5Ox5wKg8M9ZILUD0F9WY/GO4vhZgoQgZu15JiCOcbDf+Nga/sJxXlWEBAKsl+hglgsU5V8MaJkkxw4u3GutDSg53hgXFfjgO4xAFE8TcKJAIt8uWodEtUuhEbuKlVPhCGLAY4jDyKfArVWFPG8ey4DNaJwSJi7+mvrofbfoowfqgsE0WH5aHSdAOVInnJjG8T9sbq8M7ZoIUEMV3W61uojXbeBVkzsmeDFAHfheza2fXKZ3d2yHlc2If8IDiV7HYf9vtw3IfzPlyRDftynMMlziEM6sJHHURGjnO4JNpOzZwgXxaQDpcjHS6JtiPdE/WXYHfhSIdrKt+V4tgqYB0uxzpcYh1iBm/pk5Mbw4Fq+3I0uCWmG+S0nsTHFYi2L8dTW8smwzjBHoi2L0dAW+R9MbwOdrqBaPtyRLElotiMJThWINq+HLtrkYqELhyQAVeg2b4cd2mRi4S0W8NU40L9gLy0HHlpibw0Uzx3BOSl5chLa0k0JlQeXYFi+3Ikn0VOzUIWIbrAtvUAAm/aR8HGluEPGdAMEA8BelpEfWzbn2btlUApiIK3dUzdiXyRbTvXAtS3urBRyASQRgZIChWKyUUo5di7M2OpP84z1WPVPsmj7g/AiOMPraM1H2c9A6355Rg2a//hxrECqfnl6Cpr/yVFswKp+eUIC4tQ/pdsR6A0vxz0f+32V84x0JpfDq+/dv8r57iDgeQA3UuA7hl7Aq4djCQHjV4EtL7BTHYwkBwCdhHPGgvurwD/uhz+dRGHCk3tqCMEk7rDrW6iR7HTecr47vTsiduhTTexoy9z0Q7AptuBTbfApshmBu9gp2dP3A6AuYk7fHkHO9D+3g6ouIkNfHsGz464HZZwS5d7phAqtANd7u0gZDtZRwyhQjs9O+J2sK+d5h9zyg5gX9vBvrYUteM5ZQewr+1gXzv9ZcKxA9jXdrCvndPrnLID0Nd2oK+d8x9zyg5QX9uhvna23hiGejtAfW2H+tq5/jEr7UAZezuQ1hZIa8aA4h1IY28HotpHGjuUV9856JAO7bSFdoINZHgPQ3D2QsGGSwRHOYCdTxIgYd9PnQL+m7apZMFASdKv2mdDVQF0F0ptywOYRCHqMzzlXbdDVm0hq2YMNLbWSwRXtRXmtmgjTqApM9Zl7C9h8CMHLiQ6go0kSd29BES3PwWk/FyFMOTgft1IE45r5hDksQMg13ZAri0g14ztLncA5NoOyLUF5Jo53JDvQDl7O8jVFqgKpe+gj12IK6Bdby0EoYVAKfkXoroJQBEkcTNQfYGm7nboqi101cxh6WcH6Krt0FVb6KpZ4nHH1qe/xVZ67qtQ14RUqCIxCElgcoOoTWbS5YQWmKVEaIHtUFtb8t4zRhjvQN97O3zVFr5qxqjgHeCrtsNXbaKlJpBDzx3sDuBV28GrNsFSyDqF/SVYoBy6agtdNWNY8Q7QVduhq3bZfw28QN17OyDUrn8OmwAItR0Qate/hk2Ag9oOB7Xrnx09wEFth4PaRDW9vcoABrUdDGoT1PT2KgMU1HYoqF2tO8bzF1svHRxNyUBGC6ODmaPS8ZqWl0fxUxP2GMRP68zlBDQoaJ4Eo5ftjb9B19sFsgLYOnzIQXd3IKtNyBRysW185nDBTICx2g5jtQlnAr8vgOHvQBt7O/zTrtJlpejQatNdIOjsDqS0BVKaMYB9ByCl7UBKW9LYM8ab7wCltB1KabdyYPL54/886OoOorQFUZqx16FaOYNz4s7VnL8agZRIRq9GzmAdPxuQBbHIElVDByUxljEF/X24ESOg04z9CncAdNoO6LQFdJqxzd4OkE7bIZ22kE4ztpfbAdRpO6jTFtQJJJ7wCvMLPszaDQabKA4J5Md5nLBu9aYvVAtVEiG2qtoWWMCzhmSu7QBUW4raMwY07gBCtR2EaktRe8bCdDvAUG2HodrCUM1YmE6tR0CKkSWWYpbH8iVtcFGBZHuF8FdT3mYWHpRi5OrdjTgo1hYUa8awxx1AsbaDYm1Bsd4mv374n6kALMlw2fSnUBJSDapa1SbP+iM5ktR+qE1A4herNflQzyhQyGQdcvx9ZKsfiGW8kO1NrPwACkHFEXEpWaU1gjR0GZZSf4D2s6KQqXWjkkJVXUvk0EJM6jLOs9SkWdk+h1f7bImFQB7SwwJhWyvnk7PVu73dh6rI+efsJieDpMWAHbVqb5XNQGNR7CKb3pmxZVGXI7CEqvZ92Xgi/bOKHpRZOSaXbpMLa8VMaAuI+9mwRgmCAlaDH3AOzLYNrtbi4RIop28HONvEhUGdOOxi1IKWMN80IdJhKoTQVMVY4Vaznr6EapwCBYA6RKolBXhJfjT/qLaXwUGmKiyq66gC1Q8cxSWSAlqeac8WGS7pL/ZWEhhkRcLcxpYgTGO/yxAwbRiv/ke7GZhoNV4iiJvYKAv7eo+ipex3tqR3GcXgKTSjkiDGOvXPtY/eImSwlRMHH7QS0ECWlISp1vwaeibAXLUxB5gG0jJdnf1rNHJQoHh4D0voKPARDFb/KAA3rqN5ROE2VdtgkQSyp4bv3svGWJICMJic4noTRAa5Gd3p1xCeAkaSVET6uGcubAcI3AIEgtsd9tQjXrHTVpkUGBYKBEndwYSMNQx7MdIuZSv5cVBf9ewTr8CgFY9sSAWl2vvA2zKJS4xA6QPtZuorqJ2qRAp+qoSu1xASCM/XgEDgQwIfAUG3RrWUItZwljLEulAkRYVtCXDvI6AkwR6+PZZYJaBEeWQJKFFaWgJKJFNLQEnXpYASz6oyS2EmqQImia4xTNfzqPdh06F/TW4F71rBYzE8tf4lhsd5oXIbfsniVcGMbDIAZOdWyrvV1UwvsIzfsnj/LVp4/Zv1OyRj7J+Li0u6sRReJlpG+FYQvzdM1zbp2yj17IUuwua9KZpUsrTEVjeTOcYb3GP5W3SBj2CnU/XMxz4jgJ1uBzvdQxFLjyOWkS3egJYla/5Y6DIBOOh+kr6pB+aBIKBzlcstMyTANAEQEut0gBuwTFdWO3CkcuN8mJUZicZPmNiJpM7Lh/cOmboJNN0zpAWpcZoUBnVeiYzi2EsmEbVavkEZQieuOWy6IamdMx8wJjf4orKXQQsZOkpF+rgUfET0rIcwqde2mIPdP52aubTN4owC9Ig6MJgo7C34il0My7GpP43Pby646NCJCdrUjZkv9AdF0/gnnKOtfdJdjAmwOWqEtdgOorvlcDFHvMUYByiEnQGfIJwCGNcBoSWxoTMWMFcI+gmN42yCqfIzwJlLAkfKQgCmTKkDIZXNCXMoAoeKwpndkdQuknPo+ay2WP2E6SzZ5nmqTsrugPId5edYGEBXkPL9vP4txWMWBsD6E7nTqRefSQXH+pqJ+hx1m9TTaPYpAjkLga7Xp4iL5FUphMVz+ibsIEu37rJ5jSFHp26qz0mi0QjAkqCwbRzJrTLN8dXOToE1M9/2ONopk2BNqV8JrKkP7OuQYE07zAdxNNkp7awK+n6CdIjsTRj0C198B74j2+Gm93hXfdsBbHo72PQmCPrFhGgHqOntUNObIOgXSu4OUNPboaY3Aa4vXiJ7BJtfh4jdBIUC5RYwZ3dgCbEdinQTkYlO+yxi7xksAA7BuYl5RMeOXuIMdqwOJLkJN8R4iG4gSBM5eOImPA8Yk2j+nkFG1OH5NtF5mAijyD6A820H59vEnGGsBtSLHQjjbwdS24ScERkVPcOgHzqM2hZGbcYmiafVJB5ukXJpl9Uvd/Y7Ebuo5Q1v3cu6FrI5VuKZ8K+VZcecI2LQbweC2wLBYXKJemqAgtsOBbcNBRf7Ju4ABbcdCm4LBYdlOrpCgILbDgW3l6rUJQSx7QAGtx0Mbi/5PkcAsh2A4LYDwe1V/wILBCi47VBw2+TSY7BAAILbDgS3JXE+Y9D2DlBw26HgthS83+AGAQxuOxjcJqgNuP1g1ghAcNuB4LYUvGdsX7kDFNx2KLi99l+AhRV0R4cl2wdLFsMNAizZdliyLSzZjFUtdwAm2w5MtgUmmytOTQdgsu3AZFv6tlCljWavAE62HZxsC04GicQIxRPAybaDk23ByeaK578ATrYdnGybPmjIT9sBmmw7NNmW0Ca0oZ/42B2gybZDk+39F4YngJNtByfbklPEBqgCe+0usL891G7YB2VdkMOo3GNhCyLpNkSuWgWQZ0Jmu3+AxZxshXGA8pWDhfRpLkl5rh45Hm2HXctJoovYoz0nQmv9fYnvk+caYo+Ul2s8u//3yXMNwZJrtAO21sc1ir+GkelfrvEcAt8nzzXEKuhR/7HWxzWav4aGQX65BlpZ/kLhNVNkmXJQfPOUK2MKj5XZahZKdyAwqCCPjQXYdf287nFUdeaaUSBg3/vrNq1Ai7B77OVv8znYvk+eayimWeFSbs2Pi0x/kcXALSymW+vjGstfQ1FJ7EprzY+L+MEgzbS5w9XImv1Fsh8NQtCBmfZcE61VGb+iLOk0KAxoYcxfbDNgyLTTKkwKXhQc7KWV8Vw0/mNCeVrmzdSLmYNQzhLpd+5Ks+DWs5z85qSuNxN7lPFTwi7rCltXtXxdUgGE6X16Fu5iRiaWsCttn4SdvpcJu9IefTD7YS+wIPwYwod1RP+xpEgYedpTg+I+H9sFnyMySAnofDyWViGnzyzV5MwFLWhtxEc74tGZKsUSk+x0+yp0HdRjpRC2nppyuiY4eiWIEQDZU0v95IfXric/vNuVH96lnKeWVENi/l9aov0+O0mTq48H6Oc8YSXp9B49wPrti0RnnV3urcdtVQ16m1S77pkm571t+slF8i3YdBRJ6tEHgFp2KXjPfloVILOkMElgzY+L+HlVmEwIeoa/lfoL5Eht9RGoimlonXJQM9XqTAs/e/dIiDLnTWdSae+uoyEOTc/GJwg2sXweStrWM1DwVKG0k+7FoZfzRYkb6xpkVN/NV/rcuoukx9lfjLaqKu01ytLVXbKKDO36hi05tv54bn6iz39O9IHw3vfJcw1N9DsMca35cRE/0RtqMybcWfPjIn6mN+DmDjEY1nwghUXJ6X68JJEgx7s2uYBChQpTHZpHChfeDWbjO3e/D4cEch836FcRojxJaYVQ8Xb3x1Ymctf8SgJEJjzMVyObcBchoDUElgBKfuns/Us7TouZxiM49HdZ/DIlub+5w228NT8u4qdvQ4zGkt3W/LiIn8II1XxJvlnr4xp+fpHu3goJYdZaLwbqKSEpwma9MBezuvgC2i7qinMZ7N2gtJQofpap7St+3ZGCwJjxaM1K7c8fdlK8RBv7zMbPfkRuZSN2eaEyKKRgQTHYgbk5EGydV0qCUOPQ4NmPu/VTBJGmXFMRWBR/s9EUUfwUIfG/FVPirNmkKG9ly8tR+0b/1nSURbHIwC50He1eKnugMivVsHUMtx/35mcewlhrLJ13WoFjsMhBR+ofkIzNjaJkrGF2Io5Rq84L+u5SlgduJxC5t2v/upWtxxTiNqyZq790OFQuvdH19Nwit47gCeItDtBe9aqWT9Fu07B043EhvZ6XGQA/+4OfwwTSXTGbxprlNrno4TLAXkbxpg6ZL11rrzj1qBepkgQgIOsZgHebgQNqY1YXQuEOYiJUFTG1EClW92NWgUGgajzK/5IGuUtKoPmrkESUqzxfoJqT6QlFsIY8rUHelykS9lfdjjrVO1C/kV1RAr1x0U1mn3IS5uFu9yRZDnxezizAv/ESCHZUmKEs6i7nY/LwTO1nURgcXyrbFmjZLXnOTNRp+aWAYpVlX7ZVw0JVPVEkhJGCHLcVec/zi3KlmQUfW6N6BCjemar1ugJL1HbYu3lqZPMIH0fnhJdVhS1Lp6Tbj2MftgusdN3NopcPTBqyuYLzA6TC44lSa+C0U98cz37JCF1n78vmeZ9dJoK4+P50stzfJTF2HZb78P6y0s5vVPBmZ8d9OK/v5ROvvmhtHf/XQOEyumK5LGt+XMQvo8Kjxzkna31cw6+itb6yIK3xIau0DsCU4gtrfc3BAu3iLQNs2D40I0mS3sCzEWZ81vW4L78yE7cesyutUdjNtX6QTBdkmESmfVhF01AIQhEvTv/wM+cN0YTkcRd+NRZafsHG6pnptubHRfwiKUT7ihHI1vy4iF8lpRy6YhDyaabBIn6+5QI5wSPTc7ulM2Ah9qufcICOfSDe3cHCN+MKPqJnIajicD82btUvnJIphTLKHJ9SHre7vkC52o83yZgRjHXDcfmFS6JK2YKpSiEzuJTmJZiyF6m2L/h1Q1o+AVQOb2j/R2/oyMb/Z2/IL5WC+MOQIbwhNZsjL7N+oxO2nAApuYTYr5F3C6Xmwu5N67LFuJ5q60wCPtXM7Jt+3ZnmppZe7iyam5qfm6RxCnBNfJFocmp+chKHYAEhE14kivGbn0ma2Z28bPwCBsD3yXMRTQQtrBxa82XvTU2yeqDZFOopZqwtaG3qspeHTSkBhHSXF+QQKQhCNDoXFKbn0O+SWW7fPt9U/kIkpViGnuO8Gu9BmDrAbAkpwp/K7oeSZ/JC2dN8RCCNPgkpKrsxNaG/zUCYypCbviBFimy6Byk5dvujzHmDgQeXxCKwmCJKOxz34TxG3qtd37CkO8QP9Mvpm2Cfc7bch1WHj1fnp1+RL1bsF2zNGFAGXWpZL6l1gD8t+TmrqVhRfwnbfa41udi+G2gyyTylYyBLc5XamTrMUq2XYEaWt1ymxugSXlOREESi8MtkxUTlu3F0LzANVOBQH7/XrxSiijDCDn/vvEyktsFskVcSLglIFILpcWNC40FJctHlAUhdWiPJVFg6/MjB8uYbta4y86qfhHloUReVNpyL1YcHut3u5tfda+EYL+tcwCj5Pnkuosl+vA35KKvf/AQtWsmK8XDWTJ+b3WQMOlu+H6gg26CCMI2auAOkK06lQCGW0WxsOjw4Gawjp1S1kdxyK9MR5Pr6p3pxK7uLX3etyXuEcF5rllE5jCKXibMwpIPG3j7iKjTmYprxSL6ofyMhfgu4aHRj48hsOWaqzY6agPFrVV1JfcUuN5Vba9Zt6kdd5e7okJ+F7Mvjp/olRmQZAgrDnxotMd0vMWKCrPGSb+nREtP9EiNSBnZe8UWiJab7JaZriYnVEa05GK/Sb0e3WgxDSp98BzZKp5wmgT//HqVTHhoYmkxmpsmz7T7s9+HQMH78Aj/TSmF4xRAfa/7OsCeqxX3515HRcyH86V/HzXGf8pkEMnz8KNnNLRpz3ZOYc6bwZ7MlkPjXK0+P9Gehzbf6aelmNV248tE09/jUcZ6mn+JgPo1GdpqdUeSx6RnfmRcXR4zPvGgkzntfVEuip91iUcQOy31Y78Omw8ez9bO62BRrvY3rKeF/0d85+dCgi+kv6lHvfBJhuxyvCgj+H91bcudJ+pDKP+tii2TCXh/pqe7nbdEI1goZVdb8X151UMD6R5ed7lcMof3Xeuu60YrR/YohPP56q2qzWaUFFERWkaJ3188z9Wv8kEHzYN49xiB+KQrUT0FOu+ave9D8/1aLlpR0cA+basj/pVvw87LEotdbzSeQi/4+eS6iefmt5hNIRn+fPBfRvPxW82HzJXqposr8Er0Ul20eHUaIjH3xXbiKksU4umlXSnsWRBYt5x2ilQyrWVwUtxEh+TxHTXKnkGBR0R3EfOLM4SpAzdAPZPvyIiWOzEdalUn0clG75SF6aT/t16PQ6vJWt2FzoZgj3Tc552+OrL1+tmz5FggKT1s+++tf38aVYMeSh9b8uIif8iRqDY5guOcKANrfJ89Fli7y1o+ieHL42UHCxTs2drXmx0X87CDBX1BgwotI8VfOkNpBIrvKVRIIfWW7qm1OkMWd2mUOS3mTeCYh5mIbR+ynpJ4NgEvp8oKshyyHxVMO2UgxcNnkBtMMhIvRKTABa7+IMaH9YqePuHRrl+0XN1YUcQcTrdnnReXSLpGeBV0uj2scIiHPUsfYerd4Qzoc9+G+DrkftMNyH55aZ96JKzQjhcSBhiEM3+tyFam+XtT0U6hUjfdbEYPNd6lNmz187yVvpKwVTa8vXaY7twZfTuky3VpNW6tva4cNRUJ1p3b/9saTdgu/brnoll+i2ACI/33yXIRT7o7Vr6z5cRE/5Uped8fyVdZMJpkJFaD/XpUzFDWtxj4ud+Z5RJ4RsNEm+nETfrKTQi9cV+Ob6Id7Oky5GabhYs2nItY8EsukbCG6IwceZd5c6oHdiISK0SVY08wWhIJ+VDjB4y+0JGAwcajBZwmU+ky4luoFi0TSoS0k4QXEEdEAg+OicrQIJMI6BKPRLEMnAnAQ6m2aGNBFe+fL7pQAHoFENglqS3+27rP7OiRZWR/gMLWz5T6s92HTZx8vw68F0vDdsXiQNT8u4tcCkSB2LFtjzdeYfAJlRZYgouYqhN4j8qv+2Y9mGoqbZ0h+lULfh6RfeMSY2LGLqTU/LuIXHpEmdqwDY82Pi/iFhywIROZtf3L1IIeAN/F98lyDnldjxxjZgDnxffJco7DUBHxLrx7fEpAnvk+eS2iKiq1arPlxET9FkRAB3E6E+QgYFN8nzyU0wdSI9mStj2v4cSEWBUBC4TWiYbH8sJCcMNbq8BpRhLR8RyUzgnm9J43BWh/X8P1UbArsNsNQLaBTfJ+0i4hQQZ7Sk49nzf4i23dUMiSQznqSuazxcQnfT0WqSMDMR509YFV8nzwX0f4F9bbwTqKeun1PFbWCm9/o3QTciu+T5yJd76bFYyagV3yfPBex1M6KwekBxeL75LmI9dYXpH1As/g+eS5C1DfoDU8pdGt9XMN3V3EtWgrUTq3xcQnXWXOyzhqvajliQGTPgMhiQGAND4ZvjhgQ2TMgcrLeigr18M80RwyI7BkQWQyIHas4WfPjItVfhNMq9LuezDZrfVyj+WswyYly5pOUZa2Pa3R/DZtX44VXzVbynj/ku4ASznoONFr28dlWlgSKKNjtkDshNAH2OII3VGmkMJtSPcIze9ZDTvOPVSNHpIfsSQ9ZWsEvq0aOSA/Zkx6ySA8vq0aOOA/Zcx5ytv4fRybWTP/b9qWPIXtpBMgURqAWBytKhIgLdMCHimesdtN8y+sI1CJ2zXW3yInUvvjXjWqMxaJc1nwSk+Y90+/qjYJEYikIoaVFm8i4wM53+gphD6N7TwjPExEzzFvqjjtdNfY4GcpN19LkpRDtZn7dvPZ1Ld5NqfnCREoRrH3jcSA/ZG5nSDYRH9CI52/1dpLmbTbuffJuJYQJZE8hyKIQ7Je6upppFgO1McIQ4ZwMkaX9Q12yaXh7gRaUiBjfnk7Glzh2Jg2wVFao5FZNthMwLSyslX00joC04UuAbBfMA/g68FWFrjuNLjNtXO5OLLPx7G6iS/MlyX0Je51G6G/zqc/s+QpZfIUdq3NZ8+MifhI0vkIJ5SOt+XERPwtm85Sr4aqfI/R+9uj9fAScUxjE5Ai9nz16Pwu9v9vbTBFNWR69n4XeR7kovkg0Z3mEfRaGHvu66NcEysvfJ881mP1pLytUBH/PHv6eBX/fsdmeNT8u4oefNJN3LK9lzY+L+P4qhHuOF5NA3fj75LmEemvdL08k6q0eR55lIY/6b/xjot7qgeRZSHHMbh25U3+NqLN6wHeW0vHuL5NaIHX8ffJcRJ31BXGSA7Xj75N2EUGpd6zLZc3+Ih5mmgUz3f0lsItgptnDTHO17voyqUU40+xxprlad32ZBSSMTJRNbbcWPOXyiPQFU7+ScCHmghav1OpX9qYrdmvtp1P2guZ+QrkDOJk3C1sPlXj79l93q3l8vIzQQGj5++S5iJIE42WERuDR7MGjWeDR/YKHyRF4NHvwaBY6dL/gYXKgifx98lxEQ+MFD5MDXeTvk+ciGhqjR25a1vy4iB8awkbCyy+8k0Ae+fvkuQgDPwSkAbstRyDH7EGOWSBH6BPHN1JOCITiO9LF8FIm7WH8UOYKi5GAEABqkrlwhFwv4gODP+IItyS04Hs0pQiVf8TaxZ9SS4vWgaQMUB1zkVshcwURBWSTOmxsZZLJJaWFq1GP7QM5tbKT1X5UBQL8VKJaMLhEzR2MYwaTunuUjoUqaqQYANvYBi8CnPiSNayizkQIJEpJMIVtjOVAChmH71Db4TsAZEQEPmI3IreNL8BolTfNsA5ADYx2yrHVYugj3Ubuol3gCmTNKTXeezpXmPRL5Wc3s8f87CbhBL7JmRaadsgimx3m+7Dch/U+ZF0LsL4tarbOkqmAAu6e1+3seX/bvL9t3d+27Nse/dJPtsLNwu44SsflCDebPW42Cze7Y/tLay6GO9UGqkjrbUrT7OBhbgSPbEzzNpp6bUcrcjSDtUKvvJBUi7m82j5msP5IOc5GZCkcaVvL1jjYCCYtbCyEzRlZCqjQdpuG7YEym1TShkQigcgvF5ZIEFtwQCrdCWkQ3EmwJDJoH6wODnsI28keN5yJRgVbMkppqpUA2soJQQ4Xl301nWQLcIDVUNwt0YkNvtbZ2GxwHDYyaiEw4IGcyx4Sm4kZBf4j3Buw9RSQeFdXLWX+1JqEetdNgee4aJlN+HtiAY/ynNKWeJgC2+V/3Q2dvGIRNGv9fjZQCOgmfQLAYaXLNzBO8joH52SKwYgeCUaWELtZkhnzcUN+pRMGdb9gmdQsbBiYLZuWrdPw26i3AWtlKY1Nh5U0TTMWBbQtLigaj+YGDtd9uEMljuxhrlkw1/2C9VGz5L6NbVco3QiWnbl3A3fKWfbQ7zDfLxpvD9l6w+ZUhLxkDCA8R6kkkL/L5Qy/j0AFw7OnRfFxKDBCwxkH+GmastE70mT5dZxlqzG9Q0RgIbRGwpyZl8X6RTnHOc5KloW3FnOQcL5PqtdaBWWCJnQ80KrLfmLn91NiI3NlLGaKiksZWQ/UPK1LffwM0dOwVk3eEozG5OiNQLZtXWQu+V8P4qlwv4AZ6hdQuAEIcGwHtBhvEuRwBeDo7I64tCWBCe05YU2nHimxGZkf1aHc1BfXu/PRLrYfHu4g/S2jJ4p2x+9aYhyCVqBVh9fajJ7ptru59mLyy5uLL/+Md3TOEuuO24d++HV23ofrPtw6fPRiH81JoD+9YIXUfIgvKwmO+OVtcDP08fCVodt0eIZHvWVnhb9u2aaCApXWiAGcPZ46d5lYv+CH1IzRTjYG1XxHERKgMdknTdbd1EuMnsbdsj4ICe4I1JA93DkTuoytT7immzeAnAAKulKjWwsO4CpNeuzaGuYtdY3uZmSntNat6TzIlhWM1NyfE/VxFX7C4JPDskEVGGcqU2+MVZH+ZNS6ziAf1GrmDWUb41DTzqSuVjk08RoQI8Rf7maBK4IeUFt0jcKb4JE0YIsMxBO3fsgnS24W1F2QfYmz0R9oVgBJBbNColYi0s4J69mQ9i+DjUQdJcj1YuI7ijl5SdwXBN7GiQNbSv4SZKk5WWFGbZwjZqXVqRjFzSLrzhpComBv50139EBONEhqDT6NPrapAwNhgiAlUTlm8pdg0E6KxtZr8iGajEE2+MRzilsNArG4rvVnclqBF0Q+vUNEWdi6tmqfl38D5l3NXJgP1nW1JfnaQly5vb6keZuTFB8FppQimnNRD9cjyEjb6v4y1XQ+OtIcezGH8SkaQehKi29xcbLiN82qsaKThZxv5YspQ34Ox/2BeZ/VHgVH+xzldB3l64O5XCfvb8qNQ4ft/Wof19G8jq6vydfXlOtrOCZ1dH2LVjwetevo+o5yfUe5vqNc31Gu76jXd1R9x2Mq8fsDEhhKeiGTqvmIm18yQHvTMFALdSM/6jaIAjZSWiLS+F6MR696TUnwgmJ8UwhQj+IbT6vIpEiU9FZjjWgV2dMqcpcf+1ttk818vLv+iEa3frSDxsxRjfstTeTRhAkGpU7rW9JWJ5vy0RGszuXa/nAUQQUmc3+X87IYhrvsJrcUGSVnEvjJ1uT16hSjrnNKkhWzpqRk8kKZk59mGYhYd44F+ArIKqLS5jlRtwuVgGXXw+uCwhffFvgYhfqw+hhQ5aZ+ZJYEBXjOUqb9da78asqGKQDhZyero9z9az8tYW+KRemsIHD4d3GzBZ0cjm9drCTziSk4XPehjGfQjVq6zrZsX1wSJQtoiZGaVMweuw5PVslkWBSkEuJ+ESXWPCsjkwZRUnvroVFizVMnMskIJcVmNNb8uIjfC5CMUNJb5YnNLR0ngsDh7dIKUj4VqvKTpdkxvmrcIiJKM7CkRqIIMLY0CAoHtQ/3xIJIb8UPNl87YBLI8tb6K0NHbMC131VARcK7qq9UG1hyC8PMlbpFeTgM/R7t+37dnwK+twrAiBKDngKRSWco6a0CEFEgsqdA5KFZ+q0CEFEgsqdAZBIBXqzorPVxDT+FihyQsCGKkrbDAEYmEyEc9KayCuL2mWTFAqZf+bUzL4emTjNSMY462TtN25gs2Z/HDfqxLCX4RMZudINDpkZFiZzbhvaWx3nUGboJpo4LL2pidpRNqnTwwLRpdX2CQwdpPCs/O5mfN4bmjbdqSERtyJ7akKU+D6RE/KuXCAWojQjQ0KSTcwayVDm+5gDDo2O4fan5NUtXMLo6I3+keLh76kQ26kR7SUVG1InsqROZEH24ogUKw9bqr+FR/XlqXL9VYwKt+++T5yIa12/VmAhnnz3OPhMzX150b3MEs88eZp+nQqO3ik6ge/998lxE43rEogY50L7/PnkuorE3QmdXa35cxI+HqfEwYnGrPKPx4BHXeWo8jNA8z5ofF/H9dWodfdtmR4jr7BHXeWmNeyEV5whynT3kOi912JniO4kw19ljrvNSh50xhypHqOvsUdeZCGpIXYVJ7Ah0nT3oOi912Niox5ofF/EddqnDzpdeH+Gus8ddZ+GuO+2+npqiOQJeZw+8zgJe07kjSqFHyOvskdd5qcPGvg/W/LiI77CEUVcYcERzY4S8zh55nbf663yJNCLkdfbI6yw1e2jPPF1zrfVxDd9dt3XXl1A4gl5nD73Ogl7DcylCxEbI6+yR13lbd53x+42Q19kjr/O27vqyykfI6+yR15ko6tfVIgJeZw+8znv+OdFHwOvsgdd5rz+LihHyOnvkdd77z9Uiwl5nj70uKf21WpQIe1089rqk/NdqUSLwdfHg60IkdZ+Rj4U1Pi5R/CXqXwtOibDXxWOvS2p/rRUlAl8XD74uqf+1VpQIfV08+roQ9PwGwiqROnzxOOmS5l9rRYmA0sUDpUuyyTVeg0uElC4eKV0IeyZhM6BOlQgpXTxSuggK/TIvlkgcvngQc8n5jymt5KiveixxkSp6ij1TrPlxEd9bTTd8pRDlX3LUWz1KtmT11tj3xJofF/G9Nau3xtYn1vy4iO+tQskCPhO4n1gzCk0VdVETX0bppu9vJ6aOfSG0f+UQjJzUZC2K9cLejFlAPWD9Len8PHzcoh8MWYPhBYZRIgxu8RjckjUY4FEV1NhLhMEtHoNbiKelZTHVbf01osHgIbilaOp+kTEpEQa3eAxuKZq6X+rzJQLhFg/CLQLhvvbkCIRbPAi3SIMaOI2naYu1Pq7hR0Ox0RBn7kqEwi0ehVuKjYY41CgRCrd4FG4p2sq9mGGUCIVbPAq3FPXXF1CCmr8IIZPynNMyRBCrL5IVhYAPzbUhZ1QvQ4FjjfpT0j6GAiXtciUidw0zE8VDfQthu2+0WLVWkaCXUDCEnAyzboaIm4ogX6QgkohAb9kkhkBfryQKd0DeuohHDL27tEPbNfvaX3epgOlFt0PNlEnIh54EABuwcIMEp83pB7hZ3kn77PSYczz2uFSN0hd9dmsmeFCUDkgeC1HQnGJFPmVkPh+JDgJ5dwQaCIXYl0Uz8YbDGPPyxCb+UWYmFbXLaWlqcefhUr5UCYBiEJGHQGfhZx9XZXLop8wTklmoIOqgRhIKG5IRypTEr+ez5f6zQlELHraUzb6YVpyAdiJTKWNYwFBQ6dFnS2LFDBFIycRt2WG+D8v5rPJydrbdh12H/o15oHchaPuFW63GI2q6yHDvRxoXT1uSa5V1oWb4LfXgpeI9dXVZf5Ed+/SojuJB48VA4y9MbTVfqnnKQPbyrQyF7CRkIqUHAs1o+QiDd6WbK2mpkGQaUNRe/9DqdIu836/xB81IG3+pPO/ez+sSPgaUIR4A0cTuQeSFgPACFESkXqpmr/B6wIAPpddFbBuYXL/1XfcpdsCOPKpwFI9LL8SYFxAb4/v6y2Igkla4kuiX7Enlm6gpG9kM1SHggy173vlyR3reql+RiGQvOcdStNbs4jOplI57qv4yxLhT3fkwEQEtlX6e3ReCtoJyRjhBe2x9IU6+5Bxr1Fqz3eK5tVNb58RdgTJgoQvInZ7MEPzLS5y9ndL11x0+bsuvblJYBiM/vq1l0PS68ZIzsUoHiTdZkzYdW5gVVGngmxwRFJnMOskw6hjDmcXlmo9aFiSXMn1v6HkwBcLLNr1Dbk5FbXpmsGwNnwU63n/gySuhoUR8L2d66vgtg4oMit9CdGUIxg5BJM75uINFyVt8u9YB4DQFU6P3eJIAS25aEcz5SXY6FLoqSX7mKPqwtszPqhyP+8gSc+EHugnIbxEJs3T3hCIfm7POsodQMoXr8Wcls8IEo/SSzTGo4XDen1332X0dUqJFHyj2Kx59wccQErfO5a2LbpuIMMMTVTd+DiNWMr3ta2LOLNwDZl85eVEUu5vi3q1squ5b1pm5UD0sQI5ExNfiKR6lSQ2rxPrh1myj6h7onIrwmu5BfVeyZpP2vN0QbAwKuqrBUqDsdh3GXnjFk0gKGSEFlmbxbeaAA0tNK2CUjQPL288H9k1HL3rAU175QJvkRobkW6GkMBiwhUJYtKIXUhxE13yEhwYV6LAjWETKY76hjQVJryIm4Hq5pWH82EI/M9BfHz/cL++itsBiI1wgI3nv4mkKpWmVfRHGLxFNoXiaQhEPIb9gmUok7108TL8QIf8iCVMMpZ8ph8pBhxFRqaaWzFeutaXJkZ2LnlBALFAUFHVuCitB5yFTLdrMTeBlzCkSAqRUEURhnLVaik0T4JOqcSjwpjuFpXABzYDgtZstxdgG48N2SvMePD7BGgE+thEVa97zZA01bFQQsQtQn7ZEvbMCJf7N48H5BbqNPyQNyqWtzZBBktkSa7N9CnUWhHC6tNBuDxqJLOQr4Ku4FL+L9XYL7eBeXjLxZU9qX/Fsg9LmHwIKav3H7ziHd9wEMXjcsV/KjY4QyzWo9R+/4xLecX95xn7BaVpwXjB3apYOcDf5324QO+z0jB2UCQgutLctNJQEDE16agMEFAYDhBvyFyIQaBQJBi2LOoefDuStlNXypshs4TZ+cFB0iHMpJMRQEFpxG3pVF6RVt66TK5cSAvWw8QV8DUfbFP5yX+m0S60TaQkTD8BhyVVSzYjW4dl7DrcOH4/VL4pCykO3Jnys/dsy4mwgiJMvlAKmNUvOFqdzfZB898a8NI5RhFZz8GlKbjFMvniYfBFMHliR+NailJxHuJeuReVFUULNJ8oP/e5uNNuvvFIj4F0/EVHTzMe1siDMDZd6j5ktwszmF6ifNZ9d3JHkqIeHcPMVZJ4JlcdbiON6+LozEOOYXoikl4uHyRbBZPMLflDNz33b3DL/IgwIzewVU5rhRyzv4mFfOpbQxpNC3s3AZpyF7d7jVv06KzBufkEplh6lKT1yswi5mV8EJUqE3CweuVmE3MwvghJqvgLLL7xkPj3nwks2KqwjX6knktcPfGfNVzmLf7Y0qehzBRWDuNf5uV/Y0Pyi8mDN5DJWZeKwI8KrQi/jPi5vcYQJzWPwjqSYdF/bGTMI/AZTUMs0XgvRbaRDfLgZHpJDAZEgce2gaAsXD1JsMzoNDTs6RYkRtoyk2gemkk4m3IO8WjyStZgU94s1lpov7yeKeGmnUvqRE+1ap/rJVwGiV8A9ptMeDrH07ufI8hMuwaFv0nhqfYpO3uvt9yqL+Wjlr0VWThpQxt0UW6YpUyWDE0TZXwtv7yGusHjwahF4Nb/oPaj5cos85lDXnat7gFhz33l4w33YHCCjAZ2jS/DXfT9u1k/3AsnmF10JNd9FtmuWl1ws14Brv6clDbyeu9x2o5cppaOkCihtZ5cnNYhnOtwDcYuAuPlFDULN56le3lvPGVd5HCCRaz4Roawq6cZY+pGsSLSalVUnRJMMaAr+byA9WjzmtwwtCC9QRzVzT97WofUqOkB8wsxpu6LFSp4Ss6kUX6101sTjG6i5lGcF08OHi+DD+QWrqObX22nVEtL/5dvxy4fAwvlFx0LN18wfFai4D5Ot2pa9gumNoAqVjm7ZYBuLvYUUbS4HrJgE1tfFQ4SLIML5xcilRBDh4iHCxTDAL0oZaj6SWXdG95oGslzgEPfzd3UUyjl5snOqMIBXAtknDv/cerbJrOShcwVizuHGwaOFy9DG4QU4WSK0cPFo4SKhdQAdwgVkHkLpgMdNMScEBWi9Wu+CAS8jYRkhFKhQP7qWxxgXYYzzi4WLmm/vtqooFGiAY9yR6S9V87zF2UTHwDZF8jYIzPU2QLNN3EW29sioeehyEXQZxqjxvZW/RiGz4aib/VdHoQdBF4Gg8wuUs0Qo6OJR0EUo6PwCoCwRCrp4FHQRCjq/gB9LhIIuHgVdhILOL8BFNctTvvZfppSUEkzF6rQoLGJNNRH0zawGZEnuSOZxK37iEJaa3tNh95//mVvp51aqame1/HUrfvqZ612MV41XVXLZqkMxB2zSJL/ZrrK2CpUUuChf1cn3kqSHdhdBu5FUiB/MJZfAGPHi4DGl307poyqpV2GJLGmQrYQd9r5M2PVL9KThmTFhh1SCisRwbCrdnEaUrxttmy8RNkanYiEnLRluKXMH0Vtl7rDhUuauYX2hVLFio5RkWdc0O8NewZ4RdgCPR+SnToLQOZmHmdCVTiYUPZK3iawxA7NuidA8LBFa7FEJ7Ml0hGEBUKCX3QSXROY2YXAm0XwwyWRtuMfJbdbzrDqtZZk671eWM2/LcmLN1bOCzIKSnHnZoyLWQEZCo+XzfFD8NyuofJnv4W4sHwokheVDx4NZWzxov6z8l+yzmp/bSj4eQEQOTefGlNxIks19JlJKcu/i7/tCl2DbHm4qPSmgLFsKXlZZNZ+SpcwNmi0GwMtmVhFohRBFR8xvECHBwrFwO41GpLk8tjCebFAk8f6mea1mbrpG+ypLadO1evnCC9zOaDdeQHstAAO+PaUUyGQSXi9xV/YK2e/dIILH7fslabW/hLLV/MTr3Cgd/un4gP/+DtjxxIgiYkR+w3ZKrp4JV2UJIK4klA34xmQ9V43fcqq8U7pjx2KG+VfLG6Rja0HDIBLEESq1LOWY+tN4cS5kW8kCJBCYpwCXelAUN0mxIzPloNFdr4ot1IR2F124csOJkkjjnHjOLSuo2ZusiURQzo86bPdht/vJiRVW3C5Jo/mzqSvGCisL0m3Lj/SqiIz1HPZ++V9a/t8QrRGnpHhOSVlauN8QrWxm3pkJFpZhlzlODsXvJiYxzNuVXHUWsYVqOsZ6EmCwFI+Mf+COU5koh8DfIMoJhGpL7aF6n7RGY9LS1InqEsdL5eIHAgQBUXCLJ9yJu+xJDijMsTInsDQeeRdPjClr/eX8VCJiTPHEmLK03K+X4HDFjGjOaFhU76zyBb+4FcHxgJD3kPGfMH15dSNKIrmLo8ct+uVWvJv8Bv1kM12m0cMzV1NAI/il80OcCpC0FGDht/LQf61n6pStbcobWDSi6hRP1SlySXgT81fzFd1FULMIYEYMV//MzOC32eF7jOe5P4VEnjd3ALVesS8/JokEansji3jHw3cU/CuLSBe8p1xP8QyiIu+G2GNAjTduQRnVni2dWfZX94OiodLGd1BgzocEBggAZ4jYOxjYLxlmT1IqIinlF7e+EpGUiicpFdlDvBgZqPXPRQ9/qQ79uuZ5UlORm8SL8YFar1fNj316n//Iq/bT1VaW5cWrsETMqOKZUUXMqPziVVjMsuI/OAWgA1CGJT+fo5uEqpwsfspiLFRgBtkbaoe/70CfY+0db4wg0vLDfUkysC8huUJGYZgTxgKlHAB5CzVQENy3D6pJi87HzRDKAijkJndpZDsbM8vELWcy7Du3GlBSxKH7VdXTu6roXfkFwqzmLrEieXrhvlUeQT6LlA4YZtWsbH75gXoqxCgQLw52GLyHrKIvaiqFBRTqV+nu+YGe+vmzTgVJ+qpjhwNoe0FDEzxV+gIIyUrhAoz9UAHC5IMdTCnEv9aHtkn1tLQqTxDgavFr/E+/ZuZysn6oRsuZHjcv+F7lQ0CuEplrWbbNH5ihF1rai+vCHknlVyj9KdoD2k4PCyHZouY+sEq7aMD183xQTeIrYmHoPAAUUPmzWVl6/Nbif6sYSTv91In0uf+1QSKpev5cJRcuI6CJFrMa8eeq589V8edKilmWNeLPVc+fqyTDFYSfEW66RgS66gl0VQS68gJfrhGBrnoCXRWBrqQ4OKkRga56Al0lG66UFy/FGjHoqmfQVdLhCnbq4YONKHTVU+gq+XClvLgb1ohDVz2HropDV17cDWvEoaueQ1fljEH6SsCnrxGHrnoOXRWHDlNx/EyiHus5dFUcOhSk9qel4a/Rpcl+7OvT2fUTDIAMueYAgGkqvbtRRoAurDbQilygx9hY/GUpvGfD6IMz0rQRg+5dJ1WkYEqIEKLVU/equHkv1Cu1SqUUQZJQ1TOf5Skda84qmV0AJflrKnM/JLlRK09zG0JR/Jqq30W/ESxvkzMaMRP4DY0UkFLySecXimDj7OPn+CErmh/oTfH7nNqtVBqqXpM2307FeklUaDXBMSvtSxt8DXs7ZPZy/sY+lQFmZ0qEhSok0ZjY2XsfRxhUujKYTlUSybCnZGW/FNU5x2N+9tTDShohE6j5cl/9+l1LBEyuxMPslZExzIRMEg5LqCpERbH41E8D+JkLTcV+jC+IpdSmTb7UyZH5q6YgjU7HkO7Tgd9gpQcPjeeJtASOCIsUeF3ZrJmpls47EP0I+qmTEtINSGpeD5rdi5vdmYdFMpC6K4VwCHxJgYUMAT+PR+UnS5mcxGWrGvErq+dX1pL+WPkjdmX17MpKpuSLdWqNuJXVcyuruJU1FNioEbOyemZllb1JvHdXI3fsSDEd2VKmjNFzKF0NN1mmOFiTRw4TmkdEswDhaAfKYjOMZrkeoYf9VTkZavYNfpjJEzQRMQ00IsNRvHDKzuMzRA6CVJHsr5gLI8haCvFUFVTuhVNQwRkmgBFuEttQDLwD2Qfq4KHfVrHhHjOjJ5RWkkNf+0C0MHg6aSU1FHvRwBuhRmTS6smklcRQgKHDS0RhjKeSVjN0eekDURDjSZ6VfMoXQGGN3FyqZ2BWUSzfemI0Kj2fspKu94IcVCPJUdjkX0kBgshJg1tKK11C41zMyEA/MuNX9qofPEILs+3V8wYreXsvCnM1soepnulXSZ57QRzVyBymerpdJXXuBQdUI7Jd9WS7Spbbi55ajfxaqufFVbLPelwUqZFbS/V8tUp22AtOqEZeLdXzySqZXC/QnRo5tVTP/apVFpkvl4g6vacMVRJyXhA7NXJpqZ7CU0mWeUHZqLEbmSzfEqmkgWWp1Lc5RUGD7q/cRXoxLhomRipOo8pIheNi1SB8hiVFsHgEZID0KcHPexpfrf6MQ2mjxwe0/unwAfIWhaYX8QC4C3i2FCN9TEnUL/mv8Ax/BCie+KPdfiitDilCma/grw95gwrzsLqnkQfPFKpmL+loN8Bxm/354kPBhwfVqGVLnlUr14XXto+QuQYIf7Y738W+SSYqKJVKbxkFxXNmnIOpR0Lx9iWl34xUHbJmKL4uatzqyuAsJ5miSwAbH5OyPW0b9TTAnD2WLXZ18FP1fVmq+jiiCnOb+SiEU2u0nKtJhJmJmWZfyq7SmIKhiww+P6+rLT2pTP1lZmROE9WX8UByOfcv1WryFdv1MV4eYH6KL1PqnuLLC7UOMs4pLC3xZRABqb2M8lLN5yJV1B5BqiEN/kjYeB5ZJb8KG6B4sETzsKdkVZkRvYgl14iRVT0jq8o45oW3USNCVvWErCrfmBf71RrxsarnY1XyjPKLuWht0VzsqUlV1KQX30+1BqvuY7H9l2vsd9I+Jg1XT0KqIiG9hTayPPmH7u1CIbaXmMDzjar4Rm/hSovWD88AqrImeaEk1BYtIJ7uUsVnaTFcp/ZoM+N5KVX+DC9KMWq9KfbzwuNNeevktQxxl4lLwq5XlRVq1VKAROfKAfBRfuRpn1o92aX2v3K0PRqtnpJSyQRB/hjS4D7x2aPB6rkjtZthaShOVSOF9epJHbXL5y7Gm9WI01E9p6N2s7l7eU9R5OQpHbWL2fcy8URa3NXzLWo3kbuXa0R93xMYajdbnpdrRH3fMw+qqWS/RJIj6vueDFBNyfollIyErKvH6FcTsn6ZqCId6+rh89V0rF+CyUjGunpIexWkPb0skJGMdfU49HpkrF+uEfVTDx6vpjT90k9H1E89srua+PNLP42A3dUDu6tpP7/00xH1Uw+2rsOkhV6usSPRGM2DAGpahXkWmwd17jJPR56dOMRCrkN95i08brvOv3JXkchz9QDsStQzQs5I06lGGs/VA6WrAaVfunwk8Vw9urkauvmly0fg5urBzdXAzS9dPsI2V49trsQpvy6hEbS5emhzNWjzy7CJ9J2rxyRXwyS/DJtI3rl6MHGVvHN+GTaRunP1EOBqEOCXYROJO1ePka0Sd84vwybSdq4eJlql7VxepvdI2rl6FGddVot6uUbUTz3YshK+CDuN+BpRP/WIxypl5/LS1yNh5+rxi1X4xfLS1yNd5+oxeFUYvPLSTyMIXvUQvCoIXnnpp5Gqc/XgtSpV5/LSTyPsWvXYtSrsWok1Ya2V0kGy3oRoBCsUzDYXpj4KtTwAQVAtR0dSAqlG+4QafmE2GgA2ZqMz2XT9ABGYj5782LzOrevcPucEJ/wplFbRGTo1A7/Rqj7/+NV+ZO2/FoBIhLp6aFsVtA3I4PUpHjxcI2Rb9ci2KhHqt/0PW6FOx9ol4cSk/JOPTjBTIIh186cLgdBUw2mH9klLUn2Oe7wn07N6oFsl3qy80JfVelESaUw595fzRXgXwrzg7lkXA1SXteEP5Xyq/dCbxQj2L6oWj3v1M4TEtN/KzGxlzQaPi6oq2OQyn7ayiaBM67vIfxUyVzt+TDtGRUUqC1lmkIDIErRS6IFWCBWuAK1QyQ+A40IQMhijhbBXVFgKIcoDlT1WEAuAVKjyfPB4Rr8ax3WReZ1bhNhOOtaBtbHMyFZH5Pzjc/PYJRXWboHgRZTE1seD9NOksHpvNe993GSRwLkp66waDz6GS1HMGMc/Zc4jnEk/VZayiGhlELeOSFohCvXJla0eCVglV/6CYVYr8UBNKmjGwSs0xpSo2KhGqOnWc1Fa1/CqtP0UKmlxSkKf5NsC+ODQAOh4Tc4HrWfEGXrsyD2gsApQ+Db9RHO/RwJWIQHf0g17hUoMOQtjQGMtM5vxhjQSRWXLpkwJWDdb43r+lG3GMyZL0J9ZHo83rAIUvv3aKBLyyMEm5CDI4BBAc9dokQx78zi9RuwaOOARXaJFKuzNw92a4G7U0/u00vw1gkioeRhZE4xspHBotQhF1jyKrAlFNnJInmoRiKx5EFkjICy/yP23CEPWPIasEQ8GvnUEZmsRhKx5CFlLMriI0d0tQpA1jyBrRIOBwRy/2yV4Uf1AW0L+Ucj6k97PlPq4iJADy9WA3gOFbaUomITeftzG8rfBng5NoPA2gq7ePAStScQdvKugnN0iBFrzCLRmIu4hRlqNlx6k1oukOoe06m7W1S17kKkeQK9FyrIUiiYJeQIp2lArsnlUWyNCjUrY0Y2Vc2P/j703XZoc15FEXygsjPvy/i92zd1BMRKi1MvtqT5zJv+UqUJfaqVAEPAlGRgHiKd1FbgCXQVwXiJ7DKjK8SoCAeo05Sa5Li0rXtSsKTkZxWIEm1ye6jeyTfH4uSL83DwvFrTXC20S8qPnuUy6N5kDtummCTHXvEicMSY+olOJridQ98auKB6ZV+IL/KKccHnF4/IKwW45hHMQOEnbF4+PK0SYUYL1zj8o8RQDPCatEMsFi8vjhxNNydvogZcpaKxCLMu9mywZHoMpRZaGL2AxlBqGCFXgagMTXjjyZorHlBUip/JDBa2c1OyLB1sVqdk/VNDKCW1VPNqqEDuVHypo2ssHRPV/gYYgs8LIhUYqVGjxHbRfhj0qT6ycCYVYh89ciodsFQKwcjwDj20vDUSHkfuAZVO2FbqQ30jmlWpT5JOYpTkNDI7UpCvVNnwh6h/KLCcge+TsIVNWBs0skjk3cEsh2G9Z0Cx8G7Qgpgsp+WOwA87kC1AujfAs/ka5Uz4M0ozRISdn0fZmY8NlmEHb3mqZe+YDR783J2pcAP2V7By3R+pjYtIybx55vOWEYSsew1aIzMo5HM0lyskdoHgwVyE0C4/x/GpP4cSjuQqxWflBIVN7E7l9wWRrBpEJWZRyftgD8Ev2OUGrzNIlwINHz1oviEWD5DU+igeGFcK8cm5HgHs5IcOKR4YV4rxyPtc1y/YY6L8XTYtiqLAo4uAOwXuw+5jrSyzCCgOdF3Vvt8vx8UhmAQ/tXO3dZK8rPK5wR5EbczxgkxaM2+3FCO0lqcfk0q8tTK8c7zReDf02L3kcWyEqLT/4rpY/jAQi3UsqrrEQw40T0UwV8zh4P/07bnIuxePeikHbzqVB7eUp6eXLcyJK1PIZuksKecENDErTmiwArMHH78/tkW2FOLX8gAgrOf6eO1MKCpSkTGNLbVF3JdKPWSowFCkAAe92ch89JG//AH7S3qTiSbm+OF0EWPa8hrio9BQ/4jVwemhLbCVTDKOP+6PwcYhgOby149eivWlRl5jWdZJ+qgmCEDf1bUkRHEpa1Ubg5HVLeO12GT6UEXCHF3i+jPL7UHIy8Q9dDyhmuh4guiUvD75oros5ej2NTyax4PRcfFwkfC+3hzTihPgrHvFXiN/L7WmYtVXbKguMxsRnvUu88QKZAip+If4irV+/JWuwZSL0W7pl8h48WAgFzA96OLZXLglBUyUE0jph8rJPlh5ZRcrMFQW4DZmKBJm/TVuRZawWaEeQx1kjtHhYYiHIMD+UhrSX2RJKr0Pjsf3KljLdgCCIknKIm45sBs+ZiovaYnDPtyzSYxxLfqmAlBPGsXiMYynhJckup1Whh34V4rjyQ8lIey+VCz4euI2rZIQPBXmZ1Wq39jqV4kBVQVlSdJsfqg6buZAWouA+JSPzmEdnjOJRZqW8wFbKCWRWPMisEDH2+NBOWZHHmBUCxvI8c3/LCWNWPMasEDCWH3jP5YQxKx5jVoQxe3oap1TGQ8GKwF5PT+NUZ/GArUL0FVi/Jz5ZOQG2igdsFaKv8gP7WHvNIuBgDbBqA4ehyGolZnC2ozjWyEwm/WEu3wCwcyi1crtO/8XVlx5ROWHCiseEFUKxnp74Sam4ePBWkRTx0/g7obeKR28VYrHyA1xJe7n2YqVbKYK4Sc2kPiA2RupykGZftEoQFZPQa2Bnj7KX0uSBycjktN3nJ9OdCIy9EpYeS6E3EUVuSTsGZrCQ1UyjAhoTkUJFTrP+bbu2CJ/DrEGmHBwtQdWyvVIEuUkEF49IK/WtfHICpBUPSCu1vr3g04ft8Wilir3yEBykQEw2TyHvqGNW43J6ikmEp0m+D3N5rquHpXppCexFKvJqfd0JWjY1GiUKeJd0zGKniceooKTlohW5PrKKFS1bXii5IVNLEkSa035jE4E6zXDFSN9OyHw2Gb8ilRzMCbqUid+adG8+heBqXMqPuI+0cmjuE9a/TdHOW8ifmvlTNGjxS7n2qWR4m2U8lK/Ul1ZMOSH5ikfyFcLyCnzIDkXNOv7Qlt2+IYlJD4Yyxbn5KSSKLgBsK+uBIYEjlWVLTobKzcukrkiT8X6XPuYS9YfmVWmYo/01njIQDxQsRP3BW+lYpzgBBYsHCpb21jQvJhocOKYJmm+QQ6vUeGNpVWJRJGZgMLDUhPY/0fdLogioijJJkhgWwKgKhQPDU7hbNaqLdlc+FF8CJl5MA5BsAzX4pNhl1wG6QJRmA6kYFb0Eo15ITzNIKY2UEvzbxCu29nxgdEqkX3DRM3XgzlqwrkjWdIVAWzIMYuRQjuQUsl5GiexCAS0AiAtJe7jcwoeBoxQ+Dm2RKoC/o0oC5sOSzfYI9hxrqy5jEfUF0AAo1OjCv8TnCEBkIdkFHddSeQZwlWtc/5SDHItpNMLXXkYQLJPqdRe1Xb/1dQFU4dO/uO6iySQJYzaSj4KuW2JY+4DbuKxQrrto9dqS0Q0Q7dcpyL7RgUm/wQ2x0sij9GgGKKWvU/TrFKTg4MWXbg/qNtD9tE1oaukPpScJTlt2I3H70E85t5qsiI2ZKiZck0MRn8JysOZRVlPYgYHOdIEYLf1j5EdUbyIexcNmCzGw5cFuW3u5XOZT4hYbZDuWdeth6DLQ2t9S9ZyNII5dqFrFZR9Vq+K8P0Y/RRNZy2B46gu0snQ0k1Fvyw+cQ1XnnKzqrEojKLhDMvVIMmY33AS+/PidbQmXYfEYpRmH4aJKtEGXIosEmtiAw6BaCX2SCou+QGQVMW8hREMhNXwThUkVfaSoIRlIueyG1yhj0W8h0WKefHNBRwoVA7SV1tlmXv92SmHgtmz3yORCmDHUQk/uvOWETC4emVwIM34sWJ+QycUjk4uQyQ9AnXJCJhePTC6EGZcHJH85IZOLRyaXNt9KxCcV6OLRxIXYYKjgHT+fHn7SawKGSlz8wZ/8Wnqc+UNNUQmIklSOZIhxF1/bIEII6CK2MBE2M9NiutSkqMSXscK2JHaISMiMjPVoGXKh5XOl6IUpOo5S2UNBU1LuoeiHh2TZeGWG3u6dcA+PLtKnRt44v8nbhJYTPLp4eHQh1pkOVqdx1lcMrYsvD5WtaN+prM6G5b/4lqQ6lJN5w5oEdvx2eLRSdZXJLI/Q8fVyFq1IJNWQiqyeJ1mrcKIeXdVJ6wdx/mHvp8mIhzUu/aTkl5UVOv4ByC5fWP7Ury2CuwCGCHNtyQePWyv3pVoVM56qMMS95doSyK3T7wX9adi592uL1oYJf0dfWYpqBR359lL8XEHweH3AApcT3rx4vHkheLw+YIHXXgbhZssW5l+CASDHZ55M7wqFY3wRxIVCaFOdQYT4vlyU9LkABbBNnWin+0U2otYfEiM2Efkv9OEALZSlwlyX6igWL4VTNeY4fS4QaaxSsgShK2VzXKr8ELVV7SiVzUJt9WvvoCgIoFpni6biAfelvyH0yglwXzzgvhA9Xx+s9coJcF884L70twXUCW9fPN6+EDyP+HIMwie8ffF4+yJN7afOY5+mxE+LTErU1PzjWKXKA1cdQkgWztHlCzhBXqXfyuUWTlLZgrwnMB7CX8ZbEemE4C8ewV8Ix8dHf5xeTgj+4hH8ZaQ3/NwJwV88gr8Qjl8f2Lbae6GKtoTzj9v6ZH8Uc84GaZjvOlb68k2pxAujcGEWR7fr8tFkvJVxTqSA4kkBhQj/WsJ5AJ5IAcWTAgoR/pjbz8c4fUueFFCI8Efp5XyM08fkSQGFCP/6IESivQQztF5/VhyEg5YWDa7fUOdhQjp6O1b0C98cUtVqvnT9UwuRsLBHKvUorlU8/6CMt9bIOOVfHsxfCM2vQJefitInNH/xaP5CaP7j2zuh+YtH85f5Wqqdp4/Mg+2L4PQPrmVlnqZXD4Iv8+2DmKcPwsO/C8HWrLBCh9kvE05KrcXjs8vUBzEeHunpg/BA6TL1QZzl+LQ3U0o8KgUE8iIteSZJg2eTQ6LHOP+4moFqS1YeAvyA5SGg9ZgeJtaAsllAC6QUTMoB4IpllEo4AatBYzlPI2HkCcPolp+A4a6vaeeOHWJpVPDocVU1kVlICLxOyxM7DRKYn8C6pUrtHLhfpvPArbLaApG1KoNXfH70FiC8ngVb/dt+bY1r71y/tbB+Y7VloIvMRKrD0JAkBSRXleUWno1CJwgF9Uqta7Nz3F6sj1IEiT+O0dOM72HlhSDxCsOfE+aJe5sUy5EUmCGGKsXD5N8o2kbtcqTsmqrAqpA+ebiU5jsVxoph52uT+mrn04D0Fp7LNJfj2pdrMgsz8Dj+VMrJDTwrwpCZSBDfqt9keDfpS2G6e8S3tnZLyD00vhLn/lTarSdofPXQ+Eqc+1Npt56g8dVD42t4UWKrJ2R89cj4GvJLdbiekPHVI+MrYe6VT/8+GWivimqIEBIORqFN2QYd4tnSrkPvVHi0SjQCapuVRBVgqhA0Tpit6oH2NbxpX9YT0L56oH0lal7V628vt2OsLhEiTWah1dQ8QrzstobFsb4WVfCwUAeIqvsqmkKFTuGLBoOEMxZ+GohoyuIiJSkzNXs6hnZSCBortgHukbS8quxqoCg/raSL3EQl1YoSFzWLqMvJ+jrNFVnKRpdZ9WNGm2Ke5ZVBc+DrG2H9Uxb0iPWmqhGVSobgmXhT7dpiORg7h117HSyuzElJYbS7Go2wIrWjYV9hJ+NykQdmiO7A+MnMBdnsVKkwfipLijyZVI5QJ6PMUQ8+G6qeC1FJbGgPYgzay/wMxB9x7KAv2tsiIA2r8cicvaMiVKO5ZUoemsiy0Ez9WLkbwIm1jvWbbBXjoPdAZieuBfPUPHt3CuXIvc1sOhubtHcXzuq5G5UsihbGsSSpvcnQwkbQq0v7ktP5csFFwb6prjbNT6SsWbwl61snsqCY9oarJ5qjzQeNVqJNZzEHEsgsqgA0NFlECkvri8A1qYUZhFtEFzyuFia+PXVlBidJnVSDcEaZq4EaWz5NrieQdGGNBxhtfg7Qg20s8QQIh0UaBUFLTF9wlHFqJCWtscSDb6Yxrmlrau/tNQz/GjhhpiM1QztZERlquoEBJp+qZI+fxZrQ7Db0tJs9WVTWk/n+ytx2lW0kqorlh55el++vHLMLI8ws3WIIDqJiJEyu+RaYxOnpgfPaUrRCSkuiHUNxNVu1SNqr+LdN2G2AclmO0b/oVphpLMdoy4o/t8fnp2FycNpDKUV7t6LF7wyUDDS85yI8NSGdG1u+UAduLEIAogdVUIL6/CV5FlAl+6Y9yHTVkwx19YSdSkpMe5Dp0t7FgPlhviyTiYv9CfqB+J2Xc3ElxBUV0svipIlmiZ+ycHe3iOkpOpWkGHjXnrLAelK4rp5HU8mKaeU89LlTyqptbsMxLhyEi4lEMWrEcy2N8ZbSAlCgti7cBF+xFP7m0g4OeY14lq01p2I1znIiqrZFjHeYfPZpfG+NeMw1Lcnue3BMx++cHNIYXZlDOhE6K7FhPCZqDVPhnNVseswwtQUkvcnSCtrQpa0zlG5hrZWxzl/mOnBdV9f4AafmMcvVk44qGUTtASWsvZyWhrnjocksZMsSWqSyrhrjwI1wJygnifcEsrrMhpCZZPOPS6tqP2WNDlOpasgSpA1ag6GNrtwFgFTFHdTdCxdX3Eu8C7aslA+sPI/CZiM1CzCHtnL9VjkiUNfREo3PrdpRmsYGtzgOxjBbusZ/QR55BHkm2ENpvHrkIrK6UpOTDBWEiiacTaGTth1ZRHIepV9bhA7cCLzVE7yqJM7r2ShAe82s6/Z5GL8nr7kWrY7twxeZEM61dMb3r+STXoK6D4zXVu1b0KyLOk3WjInYIqzPXN0uzNjqykB8/eeLimOt/vlWe6nMPtGwHZxa1V1gc4CyA41ZFDOTsfwC296a61Phii/gy+M6k510fuZ0WJOuPV5HN9eqJt2GG4ygel5cJR+tIYqeFmbxcp7pxXj4WLNeq15lMJXycuyJXGUIqEarRAvUCSdSrGfUJEQnRIkhhU1/1r3XapcgSgYHYrcDSAPkYVJWvi9EQ+NqCStgFg+/oX0amXr8B4QIlBsSuHoSXiWjjgP6GOMlUEX6vgEYZ7UGYGL+l+hRpgAN5XkNQBowsv0ONMPP4n8/GI4sLOozb4lcL7qwcPG/luhcLyRS6Cs7qljekwBn99murb4eEcAsB4Oy6smDlUzApzZPPZEHqycPVrL42jiTB+tJq7164l+VVvu5YFNPWu3VE90qWWtPbZ56IrpVT3SrZK21+ZBmSa2dC5Ra/qMCNrGo6Y9SdqO+GOo2bSb7O7lrAx3WuDBCQRHtSO69Xa9PLd4U0uuJU1c9p66S1gYkyUk4sZ4k0qtnwlXS2hoH7aEqcmLCVc+Eq2LCPZS360kkvXr6WiVVrD2IHtaTSnr17LJK7ld7ED3UXg4BWEjcBT9mt7Uyw9Uk640g4txtSEBkuBGADNhs6zKKsrffx6fLOwiCOExcc76tDjw9reaXNmDNpw/Qs8wqmV89PFSATgLq1ZPFKvlaj0PppKBePcWr5vw2lE4S6tXzsyr5Uf1Bp1F7r684J7Nb1SKf5iGoMcylJEPU2/Ux726U3iHywP3h6t2xIhxMLOB2sf77IxHr8d2dPj9P3aoSa3987qfPzxOuKklOHWPz+P5Pn5/nRVXJtT++u9Pn57lMNUswDIpy7ZvS7WZWpQCJK0sTBFZQJTxESanDD4+ZIiHNRECNJIVyFJak1Q3ZL4FvO41ApdweTTkbeUc0PCo9cXAQgETYx4HHrNoyKKcIpDuQSEs6u1OVCvEgWUYJKGpilY4ZAGW6CSMOVN2GvRAvYKiigxzXGi9QPa1CEqM6cR2jUaoc8ksq5OBi6TEDOJRlmxAXUSEHzNNW+vo7rU6CpiGVVppAytADJaYVT7WzLoWzDQmGA91EFBI0wgcrq1gMzhzsyLOqyEuEMwG+qLAmKrXjfPDV4jOlLQ5z7UZ72mSHottfYCWGLnH2B0nrNKy+sPBV2TMlAfO1WexGUuK6zX5t67gATV6bY2/O6295EwDMJ71G+1XaAricvM8m5gJ/rPtfGTj8NsR9tC5v0frEtauea1fLG9C9nmTWqyfAVRHgUKw9JkwnClz1FLhKQhuG1snjup44cNVz4Kp01rF0O8aeUn7FprjSxJKCxEoWqulSRQfgKi8nqwKBKWK2v9AOZk7cw/xMiVXITstk6rBJ/vl9tvV8u1peGy4nvl31fLsqvh2wd+d7lrwYgk77kA2AGg4R61grck+yHkxHKZP3uwy1gvgIMlmg08MA25x/05s51tdia2a2boZ4POrJhO80gAYQikvkQkWlaCvwPPWp97XwLQuZD8igIPIoRpUpn+7IlR4uqTF4YdHcWNDXv1DtGfpIqjiDsaXqMrbwhUWinLuV3mFLIVB9/fD9fQmQDFqTIhJG1cYR9iLrHfx14fIyyjrZLg2ST+sIJYp8gBER1r+quk7MCJUnQ90A5UKtOiP/iL3sSIGgtbnuHWvv/WvfxxrrtDWqiXMffn6mluQ+jnL+bk9TtWdaVknjA5d5Hn9joV9RcqAXZsqycgK962DbxnVwL7+9IQ2MgQxJa94e+SLxlX26nNxq/IwkN1Cg5EXlw/QgBh+5GRyCstusLEfSwo2GKaBr3u7VpxTifAIseb7XuQChwOSRYoDi5NatW0p0HI+w151WFkXffQeYn7ASeG2hU0OoKqxgsz1EGD9DiBuKHsXximtYJQlg9FlXhKyxpsNpOW1Y7ymEusoU6SpOoPxrkJFmqFV0oiVsg1aHXiM5kyxTjLnAyGxrBDECVjmrs1NESDEQOSxAkRAqmkIx4/vZ1yskdFm41JHYJ+ajnbdn40mvVUYIlZnPYfiLE7tEFzgPYNpAZkVOm97rGLo4CVBMShWQJwW0avtO5AUsJaAncrskP5PKAQHAzfPrkg63uRTuT0atOFq5CIsfWWrG80+7/frTBzWzt8hSn2xsI7mw+iIiVx8kMGORad+UyMy4WRCurX0aSaJhRRRLkr1Z92bT5u3ufQpQJb0M5OYpY9/8Xz5zG5kq3A7aMhJDPhcNhqKu0YaNMi3gIVJVFbGZLimJbQy6UcRfVbarFJeApmVVnF0Hdg4mygJclRe2DWe13bG1YsMwJTaGAhrviWNnMueU9A5/pS4w2skpGeftFoA8E7i+MYHriQlcPRO4ktf7mPCdqMDVU4GryL5PecvJmqJ6Pmut0pV+wH/a7mzKdIeW3baDr/JHT6znFmJjIvJ84XTjoKoaGcO4bakFJYoZH8OEn+DkfwEO47HvL94so5mVttv65iYlvIJphsTEz2PYJbVv5NokFVMN4ZBpbO3bhd49U6onzFYRZqkde/xm1ip39k46NuWrF/mEa5K0OCchGhwBvzC1I8QgNCOaqI8VZrPQz1xIIASsEnUwkMa4jhS8j0Vu5NFSDy7VMCssYvLvgEUx4EAYCziA7lCSm+VkN1wsETUMwSbqWd/p/PS8uCZD3y6kUshTAYZxkKaJUxIfoUV4HMEuKyZOfrTBrU2mqliRM7rQJ3P0RWBJkeLFoXIgdbuQlMSr0eZcf5tqWESdJLxAuxVwPHG5koX8hEw78Zar5y1XMZMfsIb1ZHBSPSW0ivT5hEw7GZxUz9Ss4mIiRByH5cnhpHpSZW1vItn15HBSPY+wkhT4CNo58Qir5xFWkgIfW/cnHmH1PMLaXhtkJx5h9TzC2l7bSyceYfU8wtpe2zQnHmH1PMJKEl1/cI2xvV4JhYvsWKMlK0jsfsRRSGcaof0aabMlx+rp1RTpoVmzg3oEp8aGJ/jV/tYPOvH7quf3VXLLejgDxOvJ/qR6Olrt+a0pcaKjVU9Hq13V6IeGQi+XKu0wST3LdmzDShpbLbsyzRNxkWpXwGv3JXnfwzAZ/B7tt9sV+q+tv5WgT1Sv6qletbcXBlA9Ub2qp3rV3l9f2Olj81yvSuJWf5A7sb0mpXsJGYobK0dFpRwSaW+XeF6gImIycV0tHCItC8r1Wz2qF1bPJKv9hZFST8Yt1bO+Kjlc/cGERnuv1GvLNS45ZcIRlE4RSlTMicCk8rfK/iWaX1jnaJQ/7Ef5/OppZXW8fcAnVln1rLJKitiD8Il2/sPCJ9WT1qpoaU/I9pPtTPUEs0q62JOWQz0xzKpnmFXSxZ4kFuqJYVY9w6ySLvYkhmB7DfUwlOHHHwiICLIs0c9o9vValkETiBb2UhW4GA9SM6CmksZhkpqBMCCFoRAwCakZIDsqY6FBylhoEKkZTLRXZ157qVcwKZk5DCHSWbs5wEE8S66ON+2AemLJVc+Sq+LBPfDT68k6p3rqWiUR7YmfXk/cteq5a5VEtP5gz2R7lxjEco+UgD0IrGqAduq7RNNVbFSwp3tVitcWvqCJnjmwWRgF/so8I67Ot/hwIsRVT4irM70wV+uJEFc9Ia6S3fY4b50IcdUT4irpbf3B80l7D14ZHPNYYe76otrMkMsEX0p9iRYlPV5/q49XzRFAvvxFG4+kiG+/A+I9+a7Ot9n+xL2rnntX5+tsf+LeVc+9q+RstQfune3Fuqy/Cn1LYOwPoe+crayp9S7CCpIn3G2nYnL6Ai+buXqFpZzh+oC3Kou3IVwfAPCC2APnDEKIlMC1yr2A3gGBV6IBKRmgFWAugVehz8D5lILhqo1SeVjL4o4trkuxwbCG6goPx628DtKZb+MUXSzaG/+1eiJcfSPC1RMRrnoiXJW/yuPLPsUhzyJrpIShGnH6RLR3mTyxetRX4hKSUYbR/7pS4Cwp75x+O300mMDn0SnADNh3z6s12AFchASUu9TmyWotvASmduKqNc9Va2Se9QfVl3YiqzVPVmshv0hhthNZrXmyWhMdDY5Xp+V8O/m4NE8va+ElXLQTu6x5dlkLb+GinWxcmqcuNVGXHjAu7WTj0jwVqIU3fEoLh6+heR5LkwfLg72O9sqyPn+kJ5Koq4hCs3zai3mDAT9xaSFmaYYZc7gvGPpMIg4j3lBWLNMVkFAV9jQkQiPRN0RAtU7TEmFEImWAFvxzSZ7lZMpxsIPGyh0n7FxyoppYTToOvTxMTQDDRGrOR5qkIEYGQo/VKYXBqBGSKBpV7AoMocLGEI8MHpJqkcSsD9Oza5f8WidGI3265N/Q2A3FbloVQdYt1dflPdqEUBfGBEcBldf21+ufxyGACP50SC1PNX6xsfuF6cD0IBMINDv1TLTV7FApUVdOP45ra64tPmRI3afEO9OP6drK19Z1lnadhRObtvo+jM5yG5o+yJKh81SsaCdrn+ZJPS3Kz7PNc8iI0QrT4DvItIKAJoNBLvSjCulQANzoxx/MI5eTE2OEK+nESEndtz43InIDIWMItDIYvpTRPKGoxRdV5xZPkddTflp8SwnbifLTPOWnxfKCpmwn75zmaSwtvgFz28k7p3lqRYtvwNx2Ms9pniTQYn+LeNz7N+L9jXj/QMTzzI0WzaH2DBZtJ/+k5ikQLb4U5NqJAdE8A6KlN//AdmJANM+AaEmRl+pr3zBvBzllnp4D0UhoePxWuffvt/r3W/0HvlVPrWkiz0BK5/itpl+3OwK+yMIjQWp8hAuDLjjhO5AJa7T/QAFSRZDB/vICDfCRGuIn0X/kXrRunk7T3ug07USnaZ5O08iNeQ4Fp1nb02laaq9fcZMLWl74dmIXaOqHpv+lNSfHxUZhjFWpG6yJ48uFkZyZodgDajcBieZJOi0J/tEfVpQnlk7zLJ2WXmoS7UTSaZ6k09JbTaKlU9D2pJkm0szTU+bev7Hyb6z8B2KlJ2O1rFwA9kenz+zExmqejdXy21LoRMZqnozV8utS6ETGap6M1Uh4elzG5FNQ9RypluvbMuZEkmqeJNXya1DN7e/n/vdz/4c+dz+rZptV68PnfppVPfmu5bdZ9cS9a5571/LrrHoyEmue3NRIVXpexpzoTc3Tm1qx+HeGR7YTv6l5flMrr2uh8nct9PeD/4c+eM+aa8XWQmcdVu2mVQsoFWSrAhVPQxcoa1BTlHKjgfreJvefZEsDbLUe1tCYxHqIFNJYxYIFHIgjEfKpU7oe3UxpRlwMWcgBmTSpuTqpC2vSpKQ9cXCaSzquRd7ogXphi8rZPnoPgO0LsdybGdU0+aoFQoeFGwlt2dQA1x9Fsl0ksxYpnhNonlhs6SPhP8nlQ74rUisFOovi0c5pl9EoPwJgr8Y5mFpNt4WeLvmx6CI28gpwEFHMQKfDwkmqqjHI9YasmiaynNHGdJooohsfaeXgwKHQFjNTBiRaZh8UpeID+YcU5ISDTz0IQlOMgQoaINexHF7Y4BiexHKRe0t0My/Wfk32l+L66bey/7LuX9ve7Htz7M1ph5J+IX+b+0xiEGszr78s+7d9prnPNPv6y3VH084i1cc8b0tRzxpt5W2tfjJObJ7I2crrWv1E5GyeyNlIz3uZ704ldk/pa+W1xM69UoCq9GBL/CLFbCefm9AHc5wCQH5kw1iJNUNUFn+bgNjz7XW4uxD4QPcCFlg6yTLEoDTJQCXy2jv1eCIojzQZ1makoB3+TRRulb/K44C/ymaPrxafhCSqkkngc3MuPFeiC9vaBOIl1/sQ8ClPkdp4eKhGXCRGUjYYNZspfVEouTM2NokGAEggxcFL0rTHJfjYNJWD+kk6LYC2IxtxgmGOQZAhoBh+NIhnJKewmi1YQuYqMlxB2UdhE1E4SSA6LAsv8uUYGinrxHleBD3GzSHT20CGB4y+Azk1UCAJcngeurvCVxvIfgKMM3ybmX8R+liYP2Cr8qyJXlna0PTYaV6FyNZpXhUobATUnX4TxxUFpCRFAgZSXVjrwQJh19wCOrJJCXQCW3TLSCOQiKUPkqVAQE9nQgNtBow+7YWsmG5lKLWh7JfQQZirZjCmdExSbEgrxwA3j4Q+/XOLwFR+aCXYrZAIpk0Lu8A5CtuO4lmSZ0tYyYNOy2kc4rVjRWhtjrQ2MbavzWLJUWKGszbb/oO+N8f+g3ltMpWzzbg3097Me3OfLe6zKfXUZt+b+2xxjZgkcTv9Sg2GIA21tDfzemSStbC/3WdL+2xpny3ts6V9bzlcN5/t3m5BwC9aylv7ppzWLJ5u2+pr++bkxdo8LbXV9/bNyY21eSJpq69Llvp3yfJ3yfIPLVk8y7eJ5Qve8nGurX/4s4i+QtrudmUhiZbAfNn0AsNXgeugunUjlYKRUMBiM4vNIljcrs+ng28c23bi2DbPsW31NR08cWyb59i2+p4Onki2zZNsm7Fo8xlR3E62sc0TYJsIsI+xZPyNJX9jyT8US/yULfYzRHzOseQ0aXvabWsvKkrtRLttnnbbWnz74E+02+Zpt40c2kSLxwNVtZ14t83zbhs5tE/ia+1Eu22edtvIoX383kXK/fu9//3e/89/757N3UjNhpXtierRTmzu5tncjdTsx8/9NK16MncjMxtj6wjLP5G5mydzNzKzAXXN81v77Ws/tVk8mbvJFBYFj/YN0x/iFPw8l7uJrQ1J+foN0YkOtH6Kfp5i3UiYhlX4SbignTjWzXOsmzjWJZ0omu1EsW6eYt3Il4aedaGVuD/GKfZ5inUTxfpBlMT20oYhfkYwywNRRpux1zMpOahHViozompVv5AFy3SfRpjslPdI87Ym9YTq9kaobidCdfOE6kZ2NELdiY2pvazmgFNmNRyG8ZqtQbBkMWmkZcV2BqjIFJxFEXMKjq2odQBVaVXVmwV4YLi7egAqL0LES02EVK2JEIZqYNSGpKQmyl2q08elqFlMUTOQuS4dTSq9yd4sRBNpp1zJYAyGxI+cEVAWKyqaFZsPULtMslqn/VlYW1NB9JOpwQnmtiaGRscP1kxpry1VPQy7boezuhi8xFUBwW+qDqFQOTS9yCIbZbBGw2Kdo1kV8NPZvJgtfjqfLZztu8zuuUXNrYq90xT3VP2CAWivph/aZb+WsJXt/GgBqQPRKx9ZGZ9epQCDLdZWcApOYCy1aWrCb6pWoY7Z4jqezO65N9tpGfn1E+8C9yMhQf7W18kY+PXbtH/ag81dXeVCKIn26ww9X1vXKUgd5kH6dYp+PShWRvkY+1xXPMJ6AiPq/dw+Ix/zpSkwzr6t2iu7POurlWDJD5Q9TU12FYbxuchuBzpT/FxMcBFajGq1UTea1VVcpf0NrxZKJKwZwyeYDRAaRPN7KZcAbbFGG9hr+nDQSctiiBaKb6AOney7YQrB88BpWL23OsrKnubyLc7RGgD0ClSdFEXxqbNbOgXHVH4hILMi49B1oGAYaK2Q+UToZMNhTjRmsawGkm6B0vUImfbBxVUIL6zdwkZTnxkMJfSZQVihqDgOxGKtVvRWV6/RCYjRAsGQuRufOy8KFItqn22nt6D+bWUlF4+88olRvCElK1U2s0is5GUq/rUmVeBObwUMOI5BqDOiD6hiNFREGelQBhn8RDD2R7u2+vV3eir101kq529qdeLfKpFFX5axBBeqgjceWrdYgr3XOdQ9416V17E1rr+jeCT6u1QUxl6EVP3bYVEPW9muYPBB4rGMUK+97drq1qEYgdEkYGuuvWoPo8/E0duY8l/nYIditPKB2dD6bT3wodfGrb6uhS9whlsi6dU9GsU0RjxLqbSTk3Pz+huNahoDwpenZPQkwNG8AEej2sV4cCnX3iRfkCK1LrTCRGgt1l2KPZuoTopr7sPottIZ3fH46bbVGYekB7UAYfFktmBYAImCDIEFfomw5GSf8FvC+GT6u9AKvMkoS7NWIoJA/u1oHkiJtJYPZfC+c0zqcibiC0YqdpAhG1SoafNoCf+gX/+Aep/wwUySgoRSRFh7pfg1+mdkO4V/zl5EpFESZDzRhrl3yxbQaQuCD3iE5RthpwQNMy4nl6O2EYYzpI2C4Z8HUeP4q0GW8Mzes6Z5bZJGJRB8TsdRdHK8bl48pFEJZDzoF2jvb48X+ibdtCIpsV2kGAvdY6ok1iWJCMCEtDpplE3pTaQFsiUaTYMhafj0tUWv+i+GhPxXkAI3PhqkUp0O8+g7I7iowzvy6t+OPK6taZ3eQSUZ/h3dodCPRhfvZEzSvCpKe7PdbidRlOZFUdqob+u9kyhK86Iojeogozy959O60wuKtNHf1ownQZHmBUUa1UGe1ownPZHm9UQaxUEe14wnPZHm9USaFEOe1ownL+zmlT8adTxGKQ/HOK07vfRHo44HdP4zEAoeEHyS/mhe+qNRx2OUh8+Pe6Wxm8wKEnkVhj5VA2k7D8vLtJwDk1lHNUlFS+g10N+ZWhIt2aeITz7TcwoLA32A2CrZLAplmEa1c36TqFM1KhoCFNVJrsXKYUjPtXf2wzO1tQelwAdFFMPaC+UjbN2eif/qJGXysJ4/eXs3Ly/SKBYyHtzX2klfpHl9kTb11T3M0Sd9keb1RRqlMAC8OB9DkFvoedqSt9sMgqkX7wk6dYM+eZVZGZV4OPdidpNZIgxEGlLP29X475eqGhDRGd82b+P19P16HY429f3CPhoil/4Yl4o1lq0/es9SAsOQrcLgTMP95PYj6KyRSeFneblZ8p60umWFhKqe/BfU0uVAg9PuoJBTs0EIcJoGIbRzB9MZVCcGh7K2mDHcH5qLNp3aHOR1Hab/bqohguIJupakkU8hUZqE4LpVQTCb9tJsyVZV4cCKaKjCgV1cp2J9L9xcLB+C4pDNyumV6+wq87Wy0jb4gtF8bTAy0OkNXdD5+3Qp4sTvHtS2NQVDryTTlhu/VclqQwtVMQNPl8Eg8yOnXH9hzVmnGI2WQvCVN7TW+IwmSxuvBNS91El/kzrpJ6mT7qVOOnVLRjtnaP0kddK91Emnbgke8fkYDMSV4Q0GBFTvTh9aaXEpTevg0k20D0mvSnvsCTSF1EjjkvINKFo1yrB3PL1uunZDqla1fwZdufvNZrJ7dZVOpZQB4cX+LbP5yz4Ey+7FVTqlUkY/LyT6SV2le3WVTqmU0Y8xu5/EVboXV+lUSnlKDfpJXKV7cZVOpRR40TXEHX+IQ4TrXlulU9EC5jrnp3HIULoXwegyyh2fysqnO8RJA6N7DYwe4/MkqJ2XuqKSXZTJaOFexgefrNQV6aNsW81kIkfv19a49k5DPowRjmiH7mUuOkUrxojHya2fdC6617noFK0YD5qB2pukQloYtqCHXcxNl7KuDPJIXFCQFNd2SHppxA9sH+o3YwoY57J596oZnRIY9P4+XpF0hXEdtXxYnwcCDpdWv7PhRHjM6SbZ3L20RqdOBjwAzic6fXZeWqNTJ2PQTPV0jNN356U1OgUNxjhroPV4+u68BkKnnsGY51ypnyQQupdA6BQ0gHHt+RinD89rIHQKGoz5MJxOGgjdayB06hnQWfh4jNOM5CUQOonnMBY4H+P0aXiueicxHMXs8zEOPanuueSdzPAxz8uLfiKTd08m72SGj/kwTk9k8u7J5J0cbkCHz8c4jVNP++6kcKO2fT7GaZx61ncnh3uGsxRlP9G+u6d9d3K4Z3gYpyfad/e0706y7QwP41S0b2oR5bo1MTe7nh4vaMkzx4DOsmJjZZ2syg9oBgY/0PK5alhAsJ/r8pzfTv7uDA9j7kT57Z7y20ngRevlfIzT2Pec304CL4q252Ocxr7n/HYSeGFrd3zXJ85v95zfTgLvfJDN1l6syr4wXciLqbBtfKgcgRYTFWAjujlo7BGpATODbGtpamT/mIMh3Za04OXnc7tU/4mR0DkfRKe1t2lIwdTTrhl0q/ylUzIXB0U9Eqp+Y1VVuCKAODP1vwvz3MoeIpMOmI3GZCqhE/4DOOztWv2nTN7ojA/JtvYyA07yACrsNnUeP8ArB//HevZEu4EZDLw+xkH8unuSaiflFO6Z57OzyLU0P/jI0LvQiwOuVA8IuFIZMJFkUJZ0NR5MIQBJr3PiysY5o/Lc104i63xoLfTLdtKWmrBrz/JzRyDhEhHPxrzq+a5QP+UKEObcUdwztEv5V5Q1m+zywmODBVytI5fv+I+LOJ3Z8e8o1Q2L76J/irciNk9NJkrKEnYRoKHy4ST25Dp7/xgroya7qMEiFABwg73dyfUPHh36/zPR9BTRj3os2krmSj7poJpuLJ3uGcGd7N75II+rvawzZFu9g/eQ4qLtqP1dtJ6PI2sZj5HIpiz8ycR2TOaHQpO4aH/DZTxajeK2lWkNVxzRQFooRvBRT2qeF7MvUWt00sggL/JNEZqsMuZHKqerrcKtvrfY5Ycynkwyu6AH4ECOj8Bf2JJ3O/7O0AAtWZedTbOk20nWWMloqeVm/2KQZMhyStm/jfUbMRK4I+HTcEeqEPDvWCHg1nWl0womWFC36zcavsHYk1cwOQKmCejK9rPevy1P5+7lrc5wInN3T+bupNBSTLB/w215Kap3l0+ZAB/lm2D7VVh+yh807y1YoXtlWwCXl3ILW56v20k+RAHr1EnQ3itnSApH3XSdAcJQOREcKIUy5AolmlI2++HpZ0WFIT24oprz/mz9VFteKrb9RIPsngbZS31bTJ5okN3TIHtpb4tJkSTXE9oC4zt10rKytN+H0NnHA4yUq0rs1KoS9FisKs9PyM94pb+tKkWu/O+sKj0dsZOa9LiqLKcM17OZOrlJj6vKE52pezpTJzfpcVV5ojN1T2fqNb6tKk9spu7ZTL2mt1VlPWWjnnbSa35bVdZTNuqpIb2Wt1XliRvSPTek1/q2qjxxQ7rnhvTa3laVJ2pI99SQXvvbqvLEDOmeGdLreFtV1tM49RD+XufbqvKE4O8ewd9beFtVniD83UP4e4tvK8IThL97CH9v6W1FKID/P7Ai9KyA3vLbivDECuieFdBbeVsRnsy4uodv91bfVoQn+Hb38O1OMDaS9Jy/efp5inuVsZjwe122fJTAqPTzSM1aUoj9mjWR0WnCiEkAFIgIZ2ZChcLvk7Eda73JmRkTy8yq0d5yVw8Z78R/z3z2zNJemuIi475Ms5jVYeW6LbCQxZUvMLFYnKIVBGngYVcmpyZgKSddN9HNgKOJNTgAX8F1367Wf9jtRQKon7Dp3WPTe3uTAOoncHr34PTeRaftR+hyP4HTuwend/l/Udvk0E44gdO7B6f3/sam7Sd0evfo9E6oeYR+4qkzckKnd49O713MnPRwjNM36BHlXYhyNC8rhoc/xukb9JDyLo+uVh6OcZp/PJ62dxnijaPGeD95dHWP4utdzMQztF17OxaXra1cMZOcj6U/GDtAehL/ENm1a4BaNpq3gyZPJ7QcPTS4eyBglxEX1o/HyzgNdQ8E7ESsRaDID339Pk5D3YPcupyyej5m8AvjJl5tj5ehajP3qshSESLL9sBC57MQcEJ/dnpgXfZfkXar44a27B7j1glYg+vm8cLS5VsHwQEaEgMmu3uvugo6ePduXVtdBUVwBh2FohSDTLFU2T3Wmip7ARk5qo58u1z/qRJCNvNDBYd7Mwtt7fPmedSyzd2iLiOGowCDmkj/1Irrgldo52wSboYi3SPZ+huSrZ+QbN0j2fp4Yyb3E5KteyRbJyyNntanNewJydY9kq0TljYfcDnay8oCKIaAT3zkcMOSGYWlVGSIZjsL4H9iVWJWo+phei6d6FFYdtOtB+jjRllbwApb7QucyM8B77HPdEnVZPsXg3AXwMdnWdoyc8EPP8CmrK1ybdVra0EhZ+nXb+MIXeweq9fH2zR8wup1j9Xr8v5CZfMgeKm9/GpIp0grJ4JsU/4W4ORVxU4Ewqs1WwlsQMpOPClwT5P0+5buocDHOYL4nuyn+wn31z3urxPEBw/oE1FWe0HQgplbsuLJsHGR2IQWdBdEToB3yreCh3HdVWUHPhAHwaL+uCVMHkbYiQmcqJ0erFm1d9kS5eUudPkSydR6EAJNMN/sn0lnrvmZHHxgSdIHj/5dk1UgAHkmTT31GwvVtwv1sY1APSS/Ge/8dqGnNMRj+zqRekiwzzd7CkQe3NeJ1JvtoYl3Avd1D+7rROqB2XO+jlMg8uC+TnwdUJfn6zilIR6S1wmwQ4XnRLrWXsE+Z5HoVlz059rbr4E9ViikCUVWU5GlZRmeA+U1zVs+Q8+CyDm1n7A4gQd6pluuwTtRhGP0YydiI+ywcCKIb15e9VP9EW611W4goKnW+4DyAYZYu9keOnQnU6/u4XkjhBejxBEOQWF4CNogoGwiezvMStrLl9BmFZKPYH6i4q3cHxcSvsVsfpSougsJD92nPNkDIQdpmIl5EYwRi0z1RRASI1kOMfNl5G8F/YXQxkzGFroh+LvJaQdKKFN/l+Nncs2HCvtUPtY+aD6uf9Cuf9Cv38a1NT9bGfn3WUX/rNKLCfQ4Ye2Gx9oNotjmOH/A2iu7eOvBUHgym7VeZutrpO3Ix9kRDBStwTHhMChygUB3oKS3Bf4SV/ENRfdK884kVkNAXZen+MOzrxIXTZgm2exsWAnix1YHFRxR2ae1Hg472UUDK4rKM/TMm/Ap+tbPpGUp6jbMLHPy64Ph8X2DYL05zmv/ccL3DY/vGwTrzXF26h0nfN/w+L5BtN4c557pOAH8hgf4DaL12FQ9xNxxAvgND/AbhOuByXM+xiGvGR7hNwjXm/Np+B3CzvAIv0G8HgQxj8c4QfyGh/gNAurmPE/8Ix7KC8Nj8AYBdfzc+3f4nEh7Jcw6bNoATlnkABI/We+CRB2TYqh/mJuuEjl5WIr6xeZj0pcVf+DbTJcAuN6TiwmlYhWjPm9ckY1pdCNEO/9OOJO+uZw+5jW5zAXbnuQCIV0mH/vbb67IwyMLB4F9uJhTpqe9C7et3m0sG4utB4PGmB4MiLiKCtlY+5GAZ+uZgxrOnjkR12RdAqOv8A/e2gZhkzIH8kompBpxWzRWfKCZ8QrZmTDDIPkCSwxf9mlPNYVqMwdFAThzQHezNpFAKtPRxOjZxO0bCzKPBX4jIbqz89sM6E2RVwLVJzU4qZQSaJwMthf4I+mLiTqGQNPPyV+zNm+vwgcxQh9jCOfu+zg5kQ0PlxzEPkbC7I8HqfZCqe9J5VrkK5TT7dXI0/DXnraoYvyvi9UG/UT16VP+mcoV/9Wm4GsoV6KdhsV/oG4V/zGfTk4wATMBoz44DIr7nJgZ+PEvIrSLyxc4iAiDaU7ht4fgwzDBmzGEhxh6AnwOD/gc8lILD6imcUJ8Do/4HIRvxhAfougJ8jk85HPI9So8gJZsNz4wtEQJTmlKwBKzWiJNml5ysneMkgiRF8JZ8KNsK6qFNC2YQTYmk1tKSIsUesDy5uGB2KlToQ4aPMS5UIcgkHoVjYOKowghgSRKwwH0aA2HhBimABE712Dxi6r/pGACJvVJwQT9NuxfxCCzZcSeQHtg1HtiUGKozWrXGIO4s52b3e4mBt4OejwxcF2Qs69cDQ+dHbIPCw823dr9L/Z9RaOb/UdfGh9o9BC64ZG/gzDe8tCT1F5G5VRVWgJpx7isZWn0Xgw8IJWUl6tzhKugyrGoe3OBgrJeIbGBUYbONpHCl5KILcw5Bcy9bwJyx1Z1mHXQ1hs2tUIgahP0kNGLHBghHS4OXgxErIGYF4OY1eM2k3ow8yAy+YE2Nk5Y5uGxzIPA5Bge8FfjBGYeHsw8ZIwF9swx+J3QzMOjmQehyUCplfCN4XaMUzLs0cyD0GQuoMc3zeyPcQrCHs08koIwxK6PN3MKwh7OPGRiFdJDWn7CMw+PZx4EJyMXqGSH+WPMyzl+afpXeIuzykdEKy3QUBDL6nLWbkUyBFGWAKEDjRogytfkddcvcGoQ+mkHxObwcOkhQDQ1sZE3ukvkXkqCh+VFFrJluShwiK2eezVLWCA5eLAvKXr8pAHuA2iO0v9EFea+8ljgTgs5X8Dx1qh8LLKEghytGhsWvw0WhtmSp8tZQmUg0EedWtshByvlRuihoH1y+wA9KnsQYh1xc8fXnOOvax11DajfRj10JNtqARMsSV9bvo8hvQGaD6g7A2yY3kwMS/IUmyzezvtl+jjx5vU0Trjv4XHfgyDup5LzOOG+h8d9D4K4yYE+VXNOuO/hcd+D6OonF+Nx8noaHpA95PUUHvr22q1+Qvx0MrKjte/HhpBL1B4zXaSl3pQzBTjdhRKDaBPFHwf6iAXbyWR+eBT2IDD68X2dApCHUg/5/Tz0hMbJ8Gd40POQ4Q/F2I/PadpzgmQYF3+xHOAZQwzjaHomyEkiq2UF6QTxxMA2bDQEPgLQqzMfHqZbddYA+7ulCh5PPMqL8Oc4+QsND0gdxb7qc/lznCCpw0NSh0CnTy+gnD46DywdhHM+DvZy+ug8AnTICCM8ND61m4RrcsBZUf5x1oS2VP7OthvEksODtAGbx6ixndD2okekW2N2eHzpKC9qeOMELx0eXjoI6oTG2MlEbpxMNobHgQ6ZbITykGVztxgPiat72mMihIwLZQD3i0pbAbDi+7dxCQndwbVZtHm7GP/1FqUP5SFCncCiw4NFh6TvQ3koL57QosOjRUcNLynmCSw6PFh0VH1O5SGM1EunB2HjQkcpvjYS5akU035CxE9gYDcv1kXSIWQAXjnicEf25EQAD+xnQlwqQmLvBPEaHqU6pLkP96TzxZ++Yw9THcScomt8nPi4d2EOyB2mhuGFF0z8DUmJWkMdmVOgOgX0iSJwCZQlwmbZv57FioYHwI43bfRxwr8Oj38dwr8+kN3HCf86PP51EMz6pIMzTvjX4fGvo74x1ccJ/zo8/nVIGR0rxuNik7urGBIk9ySq1iMBzfKuUmsDqTiXl2nVDGNrlrdCO6tkWeV0gywMLhKZnc9peWsxTa30DVpzJ1ssVhGdMNTZIo6wYQKjJTPrjYGQlNBvqaFH6o6qINEeCj11/jS5d+5z9bYTTw8FKKr4KVtlylNT/YOLli9iW5kizuEyF0MtBoDXsHm7Yh+R2ltEOsGCh4cFDyl7U9n59IpbXAZr1WRTIT2YJdMYJZfaIXpNZc7lsIbKtBzW5sp+CLK3hyeNyyx11H6po86PhAIheSd/IXAKWLLIH9noDAm2QBdvLhs2tpiDKTaKtES51KiyPZZW1JC0nhlkH5dzGrT4OEigJSR5Uy4GZX+Tl7IiwDD4HT45nZEnEAvV+Nug+xEvgOqZcorKxD1BBbTx3eNGTScRhWvWfNin7nQL4z+gwiH7aDObRdqQrVxbgnKkvEicFlRC3kUjeKItUzUirBlAlwHbSBpq0WrmLO1R5TK0ujflOjZk1oY6JJ3u2H1lGY8KppEH6+H6Z6pj8p+xrgMyXeR8s34te7PuI+yzQbn8S/+3oOeDNxXMuQ1/MPbZxsVJC2bQh4OZd9vtE/cA9tE0hY2HEs9Jg354tPloqhM99TtPcPPh4eZDIvThqeHJ3awGIwtgfzmaQg+c+yi8itKE+suSSoQI/BDHclJJXt2UtJpCKB+INDmndXvytGYPPgkW9PJSOMT5jDI55Q0IgFom/whUt0h5eOyF+B3XPCAGsGGEkaAWDiimUt+Lkq/NtF+0pjS9FGn/VPWiEctpfkRroy8UMmMY8/qV6Y9txr2Z9mbW5u35+2m6qVMzn0ZC/VkLXKjSnfmjCi+hsk25ZdIFRSXlJpVSSMnUTmKYlVu3K/OT/5t++9pJhIWdqbDzEMMEtZil99mvrcGt2zl9siDB9we1unESfB8eUz8k+P6guqW9HGBQcktklaO3ukB3WyMF1SnJiNsqounNziVHDiLJSSZleIz+aPNFMV17r6qhwIHwZkvCEJGW0PT2oC6nQhTZbn0hX6BsSgVeFA1HXatAu/CYblO4pwAM4vlTRmHh4PCh3ReQ7so6Ul+5RmWyhbxCxEBEU7QpMsVmewjG0d/5RwQEWglISiKCo/yWuCQ4ZB2ecTD6C0l1nAgHwxMORjcvkPFw16c47BkHo5vR0jzi0saJcjA85WCYIP7DqD1RDoanHAzyBx6/nhPlYHjKwej2YT8kn9ydrU1myvPTCDQQ42K2TJM6AvCg/Etm7RfjAyt04MYVspWQq6IKT9hGpjoy78ZqMDzrGmG9kEBv7BAhD4+RdpOco5GE6S8j1Mgt60Yjp0Aq+Xa3Pt70t6reiRsxPDdi9Neq3knheHhiwxCxAXnk+aGvqh7KcPfJ4AoYWp+j1adiJ8TmexV6iiuEvgy7Yhiy8bpdmo8L4612d6JLDE+XGOPNtGeM04fqmQ1DzIYHhtI4qfcOTzcYxPk/MZTGOH2mnhowxptnzzhxA4bnBgxxAx4YSuPEDRieGzBGe2EojRM3YHhuwBj9haE0Tiq3wyPnh5DzDwylcYLODw+dH8SuP7GLtPd/nl00PGJ+zPDCLhonxPzwiPkx4wu7aJyUcoeHuI+ZntlF2vmPsIuGh7QP4tMf2EXa+b/ILhoePT8IhU8wMTzO7dz9zwRVD8of862+fsLkD4/JHwTYPwbVEyZ/eEz+kKRuRkvt+IROEcCD8sccb5H5JJQ7PLZ9zPkWmU/Y9uGx7ZNA9afIPE/Y9umx7VPyqg+ReZ70VafHfE9hvnM5227OE+h7etD3DPklvM9wmKqmR0PPUF7C+zyhoadHQ89QX8L7PKGhp0dDz9Bewrv2/s+H9+kB1ZPo6KfwPk+A6ukB1ZPo6KfwPk+A6ukB1TPM5/Cunf9IeJ8epT0JuX4I79r5vxjepweEz6jV3wMwU7tLMxF4AlggbQpXCfmF/UdL/km8DVcW7JveF9HTA8xnfAF1zJPG6/RI7BnzS1yf8fTlewjxFIQ4PiBF5wlCPD2EeEpx9UFBaZ4UV6dH4M7YXhak8wTAnR6AO2NfNMMBoqQ/Br9qWtr0D0qPKD+haB1BOqSt1qebSxRL8qjtpUh5MGskwFYrNXojTXUUIk1aeDB1FoIQtOELc5bcaeOUPxkmOHhV9FjCgGEVtMBjY/JvtEDOo8hrirro2AEsZObhrOeQWIHkRWQua2mvs9oIdGSnIQ8/NF411DNkN5VQhdYJAYGhMWdTszao0M6TsxDfl1VTpOGT4siwO5SVp3zdCy8zsnMWKIeWdDy479HhjFpvlUeBhladfBiTFm/hC5vKRFsm4BZ4WoKteDIo3CdW0BECkrou0QTcUM+WgBvcN+Vphc5JlksRaqx8fxHFhMy96J6wkBvZ1gtftMAyvZbQvy70VcJjKuzZ4G8K3ZRwDzK8CgZsDmz/ocmHM3Rq+gX6m8nwCug22ptFFqj5E9i7Q49TSGiMgclSNQZVMv9SeDo0/QtUO+IaT02PnX0cPjD8i8JRgfY0eztgXtFqLlEYptvAk/Up7r9xYJG8wAeL5990UZSwXP+ia6R3dPWDvbFugx6/JT6pwYZhEIqork+i6wkAPFF1Ucs7Do9Ajlvq+q+xoE4Sxoc6SSgKyakKdXtzpaoSocbx5EwAD8PBWIyHMSmIpzsaOgf+LTtzON7Uuxpik4VvniL36dFPem/hMRMUrhshnFfnY6tHj8Y6OXSD5ZVFKp/Rg4z/KuoqMc9GvTO2/DgGK2a7yDaYcFV6QjSZpUdfoKTkCCZRGKNuBdr3kUMGVa2Ygm4QXznDAU+cOFZIqksp2huKiUMTx4kpy5CQ1KRkDz8mNg0jCUuNDm5owyU+Gx2Xl0MktX2OuN7E18fWZQ7D3m7MfGQ8caZVG0+c21jXa18ZPCP1bVX+2K/9+rrwyIoGF5ZZpcT1TAtfeBl026361qJs4XhdVbETkbKO6wx1CsIKh0q6pvF2WryejX0jeCnybeSyTZ6LvB3oN9oD6b1em3o/OJuc1/irhiePO+RWiWaWjSzEsqBbA+YgjPXPUpBrH4Qr43WRKab1flJMVzSM9JKLlNRkBEEIS4kucXT/SCGaUV1KdHijJ1gq6y5SKmNvTnuBKRfZe9JqsCw7QfWfEZBS5uyVZK+qORNzQlEiSX/nef3KJ6m/rbJ4xmzKsWe/5r1ZzCgxZVoF2q/7bHzxtjn25j5b22djfOcdQ5rLniQUWa8/KHuTsx2uXNMvb7jtk2nwTv46r1/79Vaygqp+3bfW98l6ua6RQ4coZ7NV5DX2fba+b63vs419a2OfbeyzjX22sc9GhEIBuyQzEpJAncc+29hnG/tBMtLob+c+29wPcu6zzf0gaWpoR2jX01FoBd9ac639et1bCdfZLDjo17TehaZj/rM1H/MPVqaTSmj7D/reHPtg+2wx7M19tpj2Zr4uJ+6zxX22uM8W+/51ny3us6V9trTPlvbZUt6bZW/Wvdn2Zt+b+2xpny3vs5npacfmPlveZ8v7bHmfLe+z5X22fL03xWT9WvbZyr63cmWHpeyzlSv0lbKfpIx0Kzf7Clyl7Hsr+2w7lJS6z1bTdbAdSkrd97ZDSdmhpOxQUnYoKXWfbYeS0vbZ2n6SO5SUdn1vhaFEN9/22XYsKW2frc3rkfR9tr6S1lR2LCk7lpS+703TEF9L32OSsUTjd8eSsmNJ2bGk7FhSdiwpO5YUTU487thPcux727Gk7FhShp3ttmzzpZL4IqljO002dnCRUeiBiLVA+YLjSCwJOdbQA2zQBr6d05dW4psGj/YuTKfquzR3JjkHuSIioDhyYuLUmY2Jc8nWQFFqEiw3mPoB5RlvAkPT8wUn2XNPSjrau0rQu/Ks6wFueVOEKKODZZyuh/whVniQrwl4W5EU8xrrtIus3zFuFTLP6JspvmjraC9B6KQIcqXbDICIvFwMIvguUvqafEpyTQGoIi4Ofy4RFsYHkehbX7Agw2mCw1iJ05QndiJ+R4RAim9DZ0hkokvqG/XDXG3hq5SG5pm0Cq4k8oCzvgzD4RogD2IISDXqckcWbIOxC0cSLM+EjMERlaR3DNPQbsIvC2WHWzH8ULflQ6QOGTNZ0EBRxzR2K8pdDNdYpQAbxhJBVOanVDYVgvEaqJqF2CfbTHtTyKvb0POExGmExLMQkfYKe1dZKGHQ5ryd08cWG1WFEnKk4lqYM6o0K5DUalojAJJpJsGXTI5xLktMoWmQIBNVZgUddZVgmkCYoCozSCHKjmlq6sxExNPkAm+BL7EmibJFXuUTgE20egMRTaMtESkwLXhGe7Xjo/UcFxAlmAlrFJSyrpIKhidnJcwAkZNHrlZHSWFZeddarVKSgdapqnt0QnEDO0ZJju0AKTelbtlGNlJElUBSu0TsoxU+cMGZt4O7zrpgUEL4jPmbZl1wdMpa0lgRBHzZlq+q1XU8zhjIRJRFImNTWofigCVtYX0ryE00GVNfgTdEiwtOg5gcNXHhKJW/cWt0q2SoHgL0hvCqEFBSZaSQm5ptYaQaCR6fXL/x3yY79UpBBqjNDFZBdAoz/U6ZEG1dnmofeCw9qAyDiofcrbvVPvApqLqR4zBQICFKcoGH6rz+bVthAPUuLfzADxz8t7hkxYEaqasfiPKeTBlqmBR7Wludr7RYWQJVCWJRAZGa18sg2hWbuxBRVx2hYMjLSZ6SO1rL8UNQ2ssDNH6cGB6gRS5c+GCiBFeOOFVWg/FhYDZHcV6dAkM+RV6CNvs6rq1IKQCQ+BnxCGsJMleyhhOnom+VEYqqIA3Z05TxA3+lTzmo+oWLBtuc9rBS5cO3zbhOVrloKCRqashos9iLSqoY2N+2ddzKRQNPXLlosM15baoEpc1rja66Hs1da8z718Jgwmmq7l+JfB38276eiDncZ/7tPlsK1/UmCyq3+O0bAmR2P4nAaS8xrFPxG9+cToPZkYVu8I55FyCOTRsMAuwuoRsWExUNu2IzVmwET2MWZ3hqKLEVPtqiSMyqGo8sZDd/IofAAOcWfzFXRYWaZpG4tmaRGKFMkRjBRZE41FXRxk8qQc9i8bda8yuo684ADKnKZHE6WQBGbq0ADPUeBeAr/jasdrv+bFWeGYn5iYBPxwElDY2ge8181ci9FYhhrqdAXFfWkbqFYSyGFIaxpFYYrpTf4KySV/DF81LIxYJGIRcSdfZJrYjbwcHnC2ogOfT1qKu9tGYRl+YqvBlocSjO4mSKs+2qReMpKc4iLknvhgwtTUlQ2+7TOhZBATwxkuIDSBZJW4oWSbFgET0GKHtFUqSCiqR4dYqf+EIUNfHXCpu1r7DZm0VNbsj+RbXcyAq8omYVS4VhJI0VLMtVc8UfKXiR4Kf4SBMLxUe8taiaO8avYiIK5AyEkdHeQh6GtYU8/oFeCg5gyzlqSSjk4VoY8xKK9RbyGEkVxngAhTEFqXxtFXtGFsTsL/v+92NvzmuT92Wb+1e+0xsld3p5iEmphydJR+3lGh6R2ZpYTZokFbxpko1aWRkWpZMkbRWq6TyxrcZ/0QENZn8GHBmT9EMyLhOflgw8HGjBPU1Ha5jybDWQPl1wuNJZtXrz9h0kIeD54a2BA5ZVJE3sVaSapC9zD7W+5Znqi76k9lJPb9mLlwWFTmJJRk2+WuJQb5Suv2HpHeK7kocRvjpZEaNoLXrauBSy8lr1IHOUMCVKwTnKn3xQoxIceONKIDhEfcJwc51L3IGrJAjrVz4YVEEbT5UWLWLkbvKVsS2fchKhuNRC1RefJk81SZtSt2HYGWzAz/sqxHeCU3tRntRe8UUyVWLMuAH5Xd3jLwo1XBenBCmfnmwlC5q3NsWHxuKoMf6nL0WJ1+WjFSKpIpFQKmM2u4eg8FVzdNeTxbmkKdYoA9FpBJZNOgZveko+MTM6JVpSx6pXMK2+rl9Z4syqIVWs7r8w6UpVRhU37+fpRVAmBU2exCS1Ny7DKkYhW3fFaYtzIjI4N8MSLvLCSZtiXJ1L9skeoCAoGoeN6/Bq8j0Yh5FvxsTYYJ4h4TWzxJOpmQlFDbNDw+ddqW+EPqlprNEDjIKPlKIKtqzvLIJgNdirbNiwauY3jfk3JSqr4eUmqYmwfR1E64mqxsPqjZnW9WulO9ZkfKVMaL+ZEU0vGzPlgvkgxKi91QoDORoNj48PU4DJbloMxeKYbwI1kbHaMUS8gFWqPR8ynAIZR30FDQV7Nuo0Qa4EaYRptZK5Xha4dCqQ8KY1v7VhFZJor00qhyqRpNX77qVbVIYSh/GvOvvSkSZL8qQLfQlP4QyiAVZryuqCZ5WKTDHVrnyVSsSK7UttJlCNioglVU3YqsX6xu48c5j2XUvJRAkx5kMiKUV97KxWqIAypr47nJbRHw5wnBxZUEDoqOaEdp8ofU1RBqYPGpraSzYcmQiSt12wD4lHBhIeOBEGmLvRbblaSQzXqlcKRV2Ff0AzrDRQxpKTbKvURQVbvkm0Few283qTSzNXlS29Sjywahy89S4b1hN8yGil6q1ecy5OJrO60S4FtZ+3hYWAva2e1mvBEdk0heDvNSuDuJRAQkrk4tobotueLr2Vut5RYbyWhyJXd3xH8+ZWN73i0ZRB7IM2qPbaqynr1fQfAdsYVl2Ot5+r5TIU/eIracVSGWTUunDooyjAodCjJ41ioZ70GMu+cZbFmA2yr8csLYE7hK20UhlmqJnTacK/LPwDiOTaoyTlbJJVg8/fHiXmGDWEabmo6QaHtbSHsU5mqzfm+fTaSVOOtg8CqdOkk1C+7UqAoJjM+Iw+ucZ6q3qygFdFuRECvdT1kdrARtdIDzRRZFDamUs7NdYVohDxJPQGYARXj5Q4rcqT0CLQzIZSUpEg3CJ64uMZjKD4begldyPsZu6OLHYK0QicuG0W5aBjCjGQGX24DkgLHVVXglulIBVuyaUXfJpy+n2QWNVepciVaHQQUbncGLlcHPJpQnmUL1SWDUxVNjVzPT7KBLI8XNJSa0R9WTqoWkniXtF9rfRfIhqVN02KLedjfALSRuXfDf4LCA4wByKkjccjob5Le8EcHHC4yeYOrtPyosAaQLUfIyXa7T6oZzPu+bkXvJo5vwl6anc1drw6kMnqGyQMt1+LUUBCaTGK1YkV7FEu49jBalNJOXmYfNL56kWwnCCqd/lDIpNhGei6bLTi9iuWmdY0qRBRLUIgpPwIZHLd27mwDc18OynKKOlLixYECZIwjSobpsss2gJrgl9YCVrYYGydTEg42hU22hU2EMwtAPdyAwl7vbBJ8a8HpQftrDb5JHHEMRdz6inWDhBHPBF5qzeRV2YfbGkZVdnhoiVaf1AzlV5FiWtpiaaRPex2KZPmTAFISEGC2SCY9LQQ0FtaIYC8cXYdudKJYo8n1fc53vs1kdWa1xPr0dq5iYqRXP8nAtQTV27fxjVwrnuzafP2dP0CNNc30UbtVhJnql6lmJkuujWa0Sg2bGLJWqfXEm1RWvfcNuKa27D8k9poXg9zhLwCx+VrzCw2LhH+xiGHqoVGMVx8bJ7LS9wVgdsmN8Rdm8bKuOauVtdCnSmCZqx4n/C9WtyUQfeDLqX2VstrJWK0pM+K1TBGsoHWVPplBr6eCGYNq1y0hSydca1nAFIoaVofVJWLGLspbmFoWg1jjFXDgF2z1prhahSyIG+lC8R1G+3xeiRx9qt2cW/zeX26SbW5J5lN7ZUkSrUpO5leiamWqwVvndf0TcY+z3ElPKhomsRjW2kOAF+qMgBiMSghR4EPJYpYefIeE6ciu8clJPR7N37Rlceb4Kd2qwmbTQ0GExmTh26dSKJ3Jd9SbSYtS+cSqxZ21OuqW1PKgyNC6My4yot8g4GaLVycIi8u2aTFo1QmUlyKLrNbGbrbaAosHGjeoDW1SultXrlOWRowqEP0FT0t14lLVjPYDKK1X7Vvs7G9FumQpWbZ6Ml6ZLgj9cOo5JIlg5MNdQt0rX2vc9Vkm1CyTYt2G6fUvVK/iao36iyNFRnV3Yxyr4boPTtLWj+ynaTHw3YSlqartApMZZLkDatklfGJ8JjKyY56I5WVBvuVj3pUdV+uX9v+te+DDVvf8gNi9+825PxCL78pu2ovbayqBZWx/EMb7mosHycpvNIB8uDoRB2HGe6ZuF/SlDcRV+3tFjd/P2tJ9KiQg3CexKdS7Rhom9F+P2eGMTSsCq8/R/URipLs68OWGhbklUSVQaot7dZIkR3R9dkJBAniGyGaUilwy4IP9FW46W/byzzOIk+pB5lH7dbTX+QKqA/IxSf3VYTGF68MGNl0o3EYmxBl6XsZ0ScU4XiryrCYHyQsQLRbU0ceExqFBW5X71P8IuPZB71C2815ZSxXqmzz90CphCQlZCLyeC/F7ocrYwE+MNEU2ack3k8i0EGSH1gzyvOBbbjBOm0sdmdSGk/CEqliD/Ecgu1T5f2WmyzM9AKY07zTieE43aTEMLhG+FAHGKA9jUgkDomTBEEhFNGJWBHxvaAC0jn6ylqm2Y0kKZugXk6OzretFXIh8oEliMyoyhIEbHoswV0FVyqh1XZ/hz7BLS/Ke9pJFhyfJJi/SAIOWLUPn9BB82Z6sc0psU2mpBBe91P3SW5zernNSe1MotqPTM2T3ub0eptTepsAaBw0O2c5USS9TOak5OUjiKyMNTpQt2VdQnrtnDLTT8G6ms+jXEbSKpjlBRxLK1ujvva04rPqntihxRiEqHaRWqUEdGZ2aZo+hOCTaiaF5YoyWtTRBQiLHJjZitSaNYGQl5nBXDWyzCakZs0i4kdXkdryvBZtekSdoWlOzJSmWysLzFiJhsn3foDXEp3UBX0EdpW5UiRbigWi3w3YJeE8vAIie/i88DeYwLgAXZZRffX/MJvICidMYbWAIFc2g2oalwiIP2xD44zCA6RmyCygXg0HSC4e86UbGgtNEmVaaEdHQfNivghuq+FPGKz5VHXLtFACtYZ/FOIKuVRj9pWYQVn21euFs1oF8rwa/qvdn+Lq7adlOsO+V7e/EkkGJVh2enEeQ4rP9BHMGyRO9eehvUxwSAXllX+G3pWwUeCFqWcPuLt69oBjGLBtWKOecCkeF8BlIaLgKqNsD89ZTBdUr5T31bRaemCTGLOqLrU+rOymgARhGE9KOA721mWeIW27GRclSotKdf8xUNRoRwvfckS+efXckRe2nu0xrcRxLQnCt6y0EaPO+vAstwibRLVOtfQreTGt21gwbFJtC4RUCWNmXonLNjhR60ITIWlPqw2veg7b8I0rdgEjtClwS1qNeP2tlgLq0oq50BcsyH5VhfiCBdmvyx3JYEG8Rr36ylUWQTo6W4rXZin2wFNVTq5Ne+C3mODTxhrewEJVSSXjD5YYrMLY9z3LHw5XhbR6ZlRc8iMXmWrmR3PhKFeRAM4cpvQfL33/WNccTnFHNmjgxMF3Wr8JdRetdPlPi6xhx9SblHci8Qz0t/J37hWNZ41vgIYfQWMpgaJIaMWAZgBlk/njQoR0Jk4vMIaxEsDsy/I2TcudrwoAEjWt+5PNEL0s5ALmCUEX5oIuqH1ua+Mw21obsxyup5JjXev/Em5ZhBdFntVyz34GL9SrvrwKRjHa+iUICQVt/M4omA2xQQw8IhGTemwNCv7lnZ41AhPnZP6vgVq+nagLwA64XE6VYPRc7jfhc8uq3LKe7Yptd1yFh7TW3kyX0QJm7sLp/6piyHs4FkOPY0bZVQwJ/lL99qpnDA6FXq43ldcELaF8G6noHxMdwJJyqjVp83aPPsGs5a2fXFcJtcxV2eimt0lSM1fcrDCvsrK8hKzCQTsejOlltVlsisZg5CCGdSMXUHGusndJq+Bh8oNRVjgCQJdVyEBbj9VollYEnhuMC4IdFJtKW1hoOKAirX0ztpdn4fQYf+jVSDYIbYfKjhbvaN3LVAp1uWY1hbHmvdasojG2vVS2/jO6y3KNYp9Z7cuxi5FZDPtxIRPViUVFQ31n/rNcr2eTyWgQBzWozpHWJEZd3CFY+5q7kjqHakwTj2I1D1bd1QYXyEK1pVWlmHn1PyM7j5nJJ9fSVdZWmGOU9IabQIYXAJ+1vnWuuVfFEfNpxWg2XsKST+71B7iwUA5MaXpMfyAYkmxd1WXLa0CN+gNY2DAFvhyCM9Swiv0XpvADToiGUbUvdv6iEzRiQMa8cAoaMJh/NmJBAwalsj+xCzotR0cixWGVqoku4uhgy1svv6xGt3QPrdGde/6FItg4aGT88gKw1PhFJaSrlf6fASggvE69/Gz9BfX8+k2JxCu3T8qwP7bEuZevOF92rwbvyztNX+7vaS5iTl0YhXq9qB5WQKXuuNr3pVpA7ay/cMUDoRa1xOP6ZNF9V8Nr1tUSlyebuDQtr5Y4cix1xPnWtBojDkmPH3gha47zdJHldj5JPX7gkVajPLTVKI+k67JiMriit6721LugLrG1z3u9P3S/fq79tT/J3VIWt/YNxv+fGK2YrH8O1Uz2J8cfa1+1J9kTW4vfjdCa0Vamfy5+I8lhe8nLd4T0Xe+o5Z8V78/qti0cl3UiWZImD4tQLssAwM5kK9KwZOpFoq9srw5+jT8LYOtF5nn1IlFr/F0A6yWMeqsWeluASeX8p2ZkXT0CIhij2bSy9LCmzS4LOuFE9dRbXL3IsRoC/OAtO0vruS/8QrnSQ3jb2zPmwi+ZxrAakOD1WgNyWm29SKbFGpCYuqwBeRUM2Gi2J4NutDUdyaVVu2i2q+nIdFlNR202bd6eoq8jmN3AU9PR7AZ8Ny2wB7C7afI/TWVhg+dY2OCafvpq/+luGocR0RynbppCT85rFM49yP473TRvaDBpT/DYYGzL3jHHP8q4KAMYvEDss2DhzpYStS8/qhUzgde3lUSfdvvUveW6B+PBFhWr7sQODoNbj/laS8yx1hKxXjjon6WEAhqXErc1pHdimLJaeOoktrjRVGvpuADhtPZl4t0B1zFDymrg5LgCzpimTI7kXU3DXvq6GSL/dTOAF/FmUMW9rR68qP40Uf2npmFLFhB6tkoYS+GsjQEUmWxprgJYWuDNYMMd04DYCcFiNWo+Yy50omn8rNeOVEZJEF2HzTQhreIWqS7ZUhmVudhIUxuRE5vaftnyJky9Ah0jIZRkUl8ZFPIMpdxcuUkjo2WrVmEEqp+IRYVxTPqw5BvNnTL1QVsqFbtVQ7F8U82JSVWNdouqL42ysnD8v/qK/UIRImIZQ45uELHZ/djsDk0UKxrhQKwPyRbQUmuUJ61ChE1LqbipWhB5laoFzbiS7DZXVQhLHSvfzH6xugS6jnn/Kmfpsso39qvWSGmVb+xgw/w4rHxDzJ3KN7YpVsd9rPqVbrOVbj2vdFt2CZo4Fq0aEKMtU9wrZxPCnzU5oQ37b/a2cjajFcwFYCIMejBalGHBiVzSZlnXb2rHCQWceEN5JeLrmCTZtzvqAtLh7VMSSGnab+rFZQwOdHtIfqlMs4SEssT5IZXVT0sEmfPtz48IAX2pk8vwRfOz3HUhTCVe2vgIiDJWV4GlGMG9clpwLyCdB/8uWhFsObpDJCFzNYPJ0Dr16CUIWQNwO70p0BbVs4Jl1BAaa0y2i8TooCRVNAtePktM9gZFpPSCwbXY3xZskXBAERyI4ECIsM0W9mbcm2lvZm3e3oFfRdIWIqGFfawrtVN3yltJzCb2Rzs7lWh3NXqeUKuosJsDk6pU4g1zaNGhnX1RcFboMk3Tt27i8igDZAPOCV6OFo2aiGE3EQFTpP6U2TYVohNRKbF+IupaNoP2JgElCcxzScB/dbtzvyRoLwLz2vmfbScCWHtoJ3r7i9nGazuxnURKvWHFbPO1ndgOirzTW0pMGjY8thP7SZHXezzM/qpJ0eOC32OZX8SOt3jZF9oHH54W8Ui3gxhcS5OiSe6NRKyF9gG82WhF6WJXIGQyHMRy0dqK9RshbqslVwoLzgO1B2NXzKVAkQ0zbm01CxfFqhWop0uLAmu/3oJdskjooOxIjILyFIzKZWlR0C59UeKukhYb71Kd6JszgVKHRCeoWpBoagQemIlO0A1XohO2mfZmXpsC6Uj3QMDWeFtpeLeN2V+lKHr627H827H827H8t+5YevOc2V/lDXr+t+lYesef2V8p2L38m3UsvVvR7PW1Y9nrv2DH0tslzd5eO5ba/X9Xx9KbJE1aHj12LHv/27H827H873QsvZXW7OOtY9nH347lv0/H0nugTTqPPXYs+/wvdyz/T/Up8c2qXuY6lok1pnPH8qFN+V/pTYoDWuZ/tU3pLd2mLN0e25Qj/G1T/v9pU3r/u0kzu6c25Yh/25SnNqV3AJwjvbYpR/r3b1N6R8NJe8LHNuXI/0ZtSu/EOGmr+NimHOVfpU3p7R/nqK9tylH/tin/tin/d9qU3mZ0jvbaphweR/b/QpvS+6jO0V/blNr9t035P9mm9D60k6ayz23KkxHt9Ea0k5awCXHg2KYc1hSjH0oy/uJcVGnqs7O1KFl2thZNg73SkLpIocfk2LViqiRAJpRoO3ozt2v0yft88WPWzv90Q7EdG4re03bK0/axoXgytZ3e1Haaqe1TQ3GevPG8Ae2UAe1TQ3GevPG8K+ykF+tjQ1GmsH8biv+aDUXvozvpivvYUJz1b0Pxb0Pxb0Px37qh6I2xJ12uHxuKs/3bNBS9nfekNfdjQ3H2f7OGoncin3O8NhTn+BdsKHor9Dnna0NRu//vaig6q/YU6Lv+0FC0vVI5s1kaatRcjFBThuWOPq26F63KAQMntXdStfYOBCC5Cz4bkhXvS1RXPRMTTLLWT0ur99NXiWOkla6Vtc4KfS55XUgUqQvUl0pWXDlaWpMhNMqtB1RWjoZKjDV80lIKxXdvtkOtLFHddonqwmakKuakJaobr2Yh9fJMVncXvandpO8aDyPGPFYWZwq7eAxS2B2YoExhd5d28cSWwu4q2UnrdrWD4lUKj/PqB7HvKoldLeN409mNDHvVf4yM+NwBtL2qhC0VJhSRJMFeh/p8ow4NhIkRITfxpfAY8ir3opRmwruXyisUmvSO09WmANjUhHehI82cPNdVIJZrGAvsdWXi0942KhX6pNAZ1NvGNUp1N6zXjmRe0RIySpLdRTHSXmzdb7OO622OmtbbRENPr62O1eVrtV4CvLksAV64lC4B3nj18ziXF/WAY7m0eOPW4qXCtDIXfvHUTw9eSsfezh8vMz139Gzv347ef72jZ4/ujyf9Joxqu/929P6bHT17fn8872cVVNv5t6M3bk+x+Kf4pnZqu/+tO3p2j388kxdlU9v779HRs5v5495fJExt779AR8+u5I8Lf1Mrtd1/O3p/O3r/eEfPxt4fY3W+dPRs9/9bHT276d+HFMNLR2/t/tvR+5/r6Nkz/eMdxJeOnu2+HcQvQSJVseD8fujo2W75crePIsaQC24zF1yklqpNkgyIP6VyMRf9cJWi6V83X9xkeNRIa5ZluUhTVIxtmq3LghEFbPNQ5sDBmT5V1quXZ0E0v9xczC93fLouock3N+WP/MFDUUMCMVr+uaN86AgYCx2FAlNNuTVy4Si7VSbZPEKV31CgmLJKI4UOjom/teXgmJZhDTwQVQaPqICxtB5jt5mEg4b3g1QqcmUOYzYZN8KsMtLOHNUUtTMIXGb8JLCZnuMRdWTOj4E5dDFbVGlsN0bUy9KcLvCRuva6j06x2UD9ToG/cfWJTw6ZS+o6Gxpxg/8CDg9z7R1rpk7sUcS6fCLRSrC6j7VMInTiGdoz8g+NHHxMqdtd4EkHavFa3SQlmy41cWa77yyb+LAMe3lkPRU6Kxde3Wq5YHUVNDLgU8Z/EDHTagtrLw3QRluuQCyxzcPwyEjrQWlGjkgr+dIwPOR2GODjXKfdRuElwyJMbR3822qPAGlksr2asPDCq24cuGweD0Ok8qUhjlc7XqTrSCA9F64jOm9lbwYDtI5gL8j8hPu0hhGA9XWq6/RpfBgYU2YnjIw2dnuiaGbo1mT/iHHb5KRL2DU/WOgg2yNYSup4d2osBair80LRQpcDMb5+8x3Oydwy8YY6vxI8DLllor7X9ZgjsutgR+ka37A605dTZHoWWGfqHNWICb0Fe+C9h7VXowUWTmO9om5jtH36TOtfcLRSx5bjJti0gC3Ln1IcVn6MzRplBJ7n9T0opUKNcdQVJ0ZfIx0lFP02mTWi4THr9ZuiVbduGyzc5iz2WtR3a81qXnhrUWmbbogzVKBCdgx8gPD1iEFviTXQrsi6vECLuaMEUSCier74R1EvnmukXO25m3EoVucx6pq5iGzdhkuMjAq0HVSzD7uHdfDiUBzHgWxIdnUE9KBjCtnGRExyC2bxkdNKRKcp5WBl35g4keCKo8IdvpKYZPIdmC2s4RfTuJ5AUvTnP+NIQFiIOchWnJsMBOQH6BQyPVrTScwKcuhLo3wS6BASFV3ElOcXxd+6DftYOKXxJqEljqcAv16OyoGZovY14GMdaW/yUHjI1cYtgAWlrwfS+BZ4k621dV1t368+OG52njihANB5O3zR3Z4YZhe5ofNv23UNna8PHwd9BXlnQ93rZKrwaMBiJdBXVItDsy0enZxq+UCn/do/KYw1qlNQPxtzSmSzNcmibq7NFIIdbK2Wmzkb6oNPiU8cl5OSurFYMqSYrn9WVmhLqYy9yaUccr2kjAJr2rSvTHMXGTuZ71KbikjFXMQUgVPewm+arnjifD3HlFtdp8h8VTpC3weTVTMPxgelvx37bzXyeA1zH5dRAd9kygzv/IMSkvkdp8IRneWsqc69dO41oJMmQT49zYI6gGYDmo7nfdh6PdMi33Z6/LQ1eM3uV6Wwui689H3Yfj3HogfNroIGVrg669dSLmjR1tdYqJY+GZ8q0CGSvgnrULpC1uLb2JuattnkC3sz7s20N/PeLBYXEpbyELVATqXb0R8wJLMIrdiqX/fZxj7b2GeTbz2PO/Le5FTMRQMzGfvbfTYlqtrcZxv7bBwhOtiM1yPhYNFF7hFdNa/on+2zzX02DSwdbJ9tXmdr4RqPyifs17Q3894se7PuzbY3r7O1MPav8zpFvJ5ki/tscZ+NeSVKBKnF6721uM+mHE+/9v3rPlvcZ0v73tI+W9pnS/veUtl/W9crbGmfLe2zpX22tJ9k3veW99lyuo5rPSps7QeZ963ltv90nyzvk+V9snINklauQdLKvrWyb63sWyv7bGXfWtlnK2tlk1rZD7Lus9V9a3Wfre6z1X22us9W99nqPlvd91b3vbX9INs+W9sPsuW9uZ9k22dr+0m2fba2z7ZDSduhpPX9JPsVmwVp0qX3fW+KjPp1fwB9fwA7lLQdStoOJW2Hkjb2kxz7SY59bzuUtB1K2g4lbYeSNq5A3mbYm/ts057kraDgO20xP8Jvbafq8ssZvIxlSgPwGkm0BIjJlAYTFcC5hQ64MnHJSKyQJxY5XSMTKd+pJm39Fvr1ZcBJWr71E6LvVEVJaM34UAAppyqKb9REMvUL7KYa8Az+IHcNqN8f10GIvEIZr7dvSrcruTuU/P64DkIsPSLT+XbuFiW/P66DECeE2HI+yB0r/vvjOgjrqIg054PcFZJ+f7SDpKArSeeDpLtE0u+P6yDEZ0eg0Tu69f4gp0JZ8oWylHQ7Dw823fHZvz+ug8j7p7dz2TTdAdq/P66DlBekuO2+HcSP2CRtiRA/dXzH7RinAZv8gJVlPcLesQCZTgM2+QEr03aE0fNzPQ3Y5Ads0oCl0+rpSk4DNvkBS9dkrinOL+c0YJMfsHQM5mqkEZviDpJPAzb7ASsf4Rk+hS67/hin8Zr9eM0q7IaHwm4+jdfsxyvdTVG7/fbh2435NFizH6x08OQEf76M02DNfrDS3pLJxfkgp9Ga/WjNGq3t6YGcRmv2ozVrtJ4JMLb7dhA/WrNGa3y6ndNozX60ZoVX1NFOs0U+jdbsR6tM9ADQPB6knEZr8aNVlnTI2I+3U07DtfjhKus31jn7t1cPGSmn4Vr8cJW1Wpvt4XZOI7b4EVs0YlFuPB7kNGKLH7G0H2Ml4hhLDpZlvz+ug7QXrz/bzWQKQFTrRC6vv5SGpVXsqQuW3bKlVfCPkzfeBBiQaRX82plWgaeVlFa1LztTMsdj5185Fi2r5ZM3PeLcLuyPG+kvtn9rN2FIsxqSZfVWB+qfIGdFoMtQVsQZ7dbyApxDnkSuf+zn8c6wyNedwTZarn84Np3FqF5imSM6e3aLbC3qvooQRfD/k8My/f+i94i3q//jbvV50x3tNIAWyvrqnAF9ogpuHIbnlTUgQGHdMMxzmDVrU/+KQMYoNCwbSQaR6lcjnC1S2EBaQ7kuoGYnuEKo8oWRQvJt4iy1fJCURwI6ZR8PDCZKKVGu59RkwdppEFCL46OALRd1PGlduCE0E13fiHGB/ylfgHp2rOuitTtVtsWLNIpgkut1ESA3W+VQWi7WcAXwyDCatCLPbYEek8hfYKokwStwoQbSQmEtoVmZ9UjQkABwH9BWtcK1KUPaG7Sw+EBMi6kE6Mn5dZ8CcfGBWMZTuPbjF1LFaQzC6qghPjNfYha4D8V6kCAwKBpA+Ykl/BE4lPtSbEU3LmIJbX8LAEr5oqTH2Ju/aE5YtRUY2oTSvP0BYKK2iUd9beIbGqjM4qlXjhqmuPwDf+fVzx41vqwXq+GZhRITMDNb07dPKVsZ8YQYftypsDiNjqAC5U02FxMpdxq7ULFC+wmWmMv1FGNo8reqpu+6cQuKBREkk9wqcir6gwSC8b3xGdzu1k9zZkKVPnmCyeVvlxIdyTDsaG9kkrYA8qjfVAwGQqtobFZJCOGi2jeGWyCufoKUPxQqmvlbg09O61qd/3/sfemS5EyO3AuVpTEQJ9//xWTujiCzQbBGo935JNP2nzZ2MotJBuNAAH7s8noXLEOF7I2FpqzRhyhK3iDyy5OwiGXe0PUPPgwz0LSKpxwVaxmTkJWFKZqT9WjqrMZ5zYxwOz6nwV/7w5eqp0d+x98DzHVtsmOf/bHV73FlpwGQ4W2mizJPN5JXqkNUAASYdFJBGWOKsrNpIoZ68zUC6ZMO5oyoTeTLAeny6eVkVa99Ts5zlayp0+s5Pg5RmGnUDUMZZg+t3dkeTxbDDbrbANrSgHd5PFgXJQZzxqbqYiWdAiYRfk1g3elvsnpN31gfdjG4Pvztlssi+Szy4TYW9/B2jdC7Idvd3n/mMUiemSyitg8S60toGAquAdrE0/7KTYdUnz68CcwRXFry6/XKE9x3jyEUHWgMd5HPqxsuuua2QK8bJ4uUENbVRrKbmmjQv5ovvxdHzzerP9QH+0xgYrXOHT4Pi63mXZvgQUyo+ioLnP5d6ZDhUpyd9an78wK2wKpX/RwixFWOCOfKS6ebxaf96eBwRNmHltZAdwx+xsN5qNs9u1WM2/q7Nref/BNuSpQA8eZj+dxsYs3gB1mPoQR5935GTJdMtKeg8XgC1w1w+2YhUE96ZaPezpZw/hjea/+MZzeIIRktXd4zQD3bcfW40PffJL/99OMicaEfx69JhpHtuEZcM2ns8Z5kGNmOa8SliI4LZm9DY2Q7rhEXFLk0GNAX6UWyHdeI87JsCux42eeMbMc14hQoGX7EKHnDZjuuEacLyfBbedmojCxHMOKooeC8oTCbXyTLEYzYYyk4/74fTkTqvz/cFzl/3YUmIvXfH/pF5vFbyMKzXCJPQAk4X6pSTbD5uamAqFxosVzgU045zq+fdiwud4VoKv2tKJPYj2L3gdQ/4BP476ewaA9KI8iF8d5nHCgUWH+Nd3hWghVde6j+KbP4Qr+O5k9BvGnnXM6nqSyq42naZx3dl0XsufA0Vc/VOQeX5XEm4Ed8hkbfBQPbtH8OPU7Xp4/HiUN22q8BjNTjfwlgOA9zC/DPhjKPB4vTCKWfX+MXnvUA1DGVThgnMVNJD1GX1o5FjyuCATWWLwiQBI9bYGShqLQIim+SSmUsAzpBq7ZFbLr4EJXouErisOIbAAQVAuAOJuP2RcONnT+gczm1V0WKnmUQ/QWw8RXlMufgIc969oE4WVIlugB1ms4uM5ssZ5wsqdJ8aiU7SszszmyunHGupAoy6iGtfex8jC2eJfC8eijQi/CC42Nr0Y2k850UoDq6ZHcLh0VjbqNgV8M0AYGajk9jn0JIVZb+6HGjcT6eimLe0q08TV4w4g8R3OpPE7XJeZfgOpg4THgUxYLMI3Bu69PzUFDOqHzYhu2jGHkk9okpM37ANjPqFTfuwg+wP8vpnyn2Q8WViiWfE2WRc/nfioWJfeelPAMcnaFr4S8L+LnXobGzmtB9leTZQtj1/kK/D4ffSSk2aRYDhLNxD/bcfcy4Vk0vF/60gVk7tm+2VM24VEm+lpLSH3sUcHQWsZ7x1eN2e/UNaHGZaiMKS3Ew9ijiNmHh4XU/B5/v/BmfkwolFJca9qDpzrgCUq+U6tWkT4Z7W1nItuJKtJTmqC9BgU5TbIhQv1q5WZo/gHr2T+NKeTAExkSE9W8w14Ou8jmo01zx6Yoq0n7tP+7FdC8vySadvu7ANBVCu+RkR4J+w3UvnVliwuTRoEOaHshGjc9xPNp2xZl/CS7wVmrW6e5aIMpxG2f75sz6vUPQcgy+zd0DCvTIx6d2p/YrX1IKwQFWHvmSFSfbpckWIOn6Md8xfd1dNtmuONmu/lsAtbLJdsXJlpJ6pbxl0NfexwKmLp1v0xTWzcmeEuFgnNI9riHrfS4XGvE88FGIjjdqGLgKBppWQwiUO6WlavsZamjEOG0XCEohWqNxtml2f1rvT5WeRJfFdppg5wIWRlpMWHE6X5rO28uWQ2KCrVE4rn/3WWT/qF/S2BUA7+pchNBAE/vODxTpCli87NKPW4kT39K28q0uydMq0IiK7dPWJrvXH23QUbfGWsFNOXH+6siKftF+ABY2b0kIn2AGe9xdnFKlxgdWRhotSssvaSiCAkLzlANwfp9z2j3kO6tBj9TbilOoi/L1l+IrTxvz8DBCmJ68V1IBYnLM/CKfVJ3TK3/jvnUryI6c4kJvpRGyRSS7NjapGXNGY+dHrQVKSsZ4vLNohqJQZ6oGEHA8vTGjMkQGW/YzlyReQErf2S4WwyjpVQ6OuVkImefgQJ6HzF9+tTBjSYongfTXd+f93XV/gXEk4fX0cDvsER6ecZ2hriBAomlkp7MbdsU2HGS+ngxjAOs+ufUSVdUofkb6/EeWcu0z2JUhKuIR27ArTEN9cR96HPe44bgYSfew5M53flpZpvO8gzHRvtoSXRAMocnZbkIrhBJi4vgayZlFwj1reQVxte94jZ0AkValXhrFnJTURHqJ+gsItDrd7xAaDW0YEP5TRwF/ezLoJ5viUB9htDrGFWSNeQVZY0d0pfDP9AVxxzEtzjuMUz62P+aiMy6k569bqET68fvDfQ0td/NtlPI0Hr05ux7CMXKTGPOHdH8ILip/eqB+N7vLAiLkN5G1Gl8GWJlUJmg7UMbusjnaepGoieht/YgciZd3sLW4sFOMikxsBQN+SBEqNiwLUH44dfh4/rhSUyqtgAiQP3+2VJ9xqabqWLHVfzqYLnFjdGY5pDMucpTuwlzQxqfZ4xpZCumMqxOVswq29p2c7niRLC4/4yJCaapCecy0SbIUUpSzKlQxKsbOgrrunxcpRxJBl6h8VA6FyJigJgp48SJJ0rNExZ1CYZiCzED2OOVIkp4liskUicnYC2TUT3PD34rArY3OOOjgrNNxPe8svVD/5bNQa8AKMj+kj0JzBpH041ZqvJX2S2yps5jSO/05mWAD3QPFmg82ntX8hooBSERFkMJi/6cufjq0vXjcSIs3oqFz5v2kHMnQKVHboxwaOmeeCC5HMnRKFMkoh8eHI43ZdZoIj8ENIREgmPjZTJh/IO7ZsdiS9AnHVLVUZ7LPmwdbbTbPwAr6uKkZb0pj8cwjxXIkY7FEZYIiZYKXfXY5kqFYInG/kEV+UhzuoRDsZ+M1IvG8iHiOKDCJK0vGOy+Rd16Kw2nT9HYp2TiMUPMiqHk9XgZzSda8EvHfhVjugtxSfpFLq2jL3jKdTCTO3pEirGVAcuwgFAGUqbBN3SR9Rlg/JWOwHnKNxGikyAOOKjM56FTil51AGHAvhhilMzuAqMPNsSju4nJmJpZlkfothUhIAS6ForuDCTUKh3TGbzJpIrWTYsMibJ631OXZruuefX9aWYSc2OGTxv3p7TFFRWx8Ic691Bdoi0539+UyCo0gN8otK1K3zMzNP2Fh0JBz4A/Gb9npd21NwUF2QaLz3O0ymThaUpvzdjFntJ6Hb4bZLubk1tNcwZDtgv2amsVUIyiSPAMblNXo1U6RSOtuq8ltMqml0tbhp6c+fTRbnAuJ7C/1pRSl09qWlHO3ydjVWEbFi4K+DsKQPNkodRf7ieDzpDN1kJX43s5vsYGlbdeIhKFWp1SlIIOkHQtVvfOm/lftaxTXAnWlVG6S1ZbaEeuweg6+VIrCrDPmCUpkQhSyGgoUUvMGnEkDPttN4wu/zPw+BVezBvyXzabO9tJs9epV/w0t+GwrHI67Med9uHT4aMy4fpHdUepLDl2nAdjTGmlUBqZaosT8MUKakEGOVeu0m+OjN5HYi0zJOXZMqdnnS45LIgkjBUnSDPiv05VQNBJ4aV8uXQtFQnfa+MrJ+O21Vvc9iQlutlOJFTVKfOFxe3G1JRWl1Bc2jk4rv0pZjq8G3M3GJfJzHuuPBvz3Wi0SYooIMShU5LdV/mg1KRGX/1irRapNMSWgLc8Jl4xqUyLVppiCA3sJSJ2JQ3BpvWWcVA1FSoSaQAhyUBJx7crzMhf4kmMqriJUqalrNBw4XPHp1mjqXDnw/9G03g8vr0Il51JrohQ9xS8LbAqMgpTloOYTD6tJSZpte16HVOjSF5SX0qHdXxD8loft/rTfh0N/9mjYGDCJfoSnyxs2yYmXSD8qpqDgBdpeMv5RifyjQi4RFDba/LQzjv2MflQi/aiQSnSiAPmkQekkGxGvj5hXwomZcaA2NKuR2EhApFTFD2DrtbfD+60QRn7cRZxeyUWCakkalfMsJy/A1CTIDVGHwSQI7gEdRtlZKEEreXuWutO0wPNxc/e4kTifks80FlIXfcStU8aAKpEBVchmeqsL66yys/VneOA7XbAL4D9CBCVYvFAvdp9MJcdII/I4EPUJpLokwUSUhjACWKWk5Vf6Rioi7c57oh4yMaa6GnO8OKJ0L6UuXUmVgplaQdfWUcWCzxK0bpNFaOT0bYurLYmGECNiU/ohukAlPQE7wFJZLfHzXYexWSMnrFTN2e1lUsxIYSWSwkpV+qOkNNWSccJK5ISVqom15dJvJaOFlUgLK1WTSHsZ/xktrERaWKmaRF7KLyWjhZVICyukeKFanCTaSkYKK5EUVqoiTeCHss1sRgorkRRWqiKs/rIP1WlOKDQ94SQwKJ3MiYFRpnnU1RhI4D2r6AWQj4pe6IU0//gc0S/Bf+OPe1J0hSJPMjtmFLMSKWalKQTq+QybMcxKZJiVpr7/QiIsGcOsRIZZaYoq+kvQ02yXRpDLJmaKHBaBJ+iiPVyMWmCjddldLETUROLSJEd1VAzsO9NNWIWhuEbnX6K/mNqH0dKk0CpwVEB91M8EEpKoj3Nv7I2C7sWYuKrUpyf4imlv6Bx6rruKIf+M6CNXrjQN4/6SxdHpuauOjFRQGVHHA0AHBQ4h9wark5MiSZ3JRrB26jjuw3IfWh4FRh5eaZoiUFNKb7D90zcYpx/y9RD1ZjltniSwDzy0MjZ2cTK1CBwhTSjQcbiGI5Ik2N9+tJe7wWoAkjH2gIp6qdwQTOp5ji4cJA5HCokskVRYmvIKY6bY4eKcQ1e5rKqKL3bvRgMIFapRBYSA62C2pXPmOelbNH3mkRSpCF+VURKCWrCFOnweHvcZJ9WmSXW8TO48zXUW2IUNedD4ZWX6wjwwgsBt1GOjEVyN/vRsHZR2bkTEjYNQCRSXwxiun2NQ/dlIBSrGBA/IiAViTo5uqKzd+ad2f1qv32bw6J8S1D4eE3GkFBaSziAD1cFBeEyia6cyiifMkH/8lr+W6uwtf81oCnQPBi3IVDaPeYqnLU4ASRjoYEt3K1x7WgLYc8+hUYRdGQoUuj1DgRnOMxScRpVDq8q3uQa259D4oXEHw2K3khmLSmys4mUtFJeqpqVqvuxKMhZeiSy8IpodZlPKn4dr9Gytiny2QsrXG5Ct9Gypiiyx0rVUzZe5uWdxWuR6FdKfkC5o4xMZDzrJVBumIOIMNjXoInbRKAd7EnaBSagHQvFF1x6UBAvky/f2fh06fNxYnNjFswL6LgtCeVYcJa/XU7wYA0Z1MiGRSAzFbzr6DczT69Dy3U6kTZWuAHLl9W6dFl54i9WUbT0wpn2p6Atg0K4ZhZiCKlHsDRxF0CCg/Nl+GiHWNIQjWgDl6sEj8KIAFhcBanG7T1QBDXpOkh4P+dEg8Sd2HDTa68JLI4Kp0tXFD8d9OO/DdR+e16F4Nw/gU4m0qkKmENSK0vmoj22yWS/wL+3diGdC3qgIz4QZtJ5cI6s0HPtHR8MtQAserSccuBLJSkVkJQj6ZTBNnUY1Rr9bQCPiSvTDv5mfg4qR/bIktS41IRzV63boS+bn+304dPi4yTiRi4hU30rHGRGpRCJSIakIMuf57HAJlEN6SuEQTdrowHXaD0oxvqj3zQHv3RfwQUIwnZ6QZayyclAISo63sozFHhWMSHUqQ5H/mSPVdfrP8g6I8J6J/wL5a0RRBtk5/JV1os4A5fQUt4ub15lm4P+oB/2rbPt/Z2nI7spPFcIstltkd5Wh3c75EvjyNJfIcnnUQBHri7RSNje2yt5ngzuhAogdYSWbE1Ook1VaZ4CGI0KQET60yd0kjlQl+KEjiKxiDlY+Rpm7b0hDFTObvgCJ1Iql/fG4cbEb9mtAKpraDkitHR593hHp3Y0bSxsn7OuyOPSrF1u9rImR0cNweNxoXFDJW6N/UrZuDa2o8v6iFqn7pcImlSJ8sNtq9G7o2zn38BcIIxwXWoDsCMfE+KFPbJdtW6FQqvuw6QkootC3D1stLh0+LxGIc5ee2WEpht98FdJ1zRGT9UeetD54Dnr0NiogwH8CzaqLOIgSbC0+CSGBtMOAHYWb9bafccpTFz6P3X+LGAuiLidLkXAYEWcGGwMyGXS2n/toFP+JKZIWP5veOAxGccfSm2AFRHISRc1zOr6vVH4BrV9AENKFSsVcoE/bcbg6CuV8sczjiDEINi1NmUb8FQPUJ+O0RE5jIT+xgLqbT34XrOBwoxOjcjbvQyjX2oFpVBWc5UhQ7tkTuOkXQeXYbLXjUDTvDsEyiVhel6QYqwz+MNnbBTjgIg350eoJj586x2bAsFX6j6wiyrZQggiEEXFXNZmY0NXi/cKARXeN7PPaZwWWReJpMSfCarTqqHg8xpG6kdLoaEXDtsaqCL/bWELHBQqpXcy5FBVaqBtNpJVfodj9hapPH+8rhoKkghbEd/n76v9qiyWHIWWgqcPytcWC0shKN1btVH54/V/bYtEcGqY6jyaKQR+JrggU2/wUizubcTkvrakefWIzbV5gN/aAIYN3vvbiu09sk79sY21bvFbb9Hk3BBgOGLW1MR/wnWH5juyQsTaKevIiRgs74q3b6QJAnIUOQnFLdxA29j5X8wASTsBGvZI6320Sg07ydgvq+3m3mTvGOc27y6XVxDQFe0k7Z86+YElikY7YndWpbkL3cUUv57qiF0HF2WP4GOoxRDWrxzRqwrDHVJpYuNrm7jBNgKDuHwruw84nuE95+HOVSFwuQ4nq8rIRH9vqCcOGOrcntjCSp3LrD2Cp21Y/4mJBhqAcX9ptYqoKEP89hluKCuA96TnoIjGm+ZWyNH+S+RYFrdzQU3YWuBvzkfZtXmrncI+XKruks+61ErBlURaYcKfrC3DYTU42g0GV/pY+9zQtbfLCAZqVSzQ8R7la0cenqaqMBNIwNwltYz9QE/ode+EhtgAwscc+K0g89lVz/4XblmJzQ3dXfkYPQyCWwH3R9ZbmfBqtLu+FJFG53E7hIj5YYHOfVk64nPFpkiUShw6LvvDoMnE/M34tM2Qs9RJZ6mX+WmaYWeomssUL+daFxN2s64pMvoTHKE6YQRgB6fLBlB4prkruQctjffrj6SOpu5AMDRBjxtgoM8v1RP50mb/lemZWkYu84kKOMBBD6aaDZ6fUezAEKP+EWIK4oskdWZO9j5G83zf/Egezef53nrswVRBEDO9KMDjE4eMm4ypNEjL2fOkWP+Mtl8hbLuQHC3qdbDdmVvGLlOJCCiwgEHljZQW/yJotUxPlG8olo82WSJstIsYeqc9mmdnIiezWQqoqKX7Iw8RnyditJbJby/KR8zLpryzrGWmpRbzTN+JEWdlIiHzS4oTRnDhRVjYUIuuziPWJUZw/TVacjqzPsvpv7IuS0T5LpH0Wkh/fxvXKumqkSxbRJYFkzx8m66uR6FjW+pXAsbK+GvmIZZ2/EjhW1lsjkbCISIjscfo4Z9ZdI0munL/m6M+st0beWiEBC/vvtFZwZp01crYKCVilvZDCS0baKpG0VcTKeh02Z9ZbI/OpkMX0OglkxKcSiU9lE59eenxGfCqR+FREfHrtaRnzqUTmU9nMp5eeljGfSmQ+FTGf2ov0eMmYTyUyn2wzn/KXYxnzySLzyTbzKW9Yy5hPFplP5synl4a1jPlkkflkznx6aVg7kg5rkbNkYiVh35Y1rB1Jh7XINzLxjUDlTeI9y+hGFulGdgg/mIadlpGNLJKNTGQjbM/yZ2GcwExj/5FA5c9V27poWICfQVKn/5zUcCAhSxie9SDEW+QWmbhF7QWQ6ae5y+9NO59GCIJ0Ejq91kxyDT8n4qJ9A0u3VwQYeupLWmQo2aEx0/LShE7ftb37nliWwVbfWJgaBBlvZQvsPQWoLI16vG3ESNEiz8mK9gM/HYjlEFTrJIsbVNLc+Gs1CBLLnXiQRlkz6mDAmHQdThU7L5x2gRzyBEc83lAkTRkZUDBEysJOnVV6ydMDvU1vIaQrhPJqa4OvoVVDRU3UyyCgICBGY12tExAjvQuG2k16WXHzbpGVZbL7bC8mBzodu/HXa7wlBE6KPZLLSF4ddTd2j3rcRpxmROzCO0i2RDp71ay/9BUIZi7lWwJGBQkEPxxjMIzV24Ni9FnnRv0cRTi5RxePfDETXwwgofTe2n/Tvd13pPpkpldikWtl4lqhnJO/v2xajMwjE/OovSBNdbpKlHU5VODo925PImcNpTyOGPRGmaajlDhE0Z7VQVmNBW0QilRgbaz3PkupFvk9Jn5Pe4GQWuZ0YpHXYs5rQa4NTqbxGtdZV8LZgrx17pdzo70JiZLVq8DgmkX7kTJoLVJZTFQW1NjyGSKJNywSTkyEE4jPpY2S+aVYpIeY+B8voa1ldikWORwmuxQgrhe8V+M1smgjUjhMFA7AJ/un9R6vkQUbka1gZB50cFWzRuVZFkFU42UqHIKlWGbg5azy+ULpC4kypVj1etsD12+R5mCkLKAyneHpLWM5WGQ5mGk45pkty1gOFlkOZhorLwBanVZCvf1s0TYCX89pXkWmizbZjcgsih0E21mCCpBvbcIQ4GBsGRDOAokMiEUGhJGJ0HHFBEKtsxTFQBl6YxsULIB49LUoXvBEza/Niivq0GGX0ujje5Iq0GHLsk8WyRFmv+UpLWNHWGRHWPUBeqbsdMv8YSxyAUxcgDbyTbBlXACLXACr9kvG1DIugEUugIkLQIht+jTZEI1cABMXAInu/Gmy/UDkApi4AO3F3cUyLoBFLoBVDbWRbyoyMoBFMoCJDAD97jQEzsgAFskA5mj/F5sZyxxiLKL3Teh9KHPnd5L11wjfN8H3UWdIL5Lh9y3i9615f81zUJbh9y3i9034fdQ58otkHTai3o0o87O/9Ne2UZGdbhjYk7TztqlbpNNRfmaxAN6/lC018YAIKMQJtPGouX2ee7pBVb6gPJPpVloEwJsQ7igC5Q/cxGCkZhD1xzEN35pOFHWkIirroqQnYsKk6lUjJBoUBKltduq7HqzbMNqkthMKSJzJH/cah5/g7giG8nvtvsBUKvUJ1Dv8TiD0RT0UmocTSg64zqAqKL1LIH81ZCANgY50wxWB7iagO3Zc+S1lozmi0E0o9PYCK7aWjeaI3ram0fwC57WWjeYIcDYBnLHBy7tuNpojwNkEcG7rZQxlCGeLCGeTYwcGRH6RbDRHiLMJ4txWLk1tGcTZIsTZhGJuL/hd69nyE+HI1jXMVl75sp4tPxFJbEISt/Uy6/f+tb0v3MujnrzaRqOu7trX2h8S2CDxfrCmj43JlAQb0ZnaHxK/2hYDruOxZ4q4XesaE+tlSejZmIhAWxPQFrCv/CLZmIhAWBMQtq2XJSEDwloEwpoU+dv5km7KFPktwlRNMNV25jKJlinyW8RsmjCbQPPkF8nGRERCmpCQ7QX4aZkiv0WUogmHiOA3bdhMkd8ies2EXnupolkmyG8RUWWj/7YDzPT4LUKOjHib1x1gJsdvEaJjRKhwC9A+67GzyNT4LYJazEEtL7FyJsZvEeVgwzvrS24mgzlYhDmYy+2/ZBEzmINFmIMRgfBW67GZddUIWrDpXfVlcZVQ/ZICzvzent2TWpV2yg8cV4Szh2gJoiSAG+cFDjiXQ9MLFCCV5yzQUUnTRBEaYQQ6vLdYNhwiNsJm+7UAk2muW8Qu2BQj8EVoSqcZQmLrQIXc8ZVAHBLe2YJxjZ4xtrWsO3CX+7BtHQ6gfkh7fNxbHGcEOJR+vLVSNtAiKMKIcIARQFobykARFkERJlAEQEqZnotOX/7RMqeq/Tswb7J9ptOMMhRVnOnKBJ1U5CcVTSetBY8d98LmwOPefrCjPYgwFvEXRjTFm/6eZQAMiwAMW2KdlSN/Zp0mnnsQWM5UJH3zgDXjGdu5ZiNgrtJfQChDc7s0BBt0JQfja/I7cwhPTD5xkWMehPCkaWbcOBwEcxkx3rDlFvptnpdbIGIWYuM4TUvvBNFLJ8gcs4yA7ahOnCIhFAb+hVnwQUA1xycxfPiLUXgWe07+GiHlxJjhaBLBhutPIt2wpZj0KwTamu/vQyvAQ+ROYh6JBq8qqaz96daAdX0U3RpRx36FRqpXrZpv/K+67hOBVxcBrGFC4vYPp/ilDyyqSueD+OF+9tLVhPp03tda+2c7n3Uej+4XcTcm3A2uko7bDHdjEXdjwt2QT5T2P3NgL/g2tplnIqBs46c/bUbEdKFVFiWOgQjj0y0SjLrbjOBFYpSxxlZJcF9cAYDGJN+tek1ANljARLILyqCvm23Lka6FozzSjBEeZA4PAvYsfdb6rY+sAsX43kDf9vRAczL8Vm0DW+l7gvmaVrSoQYu6dOLcDt38yGeYCEYygZEoNpzecZNyNsC7lM0zitCQHbII9r8VzsAS6P56AL+TJtwCllHsp7qFzLD/rpLVc8Qr0MXVvS3WubUNDOr/hzxyGl+tUddLjhaolUor+VQhVQBwTij4yF8hKQfd5EmJoWRs2vPZNnFJFcYKbz/v/n3L9zBzvTU/V/HCqN7rWt9VXmg5D6J2S6efAfD6Bcp4mdCnRcSWSaiffrTp6xqy4pOrzj1kipwqt8oERavJUj/LlucGyJRNTdVW+cWAgT/btvg8WJ+SBygNGuQBSnNKjqky5UJTVWdrH876nQUuGFmWTjUCP+z34dDh4+ljCCCwWX+DImRgM4tgMxPY7M322DKwmUWwmRE49hr1Z1gzi1gzI24M/MW0JpFBzSxCzYy4sVFysrNlUDOLUDOTRDoCmbRBTnNIPdShOPBRhHTQe/8hDdm2qNIYy+lFDp9ndZruwcWDAIRO6IZYGjsjz+La6SQseUVI6HyROUwQDvyBhwrmkyU1Ueshmg6gHCK5LMfOL2rIkT+GNYCaqPDGE/cIOASkFIsKcCQwVWpPyqa3ujo7Ca2iiOFlLVHJzOMIRAmDD6aZiYtv3REFj7iY0ZOvyvOmcN6SLWTpYpZy7aema3nId1qE9tmpRHOO6tZZ0/j+xnscN+N2Iz9uAq90zMnubKJvj3sXdVW2rgL74xbjykIQIJ44A1PrLJRqJ8lYg5E1VgP0oPFZ9HVs9nMik/v4rThTEyz4Ohylu+5qBIWaI8BF3OqCemBYzN8+Gbe9z+2YoYen11rjRP7UI7CIWzThFnt7ySLyNIuKG5pDrUUXU7rRQ1IogKqIG4ifbKG2oUJAyIzPQ9PbIgTSzvkriIqnxYXp3A+cqomCp2JuFn64IDHkZBgkN/YpFrrr8lFLpp30z0h/WS5b5PbbbYvBMmfPoIGWUJImvhw1UHRoJNZiG6BwHo0w6XQBwsgi3xBhtySR5estY2GsLqy/wymwdArA+eHymLB07Wh4KMO3xsNyf2r3oYeSj1aOq4wwoi8AsQwhahEhakKI9reqeoYQtYgQrUKI9hdZKp0mAQdmydrkHeMrmhODzNpXDHfz5W6WnDTrlmYMEetFJbuY0cVtsda6GIfsCG1cCrR2Mclqu5lk5WKSkejkVDLK55FKxk9FICO/vlOuys5YcK8R+FoFfIVlT9425Q+lg3vKvBUnrsmzuv1wvSgrdyrq1jxQcoUW40QPPMzBasTVVuFqwe/MAj6dvsLy67WxXoewnKYZVr9j8Xk6JfGOxb9f5PB30rqUjcZXBD7pKYct7uRauo7x5xv9F69R4sEMyEEFEoeyIC5uki7sNKJRxD5KGqbXiBquQg2/CRr4aQx8caFl9n7tKyVngNHtIgbNhZkoK8UFu0MmSCbuEEmXFyVKKpxEGNzTpR7TohzjJxTW2g6RD3lPI+aRsIGIkJzVODSkZgA75qLF5un1XiPOuRKzPF7KJDpLqxrwXClROaUbAPk5JnXqD0foIRn047POUxM9TpFyTJkzTv2DGycmX6rHbLigyf/Iw7NT4dnB51f+5uzsXAcJuZjRD86/cl9Bp5QLEqGbSgKhbsyOiTWALt6QHOiiW+Jpy6YsDzIAF2hSys9gE0s9Gqzng7ekaejQPueQsSJ9kKpUdpZcwvanvAWCWiVs78RnZsPkcEYJBhtb2L5QZZo3V+bYwvawG3Jhe35q4m9SBMfq/rVOVXQUqgvCK4e7dlKK/dNxf0qSJIK4TlKmf+G8PuVErU+nt8ujC7XYhbTBnflu0k//74wcGqCuSxzldQw9R86/M2AkKFLWH2OnTwl1oJGmb0UfD97jgysmm3k9Vae3MPaOyZgiF6Kb+qrdPF+DfEVjVAnboClHxdm3BeR5PO9nxPuZ79GCTnJmx7BySjKHMHqNXM2QT+HAc1UQGEFJA6T5soAasBN7p7ZoR3XlB+TZnJ3MzRquTK8wZoVPRnaU4JAWyHk0pzqfdElnYIekMSUvxnExl5ftWeAsnsXFFCARDMT5kiyAVISmBtZquOdCnNEl0AF4vlwmwCrWAAQijNvLyVyZws3tbwrlj0PyIf1nmowdhuuCnEjs9v0HWMYoI7OniW4u+EFBoIPJXMq4FG4U0dAuLNGl18H5j1hE5nXxk6VLYkVdcu4r0ANDV+jUoziw/e3LX+Cjj8zYR5S3eMFF6DSjFRLS7zzPlxczF2qI5TOWqS6bz/Eq7QM0r0IAUGnlumwTRmTSuuw/45SsqFRYpAPkmkcUY/le1RiTceg2bh/xxqDVsvM+q74M1xUf/fwFOKezkpWpSlAgMa4OekwNgyYnsQMGpoiOdIoFC1juUlME2p1LEVTZUjg0quUmZfiAWKeUxrCk7aQFGgXjq1AMSYti4xGvS2HOYx9phSxts//H2iLSyBcy76lRcnD1Prc+zthpbhCUG5+T4cjglTlu5Omi0YIyQKceDbIKykug59L37YMYVjkI3NOgDB5EWlxaBzLBWtrPHeuh1D5X9c+WNIMKrLuphENRzMYUEDWqxroOFxprYQFTmWPQK3xxEHGMsOVOdo7h1y9Ks7AEo8BA58/r7+U2w69yTtBXuSgvTCGKGM6Yp6iRylNF5ekviIaaeRbVSL+pRVuJs+cr6cW/0W5nM1oI3WZcIHFlM1dMcanBfo6tsQ4znUx1sEaSTRXJpr+4XOk0V27gtRFqd2qcuoPtYLRxntuta8D+aB8WOQDjUF5ij5uJsblTbY48+VEzD6UaOTHVOTFMoD2xadU9lKSjyJ3M2gHsmtOzjqThWHcleLlnHpjfavf5SgpvCI9lujC5LMlPs7nDOsDpjE4gAYzopJx+HTZfo5OyS7fytUn1hdEe/woG7mxIPz9o7sMLDJr7zM4vzPtwbQXGIXOfR+qtRp5OFU9nvJj76PQlEqO94voWq2VMXse2VTygbaOYHCD8S7bl28h3uCqMto1k1/EpedQvU4lvJZl/JR+j3SLte7Vb5B5TW0R+OujmQ5sp4TqfSq410o+q6EdAf+Ztw9NU4eB2gcg5WkGTs4fPGktuWPovsITIe8iY8f4cIIHAZDCAKYNu809b3Rp5R5UcojcZJJ01D960v1hys4Kfh2JA4P+4+PnahzLY93YOq1n3RXC63A0natublCI1w+J5+nKsLQOnXQcXuva1D3RpuEsM55SNkQKqa5PIPUw/19cuEd1KuzOthqjQVT4PEJNaFxFiXLvJygWKuwkuJmerXztMXwSBk2OmsLB0zUdGoOhbQi1ydK3gTzE7xqAOWxhoOhUajXokiO8cuvcS9otS1JHaGIsc9EU6ll/0j90e9Xp4OER0wfAvc19glGtbp9LBibVx2LWtG0zz+KHp8NGbYtAoihkCo7y3r++NjgOo753ObQOQ4abV+/X0/LDNR7Im0tCqaGjjxbKoZjS0GmlolZQymcM+/UxqxkKrkYVWZVI0XkyKakZDq5GGVmUlNF5EVmrGQ6uRh1ZJKnvzmakZD61GHlo1p42+pDIz15wa6WRVrjnjRZhEp7/spO7N73Z8cG9vUpwlhYtU4bU1dpdvVr9JaUxK3jUS1KoIauNFYUSnkyztzd6qlOJFj9252busRQyGFCKrwwQRTjoMcLBE/+Ru1ciAq6K4oXR1QCIu3uP806l9s3VFopge7cupXfdW6x9G7bzLMX9Y8fvAQ6CMmhegauS+VVu/8MqqJbWIGrlp1c7feGU1I6fVSE6r9TcRrZpx02rkptXNTcspNjXjptXITavipr3tJ3lWvhy9XqLlt/EDMh6NQnv3W9P8iFekzH6jzPYdFDCgGM+AOVLe6qa8vWSmeHoj/an6D0lgYZnmt+SyICdYtXUbXMVYoFEnX/Pu5LYlsgf1IZL+Hkl1dZPqcqR/zUh1NZLq6ibVvaSwM1JdjaS6SoYccisZisLP+iusbBOMqLv0+7858DRR0GFhYMOchXKRq1edq/dCzKkZV69Grl51rt4LMadmXL0auXrVuXovdJiacfVq5OpV5+q9MFlqxtWrkatXnav3wmTR6epYZBreOaMFfVmUlhiYf71Brj4H5u+2j2RYtkHV33cWJwUnAL6QV2pGAKyRAFhb/Y28Ulu2mEdmXnVm3gvvpLZscEXKXHXK3AvvpLZscEWSW3WS2wvvpGYktxpJblUkt/EiYlMzkluNJLfqJLe3Il9GcquR5FZFcgPQIr+TbBhEklsVyQ0ZzDRbz9N1M6+GTJ1+StnhBTOp5Buc5l9aY+uKc+/gp1EUbLI44I+JjAVATSa2UiOPrpITZzR7Gh+z+LA6vXGcbXgC8q78M4NMx+Fji9xWpsvbpdQ94J7UNKkWd55ELlGgQXhQAnFDMCagWEJlUgqHbI2yCAJEZc1cWx0FhTb6rrSg8AQDRHiqssLuh8ULxja17urTqsNHy8SR3rXAo+z5aXbGhjFfYgc9pXErSE9wDpJhJ1BKn5PSKUZXEmSFKnFLpT+qbpFWWEUrZFo968oZrbBGWmEVrdDe1paMVlgjrbCSwAdt9nZCbzteI5siIuevdjk6lZ+6AO+J18hmiEj5q6Tv2XxRx/bT3HggD6/8C7YW2oEuJipI84E4dFlbWcpgJb6Uk4fSOg8fNxNnGtIAwZT81PVo1uV9A8vSl3XtZf2bhRilkH6MHYwbVLFcjkS8J4omJS3KM3sVKYmV9EKbENVKB/X5hXSjp9S5MpbPHcx2InkhH12MyGUW/NSE3Geseub7jMh0rOP4bVhlRMcaiY5VRMfXsZERHWskOlZ5OuDtlE9soYzlWCPLsY766+jKWI41shwrKYs2y8sEPHbaGsVJlXPG9qE/HU5LhrySbOfG0S6l6sAYoB73xpEyuQ0miuCzMGSQDDW4I67dD9gsXU7AiJEpwwkzH6vu91Gl/12bJ8GrbaF+0yZHJ2n0/jlAsGHN59xJNaCcJqXQBQiizDN+jCR7KVcXY46XnzJTyNQBXbb909r3PbJGL26fTSXbUTuddtyHRYeP9xFnu/HrbJcxRmtkjNbx62yXMUZrZIzWodmOvntZv5h/baHuhvij4ZYovyNFu+v0lt3bqI0rgykVtHkTQQka0rJBxI9xAUdySj8BWO3jluJ8TAatlRdd65qxbmtk3VZSaG0CKpgVD6fkBIXKUKGYKI+DYAZBt8qWtO9bT6QJuQW5d6b6sRFSvfuubtvpGX5oM5bO6QUVs3FZnrCMS1sTlrIbnYAIhxrbEIZpN2XWT8/6I6D12rebwKDg5vXuth0XkDZ0lt/YMDFYiDcp4N+AMSif80cpSTgF4losMOnmBOgwfMYCMLGKMnBxYAdcDmTRUAiEJ2AM/uClyJqGeFLWpFXKVtFaiAa2Bmt8rEQfNz6M10EhS3Y4jg87rG982FHqxocdc8PD2HaCh+nDuZvWHWbwR2PuAW+oRILWwMN+H477cN6H0s1/hBKRp12lNw93qrzXZUttJGpXEbXB6cwyadKe9wleMv/OJEWJRq4mDqMtJFEZ8eVl9xBMtG6y5fpg9rG5vUzahTwxWWxx00G4MGcim3Z5cE1/kSbWt8qQpV0WKDYvN65z7IKkm6GYQ9MdhQw1we2Aclug2MNztEaueJ2KKoysjRV97XRa46iLAEmZMaKufUKjny7LWcVtfGbxpQFpazslkrjteGhkVTcyGlVXNBBakql7FG6XOPHnD8U/SUGdrAijWOYuDeStVb9eOYrSjlXbH12nGFdvP7SNxVb5m5XFTo9T/Bm83DD5Y2E6nG1hk5CEZY8pN7Llq7Pl7WXKnTusAv+TPOYFBoCYtD91XJarpB2Rt+f1RI74wydQY5KADlXd/T9O93stQvdpXttFSm55T14dUxhB1ijTMWHMmUYNDI7CEE+BpFZ0ru5sBpwTe7EgCFfrIrKjPxm6ejFWDPxQJjs4wmvCfIMOKctan0rWoh2P7T+SYfzsz2aO0ZL0BID/Tkd29zr0xFMxypw+xGlOIpen8+61jr0om/G1MHuN6cRPMQdtbsbXaBuaVgiAUj26M7GgTqo5gEg7DXGW2YsjF/qeq+mUqyFOvyOihhY3ZQI0tGuqPs32ED/qZXLkE3i/P53q548GjKGiRA+og5U14PimaJHbc9pN1bp1euBQrUR+Y+KE4Cb0jx22aAPHfqDqGxHH237ycZsxGp3iVAIHlFDJaqarUKOuQqVwwZt3Xb1lFc7av+FPZ5MGNbGZyP7sogmHGqYUyUbTbg076EcWNyomVCkmzBeCbM0kE2qUTKjSRLDjBZCbmVbUSJ6vIs9j45Um7lfxeaoAoC90Ab1yjSAIDZzqpm2wheFshNwlZxRCaAiBBU5eUT9459t5qPmWjzB/URbhvMtBMTYJC+5UnKG5JdDuDrHxEDJn+LxEMYRRPZ1QNGzxJ0W5d34qyhURuO3Y1BGbXH0wy02hpnnUryOi9R+xStQQqO7dceQFu6Uwo4hNTkQFsnXDH+faQ7kgg1srCd1fiZufa4OR59oIWMBOGkcoHH/FWLDj3F6fffycsvQiG0Cun+XyzRrrijjaulgyB3fCbHsBZ8/j8tiSAWi7Qo7jmo6oBOgGoKVfBqDPHVPUI6ik+78Z6ersf9hIt0bFgSrFAQSCialMzdxPamTmV3c/gaZJwszX6V31YwrXnGqs9Nd3bo47VUbcqMi7XrfwLHB9u1Vufsri/JpUcSNNv4qm/2YWrNP/sFlwjWz6upSHqC+5xIxNXyObvpIZb2i0dL7N2PQ1sunr8kn7fLmTbNKOdPp6ahfdjvwiGZ++Rj59JTmeapXZQpbx6Wvk01eStW3SWDS7kSwDGQneVRTu2V6SRJl3S40U7CqS9QRAMb1INtYit7qS0GwgEOQXyfJmkQRdxXJGhJBfJEucReZyFTUZwIv8IlmHjcTceqrDtpden1Fza6Tm1lMdtr2kdjNqbo3U3HZ4h817fcvMW1rksLZDu/ie9/qWmbe0SDJthyfMaxqqNPd2YSgAbOOQzEf3sB3+alpQKRRVpitkOyYX6Ji2DTgGi5rnbfrNfAWYIu2DSJekkE7bO5ua/2YM+lpkgLaj/jYJ6bS8i907FAx2Bkp4KoFkx05IQJxreE5NTDrbhKmxLZJJelBiCRkg0aIq4dpOJBFxmvkeYWPPLXN1gE7OjSkhrr7q/lBBhfGKIOk2Nhl+HtWz8cg8sZU+YLtWTwBoZ18IAHIeFRi1TOfxM1keo46j3StQeKTCg5JMhjBY+0PcCYgxyIyym+NjB2ltOzok0n0noJWkOq+M2Un8O9PMwN7aoUKB2ILndWjXF4SQBcvf9BTipVLIA7fMXuB/Jj9npBdskoi/HrCOFmmyTUTY+cKi12nFA1BWklDxOvqODJgFFYKQu365xdDtEykIIWdNiy6K0YaQmWLCjztr8c44sSLRkMn+6TR37v1sP3f5k6JIdH+4DVG+6CNKboPUpEuDkvC4lR5vZfyy7PlZ36pos78zKL5nQWKv33sWzzmVrRUgisD07JoYftjKAyCP3Fv/Gbb/QqQzsnqVY0Py4Dj26XJw9uGhIm0QZr2ORK01iDjoC3xDTJGY8ibYcyBtso+WH+3MGDYscuxFVgOm4dfhug/P61BUhIf9c4v8zkYyH4ZVBljWWaXSO1JWSDxPgfnxwgnmx36COf/JrDnR/L7ZOdFRF/lvbgUP8iJnNVzQadumWa1zkqRBrgv2DZB9FoX/4KDJ75AId5AqSn4ACu1U66M3/KEM5C4jDLL8l9cjCudVxK6bFHAyrXtIRWLwB2BczQvX4WQATGuVMyqk7DTx4abBDzm4HqhUABgryuuYFo1cFN24cwBYPuDDDO3eDm6/GhsTenrY2x5Ml4grgCIC8q263tBVkHgwc/lBdEjdFTa3B/UmSBz/QEhvqMWM06dewWCdA3+mifSAUf2BnwUMFD+I2zt/uKdQ81PN0ADV6WLErp+pMgv+dh3etqiToAw0CWvTogU2rh9VvapCmPDBmh6ImgeTBWef/uAnKzM2Krl7upcCgxL9STnGbl7WSQ53e5b2g4nbdxD7w23vQS8in/8rv8o3yjIOFsD9BbZyY3332P2NDFr/hc5eyN8F0U9NSKKfeqtB5U4/DEcY3Q1k2zg86LRVWC5CGYpDhJ+qZ0zSMdvaXxC9EdPp1OMOHtb7sN2Hff/sdDUEfjrvw3UfntfhPO7D4oQTm/P+tXn/2rx/TaNGh/evzfvX5v1r8/61df8aX5of2n5Kvim2wmSLzQcUpkXKcSMRl22Zx4XL1wXQXjYhnZENK+RKDwc++gmSLQtq4Nd4P/wmnTvPxycPTDd8BtSOKdb/meuLXy4cGjRAWxf+YPr6slAEdpXQtQcsHS+kSWqe3BoYiSL8YawxbFvQDRba4pxf1HBRg2B2itEEPTIOF/1c3WVF0sE9IVTXFRkN8mTIqCbSjw3lJPGbL76ui5Hm+sHsafQ8JhePcNhP77tPkUMlWq4ftvuQSQ5AKaZI2TqcOny8/BVfvvY4K2eD+GkmwMZyZUgkqFUiw9wiwVIWohDBFEaaSzww7BqGR7qgtKf+9LIAL7ucclTbGpA7c+O5MwRCnVV+0ixBZV5SxKpivlPq7QPYgnWu9SAN2qS7UHsQ0FvkCLeirdr5ssvi6b+QDW+IPxqu/AbZ0On/KGSjRX50K/YbZKOVJD3TIq+5lfobZEOn/0I2/kI2/iuQjRaJ8K203yAbrST5vBbJ4U3k8BfIhs7+T4VstMgWb2X8UgXX2b9V8O8GjDtf2Wi+VMF19p+vgrfIk27iSb9VwVtJssItcptb+bX23DJuc4vc5ma/1p5bRm5ukdzc7Nfas07/rT1ntecWOd5NVqPggKRxsCjgXL8rBfYoSkaV1LHzMz6D9sNFiJDtcgkhk0eC9t1cPXySgLq7MfcJ60KjrAbFOTjzokUkdjzGFjtuO01sttVTCRyTkBCc45RVBTdOQkJT9B0ZOwyCrstoP4vr2FwugDCPK9rmuidQF5O+g2glw53Pcfgh9+miDplWT/iH+NaFwkck1HzG4KF2BXgwEcp12HT4eDsxEJOJ6wsyQGf/IgO8If5ot/Yb5Uan92ZXKXrnJhSfH+gzQHqbjeGTwOlmPOiW9XtPx30IUP0Y6EbSy9fuzqjoiCwwz2JQDIIM4VEz2OQIBgdH8YAItboHxA6m7+t2r8RiUCnTjDQWOx2gb89hHsMi6g68QSV09j8MlWhR+qBJ+uAFKtEyb94WlQmavHnfoBI6/c9BJVpUJ2hSJ3iDSuj0PwyVaFH+oJlW9jMvX7dM/qBF+YNGLQPsWtJyTyZ/0KL8QaOUAVJmbXzmOOM1smpvVD9o1BxA6jctRmTOvC3KFDSXKXjRg2iZM2+LIgKtag4683p+y0QEWhQRaFXwhDNXPmmZiECLIgKtCp4A1YVskGTWvC3S/du25s2lKVpG92+R7t+q4AlnjixoGd2/Rbp/I3UfNbq8p2W9NbL9W/OUVy670jK2f4ts/yY6/zzyrpYZ87bIy2/k2A/MD8kC325oAqDORnol6rCS1pMga/XPynHniwplOgry4ZV8Xm7bF9Xu5nNGiET/RtK+YZpL31NG9G+R6N/ksbuOHOTTMqJ/i0T/1pzWloN8Wkb0b5Ho30jat3XkIB8/zU1zb5nMOAP/UreIXKPoFwo05mpySKRnNkCZ9PgtM/7viIsbKRMEIKQ648ZyomvWMpxevDsuWk/aeIs6Bq3N39SSdRr6Z41gDy2c8IdvEla0wppCo0mQL6aNOqiohG9dRYAH7OHi0KIeQqO2gUGAPX9h68+bKTSht5re1vfNQHVAgpBGaYKEMt2irkKjRoKtF6kBnd6iNdfmHvJ0jJK0tzkvSSmQPcfl2jilp4fqz3H6em5oyCnhADiyzUQnvkXhhkaFBINzS3qXOg0jP4Ir7oZimZefMZhvbknw1WZ2bMI5VhC0c7yZqM7Q5HIMjb20M2Uuxy0KGTS5HL8JY/ppMohQYLzdCu4Wx/27CAUFLilCcdB/nFx6Wnu5ID/0shR5SeOwMMcMwgy+8LjZOGN2zZjlZZ7q9ZskcENbAKYanBaq23RvFy3K/a7SNsV/UTj1KZHaonhC65p3y8vg4WnykVBxnMuxP0o4LOgCsVUIlaIyhzBARNsQGbTAz6cpkqGUmK4oUYyhuRhDeYED6rQSqzHH2OadYvxKGB50sCEmb6cO74ShtqhMOx5FLi0Wsoj/OnVYPyw8/Dupw2+iWNUmGLImGk0XZAc1LIzFSnSCz9ckjy1Sv/t47CyiMkWTMgV7RRbB9LG3dNyAkneCetqkLgO0g1ja7UzoFBrCUhthIKsGsQbNSPsQquOX7MH3bcVlRGoW64X+rdMEe3EjxtELjMeX/linmzc4e5f00e1bpB4JsYlFN28ccenLRBxaVL9oXeuKvY3SLP6MKhWN0hAIhNMtnTQsuL+Hkjz3YJDO2E56XgdsXL0WXaIvSX2oTe5YDRWjdGTFiV/CFK9Au0yZokVliiZlitFeMKajZKJxSHWqL9EiUKnAul9L41aUvhqV/lfcRY9StlqInjZ5bVHyolHBAuX0BlTC4wmzPV0UvWgSvXhx5W6Z5kWLmhdNmhcvrtwtc/ZuUaehUXQBPSLdi43+7dErZ0PoQCiiK0yLNq5NsqA4IRK8uF4hGUPFIZg7Da5htfefk4s6pIYKCvPbr5eL4HomiKMmRJOL+It7d8s0IVrUhGjDJ4WXBMP4ztLcyRnFS8g+3ePfS+WyM720iM22jAsGznBZYgO0OdOya1F7oUl74S3xkFmUtyiW0CSW8No5sm1p1Epo0kp4cURumUN5i8z3RhY7jAjSkayzO0qVs8Fp31HqbTy+Lo3Rq1IFAPtg8rtzi4k/1fR70NrwNJ1+3GUc0m5ybi9B9dx1ByA6VYc3l5EprvlTlruXDDrW0dAGmyp3aqwOqCJrXBY2P0hPaefkpQS6gjEqG8MLCOdleHgZJwMMN6VPDH+KuY+WXFlRzTykVEMDXwLSTwqoTzp2IGYxRiEAthfzqq3b2mED6PrnfrFV2j48j+6HptAC3zUjsgggPhMVnofL7kPVntQI5T60+7Deh02Hj3cWp1CS1d9XmswOvkWCe5uKTuvLXHAR3FGGYzgH3CxpDQUmVTSL+GEBDqR69QTpCLS5rd2KUxqQyKX5A8pKSySH8SNnDxtC6FGhXZWL5eCTiiLN6K4Ib/JioOwAy8lWdk3KQ09zo01gLRtxaUev3oswTGRKAbUjZI911nsBDyvpCpWWK0W8hlN7D//CELqc66eAh23sDlHYISSNAM68eoEOWTjE1G+Lwagfrvvw/q58Oo9HhBep803UedxzijCaWUYm0sebCOLrhUXWZrasRHJ3m1pWXlhkOj29SnqHmneAiTcLpT1tFF15k547zwCYO2eQYGyBK5bFwpE33kjf/mW8ZMtKpHw30rdfY5+M8d0i47st1y57KYdljO8WGd9NlO63wCVzS2+R6dzEdH4LJlYWyEXWb1vaab+Q7XRaY/f8oRI9xjsRlsfcNdHTwwykPbTNQHX/i9JFobtWijuucxI16mUf2KZBo9EPob8xPv05cCI1uMlt/JWHJubw/zs8tEhLbqv/ykMTLfkvD+1/Ag8tUsKbO7e/GHnqtFTtxrrkagQoGOetScNYDIkQouJHL1q1oeuiCK8yPqJjZ9muVCdVy7mSbb0aDHWhNhFhyrXlBOSH7YtK5+ADM01xikUlIyiEbFMI5J0vQiYedX4Tmr8PF67pioqxuIzVXa1mUv0GL/lk7h85XHK+iA1Y8p7W4XkdktPlh0WHjxaPi5/z29+Yfzz9jzD/Imm+rd+XPZ7+zzD/IvW+iXq/+kuEIJ/7SP0ju0sFN8r6Mic/NteO3YXJR5kHH5u5MerwjQYR5gzO+lG/SYLCKtFlaOO43PSsLSKZjNY/SMC2D5yb+9jfm9xKoGdyjvtw9jgWd/E3QOSglP/aKLCDqlQiC7bDP+zKh3KD12WZjk7a2yb+LQ6X+YTZRFGCRoGBV2LlefwlVv5bxMqo19DO8puRp5/mttIkqXbWL3fru2zJBQkI5y+jZGJwseGvfDLYFDsahiZQ7DiANHE+w2Ql68+DNMripIZF/67F8SkHsHZuV1NKpN3e2LboXE0xa+j3plXJqDbRpDZBo5VsAOt023Pb13x31TC8qlXusqSmPla1YCnjZS3WzTEKWNp43FiMQqlG8cp5Petfzutfzutfzutfzuv/Xc5r1Mxp0sx55bye7S/n9f8bzmvUOmrSOsK2NV9Mu7/8hfcD+ARdPFUQKGX7ZU6v/DVyJ6rjJrTL0l8UrBidntx0A9WhGSE5HclVKR7y4izi8MPFQmhSk4p6S831lt7Iu+f4/5e8G2WjmmSjqEyfvtStt17p38C3O5Q2p5/XEKCNTQEHe0WIiFo4lqCur6zIaQ50x9SAfGmVXSjD5g4mxtiZMgw0/ak7wCI+LZKyBybfkLqoTO9YlfsROBWLDrD8wmr3p4yW+d1FmlTTp02Hj/aJu1EpYmGc5+2zNvBkbkYLljm5SjSvdWMfqD4C8zEyAshj9WTDRV+jHb3YAKW6SefsmzrR6rX5YP1SEBTM6k7eXLRPZrlhirFZPKZ3DMrstsmbSBQ4e3PVvtmb/FTAE9Jdsav3+lJfMjRkjsL8AXyrA5sDMxrcnNihGMnQQJibplT8mWNTrD8KRVFArElADHaqeZtnSesoINYlIPZSk+2ZfliP+mFd+mFYQrIb6Zl+WI/6YV0CYW8eZf1IstY9inh1iXitkW9k+pHUznpUe+pSe1ojn8D7kQAQehRm6hJmAgsqv0hSv+lRUqkfzhw9YIeyq0ZfF3GFSPp4gDABWCmmMxyOnykaHUzMF+G0cOjF0eN3R/xdwVBrzhHW6ZNr0yhf20GsQiLYIxzon3bDHcPG0MC7cAwOcg3ZbrBHKZEuKRE8Zd6mZIF82c3+C+Y/UXjMy9mAT9rn5PYKBUTH3c0cHdSjzkWXkAUsVLKlUqdp+YcMRmGxtG4cLSY7sV5I91Ep4WQAB9aOEq+6QdLhBqv/qJmb3vITt9qj+ETfBvW5t7yfPobzY28HVCFhkGpTc2KrIANRNqEMyzFrIucqkKeBKe23vcZ124g7Ml/IHvUeuvQe7MiJFDrNNExfXzTfqy2/oad3Y/J6iwWL7xuENf3VmG83GKcqqT+Am572wyI+QeFgG2I3zc9ccUbvURGiSxECdY78wtWffG0tfxCZVWOD7rsprW3dQT2drtPs+9gC+jsChMmbABswh/IcDBMJ5UH231AcH8AyPm46TpdFWrxwxOlrxVvOJssoJ9BL/wWQ00s2V0aWfSdrHDkeQOAeLZdUunvkmXcyugmIJUA2XiPh3vRIAu9Fc9R6mfczEniPJPAuEjjKcflFkpW9RxJ4N0HV18tsmZHAeySBdyu/cdp75nDdI/u5u8N1TS0remZw3SNHt4ujC7fd9BrZwh75ql18VSqipC2S9dXI8exysH5To9Hp/6gaTY8Uz06+5qsaTc84nj1yPLvN39RodPqvGs1fNZr/ihpNj8zdbus3NZqeGYv3yKztMhZ/UaPR2f+pajQ9Moi7DNRf1Gh09q8azVcDRvp0l3v8ixqNzv7zajQ9MrS7/OlfV+6Mot0jRbvX+psaTc8o2j1StLt83t/UaHpG0e6Rot3l8/6mRqPTf9VoMjWaHpnqvY5f9E509q/eiTfEH+02f5HS6Bk3v0dufq/rNykNnf7npDR6pP336vbmOWXfT3/RyJhtBgDvwvtW1hrW+LIF7tI1qXWraOAd3hy4AjOzjELSo6JAbzJOBxg5u71MUaBHRYFOeQCgctJwOVMU6FFRoEs0ACX8/Eay6TUKAPTmm5ocXdYzAYAeBQB60/S6kBQHrDNeJJteowBAJ5n/jbfVM/5/j/z/3jStQDIimVZatguJ/PgufrytHNXWWzbGIq+9k1uOhGQbn0fStGUhZWSjdxK/UVDp8zN7HOot24BHrnjvUmEjgQa4y3CRnvXVyPHu4nizEjgB0I0XyTpr5Hh353i3l/Rkzzpr5F53Wc7TPTIbNjo99zhPOKdKD1PbhPMBZybgi33q0sThh+U+NPHPHjcYB4Ls7BFX5TfY/ukbjIOM7GIMj7Q7yA1RRpqD1HhgO3ZCH4le7F8IoprP34qDkZThUlF8zNaZ7mIcnVneRvWIKe0G/NL5QH32yEHuXUP1fGlt0kK4OpzMa7Bq/YNn6XQDHVSw4j6XGnKfc005fE4IFD9+Pg7y/tsgzyjGPVKMu0jE50sLZWM80oL78PVo5CMrowX3SAvuZOK+UZ11lkWeBk7ccAEF+XEep6IEHNzaDIILzEpcoVLhjao2SAAz2URIiF5Beb7rSA3uQ5uJkdJjekYN7pEa3MnzbQwIP/bYSmTU4B6pwZ0831cCtU7/UwTqHknHffy6iGbm8D0SgbuIwIAvpMMqYwL3yATuY/5CAOojW0QjWbeTeVugmZT37LWxl9siFw3M7RJSYnWzSP5ICB6j3glBAasQyR71ykfdGUFhIIdDJVhK5DUKdutkJCAS/8r5CbF1+p6NpY07D8jdG4kXOyN4Fs/I3RlB6pIzyQbFdGXDBmXXK4m+fIQllDgEKcuPlCfrUKbPsA1b/APl7yZ9gW1daGgwjr7Sa3343ZfhaHiUc5Q1Ru6CXsn7U4pgAj41uI3EPWDbdH0476+uncobosuoSnTch/ePDbsP7x8bbavOj9HvT8f96f1rzM764Qab34nDRz+Lk/DQhmPm0qg6faGMLtVI3Qqa21wYSqr46yzfOpJVwIyySaV9o5eRp+vcQ3M+rDJHBnWlO23zG17kClGLDI7TdSGJsJSWZBms1PLTQS6kf9ruT3uKNOqRnN6nVpT5sqI4d51gJk9nnCRtqyNWf+ZFTwDscdtGnPe2CW3WiX6twtZhs42U1FUuBSyd77J9CNcbkys1QqUhIZvjUauP/Pg+JXUxX/aRMo5nugNJAd49HKh580RsSZ/r2PgChijuYX3uO62t7JdDYccKQhKTDnw5rrKkl8NP9UZ0KJNgviei8PzQuAQ8+m2k1ndx58d62QCKeS++kqudEbE58au9pi/s6z2BhE1c3Pc7MeLBMLORU9RI8ypjtetNrU4lpi4xHNR6Hx0u8s27HOUhj5muOHMzPcW3cbE2UcGbc8n6+tZx47usmZ6bmPFNIHZ9W7mjOghJl8haZ9ruGFf2h2zEaqLWAOJ3DudSlEFqBKl9mKnrp3HeJGPHqLQjDCUPnYj8SIJE9nyXPfybsFaf2ZY6Mri7GNxAa+QdpGsE4PF+rloC6WrFvC6BhUYZS3MneeDVietl4YVStzRqZyOW05sYqB9qIhDPSsUDzHykpENugiz0OjYDCMGS6l0QOhEMuJ+LfiB4S+a5OZWniKzD3gR9EOSrpjcCEZG2SXrAZrBPVUIuCnF8n8qZ5Wz3Yb8Px30470OxgCIAsUeqe5dT+niRmuwZ1b1HqnuXjzkUANJMdeZj3iMfvU/JwL/UUTM6eo909D6VZjtegq+Mj94jH73LgZz4qwMArHCRjI/eIx+9L3mDnnm1O+Oj98hH78unypf6dEZI75GQ3mVDjf6Z7Z5Xtn2I3PDuttHHS6yR+Ub3SNDuZOUSe5TVVVYW5Ucib5d5MzDJmJDiTmFlnTVSU/tSNvp4mV8y6+UeWaSdXE6SzbM9cOa83CP9s5OwCIm0/Bqb/QllDm3JwAhg6IT0vOToCvlPRrURFRagf+clehYNqeEJpiV5k9QcZOBSUZZk1dWwfePagfx4ZwBBdWHyLwGFIvqCBUSQXSu5Ccyc6o/LJHcfbIcyj6bDx+PHYXYev+ZfM8/oHjmI3TmIL1vHzDO6RxZfP+3X3GnmGd0j466Ty/KWVskco3tkv/Sz/Zr3zByje2RR9LP/mvfMHKN7ZDD0U9rnx0veM3OM7hH634l1B5C3zU87H0+TDbMIj+/EbhNvmuzHM7voHtHenchtkgqyDpItCBHrPQjcxi6KNL8/LzEyqPeIUO9B2PbbxDUypPeISO8hpDeSq9lbGRnSe0Sk9yBq++2tjAzoPSLQexC0/doeSTcdEeY9CNku88iVw0cG8x4R5j0O76Y50WYcSTcdEbM9jvnbNDSOpJ+OiLAeglC/TEPjSDrqiFjoQezx6zQ0jqSrjohXHgQFv0xDo2RdNcKIRym/TUOjZH01Qn1H8b6ah5UjM3obEdY7Sv1tLhsl66wRZjscZlvykHBkQNsRgbZDvl0N0oXJWj0ypO2ISNshPyuI8+R3MqR8azdQiLaDEkArOx1xIAMBQBVX9SZdZhCN7SSXafl2n6B6SDh8XH+hMldXIJdBrPLjfuPIkH0UaGT5/c5LEYhkqqb9EnY1xeHSyqxTlIL7K9wwtqxgiErz+JY8pqKxJI/5pxI31lWA0ExvOY5DWUnNkksSjAxFPCKKeBRtIsrLPJuhiEdEEQ9ZSUFsKL2TDEU8Iop4yCuq5ZgHP8t0jkiolftLbHUbIOWED3RKH0qGaaFzCOewqvQ5xocSThRKflJJRoQkD0GSoTeUP1Y2riMmeQiTPO1lSMo4iI9THXEIwvqpBOJX3fHWRZO4O2Gu7dxim19iaQXSRRlSYkSw8zDNF/bS6zOw84hg52Fa3iwHKAzL5osITx6EGkOxJ9tUjwydPCI6echiBmIMaQ/KFreINR1yiUF6On+YbFBFrOmw89eRmbm4jIjBHPX3QZXZuIyIQxz110GV2biMCBIc9fdhkIEERwQJDgL+Xt9vhhEcESM4iPd7fb8ZRHBEiOCo3llf5jtBBDcQUxM5HM2EYcIcA/x1I0WrbesATfOgyZNLjU8IDegQspvlshFCyujzKMuPCL0b1d2Y3t58NhgiDm0QVPbG2RwZDm1EHNog8OvNwGdkFjEjYsUG0VmISDJOxsgsYkYEdA0BugAYT19aBugaEdA1iM4qQJHnF8nGQkR0DaKzKJRVPo8rZAMhwrmG4FyzvqwHPM3Zn5M+uMvkPCB70ZleXySs9zp+oFUyRPM/FlIVg/YJa+jTx63E8SRQGLIp+a1kAyqCwoZAYUD/5hfJZv+IChtChQG5ml8k6/ERFjYEC5sv0po6faEmlxfxJXoGdHdlAIH68ZfG/Q32oRAYpEdVxQOjYxJok6yzEWw2mlaV+jLrZHCzEeFmo2lVqS/byAxvNiLebAhvhmReehF5k6ArQZeE1cj2o3JgwlSimZo06Tg/niwzFLeniPcSYWtDsLX5AiMdGWxtRNjaEGztdbLkaUkDAH/qDiVUS0EJLJE7pOrT0SSgQlES8YK2oCHKg8o0opTRqf2OMkkXvQAJ7EO44pO9xliLnhJi+JI2XMpbzuKFk9IuuYp2eVaAliCRg1U1tGVb44aYOrzOTyrLlT/FD11iAN+cNLrw8+0+VAXy0dRx6nL03guOSacvVdepzZ15kZbl07Lts4SxaW6C0W4Rhkpam9jsH3Ey0LGql3Ar6S+VkrCTqgokHD8lU0cE/g1H9rWX0dOzyS6C8wYRdOc5XvoanR0ZwgMlR8EHQi4g5Uht50IKy1l3p0INUkEGkC0ysII2ieRdYKukiiaoYJWiHcAXSCYO7Dg5D9AbUqrnoBJIVBvGR7IeWxADIiRw0FJnkOqLLQMiFQzfx3PH+Zm4Pl4ki7x4lsywDf3HiLp0Q5W9t/GHcOhsLheqhmCMtYSY2daeVIAhqgMNWF08Zn4NQz003aeMqBLKCnd1/K+RKfdQ+x6i1C1EKwwWPIFoBEjFj+bwI9DYZYwrTh6G8kmFb24qD9ki9K25R4TdQalK29RyDecpKCnGY5er7bPLxgVN4EnoweZddjq6Cgq+Ylih9DG9FCwn4LlJ4NQrYQX46P5KoEer5j8O6cihdlxobmcfkAT0SvDCXGYdo3EeTqIXfQMVYxWGBxCFbStFDTpmHNMxUQMMcvr1QqhtmfR7lqAlQAdcaBq7GVxddLnTL+7kDRaWReHq9aJwgcvjBEbRweQIvM7NYOSnqkeTPCVFlkO0Pgb6ao96HzYdPt5UXN+7q0q87BoFQyUaajraDZntSx5SE0Tlfp/9zZoDlCjM9bS1u83sOutWhw0nyawzmNmR+dK2nM1vvnZivgCv4cyXxlq+dDnxaSfDhDgKiWwue04dMWrpTgZ5m3fPTKjh3m7dTm33nkrpHwqP7c0V4s++02pCURWFItyrPe4yhkWC6E4VbJ/blAyiOyJEd8i5BypD6aOO8iXqtaYvgNQ9/xzV4S5UoGyyz+6sT1a6LSwu0sBCnKo/FqkTSvrL8Vl2o56YBxpIFAGgUeZw7a/HQ8R4asi01fIljmc51aNXsr9sifF+uAodfb83MkW4zUWqphA+xbOntMu4ECiVPQ4CmnIToxaXBGcpIkmQOF73Sd0OxOoSyprVJxhgaNSZQfwRAfY8f05zQAsFPvj9k6uwkc13bPBJUUDVqSbd9Cectf08tNaqsm4i5j0BJyPCmYecjiB3mPeIDZsiP6+42B4DP6DW2JptjwtKjxAXC+UitjiyVJXo1fXDBRXwxyJ6OgA6FDMEXMck2DsUqEvO3Xz6aa4WCsEqX4Lr2oDXy2ADsjNOgQdCHzlwn+tJPG37+n3t+8ASWxhhDiKYukt+g2E9qKgOSOxgLR4h6Gj+LaJcjSjg61sEjfKqlPPjZ/olbDyl1N/az9kOvw9OA7AdkYhCYZBUDuGEMZmJa0zOf7s/nUKyFr5wSaZgISCSlSjfKSSrvnBeh0Sy+mHZyKvJfumfCq7wmC8jen0QMM4nPYDxij0mC1MjxnwIY55TaUcGMR8RYj4IF3+zUBoZwnxEhPmQmRS22gk/amQI8xER5kN2UC+qLyOzgxoRPTwInwUIMGMFj8wOakTE7SB2FR05Kc6PzA1qRLTrIDoU/T19szPb7UZA6SAwEyMlvY0sARWhnINARsBr0gk+cw4aEfs4iGPEXJnuBzLo44jQx0F0HoZzRmgZmXfNiIC+QXAeMWNpk2a9NOL5hvB8yAqkc7SfRoK3fJnKXvpcRro10nN3Gvji6jfuwBCLnPUqRUHiwe3iIUKbyUmNCBgcAgxiIko7cYYYHBExOBwxOF9isQwxOCJicAgxiLU9vUiGGBwRMTiW6u6Wo/1GBhkcETI4CP/rLcXYjQwwOCJgcKz6KyAiQwyOiBgcQgy+ASIywOCIgMGxlEZ9gcKPDDE4ImJwyPrjFVWRQQZHhAwOwv9AjMimmAwwOCJgcCx11vWS484QgyMiBsc6f4VmrKyzRtzd2Li7F1RFhrsbEXc3hLuj4UP2OBnwbkTg3RDwDprR+UWy7hqBd4MwugJx2HTCy6B3I0LvhqB30DVOMU0Z9G5E6N0Q9G6ul1kzg96NCL0bgt69MAZHhrwbEXk3TjdLT7HHI0PejYi8G+eviKYMejci9G6coigdP60C7h6vcX6bid54l8ndTF0/coTCjqdJiw/OUlxHaLOBbAE9RKe8V4B3YeZ0ECzALSQBL6tLp+9xv2FkzEMUopLOnjMD+s0I9JuH+Dv2co1kXMwI9JvHb7pvM8P5zYjzm8dvum8zw/nNiPObh+gcPe1HMwP6zQj0mw70Ky/XwFnW6VA5LvTwQECgV4/oojGJyNJydYmfO5YAIY/hRQHPse/3Pdzws0B8PIslZoQSTocS5hIlM0MSzogknEISvul+zwxJOCOScBIWyCROslGZGZJwRiThFJKQftrpjSTLxIxIwilp03nmC9bMsIQzYgmnsIQvCmM6+z9VYWxGzOQUZvJFYUxn/yqMfTdgnPOEF31RGNPZf15hbEZE6iy/6nrNDJE6IyJ1CpH6okWls3+1qLwh/mi3Xyf6TO92RmDsdGDsmQe/MxO8nRGqOh2q+kJznBlUdUao6nSo6pmDRHR64yZN+fDev6zLK/XGKRBgFBNxWanp1uVlwiBYRFL6Eu5DdzF/3GBcRQhpJacYptQBcqWzTByv+ZVHuFS0ixtjNs+PIyNxVz8GbRgwxx7HsdMH0HP2cdro6FEsVhVnxNlOqfXOM08CzEytd0Zo7HRo7Pmy/GfQ2BmhsZNw1Lfc3szkemdEsE6iUYn/zUJQnq0X+XeXrxRis1xZtrz7F6YYV6MfWSl0WsSg6ygfJ7XyGeGw0+GwLyRTnVYpYf5UF+XuPvZlDU2W9qXXfal0DwaFlI4wR0As5bGJMS+LMuWy5Twclf642zhFEET7Jmc9M9ztjLjbSRBtWS8kQ51urpSyAVi3Wt0Nca7s2ZBKwiLTPr3/qVWHwrBk4dZRU+TVjHjeSWwu/I2yPJOfBZiibAE9HKl/wOquNKrOsX7aCaumAPE6MFPgLgpQRBN0xcetxPlLqOB15OgRnd7C7W14qfYmFZTi271KBAdBH5tfoPoYTJJVJzzReY8TzYUcfoHwQbYtnBF1PIU6Xi80I51mfQk+gChGXc55QwLP19orRQMUp7Y53vhh8QQY9inkAA2AVIRCoRCyLtR3cd2WKrur5frNlKqXmvHZXKTlrl9BZUFVK8J0iUhAlRJ7anjroYufBHJBOoFHWOylErO2nxWKReR2fg4wReUOd+7aFebh7vc03KG4/kzBWuZlNVd/VAXCbUrnmV+TuPLRfhbdR/Gj0nyGVOGS7dZEaZg/CmAYJZLxY6cKZqjoH5RrYaRwTBmEnVtGppAj22w3m2wxwasvTdZcVDWzch327qbQRdW8MrbiDC+rcl6RYkz3h2Mf9gvAKcjvRqZetAqTvo2+QP0BtChlHvb5RrGIjsN+f3pftsz7U9WDcXReH9r9W3waP7T78P4xilLzGd39R5+O+3Bev8sWr486+YzI+imF3/UibTYzaP2M0Prp+rt54mlmyPoZkfWz1nfaqE4+xK7WRr9S92KtrzlY6GK8ZUqdf/rp1msS6SwCvc8aJUNmROtPQu9fuKg6KTzpWj9IvwvbTArXuclU04EPgjsvTv8HRhZuCEHbY/6PeP8pvP+qR5oSnzXJU84IyJ8E19t6SXbqtNoWwald+LrupmZGh2sCW0RbR7yhbo0tPPk8FTJNh14Vh7kyRfOUrJPwfmaElgKeVuXLtahk34TjQ51/+q+bcIBtPNsort/E/YPmniWVdbYKy+Xe8W35XhJxhlSWEDpz6BAMx/FEi0rW9EvzWb0hoSCckm04IDdZdNI80SQS0CIWgft+bHbE0h9toxLgllmFYNv4hEHPeBb68dyaGMc2LAUes8tFFfpNmukWrFkItyp9i++jw1GGsECchpMBNgyanNe6YAXT35DRWLToOak0JCd3A/jM5bjoqiKjRqxf8sYE0dE19mkFL6uxxvdW7kO7D6sOH28zRjxkYOCRKhAzj7e5rgVc5u9QnqKVK22fZTl7yhYXqgm67+Zm0ShfsAcgvFWP39jpfly+tsV9bQ9OMLLZPudewGWpajSCRl9iZoqzOQW1aJrq0m6Y+oGNk8lqoSIN/A2LXmCRQuehrkawS53bEBcbHHUr6ifRXbZjZ08b0pO2nRIqKjuAmN0V3wiZYVerNDfCHVXaaOIJaj33kZx0kb6f/i15q0Jf/Bz+O+qCBtc+efBiTtwRUWd0Akc49U+EqnJlBR6n83Yasv+n3GRpZeeiPybj304S7CGaQmOEhfCYQB+0szvrIoUsx1krP4KjAn+JTg6U0fBODmj7ScdUCNGdfG8Y7+WgJyu2Cuz50Ocr6vkHTQeL3tRgSowhTKebfav7zTd9d0j/TM3EqdlzZouRJD6TUS9CrfPc3zSkqw7NooUvlj56sgBBXzD/VfrXdzfc5TSo24axHV8zeAuHA8VgMrd/oNPwGNAIGL7dh/TAJcmBfUHflTvzQUQV74vXLfX+VJlGJHJLvz8lzwAj2t/8yU+XNxfcda5fo+OuDlvzBoek8n3oDf6YE+LWg4wquMPmMzzl8y5vzkschWnLJdywCQXXDno9SjtKZpta0oiJY+IMm+nblFPLHK6rLkd7Vs2cheJN4t8MvdP+oYq+1EqX7UWM9oddaizJ08Y9DKlfJ0ZD9rQ8q1JcdaAi1MZkf1vkl2tcorVmobRgnMkhn+a89I09B74a2HP7IAB3W1Gzn8lWvFC5CP3F90DyHq6B0NRte5Wnmv+itg1awTyjzqlMoMX4zJHdNpsEYOGYl4WjOl0cc8/YGAlvlhhonzOvdPbJAI89v/nkbZ15ib0mY3fo3sAIIKmSisHf+Rl+QLajRBXrCUG6NqOgTzPTK0YcQ3PTsj/t3XT4eNwYOJNWd64cJaez2tj4mgZPIWoLADMplCppjVxk6nZ8MC1ceGdLkML1I0j6nPJlPUjsYHhD109O1HNbK8PvwUVJ5/C1admObprt6Ia4ZkVUe88K5IenpT2OIYZf0UufTnBAzU+tjITsaLIQWuxukB09dxwz2s+SRNsoP4vPgBs+CXKFip48liu2WYfTArAi89Ox53iTsYBGBBqDXn6+ayJ8XM1QSWngPkvhT7V1xTzIaRWVXfoV9JAc47J+QPl2YTTZ4xkU4q86lwaskkZgK8DRj54Rt0MiUK6XqY5nibRFiKk8xSjbWnYpU4HcBjsCJj+Wz7BJUZBy0Inp8k6Se7VHsIWpWL1joLKlJ8r5g+/4dDNjtNqmsaDT6X1DhUrv+/S3bVBi5vx5oLbLt417ZMNjddZrt7P7NANr+8XYiEU+vdh+v82+rre5iHmuatX92php4RDnZl8vkJocR5Ny4/UCK3cbfASufK3Z/oLepZcwRcs598ukWiCtoD/HeL7MuIck2xT10fxltj2Ta297aHYVnWRHlQSHa9u/5p7Tjt38zPZpKut7JoeWoWZyEGQ0k0M+4q78UC34Y6gByZqZ0Syb+KTEqDgTmFcbv3CimqPmZLXnrFtO1e7Cjrm0p4097xsnj8rV8EFxm5GKO0XFPY63WXHb34Byoq5ftupoac6AbEsNiFPuYdO8JRHbOoPr6N6SiJ7U4aEPoA6P5K26ORI6ztZqF1sLP85uwcI/uzd4QerLYO+qnXGVJQVhQNuPY2xb7KPI/nntNueusqhqVzzkrFRM1osgUkKtT93kU5q3u/ULJ1jvtuvhkzojW3mSeQx8flZV40nOCpgBipeubVfLtXuapqUXSVw2N9liR7uq64f0Tj0QwHhhc+OW+f1WdxVz40awof0BUU3ENS6tnwaeKS+2Nku8ifY1yK2gAvUQ4cCubSoKI75Clx1Cm5uHsukQJsEy6D4cOnw0XUw1iKN9kFqdddFtkW7NwREQeFGMpoYaRt4d7d2Hx2qUFOWcPM7+Fbb4EO/9O1qxrRvrQxz8BKZSkJjVYEeG2Af7eXrchvV5D/FxRWucFn0Eo700bOszLxUZ4ZPsbuzgMtlNnd1W8ZdDvNphepcBIUUdhTZTvfnU5RHq2t2CHYRPbW1HqChp2o7L9NDV9iqCFWSpLn7u+I27LD2zYarSM1fGhnzmnjxz3IWQjM5SxfrYGWt17YLIIU+vzceOxjnN8Amhvlj9jXQHTJXp8wg0/FkJgfHhmofbDvkznPczAD/HZ8CTRSGgGUnzU6R5kOzSXtt3UQQySlZ9260oA4LF2h4WpVDO04k9gG7xjXYqq7CC4bkU5B+IEkBVRQkTjky+7cmjvbnX0iZW1eErMJnkTDYpFsB4b8qrKBTlTpPZD3xD2Q8SP33+Ns9sQDdUpB8QfJTjQOCJ/nMHLJjTd25jAUlh3GZjgjy5KF9BK25MHFxQuJW1gPyEchV4RGUoFolNvMronMAO9lTfTJWdq8B+oRyFiZblfRUZrbHzEsjneQaCf7skUVyvZMPgYddEasox+KESC2g8Tyzg2dhpkEOoO8mAyoxnA05uU5kNWCS3lXp/yiVn7WSAfyg8VtnJAL/WxdpSMoCJLCvXkYhZkdM4o7zC7L4lzFWIdFpzrDnFDIQrrhtgrYvIDkNshuZkV3E6dSaf9blzuXSQZ1QI8rZsEc7pjEZU8shR5J5as5MBjjG6Y5DUiRgXiFV6Em9TWQCmZvvnPK+UOAyqi9SpmWVtNFelLXvn9mb7hny3Tdw/dimv91w1wk/zuXc5s9C9mhQ9T41w47hp16SYF7cMRE6YjbXabqOj7CwCuHjeRuX05Rx/oDYCOUMZFdYCtEOC1jUf7TyvPQJ27wrBELsdbP3TW2thI1gVTYAB2Z2S7VQ4Bve+L8cU0hTicsvPnylqTJKIOw/P61BGhTos96Hdh1WHj3cQd2pdRuaQhU+cluctJ1FL8WIKSMJVgIDj/Dm5IpwIUI0YWkhQs0zfmDNlAr4x9rRDiSSrqqGAKwuUEOSGP5ReEJBWnPepw8cTxO0J9SFeASw6W/aSKVWV7vm1DYUAQvCWx2dMgcCVIwwbn8Kt9VlkWFyZshVr9sRjsbFRv9TUDfb3JZZfWWk4ae5J6Yi5pRBOogaJNZhFeOLKxvMtSBIERymMKSsqrMEJ3t3Pvj97k3HyvDnwVyNkzy7dDBhLfLUCFzAsVn8+O6Bx7UcxKx7v6+HTR7ay3QHup8c0O1IfgBm1MaZcskA1z6cSbhZoS1B94sC2e8p0xBzwO30dNvZLdPHKSqfLeiyRnCFG4HlUJufZexE+nLSswOxA9cv2qaw/AelJTRCKwIhlbuSytfF8wzFW77853ftZ8z29UsTEUM7mtFm9IFC/zeVc5pdPR6WWP62+sPMmVmLQ0QLzv2qiUze8nO9uRhGmuvfK9dMfQWeUZpgUJDCs3fksk0EPo4jBlAnYm5+7Tu984wYpc1d1tOol07Nr+UClwp1m77Sj7M7r3CVRR4Bp2yGHIpZ/71RhqZ6lr9w3Iw3nhdByeZVjsejVE2+jbnkPWf9grdJ6hM03ly2W4ozLKWUz+MI+B0ai+xERkMVUnDAlTCyuUYU48z8T+ANgykJEO79gh/b3GJbcgH6YiyTFgT9sCCI9R6iZi9+VwT2md+tuGI6Rsk6OWcQY7Ft+yCQVIw9haHVY78N2H3YdPt59DP5/l4aYmTTEjNIQkzILEEr4zBU3PiODikRdhkltASP1K5tmeBrhm3IkiAMWa3EGZfylLCtO8fDxa3FtlnDBepGGm5kR24xU9ikjtvUiDeenMYoRoEynPxHSxjz3JklNQjSpt9M3AHJQueg4v+CR39K6SGNt6JvskJ/xSGTNT7Hm14tb68x48zPy5qes2bCFzl8TdY+ZcpteXK9bj2ysscHq9Y6+595zX2F4kbAOZoupBDlwS1xEsP1UZfN0qgNAxRzvSGoLMocw3MNO3IPDMaC1tPxPNf7ocVZ2MK8QEznNqSj7bETA628LIScfQPRL8UW4bJEFeTv2HbB31aEw5TBykQyKgIt+OO7D6Ummstr1C0vOQvwCYwR9gSgb/9Tuw6rDx6uL650M8VZ/QfnwNOIWj/6bQ18wWY/pHJtZ3a2KJktAlS+hSRzejRKzvJyO5So+KLGzglKpVjEkHo3W0/pdaD+6pEokwB2coLRt9XBmUY6HThULpQWoLT2eN66MMu8jkDN93p2DQt3Ys+zDHwMaLYMKcrgx6cxUbtB5H4zN0QCoSPGJGr3JefONgIxC+g4rFmXRMrVPR8dkem4zijpMWcKt8Ta5ZLyvqOow5aOG9Sm9SKbrMKOuw5SL2XoRedHpQRhm+yGOarZyN6i0yaCByMTUwR0Mvo1+q7gRaztVZ9FwyAhWUheq8MqEO+0j+PP1T32GrVFJYsp7bDFVnMRFmZbEjFoScwrBz4xeaz1e45a3WVvehtAipRxUhjUv3cyd+8IWgMl+RgzSXhzDpe4agOHy3TXKPxnBKa7tU5Zr+4BN44JtS7teKZaVoytPiBQaZ0pW1Yy1g8r4i+pDRKIOfhf5E67+friIwMOfmbnB2amV1ZTyb6zuY/pjxOKfrlOCT4+lN2prTAplUIL0RL+Ibdq+dNAlXgp0LnXxPti52tLSaO7rur4lOXF3VAI8H9ND1OeY8h7DM2YCHTq9hTX1cut07aLjSwbwEtZUiIn0ESXY1vb0nPyoXWKXruOHraWs3gbLOdgpYM5oH7i10VAZepqlDuEo1353lOPDzLvl9rY6poDE+ExLCTab/g6xGTFjVY/xJ7kgBLdg27UP1/UpM1msHRi3nfuQFJInRyTqlkyKkACwCHJZbNjxVQORYubpLYxxpAiBpkjDKxmSiiP+Xe6+qH0cXG568cUcYkWV+Av83WDz4GVoFkeDyMgNQYBGDmYoNe6Jeb+pqIb76HMjNjhGtOC5JBw/PU2mlwg5aSaJP2PXq9zzeqNxGT9JMCzP9SoKtUwpsQAFnM+zviE1Zv8pz4IeSawzPEDPbeDErT/5d9tWSisymKK3SZTiESTi2S0QWxH/8zlmEwy6yl5VY5CzhEhnzRe6+tHidi/NcNGGtdTjUePSLLUXynqlj5ptWqPay5y+Qr4QkTK1lxnVXqbUXlBLSS+Sqb3MqPYypfayXuxbdTqJMBbDKiyEi8bUyDjjHXhcgeZW2PFHXEH8tYIJsvyAsSmL5uV+2O/DocDj8QRxtZQ73XpRztHpb+qpMGUXJqEwoVMu5U1AEbTV7/Qn5qhlvZequRhO3MBOCkESNjCbB+0UorsIrD6Sa/kCJXzjDzrTMVV1Xk6Z9L7kPE0osuJJFE49oJxEZTKcR0RRAJTye1+cQCBIWhbZwn5o92G9D5sOH20bgwhp8DAPnLYtITvNzS8YLnEhZhoYMyIazRlip/nXSj3WZdNN5wxW2KE7534ZixLgvT4m6yjvMyXvgwRxfn/tvxInE83w3xkoR2WhKWUhhAb57Wfb2qgsNKUstN7kHpYIEnz5pyD0UOPserwunAEeZHxgnsu7xxjEk0K5IXELnlGYaMrLcL2JNPB0dg8nzdv/j24hzssUKTKk4tKgORM2mlHYaErYaL0xqjNhoxmFjaaEjdYbozoTNppR2GhK2Gi9Map5+nLzFWV5frn5Sq76wlfBDfFLybYLcQbEfXdT3u9E/WL6tuzCFrOWw4sZde6jJjdnWDtJ0gLGHcIrnEasm7L4ZbG+Q5VzpPbczXedL1n8KM80Jc+03ljRPG30px1Y2rlwnBye5/o5VXNG/MfDx6/FKU86TueLdevMdJxm1HGa0nFCZ0xTTZmO04w6TlM6TucbdzfTcZpRx2lKxwnCtPlFMhZxFHKaEnKCpm1+kbkRzOg6Akw6lBdFTHHJqudkUEOb1VFkggZRVVqG8+b5skVcWL8w3sxgC2pO5pExnnZ4mFBx7fTqLKwOlHDHLK40GcaE0mS4ijYe2JgoTQbUmWuDC/o9L5FmJce4h+ksmgG940Lh/JRO7d67JQSsw3Efntch02B+aPfhVhIoJ7cGhJac3GgTwAzgol11nu8XFSfB0ydByyfBTC5rRrmsST0qY5dJL5JNglHDaknD6nwhK+v0TalXtg0tcLm3SbwRlPnbee7OKGMbKOe5243uVDDR2hZaJjysc6t9zlhUW1Eya0ky63zxClyZZtaKmllLmlnni83fykSzVhTNWhLNOl8c+nT6f3H3tjty5EiW6Lvoz+4PodpJ/yIHg/l/n2FxUQhlhlSBSmVkR6akrhnsu1/QSB4z0s2Yoaruwd1FA9WujEw6w5002sexcyhnUdRS0k5Ch3wCxxQuDXLNN2oinUp1Lvmfezo0DpOY+0lkG+Z085M/pk22FaRqwszklMLkM0A1YbMJm0/5HVc6UFzO+aS8cOa6T/s80xftrvjUidPY77VnpYCffGkejMGRkIcjWqbcChio12/LOTyiEaGWgjSNlXboTPs2w14IbzRlPCE5qdSvmTzX6MibTXXt6GouxxFRT4EHEzgz5D8L/NOIS5JFyL9ABqP81PPlzJdL/t3Dy1j6l5HPAkP7LGg6paEnFwuZXCwaAlv5Y+zJIyNe5lUl5hwQHvCOFDwHa1WFdFPCUuQtKSgP7C259TPOB4/Xj/6gUZmFnsosTMUoLqo9yx8nhN5KchUZzZK8t5Sw3X9x+0ZoluUXT0eDo4boFAwmYx0UeonQE6GFTIQWDZGsoBGhhZ4ILRCpWQp1lpigT90YGg9a6HnQAnF9UY+TUi8NmqRq6OnBAtFdJfKGxAkf+yE0+9YTZIVMkJVwYRpJcdAEVUNPXxWIiioxBCnsMkEjrwo9eVXI5FXJB1Aa9IOmphp6IqeQiZwSHZE6huJfhZ7IKWQip+S3qGNoq7zncQrEyUSlHYVNNWg0TqGncQqZxskReO7otgZNcTT0VEshK44SqbLCLR40xdHQMyEFYjVK+UElvx00HqTQ8yCFzIOUmhPUxa7xIIWeBylkiVCicFBnoq3UnggpZClPyiZo70aT8gw9d1HI3EUuIQq1PaNJeYaeUij4nCtIToMClgkap1DoOYWCL6tV5/QMmphn6Ml/gh+B7IOm5Rl61p6QWXtS3+tRZDpoSp6h59QJc1msxrmqKXmGnm8kZL6R5EVo21ejGwk93UiYy2pNXBjb4ZlqdCOhpxsJczarhpRd0JQ8Q88NEoimgyQNFdbtoCl5hp7ZIxBLR4KFaPTQQSP2CD2xR5iLXTWO/jnTy1M9bf9I1LoJCE8l/aRHRelGgu2FnN+NxCJELK2ZtyTFe5lIZc56UJSemntoaeg5OcK8j04NTb4z9EwQgdrAzVNDk+8Mfed4mOPo1NDkO0Pfjx2Wsv4NzyR/nDIroTr51Oc0UYIzuX+hKK7OBCogMsoM9qGHOlFVcF83NKuEKgKevGc3x5z7P7hQfRN1yBKh0RAkzB/XTG9OTIWVC/jZTaWCFzUUJT6GNSsHJLxtRrSnKCrPnfpHM+ELJYLzjBNdjEvlyJLyTYomVK04TL7f3EsOChcjnss90ZV9LSshLpL5J0mtLcTRlkhpMt3PQsyhS5VcolwF4UtT9OVSRzNl0w9z641GFj2NBrQqf0ztxkllkTreto9UJ0lqrVT9KMyexEGUs43E8+BL17ovzKy13zA1BaxU8kstcKWSn7BkhK1IXBy5yJkQbgUfQISK+XWkW/klFzlTJnMhTFp6buu+1Z/GJWs70EuijCMFdAuRDC59Ljn0va0hq69GQ5AwaOqroW/5DLnl03tdXjdo6quh72cMWX11TtUy7dTX1FdD39kXcmcfKYJqTsyiWay+Ky5kndS4WJZCM1l9m1nIOqmp/qYPotmsvuUrUDfN7HXwQ1i1I7tvwAnUdZJsgXpCafKmoW9UCVneNMkQql9m1c7svtMiZOHOaAgJhlU7s/tmh0AdAKkVQzsINPnM0PcMhDWv1jkaT0RbrT3ePqz5zF6NlNGqrdYe2x4IJk7WbU155H4MbbH2yPKQRf9SJ5c+EW2x9sjykOXxogE6DKu2WHuIcsgQ5WjIDwYNohx6iHLI6nUJla0Poi3XHqUctrJcDaO2acu1Bx+HrSxXwwrQxxloOS9FPnXfCwQqNeUlCNRM1K6ZIzUfXhM1H9b80Zp9t2X5uJJGT8ISu8ynmQDLjshyUmb4MNt+X2QYc9yMHaopdoUeexwy9jhx1uiDaDujxx6HjD2OBiQyaKJdoUfBhoyCjQYkMmiqXaGHloYMLY0GJDJosl2hR3iGjPCMCbC2J/xNP4i2NXqEZ8gIz7gZq1pDeIYe4RkIPJm4QLWO/6Apd4Uebxn2vDM2Y2dkOCZBpB25PqnmmQlWt4+5xcMX9oDkSFOtylUBa1CskvNHUPKYe0pSB82euzyIlc2TjkCWCEx9HHPmowmFPo1Kq9SvTADHOfe65r1VSOuI994TF1Akz8xTe0+ug+WKGAG9qAUlUarNmXDNkzOZZ78QdUCCaS1EZprg7cs2lTbe3FXi1ux1ToSCL6xnyZMnNrMEeC7MqolNNjdMJtQWNZwk3404IgszKXmrNGly6xLyJVa44OwLnCtPw62ZloWo/BbiyEn/TcRKZYSE4ii/Gyl/Tb9LpAC/LOm/cYu4pIJjuXR86fly5kuq8SVkd8wiEPmnRNSRitlxx3Tiznfb+W6B7xbK3Q7rsje2eza2QdeDC5oeXOgxq2HPNjAYRoM+9pX4kgIon/Gge5ZqrAAjhkSVPviKAE4UlwXmuJTOhj01qRJNQbLlc4ljNqrFku7wQs0FCYW4LK58SJ3dmRWPOqgS2GnL6N+YJCv3ApZKgpO5i23LUripE8YDnJW7LBLUcSYk40LLxa0VahUr+CldrioOKvSA20Ao0URbqKY0C96W/KaPmat89mB0pUbMRPAwU09gQscuE4EwEyeCK7zZCY9caO89gSQOUMTQQ1UDwTCJbUqLDQpYNZewaFao5uwf53nK7Ol5UhtxnSas1poCz4lKiMQilVVstmOE3mNAAyElgyHlmD+VzyY1g69FZSkhOBOFTQaNZXB0YrfdM1d6WpEJi56bNlwW5+nR2qFHaoaM1IwGOCx/nMF2iUOXutYSLI9aeFLFL4HXSkojmUiiJgpFwnz+GDPrfPqwqvuky8CXUdX8CT0YNGQwaDTAU/njtRAA0bHj18IGmuiHCPvwkbZdolvIRN/J3lMnYV6QiZSwkLYAAJ6eY9ZjIaUAOs72TBOaRFsJUzElvjii6J6JZC0xssWPxWSn1TERNcK21WNrofROYVRzGWO5UDMR0cT4TPi2b/Ukc7nlJnOUEz6SWgvKWZU0UJbcIJXgv6F8xZXuT2I+mYPN02nkiDyi0IInLq58LhEvZ6ydzDtNaUqcRrVrcif+jdQgFDIp1UYANaK1IV7N9A1IIiY1AUVi6UiHcczslgmwmLnZCLkyEUsGoTPLcyIuukwklFob6FfzJZF77ETdhF/NnZT0cDeX6TO3SvBN98oktYkyupw6NFYk7zmRAThqzyabSQyd5c9ipgbLPyX8eZp+jBv/dOfLwJcxXx5Wce/NEbLYTwZuKn+8F0LFMGV8Z+mSSPI6rAWSSX5Thi6dfGtihq7Z2dyCs7hiCnzSn9a0BkIPcw6EGvaTgaXKH6fdTg15JFi++YxFWCjZl9Wm45JXSSHCpmg5/2KidVVhFT1cORDGdt901YP8KbG1TEQCPBHNNG0W6uEgupQQ8zZfpjXv7pQEy137QXTtEw3LvAgOAyJr2bP7Sb2nvjDI0kqcKfVGvupaGIDXUDc5MdsRlcriyh7fCsdNovGNle43eQWZPHUpjmtyelJ3Yx7D0yToqhA6LoXZdyFm31BUtGeijkkpwbn+aaH0TWjChQZOJ/lKRDUf06lK3y0z4WxkCWNhY836QUl4a6EttRaijhRSZk6g1I3ti0VdyEbsyeJU7YKleNYr1RAmYunI/L+J/SgbmpTU2gqJcCy65wnjsmVWmrQ+6JukTbuTFvYM45OxCfRgUpi5ZxLoJFWQW87njzuZlT0df3V1ZEp+YsCey+9nPixixS6MwPFjwGghq3Jngsny+qZst8lIZfaalF/Nggo+r/D8CIjLJc/PkW7XL/kq21hoFBDjS4qL8kjBbeXmBKehb0B7Jf/Qk7pEzhdP08qXG//Czj/NMUq6ivWKqITylcMvEs1P/iHfyRFVU6DPV3y+4WrHFW7jcBuP22SyH7rCXfKJR1cLrnAPj3t43MPjHh73mHGPOd/jYEr6+IDg8H4ymrjzx3uhZoHgGDVCpQqwIyWV1CKb8zQJm5tAf1m1KC3JpbCmol7jE/199m88If41/6YH6QeCvfvJqrFqIryhh8oHgr37yapt0sf0eOP8MXdSh9zOmHJL5CQ5Yq4qtIm5JkENVeQU5VDHFY21TOgUSQiyhD+FYGsrdLwuPY05k755agZNWLKd7FEmtkwWKY8377mpeiWTlIkOs0maipCZI+OXrcyWEGiZ8nNeQcmV5LyJYYwqAaGMl15X0hKkt5UaXDyJWedfcxNFw8lXJbUylwFM3u/lr93s5ypQmB2QmPlIUlRE0X+Op+mZ7CRLl3+aQXg7SLuoTTC6qnboiVf2l2RFfOJkxWVm6U3LKFNE0U8XV24Mgi/iNM16iYeoo+9+CLm9IaUS9HWhJdb69oWQ+xMSqbk+iJZY6xsQQm5AmBZrhWqJtb4BIVAzgZ+syhN9TETfa2WsWRe5gVmVLOdT15Tno9Lstokad+5Fz+qkPtH2b9QY4BO5g76pe3cvZnfPKn7Qx4iAMzFQzOdv0keKH1MAnuPd7FAR0USuvpKuSTrAcjuQn9bi5aVLrzt8ff9EoC4Cn0DUKuhPE4YOfedByK0Flh5b0IShQ99QEKg5INFR6GG61lAQ+oaCELMNTcGMlnDVGgpC31AQYrahRIqgDaJlsvuGgkDNAWSaFNGWoPUThL6fIOSGAUuHLWjK0KHHuoeMdU8IA/3baPutx7oHwq1vqw7liLFkUJJ5oaPAV4I5wsNm2gji9aQlnI5M6v3KlQ3S6El5polw2ESTslG6JdU2iHJ9JZtNhK70u4f5dtsuEmjdp4YAbVlHTRs69kD3SKD1bVvUBxc1nHvsce5xyl03k87dlD8GhBgVIQEhTo3Q1OBLIJ5IMn/1iW0kwEy0SII5RjxGn7NWJHEwJZO1H0hEYo+qj1N2l4yiYNS0qGOPio9T2Yj6eRM1MerYo7njVDaift5EDc0dezR3JLD07nR4QdSkomOPr47TPjIr+WMS8skJB2rOiCTrlkJ54gBLBb1MlCWSdSmAptRBOmBKV+dKHZJLzmy4rDl4mODeTzCMTFb+eMsMEbJ5RGjzHUqPa5Fr3wBiL0q6pNmYnLWy9DLUhxDrG7VKBtdv0NhDveOUD3CjQBo1qHfsod7RTSPTVj7O5dKMcVqySF8927MkmHALSpNMOoGFlPBSMpgUcFVnYJtUDyD2WPKYNbUJaKRkMqIGJo89mDwSNDwxhK0pbl77MZQDNvZo8pgFlSejQBs1NHns0eTR5X1tFGijhiePPZ48EjjcJ1psBZMeNTx57PHk0WWH1ijyRg1QHntAeXR5X2861VXUEOWxR5RHl/feppPURg1SHntIeXR5P2w6BWPUIOWxh5RHn/fDphOsRQ1SHntIefQ5BWhk3qIGKo89qDwSQNxPBnFD1EDlsQeVxyyuO+26IEzUQOWxB5VHnxfsrreYRg1UHntQefQZqLuqda2oYcpjjymPPi/Y3bADGqY89pjy6POC3Y1Vr2HKY48pjwQQd6kooAmaRw1UHntQecyg8i3VsRR3PWqw8tjDyuOcF+xueAkarDz2sPI4Z4zapNtGDVYee1h5nPN63Q1PQ8OVxx5XHjOuPOk6EjFFP4a2XHtYeZzLctWj46jhymOPK49z0W9WQfJRw5XHHlce57Jcd/39ztpy7SHgkfDcnro8Ne9Xw4DHHgMeCdCd/JaFJE76MbTV2mPAIwG6CR68J62NfgxtsfYY8LjkmMLpzAlx0RZrj8+OhHlOrHhai0tctMXaw6QjYZNTvlzp54iLtlR7NHPMcGWf5BQ0i7Zoa7WH/8alrFXDh9Pgv7GH/8Zl6Ato6N/Yo3/jsg2PcQ39G3v0b8zoXwtFEjX0b+zRv3EZ+wIa+jf26N+4jH0BDf0be/RvXMe+gAb/jT38NxKWN6l/KmF/1NC/sUf/xtUP3QkN/Rt79G9cx56Ahv6NPfo3rmNPQMP/xh7/GwnLa6Fuowb/jT38N65jT0CD/8Ye/hvX4gkYHpaG/409/jeu2bRGtVc2avDf2MN/Y4b/Wqeehv6NPfo3FoJi48DSwL+xB//GLfutQc+0Rg38G3vwb8zgXxcmta0rauDf2IN/45ZXazACLY15OPaY3Ljl1RqMQEvD5MYekxszJjfhJTXVl/xxQhbMCQhD8f/+MdXq17hx1jxx2C+/EBs9cXulIsRO4AMCiFDP90yVUWIpWon8iSQY1wNHY+wRv3HLm8HA3UUN8Rt7xG/c8mYIiwqqihriN/aI30jo3cRKviyJargfQ9sMPeA3btl0G0RgUQP8xh7wG/dsug1AVtQAv7EH/MZM6WquZA3xG3vEb8yQXkMhIWoEq7FHZ8a97Aa9OBA1dGbs0ZlxL7vBcDV2bTf06MSY6UATT5k+iGa8ezBh3PN6NVBo+WPRAZipI/eS/3MJNZwV6xMFnqNGq4+p/yJXk4nmdCnleeKEIx6pxF9fK09x1vNOPc4w7sX31jluysdVRZWIM4mQTSiWZZLOXAsmQS1iAN5Sz+hMWbCM90tMgHNhofFSQTUzxBE9Wabli1smBll/SVR5VNOsbJr0u0S3WVhGMtfWwpcrX258uavMm7EHOUZCE1qsEPnTObOQhAwCJcQlJeYT7+KyFwyA6ImlHtrU3RmpL5LkgrJGS0j0sJnII9G0TnEz3llvPvZsPoxCWv6YGJNc7c5N+O0EBd+ovzcTcJDQBCUxf4nT8dH05oZAYAZRRf6QnkOgFbAQl3O+dwLIZ0LQmYrsSwHD5ucRMhIqPSQShcoTcnsPkYs9CC1mlJlFe5E/Bgt1zt2uXvIWEmnwshcC1DBthADITax5ciR5H7LOyFZQNwsxzNJ9M1FneZuJg728zckfZ9/bTIKf+IQLU99h0IxmD1mJGbKSsCTq5s18k+lxph1X9RLTK3Fl1RJyhbiOdhIApFR3QiUk9ertlyVLJaZ1kwCuPqnR7EmI/TCz3hJnlEqCteszWzItMLUU1JqgwpFDU6O2Ay5BgMlqprcxT65076Zy+zKvtfaw0gvepkOVoUfDxIyGSVRD+mTXMtnk92TG/403fS6T7OmKZpt+SZQKXG3uJqLrXCDJM0tukU/lIHXT99CMmKEZiQRJn2TFp6fJVZgSGYE53VJMjdgFk1jCRLSRJMRGDdtZtysVFKOY42Fi/QmS4R4J0qtPbBe95FnjYBG7kCZGQtP0hl1BM3tqByqzSHAeorJONqJhvvWpcYFo4NNl4MuocobGHmYSC8+l19nZ8sdEQ5eQHyRrsOenmpwMl3kcd3qWWYkrP8sE7GIVx/ItiE45fwsSHyPVCTpJaOq4TFP3vserxR7cEjO4JZFe6VOPZdWmh3t47muVZSvColMQr4L7+xN2PT/pnZZG6lETplG8ntQvvqBnTM67P0gy1oXIt7R554+J/DaWhrAtFBnfpcr4Jvm9LbOCJ3fIF8LM3DA/r6WXJvWpZwE6Yvkl2rM1FfbmzHu2lB76lL5M0LDU2e5IRW7JA2eBj4QycL70yaRLcs1Sp4hbqJrrSOidDju6XKnKTlyHCSWaIpzDSuwhNjFDbBJXv3ogaBCb2ENsYmHv9DpOJ39Mmz21h9Aqdh9zz0Y5GRNkt+hmp0eY7W/MvQYLaRj6BFYharws2kDqeVnZPmzlCCF1xISITCI9hxXRY3pixvQQL5k66xnoh8bKZosxk3hYta1ckE1CY1SPzVNaEq48rY8CuCRy+Hq56za4xw3FjBsi5jF1ovlUywzXe1HNzZqKa2lgJFnmwnTnmJfdlar7RnyDmXrdk1IK8cpmvZeE/Kbup9TJN7vMD+0/blknIzle5CmnYzCQTJoLWSaiUrlPxO6w0lcmA3kgcI09yinGcjYaB3ms4gjJB6H1U6hKSYtxyvo5cxUtdq6I3hELdyYIX0sLHMm7bJmPf6Yvn9bgXNhKI3ozSQsxUCAyhcL+v+CBTNTnHArDZW6CS+PlJrjUk7NnDoyyMHzugiKy0tUTcQ012u1rfl7zL8SRmnUUYj5xIjVUJME2WvbbgRYk9jCvSJgt7wyVqajhvGKP84qFGNYAKEcN5xV7nFcsnKaz4evkj7cS5s2uCKCRGU4gRyZ699mhbPoW99KQmGX9QmoypAbYRCDKTO5rzAs79enGQr6eje5MRNrbXBsNs/2l5lNH0F3iecwiJnkJkVVO7hWZ4vUXEi4hlGyibS1Gmboii3DydrTE/cFKMDGDCi/G2j+WqqvE0pvO1TkfLT5ztyxL1XxJ+z85KEvWVM3nQ17aid/KkUexFF2YxCNGNJsplKTDJO1uWtVJZ4mAzdNclelT6owoPdMAWeku8flk5eAkzZLbF1JWIa65LyB8TEYny4jHLCifxG6pW3pJEWogYkYCHWcJ3OT0T9TgtK89QUDs4HTzVFhqVSqn8il8/KwWlQl7S4CaZSEjtHNTO0OOzdLRkMmlHGKzOQ1F98oAwKnwYifrRrj6A6VBmUIzY2cTR5VP/+kzduqMl4yjOszY9TP2Nk1V+fSfPmOvzng1nrHvZzxns6VGuuXjenRk87KW1oLEYVSsi6NGqHREBurC9wS/zy7dlhpvqbOR2izoG24pCUFqE5GUUedi1LOU757OBuKxTfmbjTZFsv57jtvSVshdGrF07eQBnacR6XCYydGgBoVEppEl5LO+MDVzr2Gqn2fGdlKXzKRJ6dK7OWt+JKntpBpVL6N2pJTH1DzWLLq7qP5i+Zh8oXTmlU5B6g/0a5aencnbzeE0+RBZByYmu7SV1mqXvb3UR+zdorYHlls1U8uauIt6UJWPD4Os/SD5yNSZtMrHNSjPh9HmZTQuUPxNenWhRr/8FVMOaM+JxPR3SXNQcQTLzZrJ5aNYb3GoH6eTZ1vRuZ4bIVO+lvs0Z+oDSccjE5Dh4eeZpYPVJektRcOj3KmZWcgzs3ZbkAaClSezT/ORsI6kh0Twxyw+UzHG4J8Bg3hiJc7cxMw8Q154ysocphr6qcY8VTWNWT4+DNKfOQW9qRNplY/7QVx/DLgce+lEWuVjBCCiT8TVlYM+kYWkelLaPj+R5BaHwsqXmwIp2UtGJf+eT4UzddW53va7nDPU2a3qx8ThMBP5RIrbiWo7rbKdRJ5i5kYh/DGFeW6Xwsz0ilNwsBH+NRSef08QXmoD/YUyVlumgZtJvthXsjo6PIhaJCtNJ07ylYQpktuyTbkEmEzJSgwAPWlH+QrNV85gqTSjYxG8fJxJGALpopX8ZcpbFCL3NZ9Ta00tkwJa4lzZKRjzbk1HbzzsLNcbXMKnGpTA5dMj3Teft/KU3TNYnw/ZLCKZMgakYp5h+TMxV1BoKA/eddXA02UGzYSzGdZ5rsrHNfcKMVrMvGQBvPQP1AmvW7EBWbEq/4zyWWLeh8n25j4DdZ3Op1U+5lqzknPlbEA+0lI/M1eduWuLKARz3jO18tccQGbB6usg5cbNRLPp11mwysf1qULr92hxc6o1dWDNrnqEM+XQ0ldaKBwiqq4EZylawEQWWdD0iffkSPpe7t/MNx8IOp67fJxzO6HSmWTvIPknVORY4C3O1J8di8RiPp9WyidsXhNbLMM308lGXwdkl4/N6SxzqR396en0x0fGQjudv6t8DMuv1WkpDssyzjHrdBWetVSMnSpf60afEebBEzUNHQfJcaS/7afp+wMqo62drghYPj4M0h8fGW3tdIaw8nGlCuUSDMyAy71Dye+n70WtRWQ8aXHmGl56Jc7Ruk/+8OqKMfNuyz/zjrS7lcDB97Y/A7udjg4vHx8G6a12YQsPKiasfEyOeEpb+CKplR20dS6rK9XGyBPOilo+6X8clpbvza/P5lfXAiwf09La02E8Zy80VcGrApwjaeWkZw5S2tyGmsKUTOuXHPP8Nqili6LIZZkPc+utbUaZu93w0DOxubULqWSVGvb/7C70vU3NeHWn49XLx4dBekPns6HTUeLl48MgvXny2TzpCO/y8WGQ3qhkvLrT0dnlY3rziSk9F8lTTSYXydMpkQv0KdueztQiPxMpq5Ho2NiT6acy94ZjzoZjVZGm5eO7p7LWqcy5zD370VR680NAeF2EoHwIAEEopw6RWKUgLdOOL8AzZEzBmlV/GUhgoQfK+M1ssnHZVeBr+bjSf3gH7gGSvCoy9oQWoI2ZqlGZEi3mhF2KfSlht4LsLWnQ5oRdSiVkouYk/enXojaX83XbEovAZQqMcuYuYUjSQsjKrTlzl8j+c+YuBVw5c7ek84UkGrJvNE1ZrX3J1jnlycszShHA4RH1ppMaBsiYK5nQ8nHmXfjoidmAtGzIMVtLItRtLH5NjypjnikdsbAMdpYcoyORcpupLzjLFaUOesptJoG7ktuc67NKtbyw5aIAspwulixnOnPzs0r0UgG62fSo0nFUFCm3xdXn45PDlTVFHXTn02xKPjRBaEo+dOsZRcoDaR7gOpC7KB8fw0p6PAkbVHsRGUzEEKJIcSZJPFMxnL6fgBWlsF0NKuf+KJjLUWCcsvnjAv5cs6zUUg6DBBt3udKUFpbmHW25IuUzH2WBry2J1zNdHibXHwxZHMDQ+igfU9C1LaK4nYOuQGQ+FdrDErtcv86xVsLwSHFSV4Bjc3VkEh6IVkVWnme8z2H6/ZGUdQkMgZDy8RGoxfAs+tONRNotpFYZpblrPsN0iHP5mPKmJUuQgHpZESzxrFApbs77l8qNxD6U+VarzCDlX0veYKqCYiQaScU1P2dOqMSYN39caHA6yGJOFqQEAuUpCANAxaApM5U5Sjnk3T2nKgXt6cSiGNdMkzJTwJlKIgvZxPqzUMj0y5tMdUE35aJfvlz4ci3zcRPJj6XpUme8+yUSnyrJjxG7zEKlRD+hIrKF47bvj//SATSrSJ3ycY0Qq79NiRcigQHQad22Ej1upLKQqqluiqSRu1JmI7lXEwker7Xrn4pf5GdT6jH53v18l95HWLKPoAPRy8eHQfrTfcnBhQ5ELx/PFdVBhDWJhAuYA0r8E+kX4TzinjmFCG5BVHZzLRhnoqySkspilYnAYabEfiJi3kgaLxHflFRkwrhN2aeg6juZ+lQNo/0902HtHJ2KPr1zNxENUPJgd2rMT/VQRwZ32g55oqX3LIoEhK5WWj4+DNKfvblpKsUC+uNcVOYassDJCeAsOBBdrNySHlDK02TF6ww+TbFG7l5Pyeh0dZhif7rlliynI7bLx4QiTDvSLblQG/JN918IIZIA8ESUR3ely8Nt+/Mqd3E5HeNdPj4M0p8rS8aszSpmrX6coT3xI6WTUq8lo9bo+SZiv0y8kRZaZi1JyMqU6JwzkeQEOXe35vp0RjnMRfXEZ6c+mb/UoJkvD7Pvj5Wl1PBVBFX5uGpJZvO9boqoZOZpnohbM9nbBK0jFjzisYSYpKdy+kw4FCKlWz767aAlmUh4PVF1Ldl8JnQb+QukWph/RvTdaXe6JDCaAIdEW+UcERiT0mQC2nmqhZHYSNZ+9DkgT9qUPpfj0u96qkmWy1D/zG8kGRlpyWfJ9/TTQKY+/3Su8pKpF5V8gVRKpHpcuQx8GfPl4aX0p24R49B1vMrHCHA0YLQGhybE8frL7ij+W8qlHeYs/VlEvXqGMFj5FOEf/VpmR6MDJyXSOSTkQLBJpJOi+IGpswzdzMSZ8mLlQ4Z45aLC6kpG30dh0RKZea6csF9cVORJGSnDtUtvBPvD0SiyrP1BljsRnS5aXj4+DNKfAUWHRNUwK58O/b70l9lGmm7f2h8Z62JrnpVP8arp135Z1/2f8qr7k2HNJ4Mu2V4+PgzS2/nc/uh0yfby8d2nSloAxMDojs8xnw3/78cPl+fv59vb+fH/eX48/+PDv/2v//Xhw8f/+vDrJf9z3j/S1D7823/97491Ih/+7b8+rPkn3uf/d2vMF/M+54tlKj9ZvKsXa73Y8sXq6kUdZ/Vzvagfza5e1I/mpV7U31mmclHvvu71d/b6O3uZzzb5elF+eZtxUX55W0K9qH+11t9Zy7fY93LTPZRfTkLwdJGaSctF+Sj1MOYHlQqc9crjaq1XHlfzVK/WrV7t+Nu93CEpbdarOmnn6qydW+s9/Fw/9Uu9h1/xs63ezdfn5HzAz8KMq/q3c31Tbq5P3y1bnd+KueBRun2rcw71ybuAb55EQMuVr+MlPplyhYUW8T0ivmVqMy1XO64w0wRMzIs1VePLVSz38M4tuKq/5xa+qn/hNvxF/ZapNIGrvW6IUGbg52nCVb3HvONnO36vLlo/7/x7deQ5OFzVv1imDVf1vktdB37B91gcfq9uQr94jOLxFyv+AjNY8ISWiL+N+ItYn8vqd1zFelXXrl/nFVd1LlvdHX6r689vdX/4ve4Pv9f94Xd8o93jCvfY64rw+4qfVXvkdzzJHc8v4M0EPMmk4Fau9oCrOkrA3yYAIF3N2L9UhS5X1ZRQYqxe7biiv/3fH2GK6Z/JNk+N1V3GVhcGK2AzTCsMArYFb9FEUVOu1gVbpb6GCY8DX0lsgRkPdZ3wUBe8mjC3D0v9cr/Q/+RXpFyd/iVTGxYe2GqO+Q85nAthsoaD/awrQB+umZ7z1iuAISpmTxvMNS9zG7/MuT7Vue4pHJQ48ra6zbf6y1gC+4wzoa4z52GH2V77UD/lZbHDDuPoEnZYWF/sDV4gE1vG+hfewcrw8vHL0boJqwWLsm/YLw5PZsZeW8w35z5SvS71+IrllaoAxnrAmVh3tTpqu1oTvaexHsoj0QfpRlmstfDOKP0w/s8N8/W1WeMpua2PA9coKW71p+O6mRvdTc3SJ6Uj6y3AhIR9MOd2yj4Fyn/iq6eyqZhWIqLWR4nYOQ5nIq/5DSd/CKZhcqm8Km62BsvQ7bFug2ID1OGW/u3v7z0CMtW7OeDaTm+11iT82urJ6KO1ayplxgxzd5ePX932kUdfDdTQlTZcLXar4Aa94zjVT99zdHDI2A6M+gC3dsc4c8dMdfLCq8cqdX6Gpx/x1QK8G3ig7MmEejZQo3a1s/ZC3H5vLexsnrj3WdjQ+gOz+cV9PWoIZ28N9yyHS0l1fbS5RgMLDro9IPRAMBX5GORwZLbv3u6CBJjRbx9qCOfXfKWN5hv/wTIfWA2aw8dn91bXAFsH7fwduG/+IyX+mtPVdN7uevcpNb4TbHhb9q+9BbFe3c9ZkH9acuCQEzimAu7IALxjrfQwVAs+jyHn/YHmn7d+IkS8O/QbBXw/aSX9L65bgNYiuXMB+tbb96aTPnfuqzra0kxuD7N1Qoudh1yEjKrtW6y99+btwAJLP69vfby19Sriez4lB4D6eO05tppeyl6/rgjM5gmra6kPaBCsdR5WEtIyvUxE8AP7Frvh7LV113D//rdL82xX06KNnFb/q1v2X5cw/3q0kbYPCIddHDTw4UdHjrhb+3TtSApJJZE0DCJ4m62bze3j2cxQLQbzKc9T52Vbe26PvMqw5SZ2kTjhFex7fW0DJ2cdf9vEBt30wOep9xasnRxgu9n+rna4NDdWLYE9LB+ozzS4VBKqV0c3UyQU6pHZJIrrX6hpBI+kK86pu8xgm2fa2S5wEMYJOF51U7v+xmm32X9t92oS3forB8vce7XWsnR+2er87PBqadedt1zureYxt/o8t2pIA9LLzsGf8PAnkCgVb2Ll1K8/vJPiRqmzdd25mujI3otmamyiDujbfMJuDVe/LIoNNU/mXF0PNf81V2cNXw4rL7XT46quZKw3hwSyC7zO8bdx4sSZ+T7b2Dtphlnvs/qh7HWu9X36elF+AmdTepHCY+S9BlsX4LnBwqx4IcVfU+ffeyGbmeHh1NEgYbQ6320/c8Hctf3WPsNlmUDOcOGcFBku+5zc+myMGbaOzvatOwFmZy8EjgtMZ27rzITpD6GcudeajqwgwLKLYiBSykoxMM4cGeNnGAWrMmmY16uASgNO4Gk6Jpe5xDbjU65DLIiL9oVPikOZpynLcEWhK8voz7P1jl1q6jB8bYcqSrQXzZrycW0SzwwRBstmXw+pYLNUNBxn6w4paxDnF7zEO0tIOLKJxsGYQHNIJv4Cw0+pgcy8hbpby31kohYFcJEMg83GGt03nGVK+mNFvCyTvEiOiFSZadtj/3ISJc/Pv5w49Wtleq/2kObvzIcdqX+8mdefiUfir97Pv867/3Wat1/Duvy67+uvYQpt4i1YqXUBCIGhYSQCzIvABsBJETXX2fQVfv317z9eftwub+fb5fnl21tbHhQJK4GtqFXkZqba4Cc5mlnFwdvASVW/QJl+xcZ03gpAJjVpVLNIAH703gxqbg4pP36qbLPrBRKE9c9rYc1hf2NTV4fQAVRRN5/b8ZLq9mJoRTXE2FuilFwvOHVVbTqjF+oFIxHqyuYtWndo/eVaMvRwcTi5ja2LFHj1/2BUlt66IFUGSMbRa5xrspiDKCxsh7DKhDwt9e0sFRmxVIO51O++1G+61O+11Ce/VG9lqd7aUg/XozsLn32t72J1+EmZ6lo32V+FYNVXyenW+r3+bN4VYAckYJd6Uavh7By7etHnZrfqkOyTqxflXsg87nVB7hWGsm/4SU3t1iOAk70BzlQdp24H5BxQ4gs1MRDqK0CmJNRbxPrkY3V1NSAZbEP95Woc34WW4fcYWsbeHyzCBDjXBPM8LbBEMBjTit9bOYuA3+O8N6yGAK3VtaFD1dhweTZz8D9xtouSV12PqWEZVzCIDIxgEBy+r8f3hRWSB9PChxVGQZTpYTVhnaT3zFmTja00m2ktp4JRdtxDBeQxwIOheZiLAvpAUdB5RKw+4i9w0vi6YFNwWq/42Fj4asMV/gI5pHnDiYN7wF6qUTbnEjkntWAdLFgHC+ayYB0sWAcL3uCCdbVgTTI8caknh4NldQuggwue6YKnsdYEiwMKysGaOgBZHeIBBxPrVqy1dcFf4PnB83Swj27F21/xzteAv4j4WeRTu953q664A1jIbZjVBvzShicJC+s27MutwnYEgHPDDoWZdajopB6GeoX1vGE9b/geW1B88+XgpTuYYAEc1XIxQKDJ7KMAmHJGcgQ1DVh/AWst4LkEvMGANR42vlpwhXtgBwT2mjhLruSPAt7lIZNEV3C5BCgWP2N4rMD8YTy4hiKIw7dUo3jY0wh7GvE0IuypAOPiCUW8y4jdGLGuInZAxLoSQN6VHUv8Hk4XNbewcljKcGDMAO9IQIRhiyPeW8QKi7DKAkq8HwJeF7FDleyGi+wgY51GzpvAUguQMnZ3hM2O2OeR10bEXwA9JPCb1cfR8yvspKNMMQEAO008Hmfsaw5vcrgHQwBRO4Z/4OEfeFQUklwyrvAp/PIJMKMJ2eYJ2Wa9Lo4YgyvkqCVyRlvmQJEDV+rnCHC8xzfiqMV7vsLvIVeKc9rjdPZe4Lq4Ms8ZLdToJ/49hlrV2c/ILM11//oZFXectX7G950RD+nVfwVcjtkzImBG6LRMfKXUa95BDigwczxJnPF+wdoQCAO8y2XjcBDjMYwUWRmtdoSz+08gFlasiA2zx+lnANgZJIi/qJ75u6B2/J5ITKDexfD2BZ9yXQzwWjUXin25c11dZE9xXwGcx0zxfXe8GQGrB6wIp7NHrOR3JNV3VJ+4bsdA/B3VV8ZCCkg+3rkKxIeF4zQkrLKHVfacc4ZV9rDFHrbYR5Hj23CFkWGlYsDIaJGIsFwRKxE223MDikhkVcsww2bPsNkzLPCMmE5ms7naWW0EsWfVK60Wyvlv3ENtVeC/5aYFzKWHY9MVfo9Regt+b8UMVsxgxX1XM5l3+nR6frw2mcVFVDU+wKC7YiK6mj9SVvCzq30e3O382EIKnMwZOl4UPgzuGBA2cXfVYRJk3hkNjxIstpwwfDU0mwe5WXyBz7fT1/Pt9Pzl3JXpPKd8OQVRT5b305+frqlHsE2pLjZSlRMHOIiEwYhm4eX06dolbldn4jp+9h1fv5+boROtkFEmgxvKRUd2IQblx9On1/TPtnRkZe8RNO7AmHFbGidCy6lu3O56+/R4eXi7XJ9Ptz/kjXcBQeV0aI3I7njjr2+3Ew3cvg+zZI3cWfWO1GEfHs4v7QOazW6GDRE0J+xFjXBmHwenyGy/f7rz6dPTudsYJlIXPvJsQ3nKqM8PzaibWXb2dVA3QOjnQXtrtFiFlb3aFMxYbxRdj8+QoeLsbarNcYN9RZNtrM1mwqM8siiyVod9DN9y0F6R7vfa3C6YCGkPYPcWTNBKHvB6a8c0u9PwoDgDBu+u5jGM21y/vpyeL+179aO1MjD4Dw/X2+Pl+UsLjzErqQFOy2pD6tKg3zrz5e3Kt90qUAbqVnDiibM2OoI3nK3KoG3/gdlWg1xm4ARNueDgGXEoQmJExJiLXbeqiRfRTFBLPzW3hPoOKixbvSmXG6ozxlWG6vJiUyt1By43HKsMFdVyKDcgjYIsyqhL3SEVJFL1SG45TmJzsVGABfEpkh8i+cvJ1YCfIXm5oJghE66chIWpGCdckQSTqVf8BQoXsvGD04Rcf+Y0HCfLkBCBe+/hv4kEAYIxkRZAqMFmV08VcIJASwt0x1KbIECIowbv3AUOlwkVRSOc5v5thofx1Z093TigA3tROwdyCLImDt/gbUeEJBM8YQ52ZhMUdXr4/ZfvfTuiica8qx3x9PD73557O5So4S04wMyB5OBA+/35+uPp/Pil9UwmEzq6IP8aZhP1IYZtzXBSsxNhDRZ0AErv7jOI70Bxx+v579/OnSu0bjKIgp2qi5hTsGLnM/gL6ZoNTvA7bquYkzodgd344FDThxmvTwMm2oEHQVoLTpS7bu//zAy/drFCFE3GHzhdUgp2RhsbP0pkx3miUckcqugnZHfLlr5j5q+de2q3keLY4OwqZ3uWgWOG+739drt++/JbF4mIV4nucQfYgff7Mbj96ajx4ffXdjmbFuToW9SHikOIy3rqiYczaF0HrtXvr7/8+9+eWtT6bKKuarnIGOvt8vV8/fbWgXrXdZUL8dgG/N4S//u3y+2sj52IszE2YB81z3/f2K+XPi713uw7rqVMfbTbtQ0mkqiH4fjX9cKlpOlYwBSJ4GEw+nZpsxGzIJz44BcFliYwX6hv1cWMvDaS1Futn3EBjwEbotiO78KFcCzXpBCAK/YXkOiGR7DbeOnT4+nl7XxrEnnGA667pbque/WwEIe6CVZsQn53hsM+o79h9/aizxPqek69tX9Wrp7tgzGbIzaa2F64w4M48fGxO7Ank3sCQDEuSw8P7MfH8/fz89vT5fXt/Ny+FLfHBiGJ8s3u63jvbMzHQziaZHKsDKGCwFSHPGz0bbVe1TtfnYY6PbXv3UTCrrVWBb8X/RFu4i5xBD0Rn0ZUmzjPMsOdXeC0A1Xnd2cbKJp3ayr8bnLdHA93Y9C//3h5/HZL2bDTw+8/zp9erw+/n99ebte368O1eUYpJykWBgK+6qLfszCaleaTnAObukkx/O+9ytv54fr9fOv3ySImirqiC8udGc80bnsYuGA2HDHoremPZaahgUV8bE+c1TIXCsLUBpaKUFzHwQzQL+JdKtO9HtOmPphBj18GeaE0Vpf/8mb6161cG+ZwFYHmMjp0ri8HwxFNLsNaujKHajlogvnC/DJIrj1+79PEfjNzWOMNQCN1ybXVTK5VO7PVbFOozzWsON9RRnbIXPDjXweFujyZ1knezVda3V6Az3bG7qFazrF4SaMYNz7f3i6v5+7otTYsIN1bzZptdXsdkcEMOfMeOQn480eYyHCCnW+9W8sQ6OGwclIIVzu/jIEf8v3yem3rQAmh8o5nzCA/ddDPnf/mzB49+DfIxB17EQRVY7WfQAIhKMQF930Ucwe8+dSvJOAUOata006cTK3vXuRH+4cuEqUoPyG6hIspWS89XykwVS3DwXlMBpMyuBJ5643LdpFTPgCFaaA/htIxfC0eT6oJy2lCnoG3HQOnZB4T4TIXjTg/KXKRCkQJVWABGkJOUIByRBaRc4xw6hkIw5yOcKx2u/3u9OV0aZuUNqt0jRbZ5A+PnrO383npbq9NYifR7lsVKvQ91OYGDn9Q1kNbwAHyD6htbQ9l5gF6P1zeY4INPko5e9tBlvTv1eYnZ7O3+y4ShNOXLvuVZtb4hVwAZ8gZOC2YB3RV0pYMkr37r/UJdie/TeQxGui386k5pFZn5irqRtkqJGdD0O4YNc9be7jdHV61E0kJ1FgXe8M8XU6tj2o33qM4I/oeYLbCpKCX7L7b09PlS4/CceZ5icJarcUYQ/7erttohueiGeXnbat4sDY1zOmpi+Vc8OZaEG06DOjjuHmzXfanJoKbbRJG9KChoiBI5oDU5s4cPv4ONQgLj/4OXbOCthbEzQfUs8QmK4eZipoE7kGQ4HFBagDmeXq6Ppz6KvaymziM+iCYE5fJT320D4x8ny57splAm/swJE9P1x+HgGPfTQN2X+Ygjdpv0GCyFaOlkBsI0fiHnkDk9tzRXWD0soY21tC8u90HfXq6PjePYzez5jiWGaOFugHvBi4pC0caB7LAcqEELAgZR+vu+vzl9fLYGgrvzVSVqEZxuDCwiLfz6bGJETZ7WdSHDccI/uwxrkTyea+/fIw0Zb1+5YRFfbhhvcPrMuJVzlYzUEMtdt0V1z69Xju0oLVYgBZkRQDUgiT/PvLr3PgiWBq5OYQbMrj54ohClDzzSmkPowiGZfjjw8X34/RH6/UM3JV/Ni3/ApjSwX6rk/366fLl2/VbO9/FzKoMi2Ffe+yT3/e/mGdtoZM2JWl16znuq88Ij4gXPlZCucCq5973mi2skxQd6sdEYm1Mr6b52HSOLctBSv0rzQigFRth+CEej/1G4Xj8YDG4PdohQj9W4hCDa2oZmiujopm4ZVhoZDCuCVdqSy5+BsSAbLDlhljgn7j1VLSZMpqJEU5KIynCAs4bsD1dGXmOpjjRIIpAQm3y5ObNoxvfJJSV1DK3U8LaaW2Swu45tvfjZkaYDa2ZUTQuak2F3ErI9nbognKbn2jpG7ul3ILH7XaKqwotDRGvw9Tppxq3rnEu5piVEbE+Jw0dnwzcZgWXSqTSubmKTxBkDMRZAqwYsneH07Rtn8IMBFaMg1FEcHq7Ezc5cbzOjUo4KjRdj97Bt3Bm3PQjWnO44wJXWrPMwlfAqHE7jGh4sSO15zYx8E5lvL70YhirOSw3AmsMoJtox+dud9gUmIW624Ep4DxkuYA7fszUIiWOc8mmYkGhfsbjAgMLiFfq5DV2lfeLYIJdpV5UM69xqRzoUTzilBqewNs9EpRU0wUrejz6gMLA6kdPINr/0P2BVj6BBgYI+IAGZhBwRRXXkdGBxIdqffLocge2NTCzVj1460EGi6zQkVSjLnStNOUqQRbCdCAMB8P5LDSscD7zmY2zGAktQ+GKKUL+Ch0In/z4VCPyUH2A+rdo91V1ssAhJLwBSZQBAgw8F3hnDbEF98ApeJ4hxYVagWD8GfseGn56Ye8COGvF49CJKOB7aJQUeFZ/jZziPkqKHfPb8S0lEQXDKceF9btK7JJgAgmzgGelk0kocaLqG7FHxL/HvhH8G5Ra7yd60LwpjKL5Ve/QMeBv8XSl18UISs3/GlMqHMJKCcRRvbMxGYLiu6FxmonLmcZAJSpAtpbVZDR/jtF1kooA+F+kubgp0GM82V9wbOuS/QXcVcC9BEi5cUso55AAp5uZBB9EbTP8yBkVOkFAwOIEIpmHT9UuBSVnI8gGlAqiqmmHrlo0t+vUARhF+Ln4C6F9pxELcJ8EJyAZ1oX0JN7lysV73GPD7FViAea44y6Ksfad5i2P2/81X1q08B+7N9S6K2IRkV7HKpGqetxgwWn4FVfc9H9s9Q+Ahvylxn3RpK94/ULNT2mvV5vluR0e/SgDHMXz9e23FkmxmTpUQJjwoTxNRwdrxZHDB/VfY33CX4yOU2H29umwKMcP4fVH+wx2k6Wea+OIVkS5exuk3Zrktmw7/OC4WascVX3LDlZkfQH14YB+UCaW8JQQeQgH4+eLiMxiI1hYxLbnrYtNwiHvIKn7/Mfbb119ySwKYtLTkfZtiNZ9/uPH6Y8W6+SslOfPtmG8NP0Om71m6r6BY81+MG8W9uhEvUGoHcL6e/uRvlzaCvk4dPcc4XDjs8jwYdWxLQOvhXLvl64DzZbSnO2t+PJybtMP28KP9cOO/OjKRUwmWgF4oHn4OMiQ6K2BJ9MjwjMV9HkcZXCW8ujj6wIeYw+C5T1Ed+PxdGfkUaGQsZ/Y4/n0+HR5PnfKhLOfBXrlIDByQN6F4/wHPYJ0554RwGxVQcZdxMnIGIvs4QipQHdsoYuTSUGAUFRkWWq9EF69fKPYf3wlIiBUAyEhcF+9Jc/5j6+frk86KUbKr8slziEtEqr78VQw7vV0eTjgoncTrXL3V0jDHmg39mhStE9oQdzd6HXWcf9HVy1b/lS1jMdrqR9MThWUsGCZuUoqmHJQ/2AbrRyjnOMesuKkSXabZjflLiOHMdzCzODD3vUd3PDl+nR5aNfdLmQdP6DoARJGj2Si3/wRz2bf67XFM5gPv3oTuM8eFX9FHIEoSTDLii3+lebSgo4nk+tBHIAMVxD+zNAIPv3xcHr47Xw7v56bUm0QjsYHJsLd7t/Mt+vL7XJ66xiCzC6HTfACMc0X04GNzpDb9XvXAxFNAYZaUFCHurUdhGYLWzVt5SiuOVxg3ZFigRuKwGuQw6/lDVRBQF+OsjPy8/XsUWrLSLAfcuYCtV0BFgfTAfcXue5YvaojU7bogORzUZBNM5200CVARvedPC5nW7mhgast8HTWO8O0n8+E/qX8JzxjZPw4Jyqqv5zXRDD0Tn1XrepyzZd5NTjTOK7gwnjcW8Flota7K7hMojrOAqKWq2TyJEqeTy1gmkWNljHaSrWWnQZUV98jwEQOiSEiCjnlexVXRg0h9tNIHZWMEGdwBB0jUy8iKytVPeyj5XY+tU7oamL3OZu+2g7W7Uv+QYNwMhVW5LK9B/6r37JRD4zvds+MuoNvX0tbfWP6J5niYIyuv7Nf/3b99ty1k5muPnsqbpALuN3aVECwe4ZqKmmuxoWrwtWkCZlCraKI+sLEokCiPniszjEZ+Y64XFR+UOkSIoaaRWNLxRaIpQt5f3FOlelOOYHGzU4i88mNmZyBHOyR2+mPh+vTt69tl8sqGACZgImLWD/5Ve5YR7cOO7ib5IdwLcbvVlR3+e3tyvvRvoqoMR2/FFv08ZsSIpPvvIHvl/OPXx4vX3/9evrHr0/nNoCLdgB3l6js6Xa7fO/aLE2ZN7CaMYvWneFncwMTsPiezhFTcB8cSK2VuQcegnMByW8WcTnCFUTDAjw59t+UKv29chZcVR8CvYVHpbZbcwWYyegF7heeCOyASrXOSmtcceRaIbPK4mQW/XVcfeLTWpA78+rTTuau7qGvmofzc8/+4M2ugPqg/WAZPlwu7fax6V2YAz4MUnc9nt6HxVTOWwZMH6+/t+ekCRFmdhQ3COFef29DwWAKQWoUrtp4HbGJ+S25sOSZXDXYqY3X1/Ot85pMash3lnVZfMZtLl+eDyytdsv9X+Aapluduwy4aVJdb8maMtzSvpt3KiWvr9++dt0dJq/UiGbz9Y/nh+a4jbv0A1EHDiDk1RbUypJb0+FrsOHh9uARI3Ga0m+363MHyt/MjltURjhRLNKBbEY3mKRBwi/dPQkAnt6ut9ZBbqi8YeGRMH3HsWkW/iJzeTOA3axr//MxQ8N6ccTzwwbXFGodTCAXcVHfqqLeBkqb+hG02v6cRNuhZ1lotVVwJAuyIdFTIYxMaIpED0CNyO8Ay1jPeyR60A194DF9TwmNYYTcDoDEAutFiZr68NjfeA2wy8m6sHyIj8FCSgO30DcRWiYMJWJXgGE+nK/lBARDfzjtwIAfJCVE+9ixA0+ohmBlSqgOSjXv6ILgU9GIjt/j1IZIaDD8HICaO3U8RGO7QlD6jioHI5l5Jw6y02/P1x9t+CWC8oVzbZx7YlAAYtS442f42vt8r5W6fr08tMmS2aQOq8+I82jo2aj5Ivsmp6c23++cmUHBK91Z3Qy7LggXtqMl0G/+dnpoWSBt+qC1ZqhZQm1UDX97O39tmekXgc75AOfdI83kC1Fpb78r2WNdo8eJbIokHVqqmm6/cLhpGDA05O/w6+fT5amrMMisWep4AopqOnoGg6G7Ypo3eyLvok+7jxbtHZaGPLE2MJ4lySuyKkgPLoCSrtHf9/W/vTXLzm9RVvsnSLO/P8z5+S0VTjtWID9Z+bHBMhKI91Gplm/aV5WdIJL7sLK+JZJiHhE+zISPu7LquXMCnr+E49dzmWHxXAhRT0rWKhDaYcBGKXQyfCLEQad98ygUGlWzev/eA77eLm+nnqjP2bSsXMHxyP7A85sLSnl0s7bc6kwulqHNy2P952FhJP9ELO+ZYRhMdacox7x7M5UR1u8Ncmbwcu/ZX03Tts33DceFjz94P6LgNQTeG0UhJBiF5wQvhFvfsJpLMcX6Pr9+fvr22hmfhit2cseHM+aPw6i/fvqjM0R+m1sSHiVCuXPsy/Pb+fa9Jdz029JyPyrcPXcOf7v+6GcuBW8mpfbx7tAPt/PjpVOnkQfnxnj+5e6D43p4gam2KtAgKCMWnOv9gx5en9sFncwHNHJERpgL1/gnv0F9nx2f8y5Zm6Lwt+efG75/n26XaERUgP0Gzob3B/56emsd4s3k+UVLI5dHVu6TQABVROeGN+ydY5s5wnEFmYsMH4qL2IfCot9L5JuAMdCOUa5LzwOmmO+ny9Mh4zYJ0ocPAUmgVZGP4hKOIrGOwJnrN4E58zW5TSEDCRz+oPLy/Xp57CV1BvpDAwPw49Tt/dVMWu2iuG/nwtKASfTn6dwfsLM8X8HrvXHzHppD3H7nck83Y0rf5hSMzQ6tj7fkYbpXieJxeOdJtc98ncxaUd99aI7YFxCCGVP6ZRkP9Xq+fT/fDs9BYvAE+Z3iyeA5MOAkMLp5tT3MDgIf7KV4Vz7/Hy3K3MVo2pK7yoif/uO3t7cWPb6Y4LOR0/vpPypZ9L//7VNbFjC54ka7j8f79fv59nq5Ph/G/VNkuZ/+4++Pn359eLqcn99+fbg+fz4MayIdWLXaD1B4n/7j7XZ6fn25dtWR2a6ejh5rt2bdZA4D+oZji/vKGDgUJFm3/Nh0KriqNruvJs2tq1aZSwcUrrvQKoBXPawO+Z19ZPu1nh5+/3KErXizJL5Wi70yNxMqR5JXBbvyr7RRDZun3MRXSLjiU9HFgJcSbEFFfhCvb9fb+fT8+Pl6+3G6da0Cq4S9B/Zr7nM40016cn9n85FxP+3AEJ0efr9+/twMuZnhcgD0TJCt2/zfafCXROb+rYXI+tn0/5qOjDuQEvIWR7x3Ku3ImDbw2Mduj/effXqfXb7IpNheWTz7ns6STwlY0vE7TyaIHxwcLDYUON2vrNyBnFC5cxvEeW9yVa62E/jp9NrVi7cBbz/MkIYqPeJGU0/H6Mad7/kO6gFqZvW0ZlQII4wZOcz+s+bfH1LR96LQP51e28DIz8F8Yoc76yO+tZn5WfSVfJgBzdmVwDnRapSP0UUJ1oKdQ24cEHVxmZVSriYwg/iBc6bOCfxarNQIdnpFjrEn+WTxRRCnwPwz4JwpxFXqEib1ADhakoljYTCBBzcPMuqKScG4u+Ne6o0/f6DpNdHA5z6OVK6TCrAl59WUDBviLJZbFOoAqqAiQkrU2ZnwQKWD5JZ8BkUx1BmUV0pj+ihRSxui7bWSGQ0DDVmfpTni31J6ofcSZ9uFZ5tiM5aXgQ8A0mBqI2N/1fdsDtulF029HSYDYvxDBSeAWrBWKLTkCFPlaPV71JUZmnhIjnCm1vw2mqRge9Qj1VvXTQi8YXhzgCMi3NehlO9++c/zMeUnQb44Se7061rv6J0GIn4zaLKutnSE6kSnT7ViwI8oqrcHhkipaY3mHUHieCfk0yurg7kTFGlYIcfArTgK7RBbsvfAn1pzzMHiSUIe0f7CHVoMGWDENje94FNYZEGbI4hx8CmINQQdjlrVYJSKRjwzpCPsSYlbtIggF2TAA1wvSNHtoBQRpCZYkDvmt7OypEYf4tg5MiGuH4ddd5/Op1vrL3tnUnUfK7TveFHn0+0QaJmE43Bc6jmpD/lw+ta6x4uJymfryFwu2OvVgQK9bLVn3EvK9G0CPD2xP3HcP6IdjUm4mHiUIdNMbTVjZXGCXhAK4YRneiA+6wHKHaj8fjo/XDt45mY27TCFzToI0mnEDpk7mxEceqB1EJkd9p7bpoPZ1IlzDE6uwHrYSmb25/UlmtlQskDaadQR/en8+drG4MH0KRiPXK02Fg5scU9JyT2rsxkVsLrvckyU9a7/CLVzhDvCDwH1f4XkHSmOOU6o5fRjDwOH1cz2M6Y6lDJE8IWAtxiTAIoGVUHzB5TWrkQTCg5SyiIf6ezuxcJKilzF59ewkUyHKwhKmCqErQRjI5U4QCFKX4F30FonmMhWch9xD0IXJei74svl+bmvd6ymdpn0Cvjch83js7ucjeY9O+qHaFM/2Mw3n86/nb5fWny1X6b3iggfpRq1StrSE7QYN790pDV2ixkyU2g+2ti0cTcZYB9bZ9r0CXSvbTU7QFjhjOnQqgtcfyJFwfaln5J3qKePYTHKNJ8u565fLFlxO/tpBz7npEfReyXrYn3tnf3CkVdCIhct1MJkMJCM5UqV224kSrf50Z7kJv8H88wLULg/3I25BgXLNX5vuOmfz58vnaLUvP0ZxNmnc6svtnqzPYaNva0I8un89qNzHaL5mJiY2R9OUzAZ466CORf1f43FXjCrOu0QYVZRGEJuUeHOfW5MREjCQQdSTZLhb5BUPv9xfe6SuyZXjlwgd5UPLu12irbGxsQkiQxDGaSkL18ubXu7C2bLvGiFYN0EDpv/2fIemigTw+yZx112Pdurlr5o51Sb5fYV3SscNDGZoN2rle/ydn37cX3NWI708RE3F2UeRryfdxIwl6enHns52arZ7i47c+lZr0KQeOiJ4cPo2w0cFyuUOR/m6h3P9TxCz5jgT9mBSgLbaHP4K3tYdGhz3YVTEszIcbTD3JjGrBUD7rb8VJQm+U2KRgP4uQNE/N4LTMO+/fHSxou7OGkT4J07Tu5M93VOjgRj+VVTzO5IfhAy3aP+yw9/Ymp0IAc04puFi9n3CAeTLAA32SPLMjjhLs+P/6OHyP8F3ow03kMv8ONmocvJTwoPSHy59U44Y7rPy+mPp+up49MQ/Z3yVSzKw7sP8JXu1DyguQGq4h1zFzISFRrwC9nTdh31nf0YTy6L+/rpxX2VL9PSeZleEUI4pKMCTiau7CJdKU41PYxmXn8YRQS2YLs0uP5hAQWTFthE4ONEzgAy6zpmJZjTcQ9wnku7xxxCfHIu7NlwKoZPUyRMORGqcCvjbo1EJ35Wn5DBgIxz2u5S/nR5+3pqIGe2rFZ10Jb+sJYalFw7nLsD/L2DMU2ko7SMdt9al7o3hmzHk2C6DxvXIpU2q2Rt0UqOpcvVTeiCiJc6ylo+nb52WITZhOiM9L4/PV07DNpu4kFQ8q5VVHPAPtmxm9TAo/byT9fHDl4pjJ42GRVwyWuJT6XRurlef//9fH45hMAmJwWn+pCDFrnq2Y4Krte2XWJqGvo9el3jfvyC1oDnVoYubLFxBpGacMeaIZtbvrcwctFzVoop2JhajR206TBva6qah+akhwZby0Wsn5vGvQ+tpXc2vQ8cRG4fxJLX69vr2601g85PZrSCLHS19utoU5TB//7j5VNqozjfXs+vr4e4IkoOBD8fH8awf+vT9XbrtV+9mbHsSSY9Svc137dBgUZjUUTS3TvmG/O2e5cn18HYzII2k7UHb1dTaMy/fzu3wZRfJIoc/s6djaR50C4NazLSltF7ga96N00/aHDTxCDdZW1lG5Jrh7zjq7Q9sQka9F5qTRYujk12TdsnCslo119VbYqK5poGzn+PEx4ohKJBD0EAiMoqJmgTh/XRpxREEsw8z3AZ5i4DvzrzzXNftqqCMUBxpm94unV8wG41dX13pfAy6BEq47eiwZuZDHMcQNWnWbHq4B+uX0uIeXJ7E1KFjHLDVuM+DMhrNuKCg9P1W8+h7s2U84Eld+Xzrz4v+A7AJ9VGnoPs25HCNigFPqFChrhA5ZhlvS8GBCoYdi7h8brjIoxDvUPTH1JZS5mhdOGrY+kLSivzZMtx0+to16vpUDFYFocG6tDjbvBiNNQJtMbQJjPQbJX0OrQIb6yrxaheZisUIB9GKA8jxne0tvC3m5ZvY6gQZ9T500Ms+q7+FgOOMD8BM+KfcXbvGNu+p8mFv9UY8gRY6XiKcKi429ywn26n5x6xaIrb35V1up1PTSi125SN97SDfbpdzp87pnVvg3n+mhIQEDo29lefI3mgzRyNCVbXttgKgCGq9cJiwAVQ3YB21Hw0+CfAf1W/HuCjgv+qUrQA41G3iOC/qsgQIL/rhgI3qCbGCd6qelHdAd7fgpJKaGYiiwU7DlWpd/QxWUfmn6WAiVFQpoY7JFUxYQdAOiWzgji3BORy4isspX9Vn1UDUTkiqjzKah7AQ10tDz8TQMYjsZWgnxIttsjVMcEUK0wNtdFi9Q/nqde6oMybDfTIG7DPnpulSyB+oOu5DnIhJb5sqs/BTOXUp8hitwc0lFjcvBiZtpa7PTQcTxjAFr49fmlFInbzgBc3qZn5iXccJsqKSNxyMWOdMI0aOyRcCuYuqXh0Uri/Pg588G+fP/cRbpBlpohMRGTl0KhkdRQVhvp12TNxDg73n2D4V1JEKus/e06sUnqnDwUbJmvTil+lwqjZw8Kcha+l9IX9Cf+L211xj3d8Mk3HQPPTuFtNq58yMPznvThuzMU9NM8Otl1RUjD8Pl6RWn2XoWw/7xUyDgQe4NhTxG7bWOWA/UNNF0HA0Ln6woB02HYeT6vNjNU40b4vdTlxD678D9xNshCdvtNqMsv+eZbefKOODG4zey6PyCrZxtujqEY3PH091HB3ycSmimG9k8Zqhj6210yyvWcRwmV3ttjQ8Adqi2h2gg3ooPJYL9frU+oEagFgAsXAGDm3Hp/BfYQcn75dntpMiTOnXN0/c5x2QTozTej8Bv/G2f7Nt8tTx9NiBmmiEAPve5yBFNkwLthwSW7wRZ8fe9JqZ8OuhIDvO0N2flywO9h/YtB+zL860eZ92G38vvpIMLyM++MW2NUdvPV/OhJNoEfhrQuff2O/jb//Abs2bP9so/RoGWGclXAcEAvwUQgLiWIdTgOEEMBFoL25/qTuAdblqkYSdRBWXKgnLAK0lZWI60fcNHHkka4Z0HovhHfA8CKkO2ZJt+pHoVMYGlU7GlXqg0KPrtAJQ/dg3fYIw+u3wFkkurXBklZ/woJhzBkNWOrEpkSE72xegKVCuMCdi6wcDCfEcecrS9VwtlkkguFCLcwTxZy6LPkBx30V4p9ICcNh++8IvGU/OKAxovcbP0P1SYqNoQvMa+lXDjs42NBCDO4/YYkYpSdFBAeK+8+ekuqaK863SIMeHGPd9dVcVYSNAOr6iSHwnPIUfP1wfQPbD3wKiAR32YB+zDtmHUMHPuNRtCKBQ5+8d3yF+gzQY8zpwxZLCqRx1ygOXU62+GNgLRnIORWDEJs5xmv46Re416DR8wubecxvYaoWhpNodQUEDOzASiYBZhfDz1h6jTnG2V31OGiE3jcfPveGJ0oooki9AIPpmclOdM6ypjhnXLmHBaV5BtxEptkYFHz+aOU1g8S2YLUyKM9zpS+CZUDJwKPqhjQZjsCe/5KDcubjmISAEJdz1342DpRWznNJjgGPSCmALVcKLOL3JAiQw2m2BtjvWj8By18Ldnyugda/2DYOTbkvGk+VW3tFkbn+HrdVCGAgN04sdt7/j7ezBt4RGaqF4ZGQZXkneurDMcEf8YGfuALOZSwhsOszlkVFMlZLMMMpqBYQhwpSSoLUhV0BdekwEoABZ0DNYiEIWgGw3wgEPY5fbHiBqt/Z3/Wc8zgeHzMghGLpcBOkEFvgK26HhKnDAsScReZEkKa4oxnSFxsjGuC+DrANaQ28EPXst9Z+bAJryUi1fTquBm3ch1OLBDDb7EedWA+nLt2y2Zwpg75/UjVu8ZF2W+OBZ8sc8deDUHLyeCTzKF5ZAID3vaf28Nu5A9OYiYEDmOaIidHv8diTrCSGB/t58CHPIhJwC+D8LDYf1sPp6eHbUyf/nM7uP/Uu81g9/m5b/9zKeGogoYMWNC4O1cY8GCpR5oMXLEmE0XLn2JfWkvmcctc8aI1Ojb1lxUfulZAIOmKeMCrzkUk26ljTGP5KHyx7JgHpXQaYNThDbsLX12i9ONzj1hmmUmCcjhYSASiuuQySqEhUEeEGKlRVu8DfDExXfpxtLc/UoeDHCOCSAB/ZZat0mw50ZRJf1EkfW4/Acy11O3v6F/P2TdUsmKLuxz5xlptERc2xeBTOY6EPqXSTM1EOhwpBqCWPH11baw0mYA3UO8DMiSCdHczYrSrrvge8vl08nexegjRSKylqpy+F+ahTxD5ivRyhqT54543l3UxuAizlYwEYpdEFQmgHQpARfxVDQ6ZqR5AOOioWNrgOrU8J5pul8cASo1SjG0KPIbnVfwM9IFeNA9crxyRYIrOrJF6OqRU1eTImqJJYD/jLrvMVurwvLE+vL9lhOA6erkRu2NRSD6fnh3Nz2ssOng8Oicf6UJBScPwZ+AncwgkbbiFfNdg/wPmsoMvEMaxPsyEgdIMdn77D4+10eVbVXhJ2XZaqQjv4Hf5nGv/oXg3otjm8wpNhkk2bFaHcqed3lYgLhxSgQ9wUkdwpeIwu3499zrDefnoC6Iss58KMIe9OuW9UWkwtXtajce+NeuvU7WRDKzxwt3Od3x+/vT16pzttw/Nr6QG2rBhqY+jHy2Pv1dsVtJH03MPp+fnalrnMOibj36sPMOBHROllCI3i80G68iPKQwGivzflz97WX7H2YxpEJu7iE+BeYqidLfYRCibSZIqIpLTiHXissd0/qXz9cHq+PifFl47MwyRDOpB56KO27bImjRvqgGsNNLa6/0b8Y3W34rVw2mvV3BDUp5jLH+6rx8E7ZtyaAZTkcjqnp+ad01N4jQozlyDaEYcsMpujdMhLx8VrEqjfxcX7cHo5fbo8Xd76lpt9k6pF+FqbRqsh4GBwPAb9K7hnW1o20Zf1SIIvyo6YMCfMuM2mG6eycJKYYZF5FZkwC9uVGRZXJuLj7XXHE/3jb2/Xl+vT9Uv3Nc1DrNKgj0f99evl9WtPUp7YFKWDhX6luN2bRHw5SCfZmURowjsU09iee7hhPk4D/+rl9NAtgc3uKgAsHo30q1Cd5eQMlyg7SlHaklwcG9mslw4Q5swuu/8T1Kqr1bRFqnHS/Wkl6n+aDjTbW80ajyDKd+s7/xVVZ1GtQq30X63gbCzSNls/2bSFd3EtPZCGxWN7WtuaONxDAe+Lma7swumDotERN5tJnasvNsAvj9nmlmy9LfAWMj/pzMmE2H8ZlcufUQMDKFmaVmPb9vf6r/gQ5UMNVTZRdB8+i04+xJup+rX63BuD7TWSXt6vK5+gvFsG5v21IxabTSa+cV2qO+mcuSwR81dPDmo12LcAEwjXEREHIE0Qh3Vo7nUhsouDbAwj7tgpBLwAbt882YoF9PW+vTycXr6cXr5ens+vD6ecE/hxeX68/uhyDqvkeYIhFzZyQTHqveP+7fzl2q5Qtzupr4eK2nYnAPnh9O3Lb6122GJjbQfErAeebyeWzofqesDLQ3aMS7nYNfhJfRf1bJhrjWGpAHf0/y7V2YW8NorJW/VxQs03cI/AgorHglWD49ytWD9r5J/B4DC1OCLljbNkgOdtWK0gxnIbi0NgK6Nfy+H8dwBTuJ2BHaxliWg8wPoEFLgQmrjAPRHcHA+c/4o0zBaPC1GkjpHWralKdR2cL0//8+vl+X9+Pf3jSFS42xb1LubKNPqBot4klv2/zNMT1N2ImP+v9f3+ksf3s36e5NyuR8E/1/c7t4X03eTG4O7i+g6YN1pSRzFqh/vjGCRnm+lzVxPzk1mRvNMLPd/eLp+Tqn2ndjegpr5HjUKM24FcTLn5e4f75d//9nTpJmuSU4/8nN9Oz1/ab72aqI0/3/CUb9NVsc0FNGLTziN1vNxmCocJ94folTRmZ5Nnm1AYlYfFJj96+O3UxRu+pQ3jnl0sUNiLCImKllvKHz5X76uhCGUPFk7DPd7pYf12un3pu9Vmk9OOOdtspraH384dSZ4zOSs598KJNU3uQEuxlXSaOQUtHeRXqZw+SvPc8eTOvearndVh/WHEYUgdC/4Zxi4CdHroyzHn8nLtyK29t+Ojf52Eq4CchYFtqhO+PL8RfvFr54qtAsCojnnH26EbvJyfHw+IjVnsWD8rlIjjMfu5mh2L9+ER07hdZ6pJfNagynj1auv4mLjcbQ67h9/6rsZgmkm/VEDKPAK4/HZ97YCK3hzxJzUcHp5Ol69t6+RsF7nR7jVoSnt4On3ts7T7YramMaB8cDI+nV5bhPZinePMVbcPNk0arz8fTaaxf9UWN2d2+dyl+xYbMFeNH9xTx60n3g/ucz49f2sqgPZhhd5A0Yy2skczyKA8ndsTPtgoKcYp/gtbxgYrIimudb6X7eP9t66I86nTL15ns5X2n6Dhk2Xsm+3LJp7bmhWIDyNKakgD9Q70gEL9tubiNl7BtZTIOlfg8QN8oWe4k72QgsqIexzRWSPIirjvsf4eQ5E8Q2xZYASpGEFCxMkl7oAEDE4IjKh9hUo2l3WomBp+462MainrUAkNHG4vRrWbCfUARmBZGdGLxoBerqUitc11bxB4SOK9CadXdT9nNK7Mk0eS1SatzautK5uvNv4U0IEjTEDEm6MiPd3w8tidp40bg+TAwtyS/k5nlob/evrH9/PtwI47L7IQHO7sT8pDtuClyVYwR6Ycy0i0edkE2g9PvZMh6hOMKENOCAutejDw0NaaqljBWFZTG8wZNDGHFxA8knsSuFNOSyKDujLXl+j0ACYaW5RZKCfmBGGEOSIDB7MIjJMHNNcD4+Q3Li4hMbUrSgqguQU0nzOUyEci6VgfEuf2RGc4d3Kz3QH0adYsyxDoqkCf+Mtzpk5WZI/1Vc6xiYyZ6DuFPWE4VBwcvNfX88P1saspiNiyHqEATdX9jlQ+MwAJbRVm1hd1IiBl7t5619cemymZYER3ZXmb9WlCzpAppBbUMFduowN4xzHIDL2pC3f94i+2+Th1bM+6gcCLhyy12Fx8crEG6p9YN8jSStjbwI25vp4/P317/U1H7Eqbz1uhrrD7XtTl+fO16TOZpbllNFktQcKooarksFHdfm+1Lt2588+sSKLeEKqmrMmJhAUD9/mNBab+UjumtuMbY6YBjUtAYwuAiRQqlCgZqX3g3BqzDbzJ6+tZf+VOEssNLCSbQWmiYJjYHO2KuoA1py6REXfZ81t3c2TYFMKdBRnGbT66BIL/pPp4jLQVtBNHPjsdZVqN7jA98HR9/dbq33rvTEIuLtJMA1Tz07fXtw4N4iSMba1bdIWMZVORA1MqvPMj+WjV+R1M4NLlEfYG+Ihz6E6liofr6en8+tAnsSTbfu9NrfbJ1R9aAvL9AQVi72Z/fD7YxUKBV7ABHCEmrAIruugHGe7r4/mhcRj3QXajHBWoeIP6pRJuWLfoQSR2WDoorlyfel/cRAgNRFserk9Pp5d+WydeD7vqYe+o61Pnua82+nGUTT4UGYIUdvCASWyKsoPsF62gBwXhjwi7ekXVJT4ScB5pBgRVBdALkmaIg2x0oDJQG7gI0UOGnheWchHkFljYoqsAITPUOxKNbL1ixSzW+FS1s/AXqooW02ugpAQWSg7uWWPLw8kG/b8Dg68DYLnppIWXqfUmiHQA/FIkaFTu03sZTwVrqcZGyhykGo+ZxgXK1ctDDcVg4kQyQzBnHmtQGpuDIBHhU1wQ0nBnBVwNjZpG8GXiU+a3ZPklAAGEMhkccD5OmCqFU2eiZ6O+8xm0SjMYRaW+mdB/xV8IpTP8hap5xn8L7OaMFMuMuXBCnvniVtwD1CPTwDEnG9UTANr1LuaIKlG9PWhX3Z1WEx1YF2dgmXeWdxzkLOg2B8nFIKoNH3hTb4pHfy/4gW6Uh2/IQcSNZmTJ9+loze1R6e8bP8tJLSpmt1UUOe1R24RaU6Vj9m90ouMRIT+zcT5lVR4bBKkWJqDjxg+cB6xQKEKYcbLibi5n/IXK23yohje28F7uZbaZuO+mWMq7eZHZomL2QbOjCnGbylnM9pZJ3zSriDDuHe5gWE9mDGY7yuROo43y9dPluav+eZOrk/N3nLznRD3nczmFXZ6cce+vXeVi382a1l0NWNevX1vRUImI51ivRnYGJKNpc7kH/Ui3bQueJspKm4Qx4lv3XqbZNMj11GGSCpAOsJME94Fb/TknKakpmHkPB9ygaFjnSlxMXV+3qHsz2WdlErzDNH79+u35iGGzJazG3n0d7ZDnt/smhpHQ15fTQ1t5m0zU1l3SoWXI7iEu1lpiJVRBlc/9g4GNDNr12VkbxPJpFj2T92xmKI7IWsFv0XdDqWhWSbaA/DX8ls0W56GZvl2ODZCL3cNTjxVIwHDlRVowqMmBoM4vNh9ZnUjX9edNe8Y1EWaO47sza1qcRuv55fLU2wgz8IVUHYjdZBApKGq4h+Xo7Bfux8F0OqJ0bwLDcPgHdhJsGvs0+tO5Py8SsYJlCeIAPUCDtUZlsyHwNURAD/lSM654lEJhCJj0aoDhdzDgW0jYsSneOL6Mh1cgjLIQOTtCsBlGvQ8tIX3/ZunMwUy94FVx7bBeVAuE9OkxjcEkMgvcPCbvYXIIMHuKdKseamtuKFYtFxGZztsPLUh6FK2AlvO79TDWAR1EGatVYPdmaNZjbrXvNrhP33ARLFtzRzPXfX1ao8l0zCuibfADGCs2uOVcDnD7MfjiR8NiQfDKmXGNH5uQBmLq2gGI7vr15XZ+fe39XpuEDBJACHg5DuWjgrl+xy433bx7Ys5LuQY+nJzo0UDbokYisyLCgmICt2H6WZnuvHPuY7ioy3QPWWq3izT1B07DbAoz7ztjP52/tyxHzovefv5ynOHB7P2mQMv12z0/nI5qHt4JuF6KZxiyfm9eII17fj51FtU+nGYmOZ8Hq/T54dvtdn5+69T9THAm+hew4UbCyqvoMELdDHWQBYHkEgdr+fnz5cu3W0934L2pDi8UNrhx7aDOOLxZb2xSw52d/tK4ZQ6k73fTq8+rEuNGZPpGDkyefesgbqbiPff3Cad0FIyU4bvijFnaZpKqajlxFy4s54u1PhtWMqzLBGlWQXw4I9UsDLRGR8fqvUcCIPlCRDyKOXJVF9JRI9LE9HRuDW7axcVu83dsaQenMI15XI2rycaKFtHKoTIYt3uRZjMl2mkjP39gD6dBKrbc5evpH69/fP10fepKt4sA4n/YGXHljtnFwfi9jxJN2qI7GQrysH0nt/Vw7n7gT5eHvrfBZgQbljWfn89tTkC6krztcAijnXDiUhxD7Ta8U+ZXZUg39hQChjCx/4idxMBCpoVFV2bU/C9FqQXZWMlPyVVBd5jyO/BZTEWVmtjYRzm2RzAsdhWMt8iKAjgkeRjxdQdUwvnd/e30rdOwj5PZNsfwxBFmLg/cUYK4SS4LmFGAetGL7uOkZPTxyOHPcVcMYk8HJKd4CaPGjTzTIw72HYcDlhyZerigqFRy0p3xLHjxeNv1hQHQXGse1UNQVInqn4t28npyIRoHT2sNPLl5vN5L6xAHsQfQ7zUeQWBSXSxWHGKa10qMAcUhUAejxu84D3SElLE0kKbxy5hqod2LNyBwumxGhG48Z78AjGd+z52vEKQyy+7ELiQOc01f/l/YGdL1iBDXwqEOIaF2mg1ilDGbSBhG1gkXGGRYLV1ch1ObWss+rkTDAFPm8RUTrQHXI3hp4QyJXCU373NGiBv1uRMPHaRCsob5JgBexXgbg0Zthu1ORAY1exaMUZSMAwhXInO7DBjOYJieLq9v5+eknvjp+g+t0zUhrkXRoVbcuRzmUOmY71WFwN07RKTZ2AOlNBGB9Ueq7uxyJATMgwjP+rNyMNu//3gpwszHDiHvpr0Jee8tVXcjn7+k8L0buWEnno+ZirtGvjwrQ8sjsyqX//zQr+fnx06L3jnfjHwniLkf+cf50+v14fdz96zd3Ax+Z2MKBn9OaZfjK4xO5F5EnfVnhlXeX3SxGfZnV0YaVnt5Uaa3fAw/uy7SuMqbixLFWW3JTw777fGlG9M3Y/7saihjqrNtkC7hzywFfZFFmS2r0lv3jtyTAb2XM5i5f+3dUMjAkkcRXQ6KJ07oFt1Z7Xj3G7+eH769Xb73iRgr3BM8P9WdY4ZvtFeJwiWOFyY7BTZ+pOWepkaHW1tSdmaTPVeRQMwrtBzCPgr+X69dxm5Z3+OFsUZ6u33rq+DRqnmwOkgY9CDUQXvQv4n7vq+LvA577XDyYuOUI7o4JHU11gChOu+13aA2g4AICEBwbnCqF3CouXWlXoC6BBcoieFpsUdbL+BhIoEHb7G6C0ylDCZlAFvgFMLrQ7MVUmvoK+E+urq4gLMEjLHiHquby9UF/E6Nh1AHXGoeHNX+peYZlhrcYMks1eVeaqQFhmEHBIGDtJubAU1D8cPNoi+PrzhzhmAHgc2C0HxBcILZuoUp5xF4LQCkYcYOU3ZL4JXAoRV+Fnl5cO4UQRbzawJEB1o0t2IGKyN9OFuEQG4FvHqNfIXfY5A7EvUIiN2GJb4h+7RhfhsggNvMYR5+hj0Ap9xtnDDgBmHQIG+Y/YantnPLIJJOaDx3O/9ewCbCXMLMwSJyzwi2A+YSMANQurnAgSbeZWBQNZ5LFMQ+CEg5CwPzLMoMKOhPSvfcu+b329deJM7E0N2JZqMxW0ILk2cbGR/kZThyX0QEjdh36DCkGzfGeR5x8dZdi5gSfH7YdsgEMNyEdY/cgCK8zKX1WhYbA8VCkHBJOJU34rbNN+q8I/NxrwwmHVY7Xr8dUu/OBLkdgI/GoG+nS8vAZabIATeuiOLBiF1a1Nay4t5xbswVaOvR40j36VuNNrtvSQrzjFISadgO72Q6a4vg2WeQNUOm8QqQNhGCmUNX7uAxLiYj0MY9McshC9GACEeceKw9D/WjIcFQnuI54QcOKjSzBIjCp/HT3ZHR2/kf7bffTaENIagwXi2X528d4HS2uXcXtujDzXPrsKI+BJMwcR9BHp/fbtcGKrE6kyWRM5c1t12tJTSo3YTz2wFCIlX8jnQdAlkFP5JVv3fPBvm9r9FGnsEk//LLCEf+/P18e+vTGOYpOAQGXn+/dNQGZsxRg1ZBWTMw82ng1lZ4swB9VJV7Z+zb4+W5J+R0ds145Vwo88+MDuaXjuDK2xEe9xTWXi1zyM50mpKxd0KnX5o08LzZcEaOEOophWQ0+rNqDAh6HEUyul7ACh60o93CKGMAH4Tup6bxCdZqVfl54StAKDUN6CEMfAj+fvmjj7tN+zJDBFwAmjCtEbSp63/fzH6JsVm93Q6FVb9EG83P8MohWcaILvB6u3176egmbZpaRdG7qmgPRu8LsN706f9bqc2ur+33nkzK33vb9F67Xodoq7xxjmvoDn1r29N3k4oPNVMW5BWly4WjR47OkOKzZcWMSbUemmjo+FCrQggR5wpl9k6hSfjgWKqs5kXqnzJGA7/kPDJHnmu/HBUBXs2sXNwINKHSNyHxw8gM/uo74jzAY+dpYRd6sKC+PfesFYuJiIPOSFUNGQz5crq1T9zETPKjKg9jMGrL6WXzbtYhseVBg8zNj5wmdsjO8avfBhS/1+/nvjlnMSlsdq4rDwRG0pDNl9vMZgAUqhdOQTnOV9o783Z6bWW2/GxmnBkZOvL7bueuMcx5O8ZFkoVTMHHAnk1j/+2O2qENI7wvKd3fSK9zRXP9/sRdPn37/PlQkGr4LUDD907YRcN1/WHe7g/rK99CQ+FIp8JhhoYMk+IFAAsN+rJopn//dr798aph7oWmygfIing33VmdzKMPC+2+rSzfWZfrBwYA4fMp1S/+6O6xyHssP/MSx2Vx0b0FkN/9Az+e3k5P19fXPPL5drt2w89NPR/pjhh/8kZWhVy03oAG8ydHHT74KNtbfYQH8BM3UIvETWEfgMWfGNWqPjel/fiTi/zldn27Plyfvl+uWVbJfq+NfiJ62KOiYzO8o32DZlOhNT7eSxNIN2h1zhabw5SZcY4974KcljviGQ2LstTGDAKiQHDoQ7i/aKD0JshCAhcX4KriSqGGrYuXEbIf5QqxnuBhjTkvHPgPK3PkKhDW0bgHU+1DA8pY7uUZpPHebqfn15frrTMPc4NIuVf9II3YpzFXAeuA0pNfNX3XgXzE7fzYshfMkhjF8SEY1qOBlJLmtV494wJJP6ZcRtYKDb9SAZ0TfEqqDxXiABDy5Aae37WXAfXrQMCOMxciC40kJOejkc2Qai0McLejztv1tcuUmUw3R2m/ANd0oOJH0BT7gXz7+i1Z0BaCsm5mqYvLjPjy2Fjgmaupp/rL8M+ZqBuFX8byLih5c6J35UQCip47M/0wuwt3ruOhCOLrQUCc29raaMqUO1o5bwLDVL4i2NSYRA0/KTPnvmEmDluQ7VjDMRUnyL+Y8gtRInckR6YNYEprdCOJHAHzeQttZPSMcpWQN9No7SgdgXZd8gjI98hR1scJmjkVCr4GTjNyUwaowQb9UXmmL9fXyyGfta7S8xs/yP1et/Pb7bXzE7y3Q/TRI359u7a9YquZSt/7CiQzg2pjP56+njppqmCGwZX13R6o0y0xv67kj9/NdEzy1xufyL2r/Yo8ORqP8Bi4OR/QIjfD9xGWhfm/tUokswsxRxTLv/DK4VKqYHxiu8nnB0YWTE74W6w6ll7QuPFElwB3U4N7Hq1cflnYCOAFRE4ZdvVIAl8xhx6w99BB3ZnMjXme6jE0DzLl6dX++tSde35qyLEdE43d2eSXRv3U6eT62WZn1RszxrRhd5KAjSi93iPoUhR6tdaQd2i51LYIMyOTHt2X26mV8vE2BpMxD2GfDhNfbVRpvVFPeW2ynbyzimgsRanPZJ8YQTMw4OU/u0U0y8xDUHoUjeGaYRrJs4kZRMGgFhzHOlquvWbY0QUJ+8WMqDMWK5DCgmaJx1Vnq8jaiQ5ZvnEd+/1H0CZEJzNvyKRHYbHfz/n0+HR5bse0qc0A2gYuGcwj3HdWLrijHmm8eqbUF7WAtLA6nwOkOKu52iKuaESScqxa1x24RrgPDu25CwCm3N6+LHwFf5qLSXzWMbKXmRbhWUf0dkl5V1SDNFFXrfOLBayZuUrrBgs4h9AlrfaFwXWQMqswhej3Et22NhaoLqgeV2cdGXiZO05mibk3CzaP50/fvvTyl37e/gzG/fH8cOm5syfb4+bK54E5bFwNTff5emqQPXYVpq/9ScpnAAN4I86Md+X4RTt5tVP2eLaqJ6og/dVOyo33uYn8L4/A+dBWhZtEMYRgnAOXIuPZg4iI4Rhp6lf8N+LzwYw0Uy2KJ4vjY+C+jG0Z2q9b92Vd82X5ZfLZg0eJ3RyYbVjjtuS/EZ8PZqR92U1+WcCi7yyVlKG3pfuuvvmuaKTAucf9CYHrPcynrDD3ir8Rn9sT0r7qLr8q0ON35jDLyNq4UrEWMJ8wsVfMIc6BrPaIDP25mfRAyRgkNSqgRmHSrALbArYAHJTc65rQbHptPNsk/3n75GIY+f4H+zSa7sOpI3WcG8yqIJm7e9s/nToaoGADaZjenw8WplwfHydPPYvnblLTAE2yHeV5K+hjcJfudDSB4ffhgvKgfZJ9jhZAEHN+Z6adAkhoWlJxqmjqJB8YR7PZMh75Fi2roi2y4TkrUh59tdGCZc4d3r4olS9YGwtavRgfJNjolm69jIvm+Wv8/cfLALnt3dyQpilKs+9ug3yT3IP89fz62mfG3NLUh5kx//4DNt/i8+30tR+6qSAyBf/9x1keurQ6386vL6kg2t2kafwWWPm7D5LmJq/n2/fUGd+qZnknNUoc53cnJAV+8jZEB/V4obL36fbH4/mpzQumUlBzR9AI3gnbxx2/p13eASaaoN3XtT5P03FX2mN3KrbveNGgm4EhkTyPQAsvHNCh/AI4nOR+HHmTaXKteoMtVePbO9sjNuOt9mGCcBEVYLiXQluV5WGQIxCQ5Z0NYbcheWk3q8+Y87e3z6F78w3aZMVI7ui928N+v5x/tEZe9vfi695LUUmDdrZv3ky4LxyV46nd2G1mxO2Ow/ctc6Eu7agx7MyhF/nh4cml0pImUIF5lm9YTrZ+K4/89x8v//n69qgZ44YyRJnve+/o8dvLk0Ls7uwer8Byu6PI//Pp21PbXmSjFsFRKlJRvV0RySlwQ/VYOJBEMTeUcAMQeXG3uWCEwoZljK/KMiMS3QrGV2SfjrhfmZFiLqIjKk/mpg6Msyqb2+I5IwUnhjNS6EIXrEQrXynODuomQbTSoTnJRpaW994ikH47PT8+9QC5tUE6rYg772SjKDfqdRYt+82ii8x0VunMIMNYLQqnSOtyRKv4WhfMWt80y9uCFq16/2gcR618m3ABntkDdZrCewRKpJpNBz6lOr6A3aNDXGyhPpt7FBffawMhcpFMuFYpElE+QWs3ssLg9WCZTwiv1YUmVH9BiMiqv5xMdpxMRsWJQ0VsFyc4eBXKMJX4Cf3FTJfIIJ2V06Tch8zREW9nJZmsaZGjlMlyl3JjH8lZZpxjcximpFFghRC1xExwCZVlNkUS+0gFI80ImxaMx4VYGDfBcMydHUpSfGF0D8BHCyB5TKq2sGoM0B2y2MswFmCE8H1Bqeehxi1NH/QXRFoe5eEV/QOCwm3DX7AwNlYip/SZmEaoyLLcG8yrVI5GFoX1IbgcwNnXUU718/n5tYM/+cnusYXnNPaNPiegdK8A5BbpVrIup3f3Rkefz7e+38JtVh4FvRBcDmE1oYFk7OjWCZ/dVuAkQpgbkLc7kd+P5899CcZP0USf/dNFIrk56f/fcpG1DftfIjuIKP3/NAFCWj0HSFfKYpspTNaK5KttkP07aJO4aTcZpVABC3b/Fg15aKocQA5tdNjj+eny6Xw79ZIhdt8aY/CwTDjWqwuR07wChIdPuTsP4TcngUckFWm2Xy99j91kZoHvyjg8Xb53A9pyZ/fRepcxO9IZGyPMzj7cREYuIn8dOGQZPiC6M3d6PF/fLp9LNNkpcQmi8Q9bPZ5xNu7VceOynGO0ME5kWFE/+3vzZWWSFIjY81tWEUjv9STiwhkaGPyMOSwApN85B/P2fpekfn65k1QUA7/crpR/HHy/TTbOMvHZfG+egO7UssVOk5XMWeoNIJQRuGbHjRiB3+bAN+lSqNtq0lNgZDhaQAiDDLuaAyafrqH4vh8ymEwJzUUMfCWHWNCtDF3BqcgEO4JoGXUhQVWM85FTiys3A084iZaRDXg7dX6OSTyA1EhNBugjfj09t+fIatr8HaSOTOiBcNT7kd/Z5f2jCZuda0ICocfxvakvZEevLViuj49cn9zLuX0Em6nIBj52LC/B9B1s1c3H88vtcr1d3i7/eT4/P75cLz2DpazjrJyEupOs9fH80hHyz6azysxySJmJ+DeMTrXb5XuHp/bRZl0ArmUEl6QxextpAi9LBKuP9Ppwu3xqi8Y2/Zabdg7DBo5cGvRINjHwZIYoqTxaR665mIQOOzv/XHr9K2QWCDCG3PEeJJajNgv+Nu3rm83dU+9vjHb5cpCH8s5sOxIxkqp2JwTjgZQWkvD4PSH6jkQpy7BzVOAGBqROPRH5vr6dvr60br/sKXUTh4XMCM8hjLvX1Xh9S3xGhxbA3ezRZAG4dVTkeDs9/HZA8g3SDndhFd5OvQqnX5y5TIZbKA3VLTgTqP3OSEdenDDb7FqDppAy1KmncN7Fg/sQIQgFF3NDonKb78xLXE5PnXhO0pWw7Mc92j6oYvdsU7u5lrj/kNXztgGsBHXyDiQkk06dw2RUoY96KPf4gtUC4NRGVpFFCNAKCH+xnl9QJ0Vbn+o4wjvhIriqAsJuJdMbj51JeDvsVk6Ik4UGAhK4wulEWlCoo6Lmc0ixWS7pwG3Hu/31y6nliJ82ybnA1M3cosl1t7jc6ehcOkFW0zIxeJxXVlkFSMIJTDqocFdmoxIER/YpeEmEIefOndvMY4slbCMrmmLpcGM556lFk9PcZd30CX3phNZdsBtPWMFlH9jvy9eUjG6PmmBaXeaDE3X9eiWo2xiPfMetOziI7KCfEM5xxxnQ+oqIwgeov6E5ViZX4WmxLDzaXZsE5GBN3HqBs9mUTh6eUTTQtbfMPphnp18GWckyWkvQ4RuQ2uY5sGOiL3iSHPZxxzHKBaAj9wsrgyMCWxQlh4bFiMfhwpZW916XdkQuIRlfutW+8btJBCXLbAO0Rhrxdn643h67uEXGcH6+kyjo8fJ6kAbdTDn7YSyVR+rcLDvnfEA9DAbtyADMOhQX0utRpUmGmf1IzHrEbUhcEVaqv0y4oLQDMRHSwlz+XMfkGqNo33nnQfQQz8XGrg739evD6daeZCavK0grBGu45y87WPl0ky5hvN2RMO5ZyrHZmUSeU8grWwcGmY8DMoVNUhT+4b65jbM3bFkY4G3HkvWbH3WMwyzJvNinf3ePpgFb0XKTRw1s66jfC2p11nKPI6eK7vf22+367Uub11mlwBO/D7yF+qzu+k5HJU63mUfLfXCwNOqhTJEa35q0N1IvdxJOPV5ef+9yJtbTR84ES4/TGbV13LjFy+mtj32ds00d636yV35POeWSQvfusQcThSfY8gcc+Y+X74cGvD2YuYD7auvXdop2+XtiAhHg8QR7OgCcLDAXN/hRg07I8oNjmmOx83ojs1t+0BPtBCuFPjwYyw9eO8ffWi5BAE/stXFt3+FiyvYyJycDVQBYriXq6oYt3GTMMi+K9iVbdVa3ZHITJHRlty6XloW8x+AcaPRt0XYE2A0gvsOK7fWtL36HfRDigGtg0JZy/dY5YXGVLQMT4kPPiF6H+NgdzxEtygAPmZs43lABHsxIO4hGJAmEoHngti5u4ULbKYeVtdBlwCvuINrJD+3X0+12ajM7rZwfl/8CGLAaO8oLwi6g0K0Od/JubdosNtd+k/cPFhpX6UOMkmIAWyXc22FBw3ZpSpu3+T5PPI15UOgwKdzHQ/3okCmL6cwoPf/Hjnb1JrdOC8WbiDAs7RoNIkUDLKmbWQAKWRtmCIjMHL6wM4/s0qDH9XbQV/H71jiJyL8Ehb2yZbFixGOHc7Rv3dExDRiTYd+B5/FQ9xqay9tR2mW1aZ/gnY8y3mnI6+3lt1OHbwhrQ0F4p8YiDdd61yYnOYsagR+HoxJm7RY8fbbTdPv/mHuzJTdyLFv0X/TSdcyupdzhc3VWfskxC3MxPCK8RNKZHBRSff01J4m1NoYNIiKrus9Dd7OVEuATgD2swQNYdmpbjzSfptc3qXU855NvBzUEs4UWALJZebSQ4vgci1NlrfWDr/HjUymonYhBQi3CREe2R+buI80FDiuATSfmzQMZSfti+6rRyexsW6UnOBwIUBK8AMs0VW735XaJjyBGrWA8dPY99wKLg6cB4fw600/3fgUpgFHv7F2Z6KnbsDnwIiPvzeCWMhPpdZ6AtKyvEbv3J0AJx+Xghsx6IYUVDnApktg4LpacZeP5IVVqJpBMUe4sLS8LbdV8Jy8rt9wv78kXqjB7nvTR5Th+m7eeuXjTSQPfitj/SHHVeSoWIkg7GApvUjwToaxgR+iq7tdL9Kqras9oYAx9H5kKd+T53yMUtBLtpTW21N0Gd4KaBMJvYJmAqepsjQtNWyEBf/87EHSgOFOJfgqdqYAnpfluCSJaaQySC7JY+V97xmI4QmMCqNDAoLUBS4ECJ8eWAUqBAh1XhO+V1RqW/YiYM6Kljb838KAhyY5sG3yBYAOJejBST8RSBs6hBowqKexEehwQTj2ofyhcWxvj6y8i4+28AyM38oHhn1Qk9H9uX/TTuHErYkMv6folcvUSZe6eDst15mnDuZ4O0/Fuvfz0Ms7bi+dOVDiJGGvwPaWyc7n2YtLLfvwxzttgCUsPQfFtG7iN2mf+kdn2y/t2evYUQ8uhdW6MzMkuM2a4TTBuvk/7oD1T1rJnxI2DHzkXSKZwO+f7Pk2HcYXzuqiUVkrsdIJ4E6lhsJzXlImTz854WLbbeXWB+TFuPTXFvpDm63Vuux9Dxz3SO1mkGWjP3GS//CChVg8Hyxm1P0jxtB8drToqoepOHiN2OOwMpAILDt+gr/33aeuIn634G60ODvpdpWe/07hx2gs6lAgC20AYCoFAMvkpa8izBWcBJbVxaDKrFVAi6Z1IVqTX7HX3ZKr9MFtnKVEvMU/jcTt7OXitG/cFBc3omJu3xXtJKqI6B6C1jud18VS5DlBa10g9OaBnKtYlTMUy2CnTy4vfSTIqDhQqAIw7SHu3p6A+i5e0150aaNMv22oL0L0cEsg1zm6j4yIx83g5Ly/by+kt6C2WncR5wrjCtJni3NPLi2e/0OiW0jlFmptqkJuUiNC8saun4UtAs71qIyG6TZtgC9+wCWx/YBcDwA5ypJalDrY7Gts2WEEaBptbvLAPsdQpdwaCn5B8BJmP6CdS0IkLFybEpfAvRfWJYjD4lCr6x6GkyUyqjiSZcC+V/t8ksgOITHqv6IpjSzSgGYs3iM2xQke9IqWdQTFIAAyPGQB/nC4t2HeYreOfkdYHUn2PI7JH76InXbTHxkAJHZ3QMt1loCJGVp00srIfasNHgvpq1Wau2OtccE5ZDpFyTKVWzmJ5SaN72k2zK2lVqRSaFMx+ms9v7nFXqxEEFjO49SKzZCmRp3VUzDVxZmzHw8m3SFOdqUMcESIc5McwsoDofRQ1BMshkSWKjBB3Rt+JVsdbTtvp+v87d6Hqu7esSOrN/PuQJy8q0UOzJJI04TE7bSevYF2r8W+WCeS0nV9nL1lrKvXCsU3Xul3ptJvDbq/6lQi0hIQK6Y96dzj7ZEdVuxt9VyTqZUuVVwDRu0QAsw9S2UrVNkvVCSO5ZKvWtZDFhVY9AuNV21WFqhOOuiqs9QgLQrTZJHQLIUXEjDDwAtLv0I2wGtXjN5bHRob05S3LThYSBpIZmrzG1W1E9zUUajkbpVp75IZI6ZrGVDZktUXE3u5pvX1Vgw2y6PbB6CXmagvaQwmKYQyQXdIQKOakgNqSgaqWlGnB1tsAqQvxIiGc0vM0z/HBvT3pP98P42YzHRS9TacqhLBMhAs5b3O1e5z3Hra3bB2dTZsyVEWmRAqG3oz7zbT1xnYUslpGOXlVDI4duKOtmmTO2Cg6RpAYybHdIk9EoM4heyCvE9lc5kSxoR3xThuwVYXJDNPs0K/Lcd5uPZ3O1gWQkPKSh0zE4Hdl0M1VXSd2E46Anw2mqwJ1hI/NE8xQFr3ziXaoJUdEl/MkQfw5fdXTyF12zqdsoxFBIMq8y6sd7XF1pfX81MvOUaUlUdV8cI3HdFU7Z7F0WOTmI4vcJfeqNZD7468SdaR9oFvaFipAgZU3pK2GsEz0gUSnB7AJfCuCxIYny04P0zO7NXEjcbsXhm+ldr8A500pdxyqnnbO3iIqRR/YIL3DoqtU0Kd9aihCDFRjEvoPKfFIpuaUc2wbPKlEPXK/Of46+AjVSkVOydmbRNh5HdVH0VY6GSALkcZhI2ZH3WcY8quUpEfwUyN9QOprnQkw7Z/n0S0DqDZ1wALY84V2lqghsV4EXJqsF0GtHPWiym70JajkpqIvGaohHdWGRTWEbcPUEwssXPSyYaoyEJGlqAWC/EtD/g6eFIpzQPeiglNScH5gQh0B0IkqLWJSBJM+khkXgQC2sVsMtABRvUL+DuE+SCGg5IhSIWTJygKJT8HmOjfL2quwO1aQNcTXhCkkSkxCU5YoXSRDqKKKap+o2KF1LCp2JR8Uys14eC39IZF5INo3A0YZdIii/Sg8+peaIvNl4B3w0VeRp9r+G+5Y3JOOm5v2L8tx40ZMjVpS6QSiQK9M3Ib0AFKqVhLJk7KwzLIuEQQsgurVwLXL6lVFukqrJAzMv3Q0z3XIw3F2lXpWfLr2ssnwSO3odtT/8jKqQi0LmUS9Zn+ePeRBo0q1ZbbrrkO6SnW9+haNEJxL3bTP2e1k171neBBJjwSBA3a3NtFGNwFW5cBiC1Ukwc9AvwKiJhbRdbXstWvIdImVc72Zl6Nn+FpIT4WaAn51blB2dpnItY5BB5K1RNkKBzF6z1DplTBX6MOWgk+f+Lp+zMdl79dzTVOrNBzY0luT+QfjuougVV3dknHXYT75haxWfXoo5kRdlhudQHqfxoNctFIrVowdGfHBB3BYPPCBiPIHREZtHybicJ0ED9byBoQpFjIsfiEocFVcAuhZJGwopz8v849x638WvUpCNF2nb93H12W/7OaNwzfptA8B9IKy113JpuPxad7/GLfz89PhuJyXzbL1LlX90LpGv+8V6OyE45I+C3OLDtiVkpg8Yu2gqF1TFzaCS173fbuUWFu+z2BB5bACKCv+AkiJ3snkXEkNliBlk62TqMku2cv4r4j8RbMFQrtsu0gb3Qj3DTsvzXOFYzJK6kIanQ4BAvJLMCxFw7HIKc8tpK3QiRUGvQDNDYwJ9fNg/Sjm/bfl52Y8jBsP/Vs2skCD9yYuus4EH17niXgelY00vu2IJY0ITKjj+iRftUxjn6b4AtF1xMuMeSf3sddlUi+OFqMId7Nc2KbVfy2EjKtWYD3VURK71GkzHjxTNzUSzGlWxNsGfrMgfimHaTOPWzdEMymVxsTZeTqvMg6nN5/zVegnsb9C0+N65n0mASajnM/jcX3sfqkKezAH7flLV0jBDEHYY/Q2K/Zcu0NpI/vdTlWuNFmbOJ3nna8NuGbYj9K33m7vA/J9AmTo1gBCDjUrE0ogfs/cFHp4SEMjkYsgEhenipArjNg3otIgJQx5DmEUsIWFskbBwBe/UIFKpZg/gnhH/eSsZYQ6jnpemL5wFJFzs4cffixd6zXSgAgHshqdfgNqnENbaxJNEk/ou9Nli21MC0t1kb3QSbIilTUiz5bKXkLhZvVSqDxn5/drbyW/IJ/7ghOtsv8J7SQW4WzqCoQboC98Dbbv0NmvWpBg8IZ6u3At9wWXKnDHKM9VdZAFRstzAoscZbLgV8PqJPimKBV2yDmlZ3RK9IC291LehowXYMQFuwWRhI4Yc82fyFpB7E2EdIfjfyjT39I5OHQqlTYMIIwpE6WWn6MPElZbECAODYKl5O3OTgM+PpsbNKjopnBBFCJZDAsL0aXZpi5ld/COwlrVIUvW024jeWWEBOYkEQrdh/r771+/uVdm9HJH6so2k39CD1rEKNynAOcFhlW3gPFwqPqmfL0W72pUwSbUzcDEsssQJmsl+Adlh+OWMqAD9kg6P9GLqTHJh3byyM2l9jJbwSXRe6g/N9uLLwU06H3jhDaCHWq7+HGAwzGuM6Ek62iBpZGaeflgc3tkR0HWFUjnUUFBK96SUknA5bk7RqdqH9O3hyDu2uhh9s9p4219qrJUk/iwp83T87L3ZM4bCf0o6dmKIPbRq5k2l7O3PWl7AHBlVa8Xjm4DethetSXc2mCB8LCSCN5EhfI2jRsH6kkLImvgHQQkP4FT/vk2Xk7e3XTqHglzTsG+beiFFsn3B90H9j6337lPBJnBBPFhZw9XU+lOP6nE7OdVzMxjlat1AgZizIt68BQCgviD/GSd29s6VbR9ZnhyCCXBW1XhMX22Xofa+1xS0U63j6JqMpFLPw9e60sS1b6Q4F23mTnUdUAXbqGDkSldBWmwukanMoFouc7iirvoDgGEWFOkmZXkyNq5t7/UmX+5E+uJ+uBOpwy4nTcuwrLWu482gKVJDugJSGForhbVY6MKA3rmUDoS9aOYklodJgHWxix1b1vvgenK/zaptmqXLFfwjUnQMBc3oAqJstfPw7Jf6wajy3dtVeZjHzERTUaIh8XrdJfqSm/wRgBoE0qH1DcssG910Cu+Kx3q1+DZJta6baLFwMS6oPgUev5CV4a9z9RZul6MizZUI2ZT4kum6AQV7mE8JEANqYmvbt0ew1UFB9gR7fO1q0Zv88VnPQdgsxUd8am9/hxUylTV0JSPxDrQce9+8aZK8H5Sydj56AKd6/ozkpnXcWLEtl7iGVZN7cwjh8P9n9+/upDBWk18Ulf4Mm5Gtxdu1CIFQlfAhvmpMNPD+dbpskMvY0SXfcVTqLykz8ro3Wby9BVVfhlgcREaDy9BoDvpChEh6vACszqDqy6I2y12EOkox0Ug7+v+gStJlrkSLlsvgctM48o9IzfshzDmErBDlh2gS3r/E4gPoG4hIX9sNeMbgopUOZThAVW3rN7x2tAl11Pz260+LV7x2RTSGaGkhfWQKVy5juvjSY0KcxAeX4n8aR3Tv9BaJwXiUCNuABUf8MRRscHXXUOOglkG7NiJxhTUtE7XorOXfDluvU6xlFdLoB0JcnRgjCp4MevFePrjOn4OZyJqzQFYNnHFguUrABWwraqhz0VTG1qlSEBFUAePgywinNVoR12AJwgUiTxlZglUV2FvPQIblaAIr9+eZjBHhJBqnZaNfMBOgp2DLFJG/H/J5y3l7lZCIiXsD6fz4/vtepxMFWfQYSOrdGGNl9FTtClVPjrjykJ351jH++ZrYxk9sg8YsaVBQYLM1oCxeu08JL6LrbdvdKpM58Cmhu6g9TJu3WSl0gXQkcnaqB/cTGybyAgRHAhlOSSfPLBRL5OBA/ul2Fq7MIRABd3RUksc4c4x0ZeqHxtcKpCHUXKIGPgSeULCZOhldIthje6qDLfAOhWxXbZuOtCpcaGpgSKS1Q0qGyaOqMvWQ5MaXXLyP7SbxC/sx3JxSXBtqxaTc1TxX6bp2V/TpkpIVSWyhensgk7X5S6LchFcYqPXP1+mdzf80k0Ns5wSX+Zp6zWt1K2LTmKiD07uH7C+jY989ph8+qYz++Ad3UuINsCpbXH2G5edutnneTFdR/x1Ok8uNL0ptDpw1/7Hz1djdFTdy+wfDIW6NJAblD1x2zm+HS/zfj0u/rxMe4/w0snGHXuWbZFXgX6Z9z5oTvepSiyaeT+f3txE0aENg1YVYy5nSV/dpvB9PlTKZzlUeoByGypEQjs8ZGg8ZRKd11HdhlulWwrn1KZffFqMUWtZVNqLclcHVBCHPvEOjyfPwVpFY6LWYuNfu1IQVwB400BlEOabNl5nwk05EuTngsxMtIZwBMcqpbIFHQMKQG1KATyHMB8SgZiOlliQ5KhFsApIbYSwQOShOo80sbpQ+YfCMAITijU1FdIzqtQwlEvClKoicoepLccLRbpe7ZoFSo7xAT2cQN+oD6PWFflf5p/uJtCrfhlAnVTUxrG1HpbQQAgo8HCpeWlq/oL4CjJjmNEL9cvOxnyCHiy0c8rISxBPr3Kf4/WEZ04LGrE9wCpk1RWy6gomMVVR6R/mdnRKQnpfAIUDukf+D0ae2/HVY6qKz/BLY8PqFiI7tj7UWoQIvHZ74E7sox+A6C9Apyhpvot3YFC7aIhzR/kU6oem7SNlUOEszKqXcOTVV+B29BzF1C68tCGigqowBko94PN52q8qPKETT+eotNiyUlWYzMrjdvHuYKgcFyFiAmKcydLYAtDHXZGqQgfVXi+rMt6tOpoxXRsMk3GrlYm5Dok4qEZi25cfGLet3Wtt3NcC8RxEPM5DbLFDlImvYBnPsYs38uLBWsPZ88H3kne7frG60XEsYn5w0cWVtHnXFLsMNzTsVEwrgL7CSLdjYTqxuJfl+Lfd+DM0tOw6FYeUd3JvFyeFbfQmHKXJCKf22vvxGS5+e1Q9yy00YKC4asWTFAhAoP0GyLG3oDQMqNUNMAhmZflOjFAu1E1LBqk7Qw894XQXW0R47KhXCrgH74ELpEhXzAOYQbaVagHuVYEXxW1UYsNJDEFzhGYBiShtfWJ/+z9fN1fRKzfVVPnIWHJ4LIYOmq2uWn2dbNw/v07nWHI7yM4MpRoFcAbxTexikkXJdWZfbEHN23lbfBOPbssnjanFYptCwcODa6Fn54X01sq7FvUKAmNj3YArSxvoZfvrfZpf35yvYlDxeRU+5ASg62XZbpd3r8NrVMQaLaQJ8qwz3vZ1luBc6T5jyX0by3m5jcr0hu0MSDTWeSU+tFtj1QnktnVtiTR2a0VgXqJ8iMYhtin2+uwPyE0wrrc/8A6xK4UcInKS7z9oW8oAz/6AApuNgJHL2LupoNgHP0u762MjxtaNbQH0cEgiwLEPaRW278YKmzV2hTV2o0Y3sanwJ9A7h+iqhf9BxIje6DYesHNREz2g1LaVXxuBrCaqr8LQykdUd0CGBByrziYY8KIjPQPSyjYH7u2r7OGyZlPXkPQLVhS8Z7B54IjDWQ+iT9iMIum+QDhZYJUUKHmwEh7L1IUYPDLwAolqiWOdUDbClIV/EiXg8W+NqLsj3+epD1omNUqkaAH3cpQ22RDGVYl+HO6tZigmZOYJhCADDv9VcOHwK8qFw5/FvDpCYEXZEvPS8c+AuBKVDhToam76+AW8DMTRRITE0IvnOu1we8JlaZbLWBH7HaSv0lbFBNiWA41G61gSgX8rkgiArcgSGrwmiRejUeohjNYKNuihHcDmpjAKiLDsgd2WNgIN601kJLKn67EvrooeSW4icBoVxY3IsKYbF1WgIYVe0YgRVyVkwMjHBXIO4YLQV5QSGJFqmZAQo/UBkSIRHXg07KC15EhqhNU3KmU29nwxOMsNCrOGHKWYWHJDJR3E4CidGbioiYyHrJmgx+7Y4Ha4847SA7gqwRCNVBE7+Op0uOZYtkBpq174xqAWKTgvyM3Q7RadBwE3ZB4C5IV90xXWkdV4pmH1le2ll3WW4+p9dHST376WXHSwfNuY7y+hoymY6HKcXo/Lxeub9Todj5wKcJNMDTgDduoUk+1lOb5OnpKDjqf+dzSDlqPbfzWdFuc39qbAhRACmmJHpaObLue+Tjt6hQXd1jgKPYtpLYjaFG0VIloLHbf1JGyNMjF4qlmyLuvteaBJvf+O8LzWnSrWAT3XJ6PXiMESp8JO+l28j0dXCL9UOWo2hMRGg6CS8EHBJ2BQIkIRZh/QsKt5yITeNzWOrxqF/Bb4Ym5RqQJRsJBr/QGmQCg+PqbXVW4L7rEJ2IgvxN3oNuKIr1Am4weK7zhM2xAj4BnjzEFO3eFh3jcpu1uJTMymWzaIJhiyRkqG+tn9LQr7VPvhRHKY2v6w/8omnyKZsTmMDaF6ezu9/TqQqEAlCS0ZfJvUgyYdSGQPMR9WkR+AQISchqrb+DRLcJZXMAt+IfcuYhE7c3XG7vi3XDpcWIj7W+QlxKtDJMWJv1ltQtRNOGnFSJw1TcTLgiaF+JFerxA7jkWXBh03ZFCiRS3jTDbGqaeCP0MMI8BF0c5q2MoXUR5inYZCWkQ5YkuB3rcgg4mYKOIYK1BZBWIdu70JDf34+vf0VQv9yBelG6KcdTL3dfTNctl76ATR7jECdIBqEDpID9o46/DutlrqXCXYrlk7MHVIl8qmomu4x9m4u7YtB3o824Az5t9syyodNiC7N9kPOeLTIpZt1DS5wC/8CzBFqaTc42HTUpk+cnH7ZCRx2P+N753jmCcF3i36A49U5btKRtQWDtM12NnxtRTcCXDZXSY3Yp39fTl6oG9VagyZGLZC6P00qUN2cm6tVYl50L4UbgsNqgqCMxPKm6TcL9cL8PoEqmhdvJ6R7BtF2dW6tP7LcXK7ZeuWpmY1CbS0ryusOpH6hexIAZu5DOoc/KLtTudXl7ESKuq/hLVki1mzSxPG4bHKsf2a7NFD3XnWZdEFs3VQmlbil4ggGv5C/ZFAOEQV0coh64Cs9NHZmZEBZEy5xZDZE6vqQQJWKGHFKngdvOQBsCl74lv/TdU65pGIPvD8pMAe/oUQ00PSByAdDAFktQ7VIWBopKg/gYRUvRSVNFSHEK+QIC1sM9mNJf0Qh5SIFvghi6oK6iG6FP664jbL/mX2kROSOkj/2iLTq3sddtr/cMeU9uZRrezHY76cHJiJO6Rdw4zNyVPDUxExWaRhr8zrRju642CWILx3D2WpIiDAqTNFouBy+rV3xITWUtxfA9KvI3psEqNTNCs9WLy4fK5W7c8KlWc/lcTmhByE8ruBXtgQIQBJ0edYtvOfotbFRT6x88RkPJOSnYUwcWelPeQM04gXnURF7lMPby6+wO6g44+7BAn7st8EekW1SlgXVUc0gTLZ5veJxq0vKVrXn6nKvI6zd9EJY4nUMAenZqfyd9iBAZWN+qTQmMZnjwOeITNZbkKyFLE8WxpULSSNceBHpKZRr+PB05RW7Qp6oR6gfhqv0346jqGYlY6Xy4KwvU7L2+jGolKcoixQyGCRAWAZAXuO4Jhpkyf6yU0wnIA7o+MtuygCdamuv/tdhLjKsigkDA31lD4zv74PfDhOmzkwxa7kod+iH1Zm0li8PkNXy5pAhxqGTdntUq8oqoqNsEV+izZVmYsEfZ3OV0Dy87yb9us9BtWKXjpZoTxMny6gI8q7Gn72nD9mlwPY90bOZCs6ODYCv9Wcmb7Nq99iOJXA9law30N82+Hs6zLjrXWqZdlOrmdaL5yFv1RYOZTTg3RVlynfvM7zy+U/OYIyFUhDSHY6HPNdpuDk68r19PjE/SAnsUk3Wj4d4oEObnoPJ3meNvNu3F72qw6/RzcRAqhfKpghovLbAVTaNXmR6XW+K/d3vJyXK3Tv6CHMjCklPp010RgetMtUn1vnXS6eeXUv8eoVHB4RGHWAZnSZSpSv03m6eo3upvNx3njiG4LSRjksK3mVM3ZAMuglaB01Y8AQyg7bbdfkFaNep/N9x/3mkaJ6UTD6gqp0Bfu7DmWjrsne96QdbJTzWQogbjS7yJ0i+kYaaRCIiKPowxWaJ99wnc57Q7V8aoD94Vkh5KaLwsNb2i4uvFPa43ypbHmwEoBG7Kn562WdxDTt+3L09gSxOqFaVgGhhW7Bak6eO9dyHJ9dgHIhsQw15TbzN8/luDlO43mKhSSNHJzKIhEZsDyr4dfpfLjcfTkS37IARke/p4f35G+UakM9d9eMTvK2HL1vWB6gtkKB3nTZoXSVK6S2znI+zv5XLI9Q226rUGfrwCXoMv3t12mups/uNPIQtVFuhVI3wEXlvXGbP83Lcpydz1jmoF+qig8s/zFdB/ZHleeWbUUDclYCFFV2bfaxvNoW+xHaIJtkBC+DrCywkG32AXm5zM9v86tLVSnkBlbhbMF9oCzWRTxYExN59KChcDYvuxuDVdwBMN5l2sC9zq74vE6syMwG59fRjy27TpVjRIm61Usarx4ZuWxVMkAfASsGQvBptZPX7fLNUz01KplG7WCtrmxo9SVSck9K3JhBLXpIsTe9ZrAc5+3WkZ4saxkldODTIlwwJerhZXiEC3J/ijz/ehw308vFE5NSaegRCH+HDB+QIuJMiRAljrPTZa1ej+P+vDlOzy4tqqoc5igB07cfLCTW2KprFPnKLjP0WOf2OuqJ+nUCMfbq7camSAgo5+jbrFhIpzw26N2+HN/D1+PyPnpJiVEV2LC/3/fF2Ihvoydar2pVZ0mKv43bF3cnesgNpdoWO269XqRbKXG+0YVKswLMyWJhtBEDTfdKu24AuCwQSBvSfUurCqj2YAlN1/WbbyN6MlMqZ60XZdHkk/QFilQdX9hT2BUrbSnSzyHwa1dFkFJ15nWo09v43VUflHqnJfJwdDJt3Y1IshrpZwOUV0Olgz5CtW9JisG7BynGlAIGSBRx8qF71XtdRDf5OA4Hz5atUk2cy4QN9psHYy1r1QmjBZ/D6E5Kb6Mr26lDNlBFA3kA0Er7QoAtKkmwJxdUdLgIWE73zEVXPNKb6oLeVJTDIgBEsDWtYUIiNG7pa8neFIBLCeDt2+irtlWtapLzH/WifBvdUFD3NCnFirj9AGMAeLAHqA4A0YQzWUf+UUTAh2CtAB0QvZtpfPbd69R2rR0wrGl36GESgEP2G0+xoPR9/XaAzqR6JAWgY+hM+kHE0JkUiqZsih7/3p6Ap2gq5T1MRfIFUOWN0KWOdI8oxlTijvFWHWmlPrj+Hl/moCMy36YxPEV0KHrCwGUd6fzm+rB36v4bGCnKbiRgMKWe27xNbnfUFDrIICugfJvG4/nb5NFATJ/Y+T1kU3zU7cH/Kio1MaKYh6Dc5TgfvE1HLyZSO86EHeDMFdQ80q9o7peQLX6bfnr0A/VxZdEP/GJE20k5P2FAWkTKg0DoQclgsEuYOHui1bo+ONkMLxIcaYm+7vTofH598wTUG5W18m8HdwQADfUSPXlaVX4LCgLgdFR2XnIx7PaN+gA6a9TaC2gRVonA4SOANy65AtTbQPMnygEQmDpGUTgVwGwV8ns+jj/+uPaewaSKPwJT35480fGWrZ8Bq1SdvA1r2XpHrjFqkcLuVvpABy9BN4401d1X7WHFYB3Lz/haVSkvS7P3bdktK95jubgJVT3oIpwUMIlIwt9F2uNz7ZeLv133utkcYj+wZYWgYyKSXxYfYa7tFY8R5oLzVhYo/xf8xklhI+eY5UNaHHETQdrQ6X6T6z14AlJqucRG8/FxfPlP2ekuiVYr6AUFrbkmojcrCnI2mm1sDUyobNinSXENm9FSXMP+HbA3ILMPuQ17eXDUbC2oDpg/amrQdcISykgx86keAGwBZQzpigHpuNCwAOykKMP4X7gq4KwT7H9UJEvsmyX/ngjHyO8Pk3TJpwppIIK3H+Xe478i24hy6nF9NTIVybMnp54Bdow1D11F8LjwbgTLvaWmIfnupN7iqhLQwvXr9sSvu1YHAGe0ENYR9x5J0zQ6g0R4mBXJQT0jYDUdTakUvbn+rr06SBURBUkUwd+Wy2n6Pk2Hef8678/T8ce49RjIlcS2YVnabzvj4PL11x+fzmIxJc/pd9/ZfcXof+bpns8HN7/UNlxADOktB1mNEssz6hQoRGTKYNOQToGRsIvhc4FFFHMUFLIkwnYl1eXqUHDpsMgTfnjrk/qbJ+DaqnZ4pJiS9InIhCIflOJg0zs682/j6+TbuKn+1Y8G+7r+L3dtlrqNEt9ylrYaJ/h63hzW//G92dTvtNObPeuAf//7+Px8/Me6sfz94IEYTK0ryqYKs+fz4ek4/TN0Vi16R0KdG3Nm53gdedm7oPXS1GpMZhktpDkZXfc1fH9GLyfHVml0zUVW2oMP6RT9LFU7kUej/f3r1z8v0+n8/O23efn6vGxOX4/Ty3RcoTZfx8P8dd4evo6X89vqvbkZPU/oSp340RdwPo77U/BFOW5a9ikGz1ZdB559oG6Ilbi4+Y+vp+m8YtxOvh9hqy7YlLvB/Mf6+AJvQ7XPmb64FeT5dEV5Pl21X4Nr1PuJiQ1k/mPaX3ZuLPKps23+Qzo6BjetrsX0TV/djoLBdHOb5GDc2n//Ov/x9ffbn5zwR9439PlJ7nvndtmM2+sGOhRFEbwvdRNJP+bYBOHYaoj6cOxT5tU/ClgTM/iDNbpFQHKwNZJ89SMz3W81Z6zgPlV3wvRw/3z/Hi78zzR35z/WsHnczj8i6+CRMGt8wN348+l5PI+vx3H3dJr/FQzcVqqDR/Kml5eXYCjzuV1p2QcjqQvywUjxHalLLL/Uln4YT6cVxxu+3b+mkjv/cTgu52WzbNfN6e9//3198b/W3//4ff7jx7i9rK/pj/9W/vy3334LVpXavUlfx5/vh9/ep2+nZfN9Ov+2HmHLcf7XlawV3HT/uS/wOF1Dj6fdvH86vx2Xy+vb4RLuYqr4cfoG7OjneTctkWHV4DU97Gl1iT7+pnCm609BNyKj/u3/flHPkP/7ZbVK/uP3r1vvPeil6E9NHj8D/vtyWk2pd9M/xufdvP9vuxT+cZo2x+msX9znPpLYxZ030Qcz6HN/LthS5o4+l4HPZf3x3+fl+7T/x+E4/xjP09P36Zd6cdVnsqj4xV2eow+m++9gs/9HWSc+JN2M98OX9B7/ivSp9XbAx6a+/Z8QFG8Sjqy5U0z7H397YF3+yds4P2/nb0/r6vtHZKPVVdwejLo+hOBkUDsv6R1QW31hcPi5eG5dYWFs+LkA4rw9PW3G8MD63Pe9jvZjOs4vv8IRP/e+nRGvyYh2xZ9789ddKAxSHiU1j4KU67BPP8Or/NzKug0XeaifqS7Mf2i7YPiBfu6juuyf582sJYyfO4Mv+9P4Mj3FYmd1K3lwlffjKHz7GdILuSNfP1k1GFbLjuln8R4WDlRFgEcjhUPp0pp5t++DQQWTi9rEUYVgAiygjA45N4l10O3r5udpd1jOXv2v1E8bKkGXOmJ8fl6Ley+zl0MXehRQ0qMBpmWJYT0hQjWvJOgxBVKcPeS4UWNu24QNu7plBZy2bKWGbdNaB92t1/F1O79Ma4bhNbG0JRbraEUHvmctfndMhC68K3vhDwvk87OrgVir+x9ktGGJRjVW6J1BMIyyAmhVd5T+pMCX3g6dHVKEUT2sKKiF5pdog/XBy+WlyeZX2l8JEC2q/cekokGgG9Cmi8LA2GYU4tIYmSAx8H0HqgcJwekIBpuYbjQwBMAMPgwDEXL86GP47ahYNXAb1CCCWlkB/Ha8jUikB0bBApetRYAVLb7Z0TxDpx44na5mCw8IcszWYc9jk7HDbFlSQvPrfvGgmH2jYyJrwHXQ/YQysel0qcPbNB5XR61I9VDUEw3OxEF1HdxZ8J0uyOhjFlzUtYA367vW1kXy1sPHtCiFWp/ahJt3u+l59rpQZa/WucsCK7fBmmuaEEVD/rA+p9tYrDr1dLSgJInRJUOGHXr7ZzXgK/x+iOWNyXD2AtWr76m73eXsk+FqlbclRICJJbtv9cBAWQQWUDO07wFIl7KV2Cyl8Qy2ZmxQPYA8tC2ho7GwuiCYl+KIRj+fdytme9mHAlOlzrlJdIDn3WE7rX8SDFjquqv0l4/09J2jKHLECEOZiC+BsJbBeHQjgAB1dFvHtskOtBHgrQjAkBsyN+kc1wL3qf3996/f/vj9mxtoSpLaB6J7Z2CPsaHSUju7wqDTLDTbxW5Rc9+gaDJidYgmU8m7A0I5AanANXubfq8q6xELavGcyXHdx6B7gQ7UGdVdRtdR58kbUlURH4TVTOpCl9Np9hm6lX7/CcTzvDsclx8eiKTSUTWpj8ljCmqQEftRgBkJ1Bs1TezKQjKBFQZjChzf9osiR5KSh7cfIIlRcRjmCTYQg6KKgMoCGIsf94sXeFgLcbXYKOzqUG2gmnlosAAXBfi+2b2dUa3Es4JNTz+EJtwcIcIlHcx4fMBkRfoh0PEAvzBKI5TomXVTTh0MSToeCDVQatfj7/1bdEGFdjIUjsnkE+rIdFqAXxoUBRUuJw4IkaHg+BAZCv4Fj5k6lr/ELHHw90T+gr8nDiZmLbEjCtcnshbmKiTI0E6HXNNY5oGMglhn4Iu56AxIWUL8PupgBhcJ4UcGJQgEaAL1jNhZaOwS68yiAq1nwEoSopzUmMAhTgcKiXpGVE7LFXr4CoQz8yv+CjWlycGUWRUpLOAh6rLG8/7b8tMNN3WfKcuIsJdHq0uaVqqyv9wTrNyb63onnOvIs+Sbpbsb3kmi3b/fbC+epsKg1tCzdCruQ7pnq95HZ+prREqrR77X0X0xKLXpERJ4cda0FF7Gbk+gd8DeFTuX3JvAMjB8F1hb+P6y1Hyut3by9Xe6Uo1KKPVtUm9j2R3GcxCX1CraOB1MbI63yHTrhWOqzXlWOLZ/ng5rD9Kt/iagTiVKdZYUgwWFihFdgvo23A3rhjtV4n5xYW6O3Ax6gwW1S2SyvhOUtDfi8Qt19V6U4hIr4dnlthrtYZEFcl8L9rtsEa4wNBGHNln9tR71rnN7i71VLW16ukEmb2yF4/q9baMKMgtugDjmY4d7eFRbzL92Iaf1Oi7z6S2oNqhffIo6niKMr9P9mJ8v3tJq1M4jufd0mAbj3jpHxmd68eRkaqNqTOAmCtYyWmbMek1h/+qReU2lVuXTe846UKAB0H9u/7qO5dU4dCoNzLOFsTFNeHEQWCNOZcpVUtS9eMEGaCxnrbFPld4RUOU09+jbW05UQ8FGh4/eft/UAbFD2Yu2K50mUAhcbDRK8qFduYJqaEmDBX7YD5+u3f5SgI4MEzKmX7aHaC8eBGvQcIUlgs3MbCMBEjyhrV2kkkebKhDwQVlEf4eSFnGjOxjiIaUokX4xARTG2nhPWEGlQYJlkFahOulY6OFfQDSLOkwijUTyKK2uedrgF2ui0fTw35sUUspA+HjRnCbixlqgXFAa7DuIeIS5cyQcpoWjSI1EGkSDPVYrkOignQJtZ5kQkUwqhFtI/gRDjMItwosTlE+crI3gl9PgAmkQ+GgNEqeYJV+0jiy8zFi9ohQR9TRgt0ODvKhhH2RbbKHC9HBdYwpFgx6I0hjYGpmB9j09Dyp4UonDCzKItD02epv/tsd+nYKtdjVq1JtbJEfhBSNrHRLt//t0x+mwHZ2wcFBprlDUscbuiYGfp+15vIm5Ps8344/jr2m/hiBucbWspCY1vuaiz9NCuE+3n16X83ytNcd786aSWsQ4EjI1Gu+znKZTYMlgBFXoC8zAuRSgu2+qTClXO5n38LynVsunhkiwD4/Y+BTz+enb5eUKNnXxTLUY2FDAMxfYtJ/Psxv91WpQXyIuQ4xgTyH/Da2BPsj7OLPK8ByrsXPLXlbIJeYuTYWeSlgvwcrLt0VP3PW3cfN9eXnxvjxHXqfnFglRy8evah63m2W/nzbn3fLs5taNwIvx0YS34mtFJPBG9wkDNdSyEuyOLy37qDaMQbMKbVQjupWZSuz36ed/eZ2DWueKi2JGaCWXsoPT5z+7+WCtMotxg/Z7i4+58mkD5VOduW/uZbf4YNvZVQFO8XdQfLOXGfXaShWrDhf3K+gL/TRCeIVHXaLuK5x4gDOhYFVZMHgFhsYIORlCN9DgZArHhjNCGrgZGgTlBrZHVaFrpVzv2MPE6WAJSB+VaBeVcDYv6enKbB2FdQPLwqqoEt/OaTXJOftFNaMSbxo7fQsgTsmIkJ5SCVDF/jR53N9GV34b0KGNI7GoJkUkFrsgyPbY+6BUQLS7wfwQy55GotBHlQJfRGxF+hzoWUmcFv4tClpSHAyHSBSThe1GoLPYLcEWRGGxGt92FE2FNUBcFQLjDr2UhCjZ7XV6+2lbfYp5tj8dpo27IQy6WxyyT0bmVYq5dxvdD7FadfftRSaR2DBP59HzphhUnTF0dCGcI0CMognINhoVPBCFyHYbYYBsnrE9RqQH0R/UGmC7OQcWd79PZ+8aai36qlgl7ROn4ek8eRrbhS4CTv+1EHQX64yKw5l9tTxwngeyLqTTQUlr1z4WwdZ0fMbqh4ie3Ke4w/Rc6QHOsbr3zJXrrIwLbxK9KXEBYhDnfGGOWSdW5bkyUSs6ERzypvtMuZ55f25rN+0onWu3D0WcX/Icgn4XVohhzQgbK+7QFMjjS/jsFLAWK6q8JzFuPHVRtc2RRK/sz9EH2ssHit4Mi/cf+3ZyXoHPni8rVaeBD1oiDvrw2qJI6CT+OYYViOGaBS4gvGueeSXjuSiW2EMQJx6N53CldlganssJUOYqe/Uybvw4XQXmMvVO4crWUffj9mk6HhePxdFKBfgSuBNqwON4MUOmW5+dzpPaGXRqDYVwk0nuTRLM41Joi4tcCpFqJ1gV+/PiNCfVnnGJ2mLgCA8kLE0ZWNeu6V0ZMUQHypWN1hIFegcJ+u8JdrGIoksRo4hQOIk2zQ6KMZ5Y2jEaA2YTwXMS0ZodRmM8sWnEiA+YbWDclETNZgfeDN9DcXwK4XfAfUeJD2gDy/CdYJ2/EMijESqMoFGvTsJ7foyec5ZeOWZDv+ViiGDYwnNEPnyimGqGqokA9XqBo5eKNDrjGwuw1uWxOapr32j0W0exHogBfLNtKuT8MQfg2LJRzZ6gs29V85VBl00AWe9VUw0gIMo2BcP5sXz3Qcy6U1QBodG7MGp0zMMPNxbsO+NE3IznUDuFY2tRheGOLAPh37CnF2pq/n/yuEUZS5R8RD8mQYQ5/Kijkd0gIzusBPThH5y5x+P0etmOHnReLxt+Wj15dkmCauXv/vBYLEfZzyeSsJHL845wE/s2EJqjU8g2Hd63/YGDGdsWshzfXSOCl7YRD7TPkbrAZwsnPbrBQBdDz1LoB6NUbVFD8MKwuSaKiVi1EAlmL9+eJr09BpJN/aCFbydlwx70E1k5RebMGioCAhQHygJhCjNsVk5LYKNls58tfvwZyhiync+eIv6MJU0c9IbCjFi+SOYc5idIVSifVDjemZbGaEi1fwI4oACpck+UOSADKMc0eJKEDAD7IX14/gp4QDhV4N8CypWNN+/C01jA2QBzYCEqikEnarDknwH8Y8KgN59/+1dYt7n49b/Cv40h2T/Nv/0fYt2yAIL/yhIhSdVCS5z9NTDWiQ9Fq4HtB+HbQ7VwQkfIWEXIKRH01BIHRltAR0CAJEKYquICRELcPI4QNiOENxBIbYLelgs2iQBLUEQVIBI8NdFX+rezm0Mx5Y4uJ6xxsp+Ftx8ziOlwqAJubwD7ZmfL9EhCJPCFcBfE6fh2BbRFlJm9siSLfAyvWIp7UNY/PXu+pVXl1BFtvwrWx2Q2ll1mAHbaX7ZObWIoHBdnez/YNEC3KLs2jE7jcyxbP3kxvWpttnKs7eeo21TMpz/fD8+X49odHjffIepnlQa92vHg1F9ZG81srp9OF7e2VeiEvBTZ9nReDst2eZ034/a4bKebYrSLpxeAG/aA7Wuwu2494FhHyIKIvuzxX4ciEy5xumoXz9P+rFyXwCJ/wYlkl0BlAW41qSw4TNFSLnv81wFv9sF1uZr9akHRhogI0IJonfsjomw/7o5F2XooDXoiQ2kQFmHF4ZMRabwRxNTkBYGniOA6DKURQdPPV9DxU7GriEkFsDSMTmXUibjSRGJNRpOxeBERw/9LUWI8IkzGfA/4iYz0cgudsZiPjMZI8VNEfx/v9BMlECtvsmz5V7r/ZD7GCpgsTP4VRABZk7ESZVgEETGkiA0BHKZMEjiV0lMmjBIF1FgwLhHpxWLDmM9jLL6jVwwimhrQWxnz4b8i+otGekKB5q9gJhBxRdETiKkQmT2InxghEd7rx0rxk2A6BgW/Stc8xLqpKz3CsmO6vX+1BFqREpiQc7kO6jasOrWKiMOngVsTd8KOGQ6+00QT9+w39R6clvZ12w8K2zxIAyyHBGWwBM0EKQHdihK1Lv/MBV+zsj0PkB2oFgDhLnsKg1Xc2I0BHEAA9iK1LrtuyFuxXzRw8iSJotQTLTuJ3hnCo4jxLeypnAMWbDwWeFCaQVoYL/qkuR5gtECUr4QFcIkUsGwG/uIBi0M3WmgJj1BBmcVRgQRMCgBQRw33Ac5AOeA+8ssrPHR5cPJXLkSOR2Osy5c8EMWRF+vPpQ86HmXkJuIoo/ZGz6OMKGxsDIIXA141/q2gJpPHQlejWDGCtr3ktrBAgd6HKEvEjIpZjPCZg57qTvpgIraLgFYP7nQ9cOwcgTH0NXW3fy9hwj2fT9P2xd1H1W4guimI1EUM/B+jVJmi5wtWj6F/jj9Gj+qo4s/sogkVCXobhJFIJ1ih9raQB8oCOsLLCH8yKltQ4QCpUQ4SshEIexq4Xgn2Ex18edbgmxLFHZZqCoYfKox7fYj/5YGaa7U5lSX0uQ752+U8b3+7XDzZ1UEHCxfURivUEGkd+rQ5zgc3aVYF9LE9CGtzfIIVuYGRcmjCd/mf8/nsQa9aVbJJNICo+8EKpYo2/+dyWbE6Tk9PxTCJLpw90wPBLKEdIHoikWM01NDK19Yh1T43203uAzHtLqFyEN3Uob3ChSVyDPyL6Kau4r/ub8NbKQkzySxVjPuoPvNNN0vJsuz957tjb7vK2zjMrRiaNMpS1SF2q6uNe4Kobjb4xFobkKDEwyCEpvNiemxk6EWKnPOumKNd3NVyx9ME+YzU+9310hVHUFHtoJijqCLkbgZ1V1sn8YTw1C+ADrWRWJ2WyGzmBFFJ/AoOHmpaZSARFnSPbOPjuRDDXgftUXlBgIYYP3XqMfN9+uWpLKugCj4XATn8mGn09/mbR4f8jEvC9/nbV8/pVbVDS4+zXa4+cu7BXaol+yxP8+/z3t2IGgFqRihkT82qQ2JqE3y7p7b2qEPXq7dZZG/D6h45uT2NgACEtnFZgDpVk2rRMaFCPZMAQBzgJWNIirIicQAXyjQI9BsEYJB9MC3OHag7mHv5+mFp//t+eXcFClsVapt629tx89371NVwoxXCNuquth33ni5WWakiVp/2Wd+Oh5PXEzO6NUQCcr8dj68eGVnvrSWf49GHzJcqp/1/x8f8Y67lgA0hc8HCSVqTi0w6ZkP+CcvxGCTA4Bc+m4/bi/8lU3HmTli6SSvxRFJz/XY8yZ9CtVEsKTUqd17kaPoevB3dSUqVJI8ap30h1APFvsgCnOjuQH9QqCzq5YL1gjZv0+b7YbkC/X2iQicEsb6YasjbGtdRg7FKaf36pePVRUCi8UHXK3V2nFZvqGI1NHr4t/U0yyuVNFdyc/AFCsoEoXad4Nt62SGrvqodW+VwsIcPw93rUrY5dmuBSpPAzxE1ZxcWu0HtoBYW1vndTzllFApAXqGmYNvxl+d0YnR7mf9QaUq9Lu+c6/TOBKVIa12EZTv+Wlx2vfQx+ELZ3XYIlwZNP6ydR3yKf80uEajvtOCErvQGOgrcSQc9s9mO/3KmWLccHVVCTHBie/zXr7vihffAe7kLZTqPb6fx5DG6tE8UlW5iou3+C+SjaG0IdCpIQ7qQ5fU63NqCLo1JAa1Gdxy6juhGeJ0Q6/7CxuU9Gsl7Vm6+oUsh+kBrqnnZiEObwhMWKbSnwJApKCsAhC1A0SxvSd8gxjRhgYGAx6CUQ9Cdchde6aFTDbVkDyKxitYRPc1ZlRojEOyk1AZ7uKjARdtNRGIQLzHwcYW4ANbY0ItP0XHXW/LqKmXf6Gr67Na3iW/+26pU62w36nouQUEoDTqDgo0AA6WCZO4mMfWL8+F2KhM+7A8jfmNFh/3LWF+yp+Q0VlWiHLidXseNuws3qshBOSDQSPi5bKf96/nNKxgJBSD7ZCuUtyNxK8JVcg8pBBODdTGYjfpvRNgyMUIag94WzzHqjQFAQgDyiD8SV5st5dKJtjt65wBIGdwFuU3MrqBdVxW6qcR2OntHrg7krHPO8OnH5Op26Vbo6Iix7OljJ4AEQMrW2Ltv7fKjlCUa1rWQU6r8RyT6GBRj5EZvEKpU7ASwTwDJRCEwSDy2Lh+y9R27P1MR3M5//P7tj9U49vevboWx0p2rEgVrjncKBvyUx+VtwPMmvD7dSSlnuPDy1D3z8XiX5/DyPmXtehvu/fT1akHpj/gZm9TtfH0bbuCU0Ex6OJIXgyW28uRQf75716TK/jwY6Lzxb+4z9qG3gfx7+4wnzHb+dvRUEVet4YcacU7nSz/p55dp82vjcn0rvb1h8QCsvwhkZM3gj9VoPUuIeFZ2aqOIHIAaDTicLYiGGV8Qn1LqWvbb+fXt/D6t/9sNRwe1X4USotEb6tv5u8udVs30EKsyQKhqr1nEI1ub63320r5GrY3Y8Dg+1M7ZIVbFp78Eb9jOO09ZsVPbTEOIvBNfcCuqjnqksE73NP3cTJPXDjBFK1WTaJNkEFENQLrck4XHGeQ6ne8pq0uP5HjVbme/Wqru+jRbSZ7Gp/O093oEjbp5kHBV6YL02/l89qQBBm2rhaS45avXkZyW5F+gkwDZQHWprBCFU5GCOa0UQcRz7vQcwu+mG10zJtZsjaTQKV7YOp37oZhWPeb+J0t9i6d41kjZqw5PvAGaz0TUimNYuhTObZ3Vq+U0leqbALZMg0KjSWwBy/h8nF6m4+Trw5WNEfWijjhaHFomU1N4ncMfWvVdZP4DtROTWP/r0Ck55EZAwx4M/ugmNj4YS2/l+mAsShlAwcAWDYW8gAVs2aUJThQAiYNIfdIQrpCmJOjgJIHT2k4g4AC5EqLBhFeRpIGOG7U3gKMlWjHhjLNdNi5SSXpH+NAahiz/JpZVFrcquUutdEyv7i9Ik2t8B3gmdF4efWVuSayTCAzSmVARKAe86QG7z4A3CItMUyChbRGQ3UMzNR5Opb7Lq9dJXy25xK13bbg3OGPT8Cw9i2+NUteP1Z7D5F4Zfd54qAK9ZpOVG9xor84uoRcF0HmnZa7P4uhQKkr4OdrzuyNNglsCXRTpnUj6A+oihNsL28uky55BxlIVeqy9vHqS54WKbAQXrko0CBavZFyUrtSQXRaCfGOwkqtwDRIYDtYrpRKF8LRAehf+FFH3HNIqc4UfhfAhi900rBXSVN4NpfHd6yMzTesJNPXOU2txIyQxcbqw3RwPQoW7bhhcinG0S4xpL5WSkg0KTF9mtsCX/evTeDyOnkWCOLnX20diZiK91FCrNFQj1eYOpjYOx5wfjniBj+/oOmr0YZXyYXnfZNbQsVGN8wrsa79/31mjugdFo+b2JJ4WTGwo0kj0Os5/mrok8v1lcepTjW61Jvht5LKxpRuClennfgcxxi/g5G+C2hWEXBQJ6SV5hO6XgkaC/woEZJsoki2n09c/L+Nx3J8904CyU124B/ZOTOLU9nLyttQ3/SZ40YIiTko3kFOkR7NTK1qPSKeSH8S7e7u9lM4gw7rLFJbYLu9eKNQ2avcvVXs4ueXmUjexhFpyVejVqd24eZv3k5cQ6dZyn8Z57kbPekTPjNCaDoW/GpLN9TrEblx1nOe9D16tVPCqDXGgdyUagJXeRLtONO19dfjVx/X/gTrEbvzukRv0TS0qqZ5DTlkn8UAHqt07SsuCmilUAZBmNrr84m78HgAC1I1DsAYSrIbduH1Zjjv3Y+n0rxO7fpP6Avfj69Ul1uuefMb98TbYCSZS++fpeEVFejR3MTgZmZYk+XCD2o3755Wu72EAEiav+ia1G/eeh6dpdYRqeiD3elodMpEcxmPOVGqhEIawKcvX3Xj87m0tKtIe2VOpH4breF45uVD39YBacz3rUcin8jeJnTrGf53Z+4xUvFbD7FaHlO2u6FrPgE5tP0ksBysOxFQMiVV7Xg8uL9FrdD6S1fC0IUTI8R1Cn1epZgBubw+cOAEMUfvxCGdX8HO5N5FNqoNpditQdzW2OnlNAhVBwmgpFedw3OBh6kZ+wpMjcfrcB3Yd4npBG/5Ckc8WFRinOYmzUi/uinncKpvabCQ3u2Kl9/5DaEwgI6/1Wo6Y3FWPVgs6BMkSskSQbAI6xKl863cVJkBec1iXl2zm1KQ///ayXZbj33bjz5BK1unOBpnBw8+4jWBTSLpAEUu5P4FIlNTBxNH98+l5PI+vx3EX8TeUqtWmMLGvVkyj8xLXadZxnraTR/7q3FuPlKPSR93P8XyedgdPBKeV9N5eSF7mZejr6x8331+Py2X//Hxcg2s3/DC9LEKbOpPhcR83Zns4yOtFaBjBCqrjnjdvx+XdBUyLTjnBD42tkRH80LJ8w1i1i1S5MEji36aucP3EgpVVSvFD+/Xe3xn9o7G80QKipg4WB0pTZUOQBd2BwZdi96bN1LOMbQntIFnkzKHA9wKFA6WnBuzNhjlPweqz/XtwjIzuLe7eE2H8+0x+5Y42y35zOR79yL2XJWRTN9mrxm4lwU5SVbKgIJzIitiKT+8kq/7n2tf015CgNdEc3Dop51z9y3Hc3UUwfXWwshV49aiTmgP1B3IpeSPz7rJzo1HnFnBkNX34AiQXM6BgRgiXIb3S8pJt95K27raUhqJeZ8vh2EpJryRQWdArUcKipljUMj0kIEj/G9IwSU9AMEqTcLTxGFRXaL8KymUfSfWF3BFWjCBaAslPfY2Y3BHGk+RLuytScVmQLwmzFuRLFN0rr2TnWW8nwtufFhDnLY5KFEP47u2TzVkc6z+OYNw7kYTwY7A3mDPwaXpd/yiMt2QFay39mPClAaH9mWDsx3T0DapXGrvkTOHxw13BNBHnufgETi6fgLdC+5q48IBdbb8rsbSR2VmqhP3nJCpyIaLrXRZgB8R06mpkhRJIjkNJaGkAP4XmaCV8UyNLjctKCFgCEYFEnsugQ6e+g51OoPAVffRu0bjQwbdZEhC7adz7LfdGLWdLzX2a9SEEuas/aPO4Rsoq+VD4kqA/ZFugtjiCWAIrp7OvFB1zuFBLaUHRVQIQlnq0YR5iSiFAjoI1dmqhTYT/2iSSzGk8XY4eA7FS62C17sF2H8kDcZZ6BSHvY9h98330OpVzC3BSCvKzm3ZeIbIdpK/8UIcRzPqA7fPFqsPl+zF612OzQBCNXcOiKdGdpz88dwgIPkj4BMPbEDstE4mCdSPG39w/cP24AdopCGyVYTMPRyE+qPQbW46/jtNhO/4aD4dp//w8jc+rLbh3RjZCiINPyl704w1fzBNLFlbxbDG+vR2+CUQ0pmrDxxTRV4leZPK6LqfpOXZhjbwwfBD4wiq+oszDbzqdxlfPg7sSs/ToSt5xeV5wGwoGGISNxm5QVUGLcpPYBq7X4tV9RT/3CyF6RR8JKKDRK8NU3VnOzjf9eZm8VlnZlTJagn49Pnz0xkybqaezm87jmnXJaYZKizUqSKggie5YoQNDHvV1IyLlkPBLpeLUYTyd3xbPE7nU9ssAouEKuVKgFfltzJYw4YN6uxovzsyBz3VV4sQ6H+eNR9MRSx11XeHWdv9ssR3bL7CzCP+B7eABJzPOaH6SDcQHGr4/bJAG35OhdKtQfiIAMrYIEYYikkA9v2BoQxa7zrfduUphZdOrPoBDmAlyF4xmbn5GFr+AzXE5TZvFVfMyjfopykgnZjsac/uNOvtSIYv66fr3yev0ye1q2dt+J7X+hfrkJKPjT5Ll1nm7tmSCq9NJ6lYPAjgANpQrmshG3G8HXUVlN+/nnddw7Y3auUUH0eCDThmDXkd36zLGqc6ihd/EeAz2Y8QaRDGorCKlefSEhNR/qmg07y9nD+bwKcrpbSC/xKVisOwnzsqWvFyTc+Gnaw/TPQdUxTZ2fSmczv7vUCTu6xS29lq1tcfBuTcDtpEwZ92tPfZb3eK383Jc8TfbsIDRq0wuk7Bo3S0edKhWlxcTOkQQIu+q9d1wefbe/aCLQmT5Xe+W5/nFBS/Uzac+zOX5svWJTirGpqTqD7urQTExPs9+OS97F+1eNqrBU09ht9SgR4+J+gD0ZTcJdlOkPYBxb+NBh8WHGHZqVzYW8/Gh5UV17htqjE6U5jH6Hz88zxf3kFOJj8kv4+JuU6bQgWR5JYPL9jy7r0bdkfBkUmK+1wE3ni6QaVWpV8cdGLwknaKA8Z/OZw/XJHGhpojIruU2hO0UV/28l9GDFDp2yfaiH+dCdlD/siVAQd55bs9pHfew9Tpauuxdanu7+HqJGvwIK95+YPaH7g5MTzKoh9jIipS6QAM9ZstrAaKIXYRBGCtBYIUIbl1MKD1m4yU8xO1/jdlzxcqNUTlsVI2Nj/RwaDtS7CSSSjDRiJptsgKF4Cdqscn+PckM+tF5OY++T3qhnp01yYuNfhbchryyIn47TefneecBL8pBhTpmIqkuZ08Hcq0MqgxW1BGbwn0n+theotbqQiOfLriv8/iV/UKHmKHUyoKnGTo163IeeKOTteGMRpYCRazqQd1L9qNHFS31QoaBvVKhq0le/6mD65LoNftEUYVobYO2B6Dc3sBQcFGDoUSBXYOyJRZ1Q4ZGEdYYJUhReONBf1u62tGPDmU7LH/pGheBgKNaIuCKdD2r1cWwPiNfOlqF3H6WUrCO5vcdtDXBpyBcISkbLNznWAGKOOHq8d9+3PnAvEJb/WQFtnravR/38fpMQpXtf6E+w8v0yjNqpkdJFnys/zsXfjwu7/5m16miA9InCmWTxujvb/I27PqhVFf6eNcmcadJ1G5h2WoryYxXahTNaPlO7Zih49P2vLe0i3LhsHptjfxY4U8BjGpidUyv49nTG2k7dRobDJFd2zC9a1KzLOd59AtMxWdEsDCWuy/qnBB0JIQtESUAsTwMZEnZmxB+7Tq/xpUKLPDL6EsGt7BZdoeVjeKhRerOAagArmXPR+AwKNTXkEBe5iFkeBX/Op2fQ+HBXrK9sYnjYxbKgNjNMyd0dzijaqEh20gv3duoAZ+pVuPQiMti6P+WnMt7XaqdA54b0JlsQNpIT1gVAJFKpmbwuPNcs/bTfH7z7RdUMnCNZmjM67lH6z3wYo1PffIXZ68SSsqCpuQRBYCCcDY664Q8fXMXooxfzuV8dIv6pVrQ8CWhQomn+BQ/3EetciaEd5d9myHIwq4rRqas3dEnOwaXEH5hXeIkfIDvF8lqzWwhQrjR0f/76d2NtrQHQgiPRZSwPUk9a0hNgLdawulDiivz+MffG6DuO+ClDvjcB6gRDzS1EeojYEIDgWY6hu2qeOB++umWTFWvIOLLUQu3SsU2vwFfTH4GgFf9mwR6Hlie25HpuRr3TUV8kyaQcN2mPqGf56PHHi9aqbrg91geH0AvXn9eNQ6wwVN0lNd5/9MdZ/iM1ut+8e7t4ScSQvOgXGfbofYbZ6EOX0pM2zkOzqOMTSD+IAB7+Rb2XJV5tCLeYLSqxiSTeM/S25SodeTZheuJ5/Jtef7lJTHqO/loEuO33lRgHzYuFhRQY8AxbEsu9iSkWzXsk2CWZD8NbJitnaKzIQV1jux23NkdNwLnA3ZTmB0JEDCBwTjYkRQV2LQJBTTUmqbMGiHC/DNhPU3VvYi0KkyUkxbQjjkdIn90oYktFXZLQiQ8AjJEf7RCy1eaMZGpH7NgwmduWEvBB88iTs8PnlBnmjHReAn1JgF1JvwZ2CPDBB+lWWAmCIJExcuw4kWk1MAOAsqkA8ylB1QcKZU2YOFSPh4bQVWUeiFxefasO0zbqmdrKmtYnqff/umVWtQoBdBxYWObbhCb9F7gOfV2EgfCB9vmJlbLbl6dTX0bSD3ozhF02LtJTqnim4MDyrCBZAW/aJsF5k+wsRDPEjmfuBF0Ebd3Ah3FsiZbLrZcAVZLgEv2i6fWM6iNd2ZO4hJSCdqy31+2281ycSlyveStVojnuyL3U7gOextMZiSFdJfE8+3QPcof9sfsBveDqM9+qWhZlOkjtl/8LFXny4ecL5mb6vnZctyFzPay1HukxI0lSmfXUT1Xp0Z1dUJhCG3JFtqAwkehSnwxboNX1TWGxBxPTKgT26WKLRvVLECxKQWNH34/uLKhlZBYtSvdjlNj7dvcqbUnKSmCsM+h5KIt1gHmZh8cNwq9r8xsr0D2AjFwEQGj+y0LgD03eUTK3PhLPlVUe/GxyzgaGgg9Qhd2tikMyXi7/zfncuyF58muivyO3XN2yjsKpVDLltqLEH/ouS83scyALjKxHIF5JeHZwe4u9R1FhyPS62iY/yMnpSKk6IRgDmYkLJ0glISGpNMxwRyid0KtSaqoYTOJQMpljQGjoNrA+mSB3n+JsFHQV4VJFIVEcdYJuU8EpFR0A2NC0KiS6APYpEovHwafdPVBR1KobFIVHSWPDndOjfeePjzM3gA1R91GFtzt95eSEd4v56f34xwAI0whxHVWDX7YeeE9DqDRDJm89f3idTx00+w8bOF+OftiPWrpIYzKeuxqkfhKdosSlLySqtgSHYF/QZwElbOQmwvtQHz1CRTFfjnPL/MmLLdXKkAKnvA2PWqhNIvSrt0KURnhzQkDedxIiQ+bTRAuN5YqpDokGS1ojumqVfI2fe1K1fOvwOnIpc1fhBMlQlsniKtUfCrNdetGPWKiM3hITlUK7n+pb33ZuuLRasPaVltq/AAj1oY49mNHcxDirSjYIwVCpY08WvSPRYSCHpXpGKFQDzmE9bIyh/uXuRKAMz1iGjIzocUlcqqe65snbOxc5fuJ7Q3R0xT/Nrpz4JSM7CGCEswkVpwp3r7iVf9wQlQ8NajwrC+Wy3b7bT7vxkOAxR+kEDA+kZKsrgdHxGW79cYTSh0tTTNjAkai7IsvKSRWk4FQ6tbI+8vKPnZ3HxWH2gtpDigCAKlZRUpsBaUISOoQUhXg6FPXrdUTr+u1/rZKP53Gl+lpRfr6AvmdjpDPUnG4zeFqHunGojZTCvWrZSOOfSr0mrPUrZdv//QceHu1UgXZvNq+fxy6tc2DADctCwb+AwN6qtJxU6CeSiS0J6gWCdEQqYYUqFniYzFo/5oCeDiaNvc6pHD5dpqOP4IwrlQJ/cz0bMyYGNYPOUzfqDS5WldxvI3mgmtUPWoYg5eNTkO6j+giovpaLYE+vjhn3dS17glCzIna91y+rXrBbniqPTfWQRLN+9uAbiAxqK84FfgvLx6DSuzaCCu6GFsVqwWfPjdUv1SCNYbgEopOQE7ylBS7J5UyiU2hjmaIh5CKmpRCEtED6xsdfiGnocMC8xzhsIB/gQYK5RaF7XYZhM0xRZd4PUL46wZSTauzm/0VrRogthDQXdYKWCHg30O8EYP4xmJOogaoix6Lc6L1A8Y0hAxHIp6wfiBRCGz7ReMhbKrYNmNnrEhPYqwEKqsKWHhEhgqd1FboMCG35+kt2gqxugDOe2z/6chNRgNE+uC/+ugfVwOWUldol6I6U6E6UxWU9y0ZCeLP6PqB6L/Q6Y/Li7PLdKJEuxatWaqO6V36YGYXQT7om+7Ly+9fXXfcVkffJqoLy8tqTfbsNTx0z0CKJettjuXl5eRaJA+q4g7Sq7AP1OmeK7cZPF6nWhu3+1J0pPnZtSgqdXqoSYRrDnei6WRdySBdH5oIx7ukRgELDHaTRYQmBbT08277PLmMsFrnldkDTRRJIOfjyzuLIoksiFB/h+o8aj617OazjxE0qltRY1M+WEaz6lEifkw4GV2n8/GhtUoroJ1nqesyu/GhFKE0TRlZ3gAW3J8ijn5CGFjqtevKhwTiGEYrDDifxp4hrd1mQf3ly7S7Xmefn/C8sl0W+yZZFZOYUAJT2YsD5zdiI2+oIoHxRPkRx7tooBDSTCCSwH6gYJlulsA851HbJLdFgn9LMBwCwp5HfhoKhfbPAOfIAchK0brGJ0BjVspecbExABUGZ8JTDMV+FF4Fjp0CWAJahf/aMwygViUxJ9AhxbW04FnQAjVW4pcYYv4Zj0aCm6lQiU0T4Es0AFJiCst+/DHO24AE2Yos50sP38CmzivrL774UqEK8xP3YJ+EdOHBNk6VM0TNAtvwYQAvfJREl4dxWK8TC5f9KoG7EjxdAmDZSN24jmLHZe4Tcx28Vdvg+9ZjtWCDzAthPsWOAQhGjxsrkP00rCu7NALUdR1uujov2j5VNMRBnkW1pbFLCVbILPfaa+bGjPa33RYEJC/AydgvA6mlTBqxY8VEOHG7MdEzuUNbpFY83aOkP1KsOqr3iJIB3RKhSE1Yc1r4T7TMaalO+hFee0Pit0DBY9dO08KJs8HZ1DdcikgBY7v7X2hUiGI2lqzY3dnKxU4ucYkhqKmmaUYs3UNbGZ+rAUghnviR9tNxd/eaK256xr/HVq4vrXpFBTIB86T2rimWHl3vr5493u4kZQYHPhdcff4+5ZZ8H/I4quSV/pj2njubzAiJr6wbPuc8QNayd4FHnVqetC0CoHF5ctjv0ccVM94kkM++LkCAbM5N5I/9NEGHZHBqv5QIBMj+ZYrJ2k0qxAKJzTAABdmPO9weEWcM1MAjxwbYZOw4Mt4lXjkCE2Ici/1DZmkUrIjglf8S1OcvxKzc81AUE1AfFKwEwAdnwcBPJx3lJmUTpMgG4t0YpAXFJKH9S9u6GLhF7IghzKVCVkfsfiwuFvhs+h8gzhYRMvHZBNDg3yJnlbEydk6cX9EdFuIeAmgjym0sj3WxmJqaWmx2ZgBjlv1yPLyN+5spib9xGcngk7iCR7vU4bhc7da8/VqAUWP6V49GPU6b5cd0/LXqk/qOn6brHQeViDt17vBxy07Tt46JRabb+DrsqpR7nLyCWFkXUkI/Unx4PPDpsOw9R6u2kJYPVEouQxGM+KjCIc8bWEqQ+k7SRMIEQiG9/QoTJcjD+OfFU/dtZBGV2e0QsVf50thAuAXgrBTi8eRb6Ovg4OrZ6MJtqNEB0DGI0kU6t8MGmd5Ik1kefQsSLLr1dvxuYauLB+rU53Ugv4Smp70+iSmLqQTkrCAW4c+oa2CIuiUnIEX6cTZ8km+4uUNzSWzaCG0J5sdxEJBWtAfmbXuqlh2NxSLU9FXfGr/Q1kP7yiCCgUSWEKgKaO1/hcOj3OYx1DrSFT+TDYjbWB7aT0emIVMq/axZ0hlLL3dKzuy6MKlqepixLJpwog5I2V5XT8eU518HT5bTiAOsZS8vIiGuD+xu2iah3J2wtVwOh+U0+yBWXdk4gQZcDm4zQq2+A284sPXBMEinhi0H/8spGzUr6hjURtBKpPx1iVrZdT5PWMCowqzUfbCbOnQfyIKgARk+L/IpaZgL40xJmSVLkREvyU7I8pkTU7DR8EhBlEm2YPvgEXhqHurXgT0VFTGUwwfkRVRCi72YXAQRQfUtahQtah6iRkGGIyrQqXry7X7//vtX1wem0mWqE/xvL6zSW7b3uw+rokwh7Q98DjjckCKEub3NCmzhBzLSZPWUKGva/2SzCkDdeJDDSijkHtf4E1saQJ0UniIoBNi/jOyns2Vf2I0g7CQXyF4hAgB8QDCkJQNEUpd59AJvIzRJgLdBEVXgcoRiSYRthDlKnBaiMYZjm/EMxXWIwZFcJLTSQilfWagVTTX2bFFYBUJHlljxC3HU/16BwoOFXX+hGCEYSIymSQZk0SISYdP4Ae/8M6wkYo4+zkBCm/ABZjqTlYT7TSKqP8BUwkabxGBLXC/+TPCYsEkLHhMJlR7i1SHgQ5TdGOEIxtwVhxyPuwjFvqb2fRFG+UI/gmR7YFlqBMeimINMQpDtyZCiKSNQVFgzwqmaJn2Snp9GTOHvCSYVW6pJ7BREA4RyEpqrKPQ5eCqMHGNhEe2DaxGFfdqli8ZsQO030L2rIJjpIKv0o/f47CG8NRgRcyXMefvR2PYCKnJ4cyUCC9EEo2UMWkamwtdbl8wViWPHnDpt+HonXkreqRJopoIPaHwkj/TfDrrVAj5TnfC+HJ/n/eh6hjU6592mlAn+ywMiC+vlSYJKiroRv4/51QUir0LOOpgr8d2tRVE3q1DFUWOcZQRr2NnibEx8V6SRCdkPBKcJZPitfIv+vTXGSPjaloUs5FXuVT3OM68Tnjarh+F5Bc1vPe3+Xrp/mRpxddaw5+U4jfvnl+X4Ph6fvet2Kpu1+wwfT+BhBXUTR4oxC7DMoDf8AsW94iE5s0oJkpcDVpEEM8eCjQhIWfSgIzBkEQhEgMa+w7sG2k3sJOvD+C/vg2tVPqPgG+trcR3yfXbr3I0OUAXooI5ou31QwGm5OOWLThU5R36F8izrGIzgk5h4GV8hbmITrBZRhp6aX86+TZ4ulCOSqFh4o3/w10lcZ1FdjTyLQHI5bxZXK7xSGSQlDug6+eJel6A8qeKDk+XJy/nVU6QzbfUZ9aHlct56Lhtl22oRTd7iuJy3no6vUZfGgIiLohZ2f7l3iPU5/C7AoCrXSXnVRGfhcj7Nzx6Nq1ctfpAa28BRG/M87p+9a23UjkWglR8d1WNL6bKmEQsNm+UTp8SWxr8JF5BMtqMmGKyxUTKeyUTHsF3f539Mx5etuypqlSwXIs1DOLk2y3Y8HLz3WasKPtTTJGyNDtRl8naO3tdYGpW6fq95pUby7NLVVd7ihI9hUkQZI1ZYCIsDhnQTgXxo+uDdpkrct1vwF3ylJgT4Kk2ZSOVWe/S3ZfE4G526NvMYu+uwq7KHu5EYXZozxQR533vnxSP5WpsJE6HU8iWGzT2hxUltW8orhHByCW5h5MLnwoJvhMkl+pqsBbDDiRZhwmpqeffayK1uQYcwskfOhppjiQ2MdCdEZ0IGUbfEWK/EJ6pru0Afab4j4DLYEEyToBet0/2XTy9Sj5GA9qiOeXqbD56Q4YOPrOvDjyZ2X0bYCaHckliP74EJfaU+UFtSx15FshbJotSKTvSO3r1eq+o2CWpDRcA8ZQ50/KX7dKtaJYYnejSHcfPdj6N7tfQkvWQE8F6/wnHz3V1VvXo8sF0jCMJA8LFoTu5Fr56mh/E52NR1k5UMqOvBf0aN7iwZatsLMF+QZ6fZhYdxdreCIaF5SbRcodaN1gF9Kxx170eztNXNEw/jcdxNZ3fH6ho9e0RfKgIEwbkgE/Qc3wJchR+MaHt4SxY1AZm1GjUdxuPkAgYHtaIJp3DrBq4MOJ/dymahvloUatEVZLREtC4QrSFSTRbsLVpSuSpvvRrTqJvBfyiU1y7MkzY3qpCDOADZHdENmQ7j8TQ9BTBAU4itahVMQ22XMClgZYcIIlCdy/N1qbVzgXGDKcOUJRHWXmf58/2wCvFutvO0P2+W/cvsHoHyA5aEhIwbcN9EqauVZSmSrEP653OjVh0UCRYVNqHM6IJ/G93PIlHkWIeZPTftRrUg+QQAMgF7PIwe5LhQpdSAcRAt+b5MvI6T94ka3ZItju/8n9M4Wy/2fTl6W5bE75aIzU1hUCVtw6/9wav2ilmVGkGCnNWy/YtWXZk6Ec6bt8u8P5etu7wEFptMti53v7kPWhlvzYpBQTlEJy5z0N4dUzIoEVNl0n0O49l1OC9VoWHGxlluaDQ71ea9zuJ87yqWsCRhIVFGWwd1fc167Wuh7kxXJsLZi7/pdqpHXO6h92u7jM666RxhNptHI42lgH4Jn1gyUE0XUXtAZ7SySVxr87XQTJcEfROBC6F0YFDvM7BHMTRJjZjoClYlgCUEIwjKbMT0VjDMYdUl+IY2S5TNfliWFCVy0xLHoEkc2tc3EujvdXI3I1K6AT6awfmjJXadYDvtX721ZoS91xeoNbf2hbT2cbQ2A+7sbt7bNg9IVOBQEXBdgE5d4nGWSKGpP2uozgvIY4MCFKJN00Ly68ENT15W0qprBllJm4iqpp2nQaMm9KmTZAqK9rWeuYN1bb8qHOaoL6cETErQYqRdIyjhlDfJEjW5X3rwhZadOAy/QAXQsP746D1dx7139q/KxZ5vhagcfelggUtUQ9b4K+np+Oxto1IowVTDhy74RncKH0ctlZbhRdIDlWVQwqgy3QmcCV+OgZ1tLVMVeJ70OAoNJCCqTNMCzHgjXsVucpBTIlOpw3MgY3xvbOmezDquqTODnvvYy7v/mZbyM63xmX7oJZym1/WP/e+ocr6j3BFdbULV/VSYpwUo50C0V1iRWK6YTcABFhfSOWCW2JMZBf6Q9cXynxBfgNae8GyL4V4j6r1SAyTEBgjxAGT0AgEu5GKIPMJ3TlakwEqSxsoCMgAB6DpI3hlqdAIJqAeT0/Fl9czw5FNMrctsyQZl4uTBuL/9/nXrSqFVKocnWfe9DekpWJuEgnXq6ubleXaVxYyRUcsQOQlcfDYrNnX4tmi/DeqWFO3Rk+RpfWjT/uxJCaj1bQaXMFVPUX7W8We3klCoZUEumVQb6jAdT/PJoyar8UFK/fQ+kldtalTHN3C6ShB4zH2XSQ3vfeupoOj+RIVCCqHXMdWm5EK7Te48qFZl5lABApVR+AgifIJZnE19KFGDuJfyDL7aEV3jhPMbSptCKwHZa4NuT1uEXZUSEZnwbEPiJVVSGMOx/hvKI0n3NqphkUuPTCYVul6fusf5LLSPk0anYqFT36DTl9XbuD8vTrBd9nq5N8vr6/A2+vRx7bozuL0lZDMFgffjZN0AmHdtd+CdJEqmb79O88YtPTa62Tg69TZPhrQDyDLA3+OjR8LQgxpCzilNgJCtmwKNeYMNW3ynoCJUuq2sD39ppNIBjNjpxmgKAPnvPoAKgx3/lrxIWjqS/cDhBEPS6F2Jee+BBvpGq5SiDEmBGRRHqU0ulEp08MZhPkzb2VPyWb1HPhMHbEd3Ax9UtDC70wG+Sh35bVXpdDuYlQoDQE8u2YnjsM79q/VYtO91g5LD1hP1LnvdOJfbDblBAmvS6M21rYuzb1VwHSFdCSDXOpyPa2h1iFHmkJfTHBgH6XCAvJDmPqprPWvU+u7/aF9xO3nngql6vfWU+tovPk1YVXu1NwDV7rhiNUAure7bcVhmT4CrVncgenwK33VGHkR20MZB0PnwC6qVJNNRbVAsBF1E+nrR3r6pC/yTFxOwlezGqU7iGo+ooa+w/bNfj3SH00PsZT55jPxW/Xp6IX+k70TXEXfr5r4Zt1dOy/u8f17efWbLIAU+I8SnB4WHZTtvvJxIBYzD3dAWIeCdLKU+mTihOUCRziKMR0WXQoi0Y0GQoNclviPX4KgZ9NwDl46OAqNT4XpMpT49kly227iIaNPLYmIRhhd1pEmiTeHDlxo1Xu18J2dtSPcTGtTjpyxxEPcJ4M+yuK1v0eP60tgSCqsqFQHYMWEjwUDE07IXgUPGlrHgQoPWTgncJUj+jgNlgDCiYKYpkRSypkT+LUGUfQIftixbd0dr9JpPEI6DII+4PJQRJNKzoCpfJB5vIpF5TH2OHt6CLiygtWBkJNBCy+J/pqZTRc6TBa5l2XrwHp3laRcwHkjlG3DHpzgcvFpIoXvU0xFUh+yvIwYgQzUIzx3ysh1dGFKtB0qpeOQ6knfKmkbPonM1vBNGBYfFg9UYqftW8hQQITTVActYA5nF4CbRHl8lfHxpHKnnTCw6qQXgpw1YREOk/SMByIKiGHNPibmiRNxOApeQ1C156juq8sx9s7D7dt94WY8swhiI3JumSUSW9go8AnahOijRPrFPYK+u47o8rrJS7b4EiAZoryoRzy+nMIHRj864SAShp748gTKlK/ykin9TBQKZPwmTNWuFOO+KRKB49JhwKraeWhX2QYKtQT96npmhfHUSTnycNtOzXwQ2EkriPfGq0dfxdTBvS+3Vx2l67yjXxpxPk5d8VolaWY7z521Ub8tRI38oFOMIAMVf6O/QqYqU6ahG/r8JXQe9jZjcte3aWaeg5EP4NruJVt+JOBiurS2yBtiL8zF0OBtYqm8G72Ifx83H6Xn0+FGdWhhKKU8cjtOLR4VUV1gehOs6YLBQSj0IN+hCwoy+KnQ+NCfwIPC9CoEHUKMUoTkJV6k19TIdfSMloyJfI7ok9gSCQElLNkDJy0KwCl6AkDhlKmkYrHpKJdrlzz+d5PfhyoUbDTS8IGmHbpHtn6FJVBqEG1zS7PqgzUZ3FakYLQzPiVAjSoftbY86eMWgpXaul/nnf/nMRN1eMYeZeBvU+x76Xi+h0vYsUTY8TivrYjysuItvK+TUa2RKkA0BgA0fViYI4zbPy3Jcs5DjFFQE60EaXNnXjVRNZGH3jCt3yhv+5RTeWyl1RfDJ2Y8jc/ggNVE5y7BNKPvk4Xya/FqjWrXDfg4lKMqACaFbgGkNbtKQIglYB1QbLbpSvUDPi1RXsiFylW4e9PAYUgFP6E9a6tUzplUCOfwx+3Q7pdvu0CHKob4TT5Ao/yyh5bTOfbp4sWalS5umY6bALaJS03yg6C14PjGk3zRUK+B46Q3DbppEJGoHt3k8jqz+BlI1k+P0Y17cXkE3qCEKbFcROkpj0dRivc4y7Z/DDkHVSfVdezD19GdBU6eJuMWmpnOj7EEVp8WhAsy3AGlTyZ3g63tmqcz9PvpAplIFJawCtvazT4BbjvNuPM7e/aiZSB7j7zqmm0v3jn3mgFQAmHSYvZoBjUX5IO289h9UFsWHYKBkubGGtiSJ1j3+3oBJa6rZpYLA6+18vaqQjFvPAGt15dWiQZtUQwZVyCMKiUOjlyZuUz9trjwUlwVdiDB9faQGDzI3GriNfYk7q5lC2kTw2RokNeKZPZzJJRz2eqaSl+nOP/zkp1XXQRKiflw2nqOF0XWfpQHAX5JUjQhGfbCZe7tuDxdhdHmlJrWtLM8XzwVv0OGR5F6TJpMsm1xHd4KIQZWBJ4EvRdu7DekJR6j8Z6p3CFUOoGyhopGSVbAzfg07QaX6JSd0L+x4nsaeeprbdkViLM9XXccHJkOgdSgP5al63GdCIm5jegUk06oyPA+W6+tx3O3Gs4fB7XTJg2QVLjS0aVSRGfr42voiELx0qUM/MdZ1lSVHJCJwYCwHBLFkUda0H2BmkOjYHpedL6qnCzihFArxSlmlZbgoRIBRXkOzk7J2MYfQrkl9bbvF41qYXi2Pp2yz16EOHpJY/W6tx5M+kPtBqPJl6b53bOzDdDzP3h03ekUivRLWwfwY6y8iR4/LedksHtJA9LqpsL6iv+2AJowChKGO/ahDywComA12IyEKR/hc0qMN8ulcUfQ2e0TPJg89U+BbyHoTEcTic0TCWwh3Y+RIQVqwdSMuBxTaNvh7NJKiBHWsmC08GX1P3QdqGPc3//U0nYJiv/JNPfyMnlZxMH/jr6WVlWHNPbfZi7HnZRv4y5iidWJWlBPvn0RGpHob3gO4yWtu+EHD/wDNDoqaY+oaSwZeCqYrwxB9/b7RAon5ZfDNJ2M5r9/YqHWHjkAKfF4mQbJYh/bEElRN3HR1ZPnhqfIloBQWIyOKz7H6MkI8trjxDGVVObWhrlfl3mCtNoDldoMut2yshiodqcbqbXIPF6KqpcjJuTcBGiK+lCr1On+6ncJSrewJNQ2hhZWA/16+bd0AbYXiqtwJZPZE1uGh8d2l0HHX+YLdoK0kVZSU9whlUdhJsydjj6kex5T1HkGBVxgf04uDpu1DuG2n9KXW2zi9ucHHw2i0titEXBWPR5zSj+f1QF0S41aW+Mb7qPoBzSZINb2fOtCVt+cank+H+EmQLXEmN2F0JahqoILbQr5rBQLed6CMcT1XuT74daW/5vXxrA6Va/pxmv68BO3NXjKhTVNktkfs2Demc2TgRpYw8Zx72zoYUC0Vz4vt1IqfXRe+Nn6pKdkQe4mxqxukoSNeNTx+xGvCy7FuINnPxm0G6NkMabUIuXB7kBTwzZDKmoblgqxHMlvKrSbFFL1d/PW1OnuSwErySu3cuc/Eb3h1jXZUwCbJWpYkRg3lCGRRjY9zaIfwQYkOVli9fTjp87Q9jy650nlOdovj2U+JjC6Wfth3JLdqr8cWv6jTW6ztJV3B+KXZjyfjXjnsj3l6d4eu5NBIv6vM2urFa3motTUgiC32VxnOc01XD6AcIZE/n789RVIKXfGI5RNdEOzP52/ro5w307jZLBfP3Vg3arDt2OiYl9Hr6escM1ZBErqccb/hUq970V6E7dNKB8FwfI/1rPoywNFEuJYkSNVigvk4bc7L0QOWVVJ6jIZIdZ/34YrxA0WsTq5+ylyxc/xo6Onol1lqSa8EVrWMQXHtc7KObNoU7vOo5Q5hd0jQQ8uanPM+1HKhGK+thKCnRUU7+wP1EAr+YxI7B5Xi7Q+8cugNgfngC220dqePqWmAj2D/sp1LqGQDVi3KOCGGXUgfE5UpHO98S4jrroj9kc7BlJ9H+QhEG0kXADOiYZMpVO8wJQAacS0OMihQriX9h15mpPmDnCDs44WPFyJrUbxJf3cupqnWke74DGqdkHAdce1tnqfrnzttBL32j6ev92muI4dqo6UTNJasdfdN/vL+9fSyHV89/F8nT1IyQXrUex20tWWbYOcquTT0WOk2+XGNhV0wdFW6dwVuexOr9aDMbggW4jdrY+WqoJStHmteLyl8HEaUwniTvLUI+C+lC32dZe1/7caf7mMXYr7cOuwyynub13E9YnIl6hFf2oLLM4IOSAHlrxOc5920XM4et7CWQo48dssIa0sdeY3n3IaBo8kpXHiCvanpY7dCU1f8AI0e2zG6z6g9tsyNQ3cQU+p9ieuX/PzNTevU+MxWk2M2cbYtZmXLiHRhWm8Q4RrDow0wOWSOxqbwjrsqThOU/nCelabmmsJ4gLwZ7PQGj4w49JidnQG3Ba+khFyiaEsYEi1xahs4uEIPXRCQ2WQjSTNqmcduuAnLmjFnqQhE1paL6WDOcscVEQc0B/+MdXOcYoNgnlHpGPuUrXxWoEpXKIZXhb2jCoWeCv0ji7uP2QFef/HfEqnvtTSu3XuSpzFHg/Ga1Pawfv7umTr0KvNHt0eM2AKViITS1olpw8Se7+Nj1on3e/vtz/fDb3cir3sSd2roQA5SQrP/Pv7Xb6sAnQvIENFwJD+3iyE16Crp/U8P7Da4LLvcTGO6eE0RVeUZiHaLO1cHdOsDUsbP1BFlwPVsvX8d/F5sR9R+EdLUmiQBhLeo5lUI2WtETw1rfcKcFplqmb4br8imp9BhfSIc8N0Bqsm6aEEuTht5RrbQDqNNRJlhYkPChH0UlAbAfmeXCA5Qu5nAzsZuk8gxYB9c279c20VcQ6PUBu3CQr2yb9duAnZDohm6TXJwQGP77+x/AiNVGJ3bj4PahDg5pR8RuW58fMgiAT7jSVyKLA1/T+RrPJNx5kEKSpzJyOuE9zlPe+5/Lc9a5teIiejsFc3mqJ6HXywF4hSHIEPZdkyAEQzhSjuc5/QlpxRzj7yaRPQeramezE+IMn/GqxxAAmEQCviAsAollAGjIKiTEQDCY2qIIhYgkIBaTxX+K+nxEjsfCD9bWvL1FyoygB5Ib2yUZqkuCdXUQD+I8l+uH3XH8wd/j81AgGdF1ow/ox4zfNPN0CPO8Tn0cX9r6+Nw/UWxDMQqBn+WyJneD7/tPF56Ak6kw33+fD+U7snd60pFNaM8vYb6fnjaLNvLbv90/nXwwZ/SDaTg48eJ+OC8vY69uxIq5mX/tFm9OdwZKge6zNefyX5cZ3ieNvNu3D7txp9Pq4KMdw9V58yAWkAV1gL0GV7Gy/b8NF1Bgk/fLi8v0/FpTVWfTvO//PkcBxV0k/tMs5HIfPN+Xj03njbH6dmV3lw3A2c2lJAyJYkjs12bE8enef+yPN2T5ScvWx5qp8JB0nSmWPF11lsU+jRuvj+9T99Oy+b7dH6KAc9WyJYznbdHZE13v7nNeBi/zVvfhmionY8E4J0+UyZZzLCbTiffOGuo3W8Cy7LOrIxw+KBCPjhdI4Rlpm8+MPZ+s6wc9KfX5Thvt6M3Qe1MgE0gQs54OMFlb/cDr1sxNDKg59nVR1xLtFnWytf6NU/HddfZ+UulcbYa4CH6SPz5YIbteXw6/dp9W7ZPz/MV0uyTXIbG+aCAQujb/BVym0wsE1/7aRXicGYJFYwyZ4m+99bBfQCy1rf5a+I6+L9OZ+9dt872gVp4n1ttez88vU3j83SMbL/C72AdG9t9Jq1rHfvOUY2stdZZa0g4+gim4uHgd8j50/d57z8eZ8EB3dm3+SvaziI3c23va51PNZLt50x3P6GW/X7anJ92i2e2O/TOkwMLqs+0ylkn2Y2vHpZs6J0lHQl3ckb9+TQej+Ovp+d5N+2vcUrELmQYXBQUdsEufxeMTOVWNYrCmaTxyj7Zk1zZ1U9rKebpcjhMx6dvy8X9yFYhQ2cq9p7yd8N1qs203Z6ernP4lO7O9ZKLcEQ+DCKwk97i1XXsyLtascTOxMwQ8rdFTnO7u3PIiqucE4tuBZkcfDvL/LzSeV/m9RH6jhOmcONj4A36Pn+rXCe5fgvKfdTOdkPlt0zHGTtFcCAGm7MpaveRYf/s8/fPdarrTeivv3afGXaFSLv94Sy3pxagt1anPWcSZqYf2w/Ww3HNYBAVRZ6aAzmC9YQwZXg81XJcBcafno/jvH+6EruDc8cMhXhuph/yN4L76C/jvF1v4EpPn7be4BJANhT5ZwubvE8rcuqshFwrOcl5TOhXFPmrfrXLuZ1gyjMq3GAYZY2hyF/0t7vYjafv6q24ARKAAUOZfysrD3463pruK2t4evVxO4UbKqHMMkQ4CVmzhAqra0PKoWGgRGPyV/w9hjku/sbVObsJeS4RKok69svTt3Hz3Uo+xG5hKGVFf6g+cOEvt/A9iLnMICECZvhAaWCFZ1y8M6JzzlkS2T+QvJ7H4+vk8T07WVqg//sQwQ1ow14Or8fx+W40G1lNDrScxcnhAymZncKWKgLTA1M4UaKhf20EL6rNEiMwFX3njIvCYaal5Drudfu/xRosk22nH97uWUhPgNKAHjp8IHy+TTXvH07lvHYYjw2ZMst/vh+uMe6Pcev12krp6tlQhDD/Hq4h5nlZtuvXGsKJ5Md0DyarGEYEPRZb+9amm9ed+X4i+MDVUoJd0PSx9fesu5n3z6fp7NmIr0wNWXRFBtvlJ/XryEExt3eiYvTQrflG7rjX9+qBZ8SDsM89F6D5fri3jG+ezbcq13I4+7lR2Tso0yLTBs8f/54XxydonQmy4zhngvjIcqPIdZ2WI19O5+kYG7qUe3+TKcXFkfXHbUopx5UJQefAL5Ov79U7sNgivz59H/EOHh8v57f1PYYkr7J3qtJFfi3aneHbspxP5+N4CP3Dy7521lB+/VmZItzDZKU4vweiDB99sbIy2UQAkR+b4jidLlu30GokBKLJNIkXMxy281lfTEYoLH1pmo9e/2W/ptrPqfHlvv6BvfE2PloZ0bFlFazJr6+tdYHjteDpfo1iw6K6bpO/sn6dp/fj7B1AppAoTmDWMsk8f74fNuPmbbomObFeiOnlcYFObTFkhxe3d+dcsuxTopFfRUGVBJDoskKYZLNdTtNzsEqNND0Q0PXsj/E2+su4kik8fkJpZKVROEvkp8y30XfT+Thv/LHlxw1987LIPk1vY6+tz9gHXskCZgsSdJmft95qbrcOqwcCFl97S5JuJp8fQ4dxkdNdLFCa7vK7EQwRrx/MWm13r712rh2ckyp7qXKG20fjyX04JbwC+Kcu0vRY+/gAXuh27n++H+599XnvM8v6xp2OEWp27HsfO0wSqlruPsC0lZkWvtehr+3sW2XiunQjSb2rQgetseoDccnzclntUNZcJ/aIHOREzWA7e6XRb0XoskW2IvFpAUVVDdnT3EJAkRN6R4wb8ICskn8c3CaIHQV96648IIPyE3M7eLjVSX7wlxZpbJmfONzGDvldg1MCDOkvHxl4/Dbun5d95Iyp5BlDhlf9qevfrDa623uJJDKVzHzIIctfC2KqcPRBLrWa8L7sFS1Gjx46cjtqgU8oP3X56jMa5LeKIILSbpmT3OzMV9bQfIy9dUd3GayJOpcQ5U9zms4RBdpOTNKiEFB++F6Wy5pQR9+JjHQD0fX8KSKU4dqhV0WIbR8b+rc4d0fm7H6nEpQbXUzVn0UJJJtKJsV0Ve0+dy/RNyGXX4uzusyHB92mOB/H/Wl1u4ltttLF/QsBoGX+aXebZH0Nm3G7XWvym2V/PnpIsN6BRggvykyTMWeiYGcvJYGS1CpBmXo8+gp0mp6vpT1vaBkCUnc4H6kw/Zw261ERO0lrKQzfgnNc5jfzp5/n4xj5fkw/yK5gl5+0rt3A5cd0HM/nydPkWzkDMscEuTa/o2lHjywpeW6C4VXn4zSCZm9Zy5JsCyZUGfFOSo35Fqbw0jjnSwuMcjlkX+3rtLyNqxBIEIJKQX16rlifkw+MHUbpdSW3d4CnTX4X9I44C5rdpRP2GPtEqg+U897G/fPpbfw+7abzuEr1eJfeyEuHaXOm7sqf74d7DXncfNejt8Yp+YI/WOcjUDiLFpI0TuIKJnudD3O4z3HbtGKHRy0BGx3d2cvsY9xOsV58GInUjZHj0w8hex+4jx89lGRcSAKUyW893wffj5vvkacv3zDUjer8PeE+ugUCRp6OzDQ6LGCT3wjypgighr0D0SoA0eryj6X7FDbg3CzHZ+8m5CdEScv8BNKbIWIpVNbykOqAkDH5p5Uzyem8HD2eoDDP+tLBMdPkN0Uxwemw7E/e6JXj64IvNR8WdR99LXpEKvKNZAl0FEHM9FaR469QjKC+5exEnWVGG5NfEMX4QbjfyIIQhYrrIXw21HhKKTsFs/0W2TzqWpd+R36se1EEcyjxv3RO/gI/mLL58P6XSAAaZxtEiGHyQww7xxXgR8hSINVVtkIs/ktPXlmkCZ+e6gq9i3zIrYyiexSBq/wisJ0glc20TjsBdJPKfGCxX/HQ96ptgIbuHXFaqmp3+UHqvD+3tTto5zRYKcGdDx6eDz/qSCDZOX3ViObVw4G3y/7VNG1sbKc1HvHIyh07DFJb2dDvUeao8ssc96Hfl6OXzfW9G1ujvJsf361ja8Vjpx5XAMDa5SOLd9NuOf66nWY3NzEtimxluwngqLLJB3DIudIInVa2nwy0nJpM8TxvrmtOpc7VOfLSYM82mZ4of74f9tPrcp5XP+EHNfLe/YZRxs7HaO+n03l6xifhDe/EaAhuunx89m34/WX3bTpGJnCF3QGc7fLDj1Wh4d4xvYImYoWEzkEAf6BNzcGjw8rSk6Uw5w6r4l9MJ0tB1iIyd9iXeT29opHkmtvI8mU+zCgycOTwMl3lPI+PvUNv/OiDaRyBi0x52+T4v+3GnyH1oetV55KAlJ6YUkd8mc7Z+upMD6P7uDfM+xVQ7+EnjJP7N/ml+2DY6PuV+ZTJ1R2NjR6t9jm75gd6NP7ofjJreuOMnF9+jo0c4S5IQHWXXwLxRo8kIKY3zhP/2FZw+9rXKtR2uaaXvl98L4NNU+dnrBx9zbp/rK238KFLvJr1YMwd/LpEx/3zy3J8H4/P0c+ldh5NfvSzjn95PsQ+8L6VBef/v7p3W3IjR7JF/0Uvcx7augKI+7Z9vuTYmCzEZCrZYpI5vEitNtv/fixIYi2HA45EqlTTs9+ySpmIYBDh8Mu6dPVlymPN7H1Gqjx986FtfX16y20LH9GM+o8dPOuaN5jYfvdNyYdHMt99/VT5tuwdDH/a/iNFLK+8O7lyfY25rlzCta3Eumjl6hRrxREtm9ss1MpPx0ZuMejO9PUYgbvF7fl4PW1yaeIcnQFY/kOf4bw/Xu6yziksdZDNFwjJ+A+c/EEUIb35iEYCXbG+vnt3RwccX9/22xRPGw3uG0q41FPciAjITa0GCVui4EtfD6u9rZ+YF48uiiAp4K9u3Yy0pxtkwJtoGlqPcgXFLO33DjKiTEj0+3oJhHjxtN07R2gedMvG+rkbr/DPl2WFpadNrUizGRpcQZPpQxfJ9bMGmYBCajgI6dYtfzuT0cjKfAKxMakc2Wf8Qiov8bbyh86XtXGdVsWywwm7jGBxoVJfYTNSynxDYrCeA7mvSM7vPH12a3X0wgXuKUKxv+B9xMsc6keE4hLltsI6TJCXyEh5v3+Jzct28+1mHJxZP2qtDbV6tvH6x9PpetvOufVlpK0WN4/Wz60aPfj6sZdY9fm6T48d78dI8b0exipW3q/ZRAZa7SNW51BPt1Rr74/n7DcZ+dpnTpqiY1V6methtWzKQzPbJvoC6sV+xDWEOH7mAhHWYaivNMUFztuv67/aL1cb6RwM9XluyLluks65NrvsBk5Bldf39eCn+4TAoBuOsiScMJTq65uo9+VTXYuowwI1/yGDF68Gi4lLrWIACiYyyvkatWKH+iRVrJ/LxEapBjJhRtTXd4/EBbSvSUSsyz0Q8bwgbB0Uq+su9/fn9RzavJyOP1TCY3mguAai/WNBZD+50too2GseToQNbaD8P9ZLKNyvcmcoqG9GJpxgbPT1o1W59Hnzsn1d1AUkgBx+IEM93UReIPnuJQ4e6qtBi7N+9e3hKb9vR3nz8PWpL/Dvy5+OP/SdS+Pr7Lb82NIB1ag2TjQ5yOzIyouk0W9u4qY+Bmv1+JRVcOF1d35dt35yLMzyVIBcqPsABWTFKhhj8UjVkC4hH5iu3dkf0ZqSfwqxX5cbclTjCO5X+XvKoXPNbKlyUvSfkmT22rcHZKXWLhI6gv1f8Pqrf042AGyUpPoZuohDvUSI4OGolVu5MszJ3Ic20GPlnL6Ji3rCrkGV4yEAOwbuXvsBKm+RWOTmJi6xeanqkCQuENBCKxZ6+8+4WzDKtvQM3cfBV6eZ9wvtj1+/qt07N/GBholm/alzXzuX9o0SwzFD/G+oZ3jd185uVym+OgtJ4uqgfV87fdHEs4YuuPuAhux93ZwD2igx7bnI87G1c/zAOTIiyfH/qq5RiEOjfDxQw65vcRJYlj3mZb0Jw20/1M8zzs9S5ien8iPfWz/W8+fOz5bGTzRKG+vnGBpnpR61OBqhR+8+IFR7Xz5TL0WkZhrW1uciN9RWSt2dZVsTyvkuZ/LEg3kAsY6QNedLh/Ht6tmjWGwemq99QGw0FUdykZyZa2jdVZ/Yrm/T+bK8vl0PWqm2ieBh1D+vH7Zfn96CSW2pso9A6vUTlevhMXK8w/Te6aY6Jw/iDvY7U32h/5hr5ZaWe4vq+/VAOrn00/ay7JTl+yj1CqAJ74f681xeIRV7jVSL6N8z1ddfj/Uf0TnRv3KR2BhNIYLYftUlrrunFKc2uyjXAW55qu/xrgvnQlH0dgFIOtaTNL4vp93hkqGXyJMQzYi2qY+fGSkwJ+HCNPUIdgsfWNWst3wb6edM9aMITG4LM5UxhoABWDvWY2KMy/z98Z9Z2zUvBy2qcdYiS4EliO/Rwy7egZ6pr+bT0cejK071frofLJkGzdREYE3aW2SQOcKmJdhfVFwuAxD1lnXEL10gDUo+greiNTvV91Xu6+t+3Oyjh4VMbmqqjwIsnDsMZG4kDFiqj8374pku2eyjTg0Yi1NlRDotirHivMUvhpacGyAbgSfVNvZw4rRslB1431sXyREpMgvulEz/6CybsBz6ILNgjEhpzYdQGsKcloOqDxrTA6ULUWQGstnT6Qed2g5OMEP4PcE4zN9BZv+ZLql9cIvpg6IJvb+CEUEPW7Ag9iBswcJfhcO7D+8kHMOG0Lodwv6hZ2+Q7RBWvcGAKvRCYEAF57E54M5dg1wcPkO0JfN0y3D8f8IvF0o9wiWX1mp0ooYfEQJ/i8y3RW4hDM/ocIgDosMddDB9pTFaB+oCPRG7GQACj7GHJ0gHIIyMqdpAZD6MV0aImI4gSeb3jxqGCUZ0vHcmPN/Wdn49LYeoteybxnL/zurKZxfUkg7Wy5roO/wNiOm/SVxt5iKXFzXpms0AAzdUGLWFSwAEIozRYFpGwzO8BsIrVdh+AeaRM9YsZCORibMwuqKFiW2beFqi87GLslOHV2LKkBY+QeG6DZ8QpnZ9oDv0wRJkCgFuhgALGOGcWLkOHsQjFGfgliZcwdqR41RETuyCEec6J2DpR49C+NRZEdzT6DL4cYVhDOLDEHB7MCWXXzZ6/cOMSQI88kZKMQjXXxNac5syRkdsZzpjZxjZ+fVSSf7Ggr7TRsE5bLoJMXEuvGvrlZRXZWtah0FhOCw9jUgYwNsZxMzejnW368aukmYWQTfszpc/icp0XG/6tI4YmorXuSl9I3Ey7EwaQrCHhFVn2KkhqHRwdQzC55AeDgbbN+UoQAgaDMdhGjjAIBAiVuthgZ/w/xjn+BLgCB/wio8QI5hgOTyH63ovXE8RwEdOSYqP7Y/vLq7uWvPRtRDRgHuu79vSJnpKPGslAFulWx0CA3ITUAtbaE52vnjBL7uvKctSTmxhkdlWSqI/Vr1mlpUyvlBxqyRJ3JbV/BkXST1CE7MSvpNRG52tmhP2puLGIZEyFHfM8/64XFqvgp+477B/20oMLBaNn6+XHUh0oNtKmfl1URVvuskEliADgD9oR0znxNe1+GB2h4sb4k8ghWLgm1ppJ/ZYUj9pKeICxfTKudNjySleMVJiw4p1vap1xbfl5/6oAnAvmUMjoAY9BTEyRMtPI21hUYz4yc7EtssT2oaqZRjJ/AdB1rapJEdFK985mGr9SNt/Zv1Z1xNZ14+ly6zMP5wkSKX5MD101PABxQmFR/3eCfUnziXk5OHrvNmtTsnDzn7+a+Z9kTI/4WO2lUOfsKZ+YaSGF2R/K53lwprqjYmE07Bk/XlyvTyrFcV2GhCRK9Hx64rRwDHSLeMhKryZIVqRs/VyGGg7evE2SDfGvlAfLE8/V7cT3cqNGnFIHsZK7fvTdjmr5n0rlXzQ//G0U+wyKi9Ii/IX2Wx336Mb750pKIJA1RUKxfuKcWBszZwXL51/CCQW1oyj0fBLrsSPpTSRz2pp+G5mJwZFdKl2WZdPUv7ZCnRjWFT0TrDnSl2U7WarODnjaCWZORxCbsXbXzypr85P1rPpB/atVR/CusBtwBK9tNIJYQihfWrYgEMynJmACIkb5jKPW0GON4ZzCn0TdGFg2E2fRycUU5FpiLSIdu2icTjhq2OzDrXCwJ/QwEO7cOSMU/xU/JJuz/Dvx5S43NkFfnhMA6PhwMS3ENkel/vjPjqPJ4mjdbkR8ciXDsNAz1ITnci4wgHRlZuN5B2d7Uup93KMRiWIbn7ODENJd4KTPHYYhHcCE+qvTD9WM6d045XqQ8MWaDDbBXz9+NLZ68ah1J4WOd/hAQPam1/2fDld4zjhXGPtthxMo7Ss2m+9Wfrj3XQ96JN+Kl5CKcoNrXXsTRjyQJSe2uuy4YlKteFWQGOUrcPZI3kB0mpGzjyjsdQyVaAyBSIPJpGerdQR7fGREFG2TdHQo+SP8WTUkdtaZWltF+cG61FgDGuPzKGfKudnwLlZi8c7pbd7kKFF1IVCGnuyb9AmDKWMm/A9k0rUlOq9282o2OV9a0d7fHnlPO0mxRAf9mbrpA8HGnaB6ynRTL1NSPZ1jboJtdNK79HPzV6nUK0zZzpMFkrRKifGOLUFdMJfHskdJ72z5//jKx2uO+Mac4tXusVfBGCym3EHM+5+brEegwWygBmBZkZZPaNZOCP4YNTqOGudkXvN6PLMHE2hqTIDyDiP/H+4GgZc84iVgY6bwSCb0Qye4b88T6zYsN6EuyesYub/Q6JKVz+YvzTgFDV0ycNoq8E+axrWh1wPwZF+dTBExxTHj6h3Rk6h6ORCQxR6ldCSg6YWdKCgsnhpFvTY/Uo43oogBB4MUyE5fD5tz2pg0pkBpKbbaFzmqmwyB7MkKdcf60JntZKpnV9c6evKkL9TXl6Ox2ieLcfjn+BF6vpKfFpYW509vTmH0vCY94qw+/Ln+JbNPlzm/nNrXveLahXO1lfkPKkspZ7KP1SlOAzmvD2k312YBTo05lwfcBZucogqXj2p9V7aQjbwj6RMkdQQo06AWAFoYYABcLbmA/gjKh0w8mXOkM783YxDCNmfGBxSq5PzsXkolAkZIR7XWxsjnEMAkUwhdpbvj96zraBoFY7tx10podjZzNlDojeF5JfjYA8QTAsQDPBKYTC8boXS6/OPpOLpzbYLBDAw2gvDPhy7jm54OK46HLu946GcOZ7To1N8/w78HELMjc+jCaW9lyBUHN9dpVvwaZvo3ExSWQNdkgkiRgN7a5VeOI+LxCgBc57gkCN1bWGz3ZZ8XS7b027Z7/61fUoY9W0fj0Cw6ofuOsYY9OaADusToTPEV7z9hByTyXdfKLDvt7A/KgE2F6vefei7Ton0kQxAmk1Ur5p+A5GxCjLjrtJK/bTdKxtD781YLiuphgOFwkn4uuyiCDqbYDlgg4ivBIgSraYR0eyxf2cUFIA10kWPfDnHsQc+goAS5SKzgCtmYIgEFSJO+oEi/AAzjoK+DSBwU9iM6wPTtd4cGfqGVyBjyFQ7kVgvEr9zNiwdnoeNPseRXnSos5hndNQjhnYAD3LmHhNe5XZAHlTKPV6P35e9OpTN0y9Tm/sCcnJdfKtbVlYMnbDhstvHJjzcL3NrV+9vylK6bTNHJDIAusZKFfP7+ipDcObExX5Gt45T4WMc37ZKTtCbOGqh2JNZ6W276D7kMFtjN7z8ZfDa214h972zqwbkQuVs57bmq540tWb9RXijGOsRclsoUG9XUt+h2Z35cGf2vnqJrRqZMZXXf2836klJ15i1EIAhSNGZv8GbAuARAN50JQ3hNw4pwoJoQCKXfMhpCggq5m5oScCYBBYcYyhiAFLk6DI0RhAhpnCJKaT7E1IZh9MK3VLXo8XGjLdnZYTeNuDuDhQEcb71XG9iVaVE6v4G9SmrggLer8GJ2ECHoUGH3A38CXEE56VHz9ODn9yi0dQ2nBhi2Ov49eInfNMtzt+2wyokhaCq6nr+BFQkYYRofrNZMLHuKXXbb/L8GtfYN1bqijzA9Whu+QLd5r7+5tvh+GO/ffq6fbpJ5p9XXcvEQWeUbyqekK/kRd4vpar51iT3DXqTi1Odpr/FOdl6PZ3i2KGZDYs/1XjuuNvLw8RC6rHe+Nv1y353fil/IZJSmpn91nwhqZHRIMF0E9LvtlLTcF12e7jdeoxuMTO/ulwyrKqdXa2cDN+Td6UJ9dt+t1FyVzIrcqAGePQuqEgyZzCnNWDvFH0sIN5l+PWHUcqrnHj8VXS9+VWE0QKTNYIxkLYJCAbHTmNf2tDH00XlGCZmAuZQ5OUEmyhruoV/LfFotqu0x/ZwSYLpZFMgOSN29OzAXHYqvsOPqyUa201XoF0x00c1hMOLc4tpwgYsQVYet6BxHjYumZy8qXhk3NdNwFYmZ+PD5VGiqjyaYRv0kz4MZATVB90+AEU8oncLIglIKlGPN2V4UXpBEoHwpZTqjtsH+vy6O3y+vJyO168viq/tB2nB5Zscm6s8Xrhf4cGhj5eOxIObjIhSzdL0mlcMC4nFDylhj75omcXx3kmirvz/Xk5KBqIfrRR/FOlfofy5XUGDJs29FlrtAL4EmllIUjLBy9GjmxM4AqfbmUAF8tFItlGh7fb2A//dFN7+2yfbxX3aSO4MGT8m1WgLs1Rg3o84H0JPp1+3cFIMoYqbQjyZQgY0heN0djj0UW905DsJD3igAoXVOTK1AZkaKgXxbvJ9BbCYSP8eU4l+ZjlXOyy8Pd3X3cF4nSMcuOMgqKlmY9wuEJ+Z3lsnh2BzhvIzeRVdTyxBhr5KYzXJ4QRUqS9kGLdbzUWeCLruWHw11QSSm+9D/MYPZumDbKlFKt9ic82h2+spbkZRpndixO6kp5DmBB8dAdBpAW/3pBW5tE4eCKrInT2iY4GeA86emSo1rngKrR8k4YENEjAvB4XhBzYE8BPwMD2ix4CZ9YCPVyvZ97i39f/Fjb6utfUpSrXfbbl4qdYkjmdfiA6W7pnlz5tFOwDZSHahKVDIqrLWIK0JkE9nVDAOyc2oPJo+wlakdBdKhWcwkQpCZKGELr3J98VrmtyED60Zn93NaHIQoe45lYDXtzXfGUVKoLR41DmleDChacNlXTQO9o0Z5/BB0FAkSkH0yQTOVHByCmHudhP50V8fxXGPT5zTHACOrrPVhdaLxRB6KcQeQtnjk3RhRXyOjqQlEp6RR01o1UwUPyRSjvg9IurYesTwacxw65AAIqXDRGrAoFuwtpHuTaIXUQha5+3F6JK30r4C1xKrvRdez9vL8yoWq3vk7RB9tUi7quP2eXt5Xc6qKJB8yB6w+aZS4PK26M1fJ5VZit3nmDHnmGUgMboi/ea8jc+czgQ8oQkAgQMSmtknIcS8dq+RT8Bdl7vR3dNVOYGZk5oyAnkVvVNgms7sCnD0PQPSMxdPsuM+DvWDiSH2mNmSCNQzTyTJpMSku11vuV6OcdkrCfO+qbTWeKz2tDY5NnpW6GPH2KbSJvixZvTA+8HEPoD4Fp4NZjMYChEg3Ih+RgJI5KPMTVyYZ7oZuV6D+kikyaitOFMZ6MNMObkwA2kb25nh/jASUL0zMf7o0whkHR2m2ZMZ6Trdl972m+FIlMzHrrPoL2I/Aj3dZ9SEs45w5nUVCtZK7ljJFA/sm/C34iKKaB7KWkhP4QtyZFd6QgQzLGU0s4Fhx2wkFPDobrdhm6DNDQ0tNIzZ26ZKjWAKowfeQUWMfwHKi+iLo5/ADrljayGX1lNtzKPshzpOGTJzf95fjk9qgh05EdRGhNtaqkAxw2RZC0IZ0HlzOAg5qj7sWTRNewD+fTFtu355jaWIvT2LTIOOteg+XtJ0RnDYIBjLEkESksMA+YGwH7ojDptWbD+odbmOpSxwCKOAEhETTCE6dn+pmFY6eK/7y+ckv3a+jWZOlFbKYa/Q48GESzS6+9L7BY6u52iFDWx2e9BhTN+MW4uhVD6tH3CrxUKjismhEzP1tdCOddkYSDbakFO0YNEnRJouU4qp0NI6X1+TI8pUkCxDji4KmegHkyynISgcIVN/jXDlXvS2coc7SGKEK4AGVlRdW+9YTQwbOyXGVgk7JYx4sCsn4I5BjGRpxOELuTpiT1KtUbcECCK3P4UeUXmTSkhFTQ6DSlPVi0Y2ruIEfzIOXtahWtz/ke7MuripsA1bPXPj/mk7SBw1XpWu0qbivqAaKkQvN165rGyAIIWEbRP2BsYRHYZwnS7g3tNmuOimXzuaG1d/9tweM65y2iVD5CFS+3eoeeecxjM4GxNb7YCdlTf1/dKfj1oV0zeR4aJDyj63tSONy2mnoZFmM23C4EVwGskyRHbZ0xgGnLyJco2lZsh6O3Gb2lYCD9+bGOoKaBu1Krq0smzKjztK9UYTvYyTFYRnoWdB7Yos7o3dORzKHABO2PjzXApHp5/52e8QFayZt/yd2e/llKLPhsgmK5xQYSgZsogujEL5SDrqVv8eGcM6sJUbaahFvip4qEOmLcUzWByzfw4XNlXdam6HdKDHdtQ5gVtlV8pjLieNgIu8kcWWm/JPATuSjyMD7OxUnWXezMMq/nh6e1kOCRVmllhgER3ej1w/8+PH6KwDcqipVpu7XE/Rcdx7MwcUijY4Akm2xhhmKiHJ18upjtNkxTwxNwzRNIARQgLG5jSEvzmBBIYBZZKodchYmUiBp0wXdyvwvjO7vHzOMIkQAuCYXo49fyptmutJJ1rmI0Htg+iZCgOHH8L3xXIxFMdkR3uw+T2HuBMfIbJZdHw5xBVKwiQCYW4hikn87cQecVafgNiwslIBAshfqFlA0ZO/TL0gt93eUTTAdf86bYN0w5f1DhwVUP465YPcK/eeGgJRhX+ZLoJ+wW9AhQE/kQgDwlq4bhkSfz3rlKS1u+l4HdDOxi2k0YEhFMLp4Y6gKB4+KX3C4OjiGgwchWA6Cw1s2oEGzbmAwTiM1xVfohQmB0pqoi8s3WUYaUvFvtJ46BtbRwIJvFdPUpwhLOeHEsDzelZpyWTKV/EqxRW/L/vd03LRFNPJ3BjFps337RKbfHU2SBgBrSvhClb3JsUSMyEja58ihI8SyOXH8Rp32nzh68s2iYrF29jaL+HzJqZVmPiQHqky3b8aiPRNBdzV7utLnM+1phRZsT+ulfPtx46eabGJe4wXnKVFHtOgIecajH7x2CB4IIwQWA5hDWEWmL2PzzmJDN9M0pvVYwgy18rQHu9G1NqaqZEM8BycRrIvwJYoWDKuF0r0pkYrvcvBHrJLKiCN6RsBppabCoIox+NrPAM2O8+yf0TwjfCRsff6UVVCgwn1LJZYx+PlaXfaJvaufhLUZZDVKjbC9evLPm6BmOKTOBbE6IH2D8UX6qrFT/04mmYfdU261YQ2jrbOVnsoxLnjNeE5eHMleAFl7W4QXOqMb+KXb5QgfiQsrDCZPUBk1RE0kfuaMq4poRQSdjFm+oOPw0oKgK1QWqCS6kJ+gqiBjAEfARqInG+FGDKEtjFGChTykTY+aL1lpmAtWzZMUXK+L6jMpL9NKflCZizqu5FoNNwf67uJDrdEDSFhlF8gJ9msCHOzHlZ1+D2KTogKjhKVrJ+wiqhe0nFZA4Ir3WYdWlTAOcrZDV5UThYFWIRVCSUv0QqdRpTwehZpvCz/oaL+aOVrdTjQ44/N8RrT70dJdfGIbDPenqCGhcp1YFo8MbnnoZPLELp066IKeOcR3O9TJtWCHCkKl5m7Gd89nMjkvZB6W5DsPP6Iu/Rj7JId3nIsNbJoKfVdMRhCnGJ8CY+wC93+TBOH8SXEjtDH5VwSpmChoqWzHfoQMqqksUQ0h9FzYFQRUQD53gRkS7YHJKIAVdOKb7xnHwfv6jtvLQW0MUmlPRmqe+FiR8uy7Bta2pTn5fk5FZvuvMSzojBwmaQ5u+5VjSTazswaAR9zBWDLda/xkKaOifw+2kyXTOhvsqfEyMqODuMffuoLdxg3ohuzHA0bX0BT+dUXvHauBz0un0wgbNprTpvHxkXiqtrk0UC7jeU1WyrsxnYZ/K0877r0u2BvUBe6cfeKLiuFEvx6WAcPMZ3YxO0/bgvZHxVCAiwL/PBMegPHpBUMjvCDliJKanoCOrpi21s/PjZdbwIkQqTLkXmbMOGMdIgr8vTz8hwjhY2rByTXI3Aj/OohCOZUaM73mH2EQADRrDFsoykk6UyQ2MkjvtPTawqBGBqTcivSV+ivl6WnP6WnCzN16yheQ+YmdUl6VCcDN/7IjW8G9vV7u8QlZmOLHhFzOdkabuclfpEmc9bmE9pt6veI3YevHTUZ7QOQlDTUqsQ3wR4clW7EYJpa8OzllswjRQogWebFtF505zKDj3TsIGGuZJzgOxa2BbTXBQKlQyyh0lx2iCC8vs2Gxnm57M7PCk9SkA8GLqi3g+19zZ9x783aI/hcIoIKRf1CPFwu11MK/LfbHpVxThHVfFcgXBSewWZRir+2PwN2FCXVWw6AbNHq9RrxmyirCGAToTCFXd9g0jE2TLrAvMYgbMyqG4QXF+UZlxMyHOCL+I4/YUqLqSVJWELAl3NTkRdwmtbEtxfPxij60SL4hL9oMc9rH/M847HGOFBv5qyCqk2WOsq20nBsvcjn52W3V7ttlkxsP6OrXE6z19XWxa6aSjtJIQHfYZLy/nK7w2VlmO5f1YJujvqTdeyzdUElauhtiKfUKRNP1cRj3FaPu3Ded7K13ucq+BJXfl0ygcDET2IW4vDyq37/SeivyEdfUV3HNyXcrdNNK6FFn4+j0JEbN1HeFGNKAcNuTDzn/WY+v+7Orxoxv7KTIrgjcjRkv8RPzZWaurfrKYKdKQ5ZEjw6b45vCiRrtqOokMxTHL00PiREn8cTh9hN+PMxRMYZLQk6NnY4ASQ3LNX+I++B7YyJBrloDXgU1eiqBCfG/PM46S9wNMWX0aAmq4FjBDfYR+zqNBRHvdYUAU6hoPaSSnDMnLASZRXWHkLqNQawA0Qc0WmSORtRUkiYHTM1HFAU0pDIQOIB+RMzE3xfNjfunNGhb80WwBA6zUNoO009yqmkUPeOExHsp56SBGhTjUINvnSn1xjW7iXpaW3QoS7O2HlGxDC75XK/ipqv/5JvxW2l3eXn5+3pdNSw7UiSBzM0D+gPIGB+rhzbnbeqOWayhDFhyZoLkRloAy/O26+3/46+C3N4Gel6Z2alWcOiivnp4y6ed2rWP3VRngKbsvee3155YPj+l5xP7gvp1qeZoAwhOKCQZFOtgdYDB3iizUtBPjxM6hXyHBk9UtbWPnZvd60iwTxYByEij2h3F1rW9hWV2JEpEJixbhcx9GPyiOft/jk6lswTgwhoIYqFHEdioRV0R/HY7aRh+7ocLruNAjCZTiC8eokacN6+7jbHvdIg7E1iR3k7H5Q5jsCD9FBab9AkkdTtlLDdkMeFJzWCtTbmcmuRI4U+HzxeAlIRqigZff8wsxhCiYe219hisoyyGU0J0k5l+oTON81i0CgSc9g/AZsWoseMypjFeBypkErJmgnQQkDYBWSwmVNnjkPXb/6PZbPZvl3+uMnx7fa7uP23qvNaXCEmLuW9pSo5sfM/9eEp9mPSRfMt33m6IGQ8UwAQDxuvDd9milhAdgz/PXy5wFCjWwxMM79s4QhBEDm2B3vKBJG36Plj9JAFD4juoWO8LcMDMiDy32Rtx6ELrotvQ5xPALQ1nBmQNIJITT/DDk701M6GAaxnGkFQGDvYYDkIhbSRLwEUuDNgZD+DhIv+ajm8rttWYQ/G3tR1oG6HgHYkKhz8JqTOxlzIh9e7+HJ9flav0DRJVdExS/+aCy15se53p0gYshEyZzpA6/8tJGxiZR+vLPjRa9DM3LObh6pn8b1VK0tRxhnqvdHK7z2NJIXvuyl6Eo9jBGN+qhNTWg94KN9VOvPcL75TXek5Sm+9z3y9/L/Gmse3VO6tizyJmBLUdqlvC78dj/vX5Z9xKSI4nJ8Gdol9ZUOSC+9UoSomyZ8GqmX7jzxepc4S3SqpTJmHkTL3IbyT4euHj8vgVril/fFiaAM6L7/+XgyAK9tdtwtcTsvhvOpzq8DRy8BR20DbHu5y9dHURzY0vWg61X8ztzV/7C4vN1H8TfIkhlaiW6Hx0We+KusSWu2hs7HmIvEoihtnrxNjpUwpcJRsSI2B1aKjhyA7069OAACZeOLMzabhqBOJVaXXBSUjSp2jw9NNV125W8qefkihOcrs6d6OGxzGdFcwqwrnefkenrb7yxI/ZgncC0+Wk9SejohjLoSG+2R2B6+ID9xRaf9KfRRebsxcrtIKkNcuXla+meEhkFDHgDVkkcRO3Z95I3du7qsq8BtZPdq1Guuwuuqm6tmsT2Wz3GkOMXonUrNoPAvTOmTaeXs47y47JXXamzIU79TbUVRuTfdNdObRVeuBdhnQeqYoMiQ62crAOFXgFATQjZnp74C8SYBiLiKhxJ3Y8yZiAREpB9sqRqnL7rCNPN3myZSLDScVQnuHvoYHxRsAV+cpoEX/Dugd0MNt4tmPJHAmFD8UYy2m321TOlHelhWsEE89rMlK6DUwjqF7Uo5j94uoTrg9GStu6ftaMalkMFX8szIMhfF3xianH6RtESYyYb6F7o335F/hsfg5jSmyCxU4EGgkhC5Y6vo1AkCHVhO1bwKwLVQILOhlxwnDOXIP2CpwLPcTLrh84TKWWh6IYPaUgGuPbLFwIPhCr+j+HcRFklkSJz7apTUVRteca4RPXlrrlvgu6chrEEzUT0Br+9bXDl9W4eg4l7RmRtCFaefC7d6FqFMjmXZ+Txo9JuMDsC1I55wMlOYBDyns6JU1GdeVaUGQ1453SUGEtmaXPBZVmFbzVnv2p9/7AuKA1Te2DgjUn20B3lQL3dnSj16ccoVi8fRduXu693BhUABBi4+Ofog0wM6RtRAeGYYvKGs1dSPlZwjtwkDL4NAr/FMy/QJbdgw7F+0Vpjc0TER4DeuEzYPWH93KocRFL8WAawtBOSWFiDYvYi15vML5RSgvIjsQKHZmERj7YgCcdYihU4uwaiECHi0npPBUUOO8gqLAwuqxTRNBAQHJcFYkiJVqIBmxGPLLOPUgv0xMPdJhpgCccKyJv8gNOMmcFj6eaLsxnaSQMVVgpU0kQRfharSup1SbtI7ECMKniarwUUGxTeh+jmcjGtfIFyVPjtMbludK/pjs8dg9CMcAEvMWiiNtE97YtgEZFPO88tB4DUD/oTSubQ4NGG0BlD3rMgWy4zzChFIw561EcIpdkJYNNM1GS72k9nv/PJ93h+dIVbzzkcwfBLQZBCc8/TlrnI0Pg+8a0ikBDtOHsiEVpQQpQECLQrwCZtQ5BiAEFkx0aELVYaZEyaMeAQherh6gPo+DQeCSaFHVc+NRVgwbD3I6Jduq+2NPnnorwX54cOGDkCkhP8cQ37PxNYgthafR24Q23l++qdFJnv0gkPe13YN1+dft+bx8VcLe0pSTkKChPiv9vk4utJKfaCDjvEFRA/JmqOWFagWAKQL+QWYni/+GMRoRrRZ9fLtnRes1XURhEi+84eH+TppDyfP9ccHLcrmeV5Mk9QV08gtAQ67SK/2+9rp8ksZ3suM0A0Bes96PZb8/LIdjDqg4CsjSJw44H0ZplRf41/GgzWHFjsFuCA83nK9dePuQsDlg5F0HWjHtvifmBk16gj/2XdU975RJrreVabriTthttssmIYGvJl6ibRmiR5+ZkBSl1B9XUC1Rs8GXMgNTnl/+Mme94ToXEbRznd0Mr46jOkwuQ8sDovI4tpLeh9CbDz+ErQJKFTE54dQrdEyQwJO6zZwc3TkO2ekuQjczL4x6MtQ9MUZKMe2UyyfeCyxucWBmDcxb5rcsnZDflnsxzEI5ewJUlFMoaUwOnCVlR3BXPeET5H0z9yScRtiWAxZBF9oC8em+AePEsOvMbhCgG4TMJXBwYUkskOtVEPHbzfyRnXn2ky25g5yowHi7r/3leLycL6flTc06xKQl48IwpSdiUZbmcTE1r7buH4i28AQFORbvU6inwxc9hfBCA3aOsinfLtmnLJpQ+IjyCQUSiqbONjtS9mCz2epCiwHbYwjBC5UEPgEqCaHSLJyB8SIjfxZFLvFNRc00WcbiybCgJR4er5YoNllOQqwQ7hQCEYUNJNBBg2DXkamJF5mcTVv17ry9fDke99uYpiazEwyeq4dhF51HRbAhdDh8bU5y2bzE9McuUj3Heim0x1jvSU1POgk+Qi+mUkN9XW+72b0u+1VjI2psSnICVq3NasKqvh/i+lqs2mHV2gQyrDp00aLSQQhvfsbbsLxoQiJ1zRSpx+Flq3TEXZc+XpXuZy+rcXQxM/RSY8Xn/XGJDwHJIgFrttIM77y9fN0eX5ZzxHSSaukYvLaVfgtccvUj2+lczjUSp9NBF2KqNNg9by+7OL+VFSEQ3W1b/b7vj0puXCabeN8rbZIe66ltH0na45Vvq1/51+v+stss58uNi/q8bBRnRNZN/jEi+NC6l8tereiiFavv9HDdRytJRBpm821XHZzW9fIByrVyaUSorjpCiaXV1+Ui/BfCVFf92oul41DlItgXYlUtG/m+cuaNdVLRk2SGWgqtspMcTb8fpraAYFObrto7Uis0W/f0ovJd10rbOyoEVMe6ixo4NeYUn5x+KveAl18m+q1XiYtkU3wRh38pw1nbdufL8vr2utucjoraKfFqVBKojtRY+9aSifuCMgwirFYaHNyWTvCJ9WbW1poKr+cmG18E7aWSmPR5e7led4rtFrHZ8cGrg+r35aRTPtdFehRYszKsRnwvNzjrORK8I3J1dD/mAtv5+fPTLsbhj86clrcFwNLzEq9imkH8uvLs+WV5U/pV9tQGJY1rEJMajIibgRNQatdRuAY/oRMi5GXogAv68ogWPovMEn/uZVFsXedG2wkxlN7hbezDDqf8JpRjRFXXQjmCknklNZmXXdwJGHrbUkmtnF9PR/FZntyuwVyME84pBPc2Z1grflNSgejcgJkpHQrgCiBWzN/q5ri/vqqUVTbSOwTDyVce2y/H617FGFMMD0O/DAoS5gpi5J03DE3Hx6zZRzTfklFs/u6vl6fjD2UqY4bd0GCAtABH+0EtoHSV5+Nps99tD5fN/qhk/r0cOoxq9fe/hN0XLdztJ9OXRVC4ugLOZvcUezqYAEPAAvjyhkDCtxg9H6AiPKS4AHuVL7ZovmBWEv62bbz9iu+etooANpjGvnUv+e5pu4nPvMEUYaFaCGefJFkUwFK7J3X8D6aAW3LXZYvn8+5rPOKabf/v2XZmX5eJkXROemcG71p9RiGVzcwBAow719u2bkGfKeZRnioNOo/0xONUyUOG0YWckgBeHZalqV2qBEgrl5meuR4bPAs85sGB3ysE/NvD+uN6yDy1ydRPc0SAj5OdWu6+HnbPu82ipnGDKaYwoZ3bYALSEiZue2aed/utErQYTU1PD5i4f/D87CVjCKGzlQZQFWZEQOmRSheeQvqx02BoM7dDthA2SfjvgOWj8TdBJR0bhLxDFswJRoeIeAkMscWlV5cY1UZ0pgdjz4Sd3se0eBjTZI4jC+FzbLsbn3dxZT+ZYASfMS4t4UF3aYHXt+bxV9saKDUEdhEvszPVParcbc4KHDxKca6uR1gExURozKSVoOyLYAZLCU6ENpGiAW5UVQet51hhZK5RyaNZEKWzyVHg0tRAMhqHybuz0zgNZfbmiDKjIlDi5+7+pbfb0P2SIsi33dvu8PW0PZ/viWaOgOGcUBshJiBMxN9PNr/t3t60NHVjfyfq1bOW1Jx901WQ8MxCqb5XuJPJTAFbCofY5j639eIjtJmtj0zQwlRQ9VxX1GL9rpHanrl13vlq9gmGZZrtk76qiaRNQXvTLh2tH879wksFzwgca9Stf7yyjX53qd4inB1b/oT0mjKSlMv7U9aw+Ash9IxdnJF8TkzWbj+B/y1k5DJyGqh9EJgjjAjhPcCS8AgDCoQCHHPD1LDwehwv/6FCmcmK8Q/0mLVQjDG2bX3CbgYzXhjwUXpOSI4gO+xQyieV6zvyq/vjDyXBMdoy1rkpf+/th/i67Peq596bPkkjMUPiTOQ3aee/h+Xt/BK/hJ2djCRAWpAKKCKTQGsjyfihwG+MYMAm3St8Uny7zI/Ct4y0EwEBee3jl1NrIgLaFFAnZyYCKAZhJ2kj0cCmpQ4jEO0WsBQhOp9DrpEniLH9n4tKiECMT5Um1iI+IfMXXigZzyPJJkHZmxNCz/nN5rwd6Puag+YQ0J7xQhEy6YJ0TFsDxItcrskMj8Ad4ORymSjlYQjrSVrLMawni8pTbiy3n9iltYPKcfMtxlq5yTTM4/YVvG0SWajPJG5xZNcBxAihtlR49dcbe14yXnajHM9Wi3wcN9/UCTSbKW+JaXd8jh/XaIIZZ0E5sVPoo5Ic7kytgGJKf9Q01tnsjOAr6W0z8vPxeooz2s62FiUyk8bQhVt9W5ICwXqElDGgKkXPAFEMFTl0nlAWwLnVpC9qwfn0/LZo6VlvfmF9gWzwtl2+qcm2Wd6x5xL6JsaSm7VJFoNlbOWJYD8DzbvUfoYo6OxoJGc1U3h17venhQScGW5+t9OSpDun0hHzzJ8KX78W8XGj2TevKx3f9ruLeh2sbItiAmJLE2xrX+O/YkSSADrAi9D3+ObS1IoIlZaef50dPS7aobs3R7FAVwPyDTUFEglCCj+G+yBNFz4U0GfEzJmKCQSKUzFhZicCBxKrAfQ2JbeTZhYUICwoIVyWr/FmnwcTxxxulbJNzAuLwrqeZqOl6fhl+aqNTBszcNFGjyr+9Kjr7drhshyelr0iDXlpxvjJOQorZgUJRV6VEYEsVS63q59i4X3zGPzoqXVZ1OQ9wqGIkNlzM6X4nk+9UOKwy9z1Yso8JwL/zRlGVKXywrq0AukMUjxvIma/VjzvtqTuX9t2UDOfN+FuwK+LIF0QpF0vGYXh1tm23vxCELoe27tBgAGdFtM5FEUdgKv48iR1HgVQlf71uzmKE+Rz0LxxXD0OOPOZXGO4iTO7Dz3HhiRuFNqHl+WkLYxsxslfZXdm3JmyiTfHMkXpoItiAoyTidmqajGv6z1fo3N3NB1/MArmDiM9Da4cIWS8Q7m6LJc4CVzL0l+pKW5M2DiaStgIpjhomIB6E8rvifRq9g54xiLj6mvRe7db2hyfFCtVDBiwjygRHgS8MFtviKdhNx4ecBN+b0aC2+MoGmsZurdbzXG5ZSTHaQ8ru1C/g6TnMOF3OBodGD1uwu/NwCL1SA7GWjHQyxI7q5miOYnev7Wc4rb2Jm4iZFoDmmNCRL9FW5tjfNZuvnAHT/vdl88vl0sUEb0ULvrkmwyzoTzxumzj9drGRG+JT1Ho6l52McjfTWZWFpZDUUbbPBRiWlijDdsDzSd6fZS7kR0ljBHD2W8UrFgqxnQqMN4IgmGVaWaaBR0WYRea6aFlumS0sin0wfIP+vim6dZmnTWrEtdY8KRe7bE1sf6AwA+Fqd/lGPcWbHQyBUeGpDQK/wSpQVZE5EELFSBq/wg/C/RywaobOpUmx1USsqwWY7gWAz9hVERmMg06gPkdwGAWPONCk3B9YGqwNJv6h8XJzbrScnh6Pp5+qBLCjy4ix3BYViu+Ea/996fdaZu2NcfZ/K5LGt7r2nGNaaLEf13SsixkWZCvNG85fhN70zxiDPBygeBNAo+HgFaE0S2EgtOy+/qiQF52O7j4/E/b5TXegOaBgFcpvGc0p+ccB0VcJ+YkYMUXUKOXk0LQTuYZDiCKGwsSSJeTKuoKIBGcFUIRjbpNiPxeTKlysx/6p7BYyllM4Pc4T0SxBGB3tQEFrLVFx0HobqG/MhJzR4tc4HxGYshC6t7CRrpt+sILsT7olSkdvRWzDDstJT9ryZi3VbMAfMkZpcMIXUKEJWHuQffx46i8E6XdWVBbKGVfJwXc8YUj96Py7JfTdbOa/+5VlWs2Mv5bq9xwcwpGOnlzNM+x8zs3ih7Fn/AhL8JQr1/ictSEMtURhoxr/EO5tjm73q4bzV2/vJ2Ol+PmqFDopmw/Uqk+FMAjBhIMjNScEFBavF8IkSIETaLFS8S23T68frkD8ZR0kYnyLEkhrWupx2oyWuuU+q+bzXabOC60pmBpsW1zX0wFl8bGzn58ZohDJMF6vzMpXG/tHAvfDPYM9bG2yAQGlL6FU/9+EdVo6mzuDIdmaBaEujCjshqgPGHaT4QFpfYE8gQqXn9RZDQVPsHYASyBwOsSHQtPL46q3tuwstYVu7zoVzSAmOU07ks69dfYKtc5kyBGyLtUqinuZj6W0s59ft5tdip++N4GhswcyqONVpqirheInYGcCXsABkBChwkjs4/M6y4ZQ3r7WbLhWmyuXt+2p50ycW17+8EU2qvXt7f9TtOLTFpIH/IuVO5CtAkNYop840CRckyE5ZQ+4XpbukCzAteIkO8LaJJ1zZ9/HFcNSlWkrLYdv8KNvq2YsOKn91x7rLU0rbYzz3joVLsGIgHi7QPJcKaJAM6NsdCvvN+EBn2bDwd6lxnzQcF/SbUwI7NAhjL8K5uWWaxdgrDz0AKVNVhGzTlvy4dwBIQL660JPUHBzylAau6PUKu/m0kPBX5oeaKNoW8/oWIswNavb28rDSJhoJsuthkeRGZVhTXqTPZhpezDNSN4420kNiQDH9i+wprRB5/Mrnjd8Oy+ZGwnZfbFPdvg1JbTqC77MhoWMZoe307Uvk1p1dPxmliK2boKCMvkztH4eSzwbK+n77vviiI7mClmHff4tmbcRjK9Ozxk9IbSiXlbUW0PWxOnbnt8333X35szs/4u9GhyKMIJDRxfAGRcV/Ca4p6aDcM6hOWPbTxKKjD+QtTFdBgzVICp0SN0ncgBwEHDXKhHVdEPdiRd702xw0frrSCzsh/tvfpjd9m8KGKdTWonl32uiWr3xZUc5mASL0pL/Xz9Epf7g5RK6MA1agD2YHdzEva6SAOgjzJj3tEwD8PpOIWzOPQMLZo/TlaURBj1heFOG5r5oLTgDQCpeAxZ4Rj6LEJBF/UZP5sQFaAnU9kJnTNAoDfhYeAmTKImgoCyBRX+VSA/8UwF8hN/IZCf1NfFxMrxdc8g+TlanlUrw0Ljd+n3Zuyqp93NbWiJBz9udEIebqbnnqsUnlJrazLuJNmXEDByI8YjNcvvnr7vtj/i7rTA9GHnubFW2u+2bHzA23lIsvnT7Zi/yGETHzuRewP2xISj5j0OdyEB/HnYvJyOh2OMmBlM2AMbGeEUxTRIUngYXArh+uf5so2HUIONXipEvxS2Ky1muxZnJuaGwhUc4yo4PfiGsPCc9BA9hBwyoKAKhxAGfhY82jE9SxhbIC2C6Sdq5EDLmlAvIfBxeBV2FfokzrVpWUVWvKedKQ126MuK3xsxU2EIFJQo4fOeCOQJmtQEy6BpKAZNcRCxL4SgKQIpu+0MpCj7RCBNwf+yrYAqQfgJOvzEkVpGoxh01IkWKgi4ksyEGbM3U6rb9s1I9k/ite8DHgYktSHUyEOAo03h2JxCY2WGfS0+oaMlNOHjyFaIau9RSAJU4QGq8EPGhdz8aLfPEOEJpbAoolRoTneh29hBLT+8t7NQnAS+A3Z0E8AqE7t5PJiAhx8qZYEz3sACrftpRMLqEV+zUJf0GCBPUuBZ0kwlcOHyN7dTcq02Zaag4XFZvum+lrnMY95sLRONa0e7+gKy6s/xPD/E6bTu+ajs51Y80C+Mc9alFEjLzAp6EZiBQhJ21XPNd3/6Gg+3BkGo/tSGFKCH7RITHWGKBH4IM8qMLQz7FHCjEVgWfHEjei5SLqRC1sT+gHFh5GyASmtj0x4r5QxWZRRyOD1CoOxIVsZ4qKNtaaVY92WjYJe2oJTEk6THFvuRssPHoQ1+T4xvkM7Yk6TL5u2Py0ZhE/rZfHdLSdi61F51MU0DBEB9+yBQQVUKcVijRm/RmxAMZcR2wUFmrVO8VfWJzbc1/2UUAuHmLWvT4UfpG+6NYrmw7lapydpCFILu/MCaWgtqSUc/vuvFgXxLuGqM9nu83W9ftxdVOXZmcTGi3+Nt6PFl+/p2PC2nnYKUSLVig7zEwCUtgmhpAXUQZweU7el1pwT+2k6mBYRJcJQC4605456w6n2FOI0Z2eNP6fSJlAYst+gQpAwAXpmM9WOHcUWPF2oiDtIm3D8+dsw1aWWGyrmSmBdFUZqcisI2f1xGUXYKzjuUnEGI7Caz5gwX0I4Edms3+7ky655V9u5MtA3kP8Op3Ic7p85IS/UFxjYEoN4egq83ooJbwc+SShY0xAHKfbQxRpftPxW4ZpJGf6wYMmJZa4AKJyqOMOopukYk7xmIJeHcHO8Jt2iO99KhnoBEIlthQgQHXj/Z6PnLS+wzU4Dfor8ZMh4U/tRuClFI1PJIe10u2RUEBRQ7Q2YMKHSAIeNm6/ZE4h2i8sVhWqDvX15iIttoPpDAEMI5z85D+AFVKgro8AODVOi5wBsx5G7QgxIdllBThlAMAiTKi4zYcnhQmLvQpTnxZAbBOOvkJjY68MXkrLASoPdyTksHjQ/2QVtOgZmoopYkNThnOkbmCwKPGCy9o6BDjRy0+MTUDxU4qHRu6tkQwk+CBoYXG9vhHVUdnKUyISOSBNkxwPXUbKIeRU4eW4AZkRNQjzzrrtymLxf2ZV5zh9kraj6hVJbR3BG2WezoC9FuzGTw8giGkQhzIOWSdcSGFX2WUx0eaqV54ChKHsSXF6XZbSKXwjMOVwxXebxQj7tDMyvsD7wEaFgCJCLsVMIP0HVlewW7P/yA9wENCfQe8FpgFoTNjrYyNi52Jraj2QNiH526d0h+sdOA4USDEh049Ijw+PBtoiOJfJZMl/ADRJbSFjYCbAjY6GWHT0FKTvgKuvAVUIMhtI7ZAe9wAoR/Cp8CAn655vjjz6lr1uhgjjZECroDA5YVZ2AM9KEjSGvDMCdFk4blafg4dLcOgZc6a2lCF8I+HURDeEC9i0wcdtl96CxCuA2JIfUfw9MYwrczhO8UbVooevOwC58CPbUh3Dw9usMBgKg/hO0nZOPC74RTCgDgIbwFQJzB5A8HBZ1RM2du+CfMQnD4hgQNZhuAqY8TCiec1NC2RfGH9lX48/Q0R7kFpEJ4qiCOUbol8d4AmgEBFWUb5zeJ0CDNYMNuESbyIQjCA7LHL4fckUi68FchsCNe0zmyAZurIfkJJWuD2CoIUZSmpyAgUhforjvorhsJEDN9/D+UH0yKmP2LWRaZwxmPeFhJOVD7OSQ1ZArx/xDoMctzCL/BCDn2oQcoAHKtkoXY8SQCeQznDGW9PSdxwugBf4Hn4jE5k0r8hEniDib+P1wDqVWLBK2FgoBIIFOZ9qwcOjWa25mHKlJOkq2xc8BfEj2LjvokeJIdnqRIXEkoQFufyWyHpyYA/dhDnXYGuXVxsQq716xASmMYMdcW+ikkkqM27Sm2y2wjl2wLAAo0WlKxUUFnFvCUdzhRSM//W2UypaAvVp75E34PcUgUDZwxY/8hhZXTZsBdJa8XSRhimJB8ok0PJ9V4GhROnnoWK/h/uTk2laYJ/hHFCgHKubIFrRZOuYlH8FwlA27G3YOn4WagGoTPBhX2yYUkEIkzdSFLx+l6hrBKULWQMsVfIKILGgU1knIwbPZp6AhCLwCyNgmUYm+DDCDESdG+IutOyKri90b+HiHh7Bkl4HA3g00O1xF6FZBVKuFbxB9QzI+VAbVZ8E7P1LxHPJ1n/h7uhRpTOcg6ijPhqML6g6RiliJERVBiECUt23+1NGQ5mqoYQ8XQdKgSiHJd2NBjFZTwzYxPrtk0sYg4qimHMZFDf8xRDhA9LtEcwGejwb1jh12oluAa6Lo7QX9jT56/h5XRb2NtSMaFR++eBaNH9zLfsuC/orVB3VC0EwCzEIxN5Ace+YFHqRghZjCwxm7KtkXwLdB5UBhVUWgDwoSkslN8o+VEmdLGos3CISGbMPhbTDda4KTJq25zbXbRrAGYUrRt2DsFO1sMIjmcxN8S0w8WtxAGxP4TwiIo+zu8ZVL2HtdAo4dUSzIepAA+rsZWkxAvwXoCPIpPibdMzusBxMcz6EUnmSpO6CkDOcWxLEpsj4ra90KgkmB/aFgJAgDWw2fjHEuguAj6wTWQ5/gBA/RB0KkBm6U3vZBBzZGB8LdkDyNyCV97PKuRcwgqTmPnCOEGmn0J4C7BvGSVk83Lv8CsClKfyKqCMqFBWxo7rKzNeWMRCcREouAoRzviTR7xdEc83cRtULUwcQ3RzMRfZNuaWDknbSFmO7gX7GzRCEWEE2g+PLVJixjffsL0FFebaMuUlTXH/8Nbhsmrn3FCIC9hs9UTmTqLlh5pn5QcQguVHT+2/EI0a3Hut+gGtDjj2wao1sbhLxz/gohGj5/wF+F9Czx/5cLW4Sd7gPmy1Ta0plI5UAnIDtDNDP1E9CXRYCIGAJMotgYkrIGg7QwPgOUGk1Cm83ipJPAUYZtbAYH5sVGMBxKBpDubthveGhKsWTJLWbekPAlJl3X983b/Xcm8mKxq2tA8ZpTGokrexURG4WwbM84ULK9RsIn0qCDucXnZxiTFybRjRWpFUTEipFkDi0qQVVquVkmrgnfyb2arSXQ1P9qz0mRbyxxT4En00rg1GetsNMXL9qxU5U2p6L9QXGG06WqXl63SK7PG0yGYsP2N+pZBAVW3/HZEFYBMdFCZY/7edrHMho095agK/ROWueGOcGuorlC8IJfCjEhPjdrwzSOxxnsMYXPOfzJjn2TaA31+KACER8a5TUh1OLLghCF8HyHRIvUrHRqET8GBQEKgQNynKggb0TBVznHQ2T7tUpUT2WJEc0souLOxiCa2aCLmmoO/R41ENPh+va03Ur6LDTm0MqhJL1pzuYYcxrOSMJIRIfiFBlpt2+z3NMtq22H/05tg/9NbX//2hleGiyxQJGweiRYPmkLI6SRnM9OwAVpANmJScpJoq7BJ8md8nUQTgm0BNgPwF5WuT0K7iIUcBQf+x5emKN9qtDouL8qRvjMNOAWYLQfGYt9pih+zcdnr10hdyTemqKXglZQ4JC+nbZwg2t6kmBOjey5LJ0JuUNeynhYFTvFWzi/HfaxBMppSNlTBEyJneE8LynjrhX6oqsN0JyWZzHYQvryc9BfT20DikUdFuH9kjhor2ocTK9Xmo9Razm5PzD7FnBM/kUgtAL8ExWEvMkiw04ZgUv4u1ydyvCpzA1u/qkSrui/2phYrkJNL/JSX0/GHEt8YZ1PKoUbQ47ZkzKDoTROkd+9NU2dsN6UU0RTyaeKXAFtK0EoZAJLGHWVQRsQLYRtqCJAA4QC+osEqBv4E+xi7MjvJ4TRGzFvS2YqcZ3AikJscYEqAYzkL1cz199nBZ2c+1yt/pxte6jbne8fosHX2ftrFjNuC/hIyVEJewx7iPku3V2FXpZtJA9TwGQRa6/FXxF0BXBW+JIGFAtBIbCbQY1ijAfJBYwkR7DJjQYG8FIMwDJ84zMptJm6h3MbhduFwh+ObKc2r5HbBv3IoMjLr4ugCeZDYOHao3r0q2a/OW2cXpx2uwPbavW514G+ErPsKskKDeghRtSgGxvFy4YKvyuxFkLHY2WKdhlScKdj9B8CQMHVjZd0h4YH/tIO3ssO35vAeuAH1/oT6koK4Dp/qHQLp/SO+vSxn5cYi1bA1o4KUCGDAUCIJmoAA6acwfD+CBfP+LZ7U2WVzn/4dZ1eKkP3YaYYgpcGhaUiqPOiiOFQJWfiFw48xLDOQrz0Qa49BxjVxIH78GEyjWdWBaO3MKDaMg53vERiZcF2EAG7B5P12tcvyGluZSWqoa9Ah9KipAVJrSf+NbuyxL3FbAjtKrCdaK0Ru5mWpii2snDUpG0ipSSnbN6K14nJyU21ajk9iConZI2eFBS50eNCfD8vhqMxoha7+6jiEi2ES9H4we6wdL2x7SABlCySleMp8omix8EmNtvQW7iPrhCC8oDo0NCf/69evfCiv6pn0gvQ5hjiGlgr0WLyH9opniYlxfodY02eyguINKYkIe/hE+PTvdufNePKG0Xjx1q+H2D/Xz5FCwOPteP9RxJILvjVV7kvZ1d+kJEHuGp83S1yDC6Xx1Y8sQ/guFrz78+fT8aiYysMcaSSgDffuE7iv9fltOZ9/HJUN0jD3ctGucsvvz5+/b0+753h6ODTRx+5yAbv8sdVz9FJRyJGy30C54d37zNymJJ+vq3IyWPl+HWN5A3NLAfHAebjNk0vpcSkHLlWHDDlbZuYIPlkINGLCGPJDjhprMk803VL610dYXyGcFFlfv4nsFfL1ITQuhhCaMD8sEsLQ4AkLhmMsR/8CZxpT2nA/CQ9M0LaS4SxTa5C0wM1CayCsQ24WmFiBPk8mFnhXgaQVZmGCiRU6CwVKFnlXCd2KsnskS5VaWYLmJMhN4S9yZipZqhJpPyQjIcXzSDl8x/QQv5ejEY1pntthdiqn2kUyTY5CkyPJkPiRI5yQPoK8ODs/JmUjlTr4wNT4z5Atfg/FIpd8c2r8758V81///XNhzmz/TTPgd2gNuAZqQzErhrSimBrX1vn0/Q4HnXcABzuAyd+jMLBpjpU5kczSFTgG4lQb95cjLgh6QW6WzT4EqQQkEPD30F8VBAKSBfC3gixQpgNkSABZwD9b/pyhY9KdIwGU5+rZ7ghn7WXAP3/CNVAoi36KAPLnZvesqLCemOfnwP24v+K0X/RxKJqKZyDoAJVdHgnzJ6QfvwcKg4T5g2hQBvwLSH9mtCLkXQnBLwxZ8vgFgVr478Uq5MDzGci8ALsT4k44OzCAGuIZAdbpdiyh5mjZhPVaROUWUblFLDaA43YP7fjl+vy8PR3iOb3ve9nWEQcaQy7dajJttNK1tES47/sxuhhPMdbPTfztVFzs+Rx1cfpOetKHdxipCfMMvssDMTe18pPHr9sVDRy3j0zHXiZ9k23peDkqqdeVkhdVmyQLsu7M9AcE0T7n0SzVfbD/Cmqu6219/qcq/SPT9PtFKh7aupKq+4WQ5bpS7eP/tj2oFpWJsgkJfn6hWEa0M/vY2QdYsM26HN+O++PXWEnRm0DkvnSPp7hNORck9YhfG1Wsyi990XYxcqzImNVP6dvICjAcJ+Ylls031eAcxQYi8+pRgFV8/+uib2/bw9NjjqdMYLvIoRuG4RWrflk2327OTdfT2k7c7/XKfbTyB+43MfRdT69osdoeUljs7fplvzu/6GGz4CN8ggaA95XuvFz+tH3bLz+T1Se5euhIe14GOWSlMTEveN4qpfZunOXFQr+CTW8c8C0Tn6b24Lgs+83LdvPt7bg7XJ6X3f56Sr6gMfqCKjvH8cp6ySlasrIVuy75tFyWr6flNXlOfhrkon1TG4/XRa+nVY09fUMnKb2Kp+trJxvr2tvT6XjSyzq5LGjZ1anFZdmvX9WqL65XFuc+MknMbrxHutfW9r9vF9tfz8pKyI1CEf7TjGR06D4QZ27r5jadG1up+IkEd/hIbHw+La9mfJCKooQHPygsH1k/HyDkCYI8HnZGHqo9vq0dGfCKaYQQDo+fUCtg9Os9peAzMwXzaq/b1+Pp5/3z2efMmkLKq4emKQozTyn47gNRSV69fB6tUCx5B6EB2/JbRcFfnaVdlv0hEw9kKMau9P0HYuJpuzkeDtvNZbmsWtP6YUp8Ecq5CcQwjOd9W50myovmopFMsFE3TmiNeGo+f+TdxiXPDztq/YrMUagKLXamQaim24+89AnUdZRDtZlGYe4De3FdNB9HRuFPR6m1oAdQv/r5snxNlh7k0hAJqMV2rUuft4en9Cv30zBHR+UHdtJ5e/q+PaWvxiChEcCk+fYjD+Kmbb/cPLvO66/vLtr6dWxH+UzQockYKeWvck0s8frO9kUvukYXvKJv19FocNOGtw4NfrzuDpdpOZ0WpXcvLccCLTEs2GJc046V7+5p2XyLn3pv0hhADw3sRHNF9TAKTlyh2TYS/+jYw7UbB6dl9eeOt7kNl+8b+8s7Lbu99tH0pm8iJl6d6vIba4cdHjuK2baM6OvriSVHMBmXraw0AHG2M6rB0i3GZfE8yoRPCJRkqmK0tQN5850rKWNt056Y2H9+eM6p2NfHU+Pd5S//rBx6/GQSn4bO7nOsSyXW8K0z+yjCTYDjATS0Cu68tyvtU4cBN1ovVJWn8m3Z1935rNb1gymc8O421yYlrRMpt/MYP83Z9p3jeXf/AY+HAr3JpF6YVksx8wE/IVxBRVIOkYFX5shVDIITWvC7BjrUJiPUE/+KMYTQJptK4yipc0NNGyq2lALa/dv4D/WaOfM1Ay6gZ5I72c25cIE//nG8nlTYcL3pnDIKump5ayYW5r3pR53KY0NGCiAC6vSneBLAsIEQyAl5vqciz5k9/pXnAzv9mDGJSW5mAioQ1p6zGTWvMR7e9238dXjTya0XevOlr+P7VtVfs+kqTPxJ0eThtF1UL8e0ZPElQ6B1HZUxDpN1b5MY+hUi+1Z7r9mRtrfnB6fd169qUjKa7wUVL9vswAIbnBpsGKEOmnxcuB3lg9Pb51WyyQurqvTaFL6pXvRV5bvWCT2ySu4Ke2T3+qqzUXNmBboaAGNke1GGV6AMsox57buQv6/rVm0Pc472OBDBBQGwK0xNQ4BpA1IEo3hM4nvC90Bbefx5RsIkR2CAVqHrAKuCiLpDbHfTzJ8QIBsmbYD7CIQ5zsZ3IDGAkuBMZsDJSgeko+2gJWZ8KYeNsqVyjay44AoTnEgqCqz7mrHruzPTLLoZkAWGRKVAHn9cJg5ejYnfpn0QvlZqXrnS+6mMu83KTurgELEAzM5UmL6efh62/7xsD0+3WUJ8PenFDHQk9n94eLBx5U0AZuPgteqgnudmujQ3tZXzz9P21h6JDyDB7fhEtb++theKVc/7ozoknRzDdX3aJVv/r/3NXZTFq3mwBTROdpXrQR0jk02gL1iFX64HXXMPvdV3mIRop532Xg+H7V5X8n6yg/0jm84u9iMCrXej6TsTMnKgDnCzAnibEc4TSl+JvlekU1oS8/txjHN8P5s5flCAzK7z8y3axHKyhnIKslFzQOvMYIGOuG+HKcQAkNCQaTgKHRB6lCHxpneAAOQSZApQmdQ0xfuLVsVUiPQ/31TiaAVKzHj1ORqyZ7p8ULwEOYPoEvHwwvBMWCkC29fzyCpEyPX2/9hvvy6bOBz3drYETF7b2PXDbd3TEkGYJlPrjwX2A/dmrRnzJu3sC1tiTJ8fASiUqi0Ai9arbk67t/j4mG3vRwfo3lSwlPz5psPWZKuRNGJ7mtX09SmG4/hONuvHTB9XNsHoIlC2/O0ZWTJ6yznlWwLUZgCQC33E69Pb//5jp+RL7Dan3Uy6Pr2tLq+7TRzZfC8hbv1QN9hbm+huUFpHZtnjhF+2eTSsS7Y+6pR6a0e3wk0GpwKmDIQCTHCaLOhjrhceuhgAZmdfNGzxSHKEdZcQz4UEiF1AXuPUoTVP6hQxll3usMIv4m9lsF9MHIUFJ93rOqI6HH/st09qsObn1npIJeXg62H5vuz2+kZXn0XrpEATfIZG4cxuLATju8JLdPhyvB706LQ1zcrBoZoo44R8XuLtebpAoQwgiNmejVwPm5floB9ob1P4fnmEtn7q553KLTszd+MngtAayN5hQw/CtzLVpcQpInSYBacmx58RbN4MoyVDiaaiQoGcvX7yqFPU9bY/8YxPhISSJTP1y9iVEL0IM/273cH+pz7Y3GDudL7kdoZ/PTztNvGB0BbMg7OdL9X3ti/z9+WrHsd0717MXs5yXY8QwNkC7OFBkl/6hueJ3yU32I6WJcbdR7Hw18PueafiytTamFowzhp2vWwRhXX14ylu3E2Tec42YJg16DmMAN8XhL6vh91/qb7Z5MwJXl36pZjzq6ysFNloGbxymZhUzQvhgfoZ/w3yANJaNRwxJb2L9fOqmtGEVgvdgNw6ET6+N78GROpwm48PKK3iWPgVvvv1fI/GlREQzjlUWI/hnT4yQLAV5FcGVITMMakuSwa118N+e47F7E2xPbDOeahMjHZOdTKNq+2+KUdcs+GuubbWgq+7ZIpiZu6TIFYV3qnjl7WHlSRPnbeONvZsnd3iuR5O2+UpWXW2AStV86h12RvoUSelk63TImyWSwfreXnefj4+P+vSaHDmwKuYN583y15nhyJd+DRgXugySHRpoSnYysx1aJaF5o1gpQ2lD7qNo+jQW9G/qpl3PZx3Xw/6vBrtE0WMLgp1D9lsH66ADufjfs0M1D05U+WuJ5nY7rxdD+e37SY5mmeTM9NCnq2YTJ+vu0taupjbuWcUsiWp1lXf1qRIPQKz+iVfFY0x9PUw1AiEwPwVL7uo8mzNp03XbhzYTkOp4GUNN2l8R/AHFnazwnAU/Shp2QnMBEB3Qh0frHbCsmlFR1M1GpRVTRJpXJR/XNdz8qX3rYn6AEO/xxDZF77+WIrMhDey0UHMTdiyGFhiThmef+ieC4GOgCwPD5CN9Zwaxjs6FmM6vJT6FBxoZoaXGT6/gNgLnjmB7xktToS9DKP2PQastxOCt6+n5Sn6ykdTRRzFcgeZGOjOhA0Lx+0x3MgY7gNyKtLfmA7GdLdHkT2JSRsOGQqk0qsQnUi+tYLUn3Hsyznn5VzjBGKKrlgTCiZX2O63BxvPU1sTHjekns5CLOFB089fZ39c1ChisPo9QgsZM3sFllWTcPuMeHuL2w6SmGdsm/DNZtc7xbgjiR6lb3eoWRGJg3pAH9KRPkQCyh2Fj9MDbQApDgd/MYfZmRsZfGEqMlMYgmIH4NT1nB5RsdRl6ntsLKo7FUotBY0xk19ZJ/7O6jB/U8kR0bSmbr3wNy6sGMtDezNLIy6SkKbwriTiXbAQCgcyhbDCZxdSS4xHKCqF0Q6OagHtg71OTmoIO140B8V8hfV9WfKHQj85eZ+MqM8vCPjkZHu4cz4uwsO9ltPq/LiQTk4+J0Wtu0bFSiXEQcmLj8tlZEQySu+HSm8bb2XNkFxBqBrDdzCGfIPqEqIxT6gp3nb6jIt9VhSLyKGR0R4UDr48PTt8F+L0JPYAUz7AXrOOrELshINYohAxSeSAYbKR9OvTTjjiwyyZvVQF9HVMqOt5+6wGVoPZJCyW22fFFmhmu8mFjKMgK7EuePvzaLDp5GCTkAAUIr4ZUrrTuze+rvhHVsOyNbHUxcb4WX1J5gwQJtN9iAd8CSCl6Hr6WmWx1QyYv6NxKt2YqGuE8CK2dF2IOK86L7FSfCN1XkRWUrtpNUjVhAvj+Ur6Q4P/x7rUJSl3/sAqHzVC2614hACU887RIMgRDFEM2yqoZ5/V5TlqljTWWwlaBWIgFe1gwZ5t4aP160bBfEJAQ3BNmu/G/U777eHrJTZdcpHSDVTP2qZSBeiaKJKvgKJ3KEjZha67+MibI+qOwy6j3TvI1m2TodBLcyfxN9RxslGK6738/W05KYMCG2LBS4ULWMtmxa8lthcqSVPlSfPdxV+o6S3sPPoUgr+WHQ7lVB3xLv4mPWnzMX13f3z3cdFiz3WycUPHiOxV1CWc+d3Wz89yApRz5hEl4pBR1vqhSup7q56UTSz+5Se17ONXc4pEfshlwxg+QreE6BcyMc7ZGqSWI8okyOa4UcAv0b1ELBfptj39v925hr37zr2XesRUVurW2UlVuJJCvptmXJjvAbE78uUkJxBZM3G6tFvMIHZbioFbt5gALBqry9+xb5broP2p7ZQhk5rDqE507cpiuZm0osskGNn3tCDdmk0m8jKKmWqw8O4u+xhHMJmTBUwN0myiDTQscAswM6CFcahfAEKiwPj/Pd5raP1+2IRNwLvZjceMxWN7w9VUzE4yWZijTgCMc9yEqwl3YFB+6Q4sFJ+zOs+/u63DCevvbuvwNfrdDR6+gn9Zq+d3m/FxUFBty4eWyC/Y8rFBiTbJX2XLlyc4/M4WWAQ+nokPDnu8bVo7W1yD6B+vy+mbFgU1VRWqjFBv68YMYddI+DcbulNlrXRbUiHvbHyax+zPc0LH/LkvP5G4TSITNjREYJ0whcNl5quFBgWluHu2KppMpoeOAAHeCY0Qcqypf8NKcQw/9YzRbJADPYvnwrY4Y+o05PoNJfqOiAkZ/XGR/QlyD/YvHtM4oa60YVr3byZpNc7SeYZo/bFSLe/7ctq8LGrzN1HtTFAg1JNDl0HspAxqIk03uIYAUuTOSHEu8RyZGLGTuFDe07fP+MeX3WGJyZ+zaQTadtwoZkfx+3La6VmU6fWHp9LoHS6fRZPuz5m6wTa28HYrMX54sKfoaN/TB6qnkart1rReJb7IbKLAfPzh7OXi7WzOKnJ7O11xe3rabeLA23dWyQYHFoGyE7vcxts9LqP4PaYIkIP1jAMH0Q14QuCxOxpsDrBBgT6Cw5HrBps2lnNpcuaeLLTgV6lOXWd5KScIvXkYlwwhyA9haj2FCDhx4vnYe5RRR3tuPdHCT0hNPNIzDKk85qfrXCT8BBSW/IbRGxARneraA/JW6prkhlLidLI38/15fX7dnV+Xy0bZ00c4Xw9OzZwZjBQWV71Sk1UjexF21/T7Ljbfagv9H3usovXiW5NN7VCUQPcCWQGev0jgENnDD+gGhbeJTaAO7xCboIMoyCBYN/Mn9p4I70IgFpukQvD+nVZSMmox0ckA/7HTRezeWAilu/NOoyK8GUuFs1dAJKDkwmy3NPVcLxeHv8mMsvhKw8PPLfhjiUkMrYCafPJzJpsRgEmUSuHWAVNnzyEkW+wnoHsQso6MjIgj1o5YSqIORdWeguBFlciKkI4lGYZTTgBksm3N12cW1y19b+4r9qOADhWuVebbvV7j+XiyqImDVIT34XEAnTpjiALCletZQInWBDj3ObYwLO7oQzawc9Imz2wYivvs+Xh66GfHkgGyMQ1cDpCAAi6LFJ5oMimGhFns+/exRoan07I7xNFBmoQjE+4qldnXpfUoVhogcvbXT5nJF1TI8NRhUTaGKI3eMvs94GoKzTF+N+QlY+Ir8KTsKhSYnI+Pddd11ursknDeNXUC1Y8FU9ForTYshbdBV0VLBKhR31YK3a4Xjo8DU7tBgMIxKEdijeYSu0zq/UNoAzqcslCeG0vAxEE4peGKgI7zpxQ6nnubGe4EYBytq4chWv4RxVjMeTbHLmCjl5jnP5b9t5iXaxJuUIN2dpK9LqeQNTaNwnm0u+bSAajYn0P7KwSbH4siMbbm3Fk4ZOL7EhZrZjbzY1HOJtIFVjFlaLlOVKRdVq0ra/Wbzh5JF5LSH4tmCBqL4HVAAwksd5qfwSULuD52Qu4/tCEyQl5rYA6BUo4dKWJcMIFxHal8SFcF3JNZBxNXpKvSTxJFIvAhdJaE+aib2NGneJkgLiNdAMaFKgbCdw2MEDpvTWT42t2sH8t5s98u8UZqpcsG6mPvKu2dfiyX7Wlt5kYpka2WTe9FYHhD8j3rTEZ46gYBTmpXhylscioyTQE2MQhPx/EUyT6OWBFPpc1nGmMpxOnROMd4ymMoFdm+Fb6WxyNU2qUmsB4CSo+dml9UCYCb3DC+NAMFSWkFabPtfsSIxMFEcBdj5/bL+bj5FvMAxeEvpW1ziR8x0DqCoHJFmIBXM9rcILRwpopRapiXcqYK9kv4p9R+mcPVUAwVrJXDPQ8hHKWDU25IOS/FlBTTygZTyMbzX5PyMqLgEL+WoeWEj+Y85chyjrvIO0WUE/D/IiAhS+kpTupwKuTIPWJ6x5ldhvAjZnaYH+RIQHIqR3oH527oh6OzNAKEPlKBFwx2uh5KUlGHnxKikcfMo20Kb3p4g56XzeV40jZqoqTHB+J+zZmS8gG0lbl1uAPlqWG3yiA+QeaFH52dSW73Cpk9/Up39cf2FHNObAu7jGTKbNPpfrwsuv1t0idhSEyIA2GP1P7LmFV7giI54AU8sqT4t97f9rsWsTfzs5KI/brUj6/qe7YFQZDblr7dl9jMsaD3QhUIxP2ECoRjmHy9cACEu8EWB7qmDx0a6saHSImMoQ9vt6Bzhb8K3yDHpCgHw5fGKJ9SJDudzQhXehwJ4LqGswESguHm2UwTBvH4SaiKITmmpgVDP1JYMvg8jLK7lnUrD4YMK6pjEk16MwZtAoSDn1ARE3ojBgipOFZeVJ2G6b9Zlimr4w/TWgo1MjdsYHIsBtV8m7EyD70co9X3aV4p7ax5TJJcjAOTvFjaXqCikkcnwCs5Qrk4Osm3whGLw6yDWwEtNXNkdCQS8rBFQSQassIgWaHzlLQ9ogzEy6Q2Idq6okjCCBvz8qbQ9H3ZHnT8XGFSf0o/5MeLOo5GE1qCklecCty1GQhsQSXWuBVt0dua9AjAr5xHiEOvMsQfRAShpCx8NVhM/yUz2tvbFfYEh8sDBT1sMdMfL7t4jjiaOjGIj3TC4KHOAEhie9EPQuoE8EXHNhYutUyZbIGzHy87Lelgyk2S0hK+WMRu0sqwi8LrgsFgaICivApFL8srTIRw3nI0FNCjsNQQgg0U/AoRnDqYcj+hzu9ZmKRNnFzDRk4f0VVlAYOGTbGAIfHMu4y9EL86IeeAWImjvthLfTlq+rWZAou2CbclsoCWT9Inz5Ri7g1tRaiewBMhB4UU8T18cqGoANsQehgn5u/GJz+rMPmecEyIlrMAqKF4xm4gAGigKhM/Yc9vr0s+IXPyEX87FRpvu1hrY+3H/wLjal3mHDesG5s2j1qiWBnsnmJ+WcHkIrz4CZQqp8DNdy0Dr/Kc5BT0xX/sVNXXFSzmxKvIVJBpH9tE+FcmmTDC4+ARonhuRrcah5pv2GTKJIX8mLSMpQ3oZHvg/YhHkn6yDd8ouFzguPzYKcu0xhxVoxCiWsskNEK42wt7/KSQECZ5GnGHHSh8KeEphR5ZOOsG8QazjpmxEtdk9ZLCHuWZkY7kMwe1cApxyEZFzY38nwbwGPUWM8pd/NrZZBo8LQCxCJPHTQLqwJsN71d4W0E6AcVkwA84r0MXFLVvqLWgANyH04o8KJpi8ftEe4fIYDRSiH/0wAJS/FKwk/m14Utlv1FKcfARESWC38O99JibZyc3RCmTK0JeSJ8ckW4acnnd72GI4C+yXBFc7R0G6Mf5IyyZc0wSrPcOhfLj7BKskuWZEAxWoGT+EveE7PMcC4XrZZoAwsIPfyFKf+CQcDVBCRSebZmynLwVZv8i4UI6JgwtctS2j/M9KJeSYX5g5M8SXHaqkR44/qTQzbdyG025sHJJdnYNky/HfWw0a8IS6gZjjyUVmsU0p5M5YQFJsLu8KECRTRRBROIAvOvYtsL7YWuh346eQuJ0eTlela2m2YtnjMOrgneBxP3wA6q+8I2GLZVproaoTRJJeFOIkUnmuKDVEj4DBBTCu6AH4uSHlooYXgmUjRjvc4yFQ4LdSgRSIdCIMCZJhpgeIxxne5nEOBDTKvId9rHx/9Dl5/BfYHoyU2YyjCXiB6My6JVJWliatyD55dip5NyxbrKb2/kmpQbbb1MdTk9pzzhbhyf0DCg8TpHHPsn/fMvuIeUUp+KNKDtUk4pew71Y19OG6EJKAp8i3KcC9hQ/pKx22Mbm6delj4Dxvu5hXONA7LrGmnKJbD3zpqJ6zvcuhawOplyFCva0uyhppOm9wZZBLGO5VirS1uv98T12VBlNew/f0sEjBAXft/ZrtS7/eXs6HZWIlFRGdA4pEYsA2Mn6OeMxYF7ry7L5Fj8+08VceFl2OBo6m51xX3/3NeNAI5gZbMhk8B2lZXPONgIZjTKxxUlZs67m+nnxxn9CgdhCLqFizef9cVHmP17AcT7heGnRBqtdVX9+gclFxt1OaTAxV02djyQpALl7C92iujXVp/cSGt1gzTpWblhzUttWLIkSMgO2Npf8rx9vN6uNl+3ypIGms3z7/MzUNUXOl9ZPuXzezZHhOak4H3mJ1d1Kt0utxfk3KEeqkB2ytvAHmOZRzqMhGol7dpiTC0xwHhECIKxHgKuZCmn67WMpn0JXsIvo8eCcfYTdFtWSL9aJTn3nyVbPvi2p7tJ0cuDXK9oS7zUPcGL9JqGJTPPgNwlN5NoDv0doItcA+HixX1fii8k2C+ffLaOQFtMlG4HbJrvptl2W19j3rx8kb2XmizexZfGBUJ1xvvPSmRZJLmgElYvqA6CTaS8W/UA0vaYngEgqsGPa6QNhdJXcU/RisSTyiekD+cS/tqejig9SPQ5w6Ie4fdWiCVzfDjh5iAxeJ9Er5ISErydfY76KTJv5KvJ1YkeKRWduLlLc6pcYD7ZykG2GXWZ2wzkNXVFtc86YJeqmxrwYobU5r8wCgjIGhBKtUpimnP9+3h6e/p+n5bKo27ONqzhs9XZv6PzHj9h4aAXw/Kq8Gr7u8PBLemb6ur1daOSeb9Vzi8yl3GyK0wtItETDJTImArRbRbH4qQxtusY2YSRDBTCxgY2XihbMz+M1/iJb+4HWGGyusSr+hiwqcwhaSN0xgSGe5/EDnWYTSjkmybCiC+Mmqph0+CH8TnhubXj1gQXvQhDLMZCDfF/IAoYQBSltFv4cJB5iUkIOhOkPHK2wLaZQcM7hDgVRE2kwTZ4FfpK8P5qLkMVCQy5MKgVqhdN1x58g00iZF8qdcDJPBgw6MpSDmZDLQJdYoFscmkdShIs9HGIRgZ7AXwhZLGIrJjYUIJCFwUoPXEovnMSAqsEwHC+VYN4UfJkzh/NkuhqUSHT/Oh7U8Fvaa/XwFiVkgg8SN9ryEQjOQJprZNYDklgsJzxR9MLWR1CCvqOAGH2aAVPKyYZmVzxfYl/WKdYHxqw/a5EYvnEhm/DYtxPoWqL5j0zG46WjOR/naC02HJRU2AJvG+pfGM7k//m3T2+7t+1+d9h++l//33/+n//z/wPGzNro"; \ No newline at end of file +window.searchData = "eJzMvVlz5DiW7/lVrqVeu+Z2KjJz8vbTeGiJ1JSkUGqJ7Mq2azLICXexg04wQbqWvDbffQwE6c4FoANncflLV1eU8PffAbEeHBz8nx+0ei1/+I//+j8/fE/z5If/OP63H3Kxkj/8xw//z19rWVbJ0/98Mn8i9T/mWSrz6od/+2Gtsx/+44eVStaZLP/nY/N3j/2/+7+eq1X2w7/9MM9EWcryh//44Yf/79/aX/nx+NfN7/z+WnwW1fz5XqlLoZfyTGulN7/SFPf+irO047f/7YdCaIPvN2yL9/OP22qYq7ys9HpekUAd9eWiAN2y3Vr99+OfNtxP5i/v0r/l5/dKlhTotWKZ/i2fGkVG+pV4+0xuwEq8cdswaNdpnnwT2ToSf1PqENpxHwbdfrc1ssU8/uX4x59+6pCuO8MMiNEKENH9+0/bj6plKVFsrQADWymrz0plUuQYwFJWTxsVJsr3SmIRrQQP38mzQPWRUlZzK8HDdyrQ9ZcIxvo7lfN0JbIfj3/FUnaFWFmPf/6FhtUKsbL+8hMNaq3DRKrWTxm6jbYiPIznmRKoobyU1aLR4CH8ItWzKJ+RjMuNCg/lBW6yLmWVcs3WpawuVb5E4mVWgo8PP/hkGxUeyut1liERcyvBx0c26xjSPcw8HWZ8A+gwc7cDqlmog8w4ExlimnHU8HKPpXfPSmNH07LR4CG8T1eyrMSquErnWmH2tYa1atVWrRoz9bXI6aDzRoyH+WGdJkjStZXg4fsm9By/UXrZqDBQVuohzatfZ1qLdwxnpdZGRzQ6NKRDX5EtdSfLMlX5Z6WqstKiiPeGTugcgj9pFx7awzRVjx5v41ysy7jdym4rGsktf1Um/0jLf6T5s9RpJRNOezJVyhOVUNtkZOdW9kPsqv+J1KRG8UOs0bIsVF7KzyqJG512WtUqP1nlvfQhLSv9LmJ3/QGmbGU/5CuVUr9IfauoDbO6Wn20ZX+qnMWyv63ux1hWiWpd0g+AVvcjR0BLcCXLUixZjFttpD/EPrO2Vuvq5llQT8iNctEof4x1+v1avlVneVKoNNJttttA/Z7Lt0puxT/ERmMRqV1WcF+2DM4i0/JeFSpTy3QuMjMJ3Mr/lnPiL5eW1fZHzIyg2x/5OKu1yEsjwmhz+xMfYvFw9/VeyVspEhm3mdmUOoSdVR8GvY/a1ogvwiQ6LmNACI/BcLEN2nChyrRKVdxZ+ACwo8HCqOVKpHkaeUIxgOyKEFF2fSjyrZBzM2VhGK2IzGHeqJ2MWorkc7q8yKtIr/SoKkXylC7TRoeP9CElQl1zs2L7eM1J28+HjPVB7qdjLOViI8PJif/qi40ME+dFXv0Ydx7loEwbET5G/BdPc9bvfZFXcUeRbkTYCWQQ4UNK8anXzN/6IaX42Gvmr/2QEnzuNfP3rhZ4RKtBtJ4cr8L/MIv96IWvLXUgq/AODMUqvKkR7yoyk/myijvdHkBuFIj4uu2uMPHSsIGmi1jL4EaaQM74ocbJCR9rAjmje7ITE9yXpynBJ68DTvTJ607SV/O/QjcPXdRaCLt7CGOFbR9csLj9QwgtZAMxJsXsIAIogVuIESdyDxFKSvDtkbuIAFLQNmLEyTjit5QE351xvG8pUcN9C8k02tfy+Dm+luGc4zecBJ+cc47fcOI/OuMcbykBW4oxJGJPEcD4p9SKYBL6u5Wh4RzsfU7sZiQC0pY4gD1PBwS73zkZ4g32OitZ6XQe9S27dNviBGTddvaktFavv6+ljlrudtmsxF+NBAvfncwjT7jGgGWrQUxYB5eBW11TmJpJ5XnkyeegL+TDU00ol3O0ODFmJ9EhoqPCBzOGDJlohpNuNXlr9HStTZjZbP79IRcvIs3Mf4uuWr/KAdTxDjhsZU/UIFXc7U4LqKJuAbZAYm532kMZcRtvU2y87S5zqKJt4y0BRafuMoc0NjXeJlhk6i6jaONSoVbFRqWGWUUVkwqwChSRutMq0nhUqFWAaNQwwwhjUeNtg0ai7jKNOg4VYBk8CnWncfQxqPH2RUag7rKJKP40yA766NNd1jHGngItxkWeBtjLE3ca1k77e46zpZZlGe016BQ7gF3FkAa7jehWim+trVZFJmOjOx2gHRkOTi3r4hdRi+gRZqMCu8rrphzFoVaplljKVoOHcV3K8lsqX6N8fyNKo/LSqFBxdj1G/yXK93x+UUktKqX/N4q1lkobKSZeoVf3dkGCQ9WraiPDwvkq0uqEptvXWhx9v+87FPlcRi1ExuNTK8HBtxApjq4RYGFL8zQuX8eYrpXg44t2DnogZaPDQbrUIq9OtExSXAevdeatDgdpWp5G7vlHkGmZDDf4dHyZqGSd+5OgNo1WnYmUtUaLdfl8K2vPB25qN0J6K8TNamZ5Mt4XK8bBrGUmRSmvRCV1KrL0b5nUDQS5jKpFVx3Rp0aU0QZT5WTspsp5metPS13vtej+6r3+Oap6r8X2Ue/VudK3ssjiojqdxNVCad1K8fCaHQnBpoaJzyxDz5U2beBUixS3qDViC6VNG0gaMaodrddnMXsSuZlx40+gvSKH5c9wsBF6NwbVx+RDcNlA5VHwW+BtMyf1nqbZc2LazVjosNqOh4+w/TiqkqkN+WyhakfhljRehiuoF8hnSaO7wvqFpi3x9gpMRzjAts/S3FlbOEOjDjg5xcNudEhJve2UYNw+3BGbc6zexyjNNz7vY2TmG5NjRmO7t7mVf63NYQawnTtEDqal+9ho2rqr+uhbu9cGgva+wwJXm2lSDcXb0RQ8mLbR5aFpD23VeNuAiEt96eBsNcgIh68R1cHD2MpsRbgon0WelM/iO8Dd0QPt6nCxAu5wOEgRVzkCOXO5VFUqKpmYg0dN0cuPtprznia/DX+WVXIpXyBHkh4L/i6rJGsUufht3OZFvlBIbCuUWiE62t4ZtfWGIEG3KjyU0HPp/niGPJnexRh7F8g35LIRyrcC5FvuIW5EeBhRZ789UJLT3x20hZZG61zpG6WyW3uUhORuNBdKF0pleqPJY0F7dQ9DDL7+F04IDKIaYyLjqHaw2shM2FnwYIFohHDnwDtYy+d1lajX/Fzpzo0z7IzViC6Utn/HO6IB7jq6dw3QK4/eHcPEngt4AdKncWg7MerrkN66m7rThlp8jS0w/0CyDAu61Xku0ky9SB3dRHoFD6BdjHmwjaFfNZ4WIKpKrooqar5woHZkeDijb5K66nN0eRRL2G+LF3ndfGfz7/CDc5/GAbTQSTRsY/XWnac9LLRanZdRe7FpfiO4KEHbslj2yrwsXt0ZX2Y+j2rU0yZY3XKry2+JIv0GlWL8Ar6+Cj3yciscVD8lP/Dy1Jpvbpl/z9VrJpOlTHCtfWxIV5umxQedgRH0XMc5GGG/ZTvJmzQAc5C3m93Zc6/F/Du0z27KHk5v7SMR9dNtHXnPZ+w7YnjgjhIbrc1MRPPRj6wY+GrGFLOzvQIOEfslD6etUh4jDmrHe07QHe/PtVhJxCDcd8d3hBdGmGAcZjhzdFY9+NAxlBN06uhCRR07htKuxFsda3+X/h2fltZFvRJvdbx9mf4Nz1AbTB9/aupkhh+bhpIW66fMXGuj7YgbVcZeiDqD8nZBPsZCZdk27wC6hlWWJVZN1Gpc1PZL1q2DqFUsGi1e4ntTNege2IhVrdg+mE9lVglS8KRRZKLXcpmWldS1k/c3pdCNuxWse+SzFWRiN0tHksZthJhb9ob1j7R6vjEfeC5iL9hPor+m1XPR02W0hKaDGiXu3rmlJemaW2TmfjngZmg1HTM+oO2wGbQ3W5pbhbPOvgVrRXO3UPQlefmbZQ0RerJR41otxp+ee3bL0ONzL+ekvwF4gO4VOTgvBPURur/6KM/Qd9mAOUQPsqDfZq7kSul3Gxo/KwozWgJPRaaVDqD1BABim9CO2vS0I+O9iHVahBhjnBhQ3wXMEt1crmAxpxXfs02gM5MQe1BnJzBb1iXTtzHCe/gu/rGrdv/dK3VpTtRQY9dY6cDGLg8g5djlqE1vNIZYyRO1jks2G2JOrTxvlPdkDXYk9tlCNRKHW0IyEvvMIR2Jp23y9/jat0HS48dKB9bjPYCUPd5Rm0x9xGcMVR8Jt6QQ75kCPIQeYk2jvWeLSHq9zyTSXj9tU7/Xm1sjs3n949DNiUfiAPr5FBm2g/sqzh8TotY67jxvEr8jyM0OWqVPwqOW5wH04zZ+21QXqHX3Ch9Iux4zUbTofjVRRY37eKGR48Gk0F7ngMX2Ny/voK1qVam5yuLbabfgIbTREQ+6ffaqxluDdfKSy9hrkNtSB1B3AxhsxXVqhCqjxJAQnE7CyUYRLzUkRMVKhVCi8x4MicmSHsTRgzIe+NlR6Q5CyGG5DobAuEQHbk5UXNRoDIDGRO1mi76BPWQDX78OZIu+e+0EBF+8do+f/VnnVjaHkGdvz2JdVoDTQY/EAcxHU2TYyclXcYQ3KyfxMXcsI9mj183T9Q5dPQdQD9u28SqcpnMTgiEAaTedAgfRrn1c+FbtqjK6duHnhreKHcTTbeJG6tJECuaALfYurQNsKU5E6kYzqlOu9uOxhupV4Bi7XK3MPmcHmlFHxQ+mLY2paJpPv7KmThYhVwy87OjrBRH08VmAvdjwRMA7eIftuFxnVfSTFZ1iB9Fu+zT49rqtFM+Xru8JwdrpgNXeOEK1z520c5WtV3lkwxzVaavBQQjKHjtiROWLDaFUr9FRD2NI9QoOcAhgrMOTryNvK4wga5UceFXBTdnPZSdxlWjLc5CZMtjvS9lLvOP1qTQPhUMHyqb0YY3eXSjCQbytqYnYBvNnt/Av3wNfNddICRrCmHyQobRU+mm7fqWgt5pJV5PTgqLI3k/E/Fma1+KgY0LfACM5N5K6kWTkT+r/mQJ7o8ROG5uDcZoYmogxnLrzph0FdudVO27uUla1i/Zu/ixXUZfC/PClrGqncdlqEo+M3vkGUf+m6GHNNBsiwmmmriDvaRDFjmFLTblrmOa2637Msrdb10aLYvUbwgydzIe82El8mhW789nSUu1+dvDi9kAdXJp90DQtdje0xaXaEU3zvogsxbeEVoWSs3870vQLou7FyLlQ+kzUC3s060JpKeo1PSMvfFe8BcXvjKcIM/Gu1njIjQwXZ+fdXzRsX4uLWMdnyPfMAuCs+MGk8J1alxO/OZukJOj05L3dubo+qYdB2PJ6W/Zg1tcDJJoFdqeOJn3cF3ki3yiYzX9PGzFK5uGuwFyruJH6m8jWgL4/5K7lCqlfGjlG8hy0qBoC4xZUQZwqv15nGXDNOuJVeb7OMuTCNYS70HKemsDKz2lsUJELfCP3lEJDikLJ4TuEITR+ixDCW85FXGISN2wrw0n6vnpS2dbfewda3ozAa9Wtx7dELXRC7KjeCwLuRoWUE70aH0KiluNBjDOtTQzLSuZ1/g+anreUlTC6SavL0g9dlpCsgzb8OC9vEPXn1HQaMuynWm4f3EplUgB28S7ojRYr8XtFMGwYXCvEyXryLAjWzktZza0QJ+upnKcrkT3k9RQGcD85sBOrud5qslqg1pHJxfzgrRQn73mmBM0ovWiUOGm/SPUsymeahehSVkurx7ESHZBfEM2FKfvcd6nyJQlqZoW4WY9//uUPpWnGiszqvVo9TvK7Z6VpWkTZKLHSVjolahVlK8XKW28kaHhbKX7ec6Uhh29e6IXSmMOXCHJSbHbmh2rxK9kqeV0tft3DGvlhnSa/pUtAbLSLeZ0mz1aMm/kS4vz2IGcYJ/hu4rQ07jk8bVrmVoeNtPEkErmYG08ii4/ZR03T/brk3H3Q/NDntFqJIjq7kQd+nWVPtSA4o1Eou51zibitGD9zM7HQtJR2ZuFuJfVxR0lU01aMo6adp3+36hVW2U3Bgzn36/LQHPq1VTMdU4ckbTW4GLV6Bc4YPUytXpFThYMU7e3uIaJc3bvpSPzcQ2BSJ3egDfjuTuTe3s2L8W0PgSkc2wHEUK/2CBfr0g5gBfmzR6AoZ/ZuSpgne0iJc2PvpkT7sIfAZA7sAHag93qEjHRd7yYF+q2HoEin9W5OlMd6SEvirt7NDPJVD1lRjurdjDAv9RAS56IOowT7p12waOf0bmagZ3pIi3RLB3ACfdIjUKRDOoAU6I0ekSJd0aGkEG+umxXjyt1NC/fjDmnxTtwAWrAHd0SLdt+G0YJ8ty5YlON2ByvUa9vjxLpsdzCqBZKvFiBjG3p/VCav0nJl3A/x+YOGhQ/BC+RkQnuCRtVElmvKw0uWXCqY3CTQPIm9Ru6hN1qji+TcFtT/hIdvZPbHrWWl32OfJfTAd7X2Z4HNDmv+nMAEK6bVh9jwp8rpbPjbiu3RhjpdF1EntmJ778X2Z69kWYolnRmrjd7+LKnM+yJxuym3CRshvnmreXHi5jn28p+H2MoVz8M7gOx1rt+v5Vt1lieFSiNdGR5T9Hsu3yq5VdyfNYYdb4FVYaUenDal5b0qVKaW6VxkppzNA0hgS1pWW2UzR+hWec/2aZGXpiS1da3u/mwb7AjuZJ4A3+8dFD2A3YCLCLsXGFYQ1U7AzUq1Dwilhrwr7CbHvCY8QTturXHZ52yJA2mbRFnmmlrwjlfdN9YhyX+6qF0tTOqfXcwrWel0HnVw0sXcFicnK9ZPWVo+46tyI0Rbj73MduZ8/iQ6UUrvgxsJeJKUHXxR02YPC7Qg3kVzHef27APlMFfnNJMNWMB9QqvB9Q2bGAUkohVhY3yvJBLwvZJcdHORz2UWmSCoN3/UAsBEITvYnoXG1ZxRYKu52HeDemDQN4N2MKnVKgWPa5vS5FT1oyaIFUo+3IyQcCUC2zONAlf7auJvfjz+Fcm40WEmPf75FxLS459/YSb95ScS0F9+YuYkodwL4718A/fvHmdlhahZ68AwZHXWGly1WUeEfTrGITYirIwEhHx86zIqzqFPZgtzMM3y5IussHu2WkrkiQlzYdu1NbF+uK/ciHB95zRH95RagpEPTcfGVrwgJz+jwEXXxBriABsRTsYZ3rdhZFj9G+YH8IhcdIWWRuRcafsEd3Tuz543y4otlC6UyhAJQKeZo/N+dhnB6T6nmep4V9xnriW4vrMNc0UC1hpshNFhsj02cHDsNFUVG5XThapGYTg0TOlKlpVYFbjPuZHh+qIm9hOHaBS46F5FWp0rPescZkAxjdRCadGXouY1Z33g46VNaTyV8/ytPqq7tzEfoFNjh8TBnNC5yWiO7MYV5zmXpTnB85hCe6QXbJMNayK3xsru0w77N1eAs0qfCfZfVojjy0n6cR8G9dpD6qe0PZM+soPiDWon2fhbYgbiAxyBWYbekH79tF4spJbJbGUu5Efn9XCzt6KiFgXn9wi1AdRWHTVOGYbEOqYyDKaBo+ggK3YU+KDsIfQ8FxK65w3ryBtjU0bmFHfjQnOIT3H24kWS5FbO1Yvp0HhakSS6o8ZGbaJLU1mea7XCQzdiCyvGxryU1Vc9SwhqeSkrpUXCWsPxPionKtxbFchZ6XU+F3HpP9yoHSU22jol1oygXmshYPyYn3UwH9wb98/neraPIe4UO4BZYEiDnQC6leKZ+ev/wCA2AkRs+DcdHXWYQd9zDGKEvHwygsQ8euKhHI3nJ1qCgn9GsPWYPq/V4A7DAGpzESgySm/cPOVbBQzUCyCMnnnGHx466YTQqSx7EvPv2DpsdfjqsdzkcrqLfZdnRFtu0jiBH+cJI27yDd20jyxhqZsIgqKjx0KepXMZ++z9mNeoaOBj9555yTGj/xHtiO8UO5QZvUNDMqM3leL18wJevx1xol6+dVNiXmoc8WHGop1k8V1jgAbvFeNv2+8VD3mzaTV/fCuLzKTHbJfH0T7I3WoH0IcCIbFdK6Bmqbx+wRZR+QHjbBu0uGKpRSLj21an3CG0oiEOur1064WsZYwpoccXQXyQLDQORmcCGkLO2FwzY8RRmhlCOlBGmTGiO5kMIScsb8wY1JMyhpw0NjuMj3SUGIaSFJQDxkHqTv9CTgrI9OKDdSV5IeSF5kgZ43rTo1DSwjOhOIAnkqAQMkfmOxlzDlOd4Njos5qMiUMSmlBbgctd4rRhR9oSZBvpr//sjuRWvUavAPslD2AN6ADCrgIHtUO1DnSSQleCgYy1KzfWceCuUqMEdR6E0UJe2HCxYp7YCCMF+WNcqCiXjJf1+Odfur3dPlZhTuw2uGleSb0Q82nibUFsR+/V3uaZjhLHc9QTiq6+TrV4QO0LQkjIjQgN4ODbfm5yW9RXy7sO6zDYYXHS71xvIRMKoqONVHQljirIAyuHqzwMLmaVFwpsrlCWz+J7bKd2E3fV2JDTfKllWZ7KrBLDMICz3AyFNK2l+Z3E/I692JJsfkdufofbTG84G4FpQ6s4zVmJXCxledFYVcdG1zNO7MjotqiRbw2r5WUrz2eU3egSmbAVowSeSNOCHks5URNZ6FTptEr/lqPNM4a8K8w0xA5DLM7qVnk1yKSGMWIpK1mLIvKrRRjQdNtzLVZydFEEaUfTZxdGG3NbJN4c4g/SGLKfL3LT5qxj+SabjHh7+ypF9x0ZDH0BfEgmGNRer26a0Ofem5MobqvbNCLwO5ShZpgpkoS7EeID/Z4WTWWf1IVJ27pRb6rc/ilXWx9suGzZ2bp6PlFtmp8oa0YCpJuuMl3mIqNhOtqIxVfouJp2VelJti4rqb8WFcA14NQgrVixrqKHCy/UUaMGrddBXU1twO9H94DQ8LWu+1IQMJghzizbTTkMs8ofZ9pCpJmJ6XjQGaFZreraqu7XpEKrSs0VpT1dyf0aU24vs1G2OyP7cY2ulKVxon5WyrzmJwpKu2rlp44y74jXPf5E0w+PQvfxLV7l052af5fVuTDHV9FOI781r/KprJUXG2Xyb+Ge2O0eGjWv9yQOZFofM41ndVyT6Vcc4yTvMIVtjg8zSq0KbQcPOot6mtC2H4t/KV8kcEyatiFrhJkNoVhqOQ1hW2kFGYZfaDmMYlpnBRnUbIWv5VJVqTB/Sv/Rmt/It7/xYd9vJd5qB07v0gvWvpV4q703GhjtH2MAclnsoOdYFQeZomWtc7quQ9Fn8+9kJjXKiVUWtfJeTSNY7zvM4lruB5pEsdp3WjWx2N+DYYPHArHmOJ4M3IMR4A2MwwLa/UsQPs32xWHL5O5lD4b93Y1bxxpD9arpDgPcu7G7Qf9H7cs8YuQ7NJlX6VxAApx2cx6NfgA68fuq1rcGlYATqAB7Wt09mWEuZKRzOZvPeykT6OxpfkDMwekUgIYhjlKmDcIeq0QaAp5UJq0A3hQINiFs+LqV5TojanVWi/Y4jqFzdDD5+kZTr5MXjxjMaXX3YwZZx+jaQNsvRgZ4ukWRpZU9ZcdN6CMd4pDg2nNMyna0FQVX+rj2fGHC9VqLln+juS/8O4xnddqK0uFgxa1uw41r3FO0Zm1F+b9OGzjM8Xk28bUf933Moxa0RjWK+zel7D+aTGLMRnMv5rinkYc8XaQyIZhIXEqHM5V46QgmE2cdMkwnfhvQE0q8Cagxa5cl9INWjIGoacVvGn5iARjB9JnYJpcYE+HTi98w4gkmxhzMFOM3iHyS2WGSe5r5o3UTo6aYocqBxIU4sbABn6MaY4wGcRvAFhASbBpJLILHOL5whFDz8BEJbtOYghJCzSKPS3BbGRqawGMk8jDfbRLHeX6oQURH+m7Dpk/1eQwiOMh3G8N1lh9uGMVxvs82svDdUHPAHlm3BbRH4KFG0JyCuy0iDOOdMGewbDsR82d5a9JaD3ONhVk0Kk+6VFtkYhnbp91ER60UusWMaywkDSKKHZoOMRi1EO+ZEsmlzJfRa2MPcyOZtZL7q/c6SfuVKGNnNo8htdzKyvF9gTpd0AngJNFDXeuNTw656/5FaoAXwmPDVozVgOGIWBey43sanUZiUJr4xNns8O8yVRlL9AskasbF17gOykxVuicc39wHdUeY8cIJDk54EQpaP5vx+1rqd5h/zU1dq/5lVF1+NQ4T7iAupwl4h7OJFrushI4eCp1tuxGiBHUNGLC8Fb2yH5+ia4yDyM/Vr5cJzPgsEx5OYJaJIFDTXaHTQQ90K8QD2gzmeNCtEBmos+fcKJXBvMWj8rR+4vlf61SDXa5uuKNGFeXDGtebL5OcWpfyu5QmncaFoX4RGZUhXe200WY2J00y6s9hJPfzLVbi7TJd1D9GBb8Sb1kjyQxfL1bM312JNxr2WtEcwq0EKJ0rAD2Frd4m0FPEyi0A3Y7ApNVuJfdR7x14qorvwNPX/HBuqtMiD96oDKTvFKVd06nVKq0qmXyDpK8dYR1t9OCZbHvV5MsK7HosDsqMfS0uBHjpeysOCk3xWFwIeN5NXA2FhSatDgJcZ9FHaQ7CRoUFsfe6NpQQ+rh2CGD1XuABGxEWQFBy7TEi+aA0GuHbnHAnZo97kS9UNPNIgXi8T+K/tBvpCPpYjauWvI53UQIGSw/wRo0T+VWUJ5kUZNCvopw3esTYg8bbPMAKyf3fLUrrnwZM8COYI/DM3qsS3yF0XsvH+sXGlB0hKtDBF8bkJ+6VJf3GiczSF6llsm2t16pKF80VWzzo0eYX5ptfyAe/EF3j/br0maZVUXAaZvX3YJazJdWnGDA/21iAOiBTnWiZpLEOfw+XichU81YQWKu96vKAP6V5Ajmz9XEbPfBtzzjsG3s8TwhebBSZ0Yla71GrxYib5mmVioy0cTea+2jfdegD+JkLnwG1Ku6Bi3ATKqC72AeP8hVPYjsHbfv6bx24cPYigQPNUIR2j9J7LA2NBX83zVNhvrtNsNcrpsgx71bEwRdavqRqXQKf4JgyopXenzFNzPAFbC5yW9FopojZKBTfPloLcB5M8VvR1IrSG+AeatTavJaBWSH2JUiHGVAKMC+VKwVYXOX2K4sutZQfGfou8g5gZ1togp0wbaEvQdoWnmrHnjnFuYv31XrpjqysOV2Cem+dleedN/O5zE61SMHXZvymWPHEiBMsWAIN2uxrL9OykrkZFJ/U24koxDytYItHp22b38ma30nN78y3v8NqJn5J7zKKaFEfZgIiw6rfghUyw2qMASrvTG5kFqhc16q6UWU1oY4hoO/4tezeuryWTWck4+8qsqJvl230H2G7euP8Es6Ju36+vFAaGI7qFjl8B7KTmNGTPKrm/bmUPaYy+ZYnDHW2v2+pfK39GyDbNqWpo2YKE+QXfTTpgjrqqQFrdVtLLHviATHBZtgF3AvXF68irU5IK7qW5Krt/hWJerVM0jhaJS7UpRZ5hVh7DnhrOeyicyd0Wp5CN8ID3rRMULtgJ+pgHMtNpETyGXLQ0ClKPIIBzpiGMEfwk6VulUzfIEVDYk6R3JjD7/sm56Y5wq47D0p/+GVnFw/dVedhXdFddHZyQ685B2KqQmqbpiQ+gM7JuxGEBtMFgmNuZzvBye9mBxoCXta4jMAtawKB1Ws5WyzkvIoOGXIzq9dSbPW4sMGXyZ3QtFfJA02AXSR38hNeI/fDD2aZ8yY106yq5KqI/QyD0qSzDPDg04WEOvEc1pAPV2sVe//CzdoIEYIOv7mOj76vy3z4KmJLQbd2sLVBulrsYCKWiSFgoKl2jEc3wU5Cg4f7DjHtID+JCxvaO6yEA/oQ1NWlf5MiPndCp+RhdO8Oi6OTx1RXUx9cPagL6u9HdMC43tOl9fQhOlREz+lyuvoPCnLQa77Y226QuwndorQxA2kV221GLEeNSHSt9SrEH9Nl7wZ+piDdqBEjD770byJPymfxXV7JSiSiEpHgo/LEbrO8knlV+4Xic4y42Y4aUbkVja7bca35jo82STrPcvP/xC6YPCZs03PKjSyfEW20gYnV+fxeRV8M9BjRxhuYWJ2nRpbPiDb7rDnLg75f7TFkK418xjrYmL9ei2+gmcRjwV+vBWJKCca2x+q3KvqOmQfb6mkFu20Wif1n/AnIJDY0GnAKezC4X9jEy9atDgsFdElQD/GLVK9kciXe7t5XTyqLdi56GY824ivxVtbiMGejsyK94RELqU/qvAxkdtSa81aTFx96WWSCHnVTJAZ+qXSaZbFrGD/5Vo8a29NTjYsLck1kVJ7W4whw4bmJ4E68cQ35ViuguCkP7laMD1jLslB59BUcD3FHjQ/ZpvE5o2sWVpC/cVRSr9L4h2M91B01RuR0JctKrIro+EYfdSsIC2qcAneParBIxn5h4ryA33P1mslkKZM7cwiZz4G9rxfC15Utt7LQGt4VmUgbhukyiCP8MtK4upmx2VUPOPs26UYr++wKl1VF8wP7MowyRNZpGHlobJRhPE3Qau+1AdqfZGt+Vn7PjS8TZYVYh/QsMFrYJcgO3JVcKf1u775ciTeIN81FbmXt5RfjVoN60+KNeChlwmHFupQJsxmFzI3/t3lH6d78HworGtnGRVu1srxG2I9B9SEaUfsl9vMVrAH14RS5BYtWldsEu/Mi/wpWdl/fwf4agwGc8OunLC2fSVfzG03+pbxtprPO9qHuCITG2F/oblBsp9iTaTdtXfLYtflUezKqUpXIZvPvFJ2k1hJWixO3HpU234EKvB6Uio4quwl2oiC2QG9F2Q24A3t3PfClhIWrRIBv35oka/LbI2zull9vD8i4ZavGidxGrJJRLzqCrOD1AEw+zNhxfV/jjDWCeqCxNuxppLEmUA41Fn8PY81VZ3c5K4rt27BknaG7zxT1L1TbX9iXaZ/F/HsdK7LW8q4S8UnVg8x76vxK2f4Kp4nXgnCOyPcwO9y2+Sqa2wFk8JtEGGIrvBdDaOe7jRl7mfg2RpR36/lcyoRu/N0YUpYdaSZjzM33NF+OxzKK79KIj4cx2q/jPsxr3ceIKIWeBOnBHuAeq5cJfJnVWVEcwQoOZny8QhA2LmTBwU0QtRAEXqJcDw5wAmdDEDg6CsDBThMI4MN3Dx9t2q+50sCe2lWgvZiD902N2I6oPFK9eiO9k+dFR9zQm4aebhkLqfEfoBE51PbRxSNvIm0FMlzvmjIDfdNrpxlT7eauUhr1UWoBbHvpZ1Taetvvn7VaL1G1veXrxhlVG2Fcddvq8xlSLy6p4FsxdmAbTQ5Ofj9tgI0mJ4lsDjAI8ty6jx/84no4bpKWc6ET2lbfiO6lxWOn0Q42yRS6E3YzXAJXh05s3RVlNoCpsxrp/XbVQksjaHf79bU5IlMaYTv8PDXCjIZoKYBvzPgsMIpUi8od6EUm5pKpTTXq/M3Ks9zBbL3b0vTXQ2DZ2FxY9o7IaqMHr9Wmplh8AX1kkuX7DtxKVGvw8N6DbZW4UCtELF0fFR0+50B196s7mSe3slxnQKfmtjzXVYUV2OE6YDsai0Krt1NrU6FZNgyYBr4vyAeOGx6G1AQDhBPZ15iBT9qMytNmDkdmQ3DT0WRDGNccUzYEjxErimwIU0b4WgrinRinBvXwB83u74cz4x8qr7+77nx5a8T8+1KrdZ7UC7xZnpwr/Sqg7m/nuzebnyjNT4g8WWx+gte4uWmyD8WJKL6I4irNz8ybuvXY/EeaJ+qV8qvVv7Uu5qJYimKV5nLzW6/1b+3hW9K+kDNlK/0TOVGGbkfqf0pZCHOxjPJTbkfs7638Hr5eva9g+mC19n6/UfuOkW0qV/EvzU+Y075mZLVXwJfno8whm1f9LxvRzK1BxowCP06lSLI0J+1G4wiQpPmVPfQmuqtsu0xb4W+0hb5KtQ10pjNF5dvhbg8mIG5DuumxVyJDwdtAAkr2YqvJjY9zzPmeM0OHxYTi32FTergtoEnsEWiELp5FpwtfpeXKDPtX4s38oylLOfran9v27VXzcyvxljQ/t4dh2FKwbS2s/L63FdBn6SYMQb1LFwmPDEhw4xvRshElN8DjHBgcoJzKLDpB6JQU7SlEXukUvATx4h1tdcG17qxGv5tfx7+vsduMWheV/W6XGe42VN+rxzjWOwKk7aX+DxKio0YKWrHdKtrhjK5f8xNzuDd9xN4qVz1lWlM8LQP30qVHhdb9+CRy816Zvbd8K/IldIBxP/q40a9jAHWrD679wEctBe1Nc49tDJfNg1/tZMmNtb83SqHmUqUq2mEpadaiD3mJddpOrnxTkaYyf02GDFShBtL5jty2EXuPIGYhEyPttosiQ1KoYVRZhtxWkaYbApmEyTsUYBM6AVGwUYR5Vjx2UadaCTWNKgOI2yzSVCDxJsEv6u8yB3lhP8oUZNaKCVMo0lfEmUKQAmLKHqpcEACjWNoaSXaIKGOo00RMGMeSLwJsLFXiiECDSTNIRBlNlJlhwk7KFA0w0zC5GkIMQydtgJmFzd4QYhpJGoco82xYHSLDyYRZ9k0YbMKTUHOo01O4DWPJUzFh4sDNeKny5fHPv0AesesWJXUoviodXccjmKNWJboOe1XirbgbpbK7TFW30rRKSOi2Q4H0aq3KZy8izYyzmYjsSOWiIxlds646895OyqSIjhPwgm/lOKErM07UgxQVd2XGhFaRGr3foH9fS/1+Br+lNCpPm1cA8CCsm4ju7edxjdFl3PGwQ9PtBKOuCL/9EeJ6WjAwJlODB5v8WetgY7SsRaJPtj2GNHKwA+1gaNCdOw8x/NZdMC74IWQPMu2T4sFmwB5J9thA+NT4lAGuGefWtlGIHU1R0nnmKc0TcOPoAh0ZJfAr2b2qmUCF3T13wyJunYfigkaJESh8fNiB2F4W0DKJfpdyjNpeD2jVWJD/Mn9zDl0c9XhrqfHiiBAWNb31WPEz2w7U8q/Y5+/GkFaDCm8weG69Y4Ack/3CtNFA1kuIBzraKkVX4aByvPfy1tE7TBdoq8OEKfOkUCnFNz7qSHHBFmmpkvgLPE5aqwWLDw/DBezMXKTQbVkYZKHlS6rW5RldQ2gl+RsEPCenixuZjdOL7BtcYVe+h8VJB9hmWWFOuNRiAa9V11XGJyuKrNzddxiBh1Vu9pV4wxxNRWDT1rmJudpTfYNv9njJcZd3ItBtULH8bxtkSMZvY4m7smxGqBy1RBteNHwBxg+E4hYqLVVOkabAbYLVJ0tNMGHWaFAv1VrPpfGKw6LpHQq0a2fgeY2P6wh1WuOqL99KWkthTjGpuDt6nNj1mVD8+s8DvVHjRF6Jt3S1XlExb+VYodOcFHojxwldRxxQIbdinMBNJAEV8laOGHo8LK+zaqa1eIdEIQyL0+biSlcyL0HrDgfVUU8OUqv9ivKdDJj/kQZ4I0UJ6/z+dVYT2MHzWID2RKDOtwKLEvegHdlEK4i4cEel+fBVEpvBx0ttpRhhIaf8PlqyY/5wfJA3yU0P9yiFwmIOzn3U5Cfn4eZAzxZ8pqBOGMKxwafRPm7a4+hwQ2Dn0T4rCA+kJ01wzkUnKluvYJbYoh99BX/EMr58j6rMpoL87up5ar7e5xTg4RuSb9SeUqh/bzey8UTgK7lVYUGs3gs8YSOyl2aAWIZ2kbFL0BHkRJe/mz/LVWzulrHAIXX/DhE4A4ejingaaRd21FQpYJ3f/ixPMBuPbXHagNc0N5cpENuOAdhRrYjfdHSqi3wVP0KmXcPvRgev4IfkuPX7blD86n1IzLR2320KbuU+NINg3b4bGblqHzJzrNkDjKhvo6lXmq5q751ZNbZ6x2wyhsDkWwwn/mDGaRJI5nOVSFhsgUOBdN5ZKp1mWewiyEd1tJVD17Kr7nzredyjRl5rKJ4zmjbD3V4ACUc7JWnPKIsiS2Vyo7J0DqzXDdNRI1a0YtDKrOvHG+VXyaWCtoEta0eHAzORlbmKnMziH3EYobZaAvh0QwDuQqvVeRk7Eo9IjcyiBCXTC4Bs7h8BV9Ej2EYOs4QOgP5rLbTIqzSXyY2IXtuNoDtyhYC9ORsAbW9mw7ZRI2Qrhrg8Fgx8V183MtllaJjt9aUnq8eBXa8Ur+NdAiPeWgjqEAgBVQSjQ6VIxwb/3NqmJT9ReSXfYhf1fqFDnHldiKQT8bAyWSc8pzWE81+gMejp0GkHzewYaALZZOk0hXbuDDSJYLR0GkM1eIaagRtL3SYQDK1+fOdIC4u57JWlHU/XlTrP1uUzJFfjGOvI6C2MHjg7Y7+efPsZ8zR5rK/MgbvR4cOMj0bzcALj0MJAmyRQFFXakeKBTcxr41omALedg7dVg7rtgpDlYmGC7F/kjLi/bYT31PHSHPLyjgN8K8QD2qRVJarmRo23bttEsyTNuk0ry9mqba5I0+go6timh9yocSObHKQmUyEl+GKryYhvGshNm12XCN/8YdHRZMa/q8SSlL1sBRnBO09qlCdqtUorkgmz1u48qlHOO9pk5jhXo5jTF5ZHfNvZEU20XYjCK3HH+QrB0tlNjJxlQrEvDOiLyICeBzd72ohifA6hBoAnSjc6bqrcBW1ukoDfjHRhG0Hcc5Hh4DafKR23dRRzYtcbu7qVQF8Fd7DXonVbQT0KHmTA9l1lQgO27YXfAFkf7uKZNzo8mJmCbc97jFaEB3Al3oz3DhTk5EBdiTcj7IhwooTuLGei7w86oIdyZNDOVVHz9iEIuylLuyoieoRrTEj79Fa/9qYySCAe73YYsaJ4tDsMHuG97SNvhHhASZ53cXDTPeriM6OXS7iecPHUrQwPZFMn9YOGBE2jkatauT1AQ15r3UWeNJo8+CZnE1WFGy3m2t7iElX1lnlf9VyD/5FWz7XnaQ7J9b7bjte0ei56+txmMVq0L2PMhupcmd3ZZirHm2FEF0qLviirAc3umIw92ejRYQ+Xi2Ybe5EvFDToa1CedNk4F4V4SrO0in/r2g12NFAEVOuwvry793VZSR19G8LHbeVg1yHCodWqfv4oVfmJSuSciH2rOm9U92LCpXyR8Tu3XSZkjSqfCbJQ8/htspO7leKDhVwS88CS3RILhgdcE/OwQ++JBaPmKpFUg4nRYh5JMPfaPNTkF9uCjdEKMKc7bWiU+OrduqX/EFl2LXJVmqR60dnaPexW+lVkWd6T5jMGfD3PYwHt/bxgM2C33Tw2EF53Czbgb5WTjT1Gi37sGa5q6/tdkDRknZK02X6jq28AcgSstE5N+HoZIFJ+CNdoEOENvuZDsdQikXWs6qmsRBr9CqhDgXifEp+B3scET0Pvqqeps8WT+MMtP3RWzwiwU64IcMCKzcsMXbNF4GpZ6XeAS8DL3BXkBLeT/W38wsdLbhWhC6Bo9D9VToz+t1VkRa/vnVH2S6u4h45pfwjmRNpBj7hBGGFAE05w8xz/XKWXv9EsnoFvVsbg6/dr+VYB35bwW6Dfc/lWYd6XiDDCIBOBWyli2OHCZJ0mkEXmphzpIuQ5XcbutPsgR41CfKVt6sEbofKKI7MCJGCDb/iHfLpT8++yOsG8FOJRoV1kmiUWNJJqCtAu3lDhVL5anL6rw2OM/bd9mmNi5tWL1A86emcyaUqru7a63GYUWlVqrmht6IpyG1CfiXK0qfpEdI8NKn4enMQHzoW7oX1j6WX6PXZO7JUlHTefUpPi5z4+peEY6chqQXMa9uvHh7teLKSWyWwFcHy6kBs9sYI+YhqE3fZzPHBHiQdVS5G8m5QhBA2i1iobLTLcXmyBSJL64aHLtKxkLmMTSDmgRZLUzw9lW0UedEjwm4MXHPwWBFnEX292tVrg3eYgRC1X6kUStwIrup+GYCZQPHGjwodoQqlORFa/n0eDayKo5ltFHvRK6lWak4xnXSk62MEywRxSaVB29m5R0kXC4+NfrfpFXqyj590h11Et+Fr/c9oIxtdnt6K8mQTKdGk+WL3yrd/URLNvNTfvdP7jRy4DAB79MTHUlR8CiMmDPyZF58EPQYbkwR+jgvPghyCu8+in2ceEjQgV4PG//6//+8efj7tj1ec0T+5kVXUmXLP6n+TclsEOUR6g3l4mCMeU4ICxfztbV883Wr2kSVQ1jQvzIZ7Uf3pWJ+wYuvhCSR0a3MAXOQFxX4QbGcfKDnkuq05wZShcXYoPqgnTNl1B5tUwkD8U0qnCDv1ZqaqstChOVL5Il1DqgQwDth3u48bObRkWoNqtlqr8XMyrbmrjAK5BUQa8UzlPVyLrL4d3knVLcUCptblSbt4jjAUblGSAs1PDyTZWPJxuVJQNb3hEH4hGdL3Di/Utla/t1tskItQdV2IgokOCAfeLVM/CpB6Jan3dUgxQzRR/o1X9n//s7ql2sjkKsyCmVSqyZuS66sa4BBAOy7IAVr/8FMNU/fITB0bx8lNk49oUYcC5VPny+OdfIom6pfig/lA6iVhodksxQUEmpn45BrBruVRVatw5iAlqQoQFuaxksqmZGMxeQTa06/XqSWoQXKcoA97va6nfzcfJZNwmYlCQAe1WNrEZ9UFG3Bw1LssCuHli1KwlfhN5ksV4NNzl2UBv1Wt3yRPLOSjOhtmPkAuEIwmPcyB10l6fDB+U2YnmKMyLOHgjIAbQFmXDu1TLZUzX6JZig2pcCdG7aVdpBsh7oZcyYmFg/54DpD3Veeg64XfzdIsxYHVjb+Nmh2FJPrh7V5R4KF+3MAfiOk0i156bIgw43UOWuM85LMkGd9uJSw6kulWvbDiDd4sDiWgeK/7U4fnj5vHk6+XD1fXj/b9uzjY8L0KndVoYP1O/JOkJ/eeL69ntv5AwTQBf/JnhQOvxsY4B9KF+/Xp5NrtGsyqVSQHIuhMH+6977Cc+gr2UFYV58tvsFos5fxaAEKcozNMZvjYTUPhNHObZycXV7PLH41/RsNbfb5X2gHz88y9EyFZpD8gdryKOuBZiBf768PkS337rk5a9oD7Obm9n6EnBAj+KxpvDiX1++XV2j+VdZEoA4l6iQL+cff1tdvcbFnVpzz2YYS+u0XUKutwYB3nzDT0QpMUL9xhw+fX6CxYzU5Bg6GhMmt5vYPfS9w0ywfSV2WMMZti7377eojtV+aw0d7e6+9fV56+XaNI6EQkz6v3F1dnd/ezqBktbdUJ99wL8eD27/npHhv1YZ5Bihn94uDjFEq/XkLQ7UZjfZrcUe5sXoXm2NyPHwNXN7dnd3cXX68eTr6dnJ9Hgg/KkToLb2R8kPEdaAC6cO+Wmv/6fd/fxjdRJ/HdZQZvqTuRBG2j2NY9Xs/98vDuZRe8YRuVJ20BvR4rHwu5wx6rTLaK3O6XDh64YgPjRe95peuDONwB+1LTPZw+X949nX0yXePz8cH5+dvt48/Xr5ePdxZ/xDX1SjdhnO/i1i+uL+4vZ5ePJ7dnpRexSblKLl/vu7Pbb2e3jxfX510ezAPn6cP94Fbv2CNKktuPhdlb7JE7++fjH2ee7ryf/PLt/vLn9ev/1JHqFOi1GTN7U0snsZvb54vLiPnZPNSpPOqB3JigSrm42Z9CwMpadHhN/fzi7/dfj+eXsS2wz9hjwl4nVeRznS+Yy4M+v17FDn4cclkQtDNndqK/O7u5mX4D4TWHa5jw7+e3s8fbs7ix2UHZAHc3F/Fk+allK2EZ7oLnjEGZ2fXIWO5K5qfM5JIt6NDBk7nMCa5lA7hrGAp/959nJ4ym4u/WY5ZucPybIDheGbUe4s9vbr7EbWRe4Hd5MskjYfhaAfnv2+8PZHUVLsfBa1sX48W/P7sw65/Ps/iTWWe+i13X03WP9GNne4M+uY/fAE+igHBGx4J31JAG5zS/6mOYLxYLunhhvZvfAFmNKUq9Ar0++nl5cf3n88vX24vJyFgs2KM5F93DdLkbPopusS4OY0ywxzdbn7NZ4da6iZ75ReR6+y/vZo3XbP55enNxffAVE9kxJsVB39mM3Xy9jF0FODQ5OWP/pFuWgArg5N+WIeX47m52e3UK8OZ2SxEwX1+AhuVuUi+r2q/1//nkRPVE7NUi3U7OTf15//ePy7PRL9JDshzvCvRrn1d4R07IdHxhMah6Te/wQ024ePl9e3P1Gac/mIVdOIzxdoutPBHvNpsVIO0mnZdFDdlsW6lt4fmP3R2mc01+vr89O7h+vvp7GDu0uCdpR6u5f17FHpV6oI1G+54Bn9Hya01336/k5GbhaLPaFTVrhzPU9aNBXsy8Xsex1GeIFgDk2q0OsHk8vrs6u6xPiy7PrL9GLFL8QP3Gsy90lwUBZO2web7/+cff4cHNzdvv4+etD9OrKL8RAfHJ2eXn3WP8CwNnkUOBgtJEs17OrM3hLHYuwkdrauJ/FR107NRg4L07Pru8vzi/MR/vX/RmkNw0lGCjr5o+pyr4AA+HISQHZgfqFGIjrmkB2pZEGF6f9eOe3sytInQ4lGCiNJ8PEo2xcf9Dv7xYiJt6eWNuDSrifbkKJmPn2rF1knX07u76HeCtcErTbgPv7s6ub+8fz2cVl9F7YS3ckqkquiurRPBgC3A87xXccrtoChHY0OT72Z0LPI3t2e3dxd29Kms/zcBvbO/12dTbIj4V5wNWkW7efa61hx7NIYx+uZ99mF5eA2TLMynUuXkSawV4qhJln+9Tj129nsWfQfpNsh3o0j/Dsy4yb24srM6tzfKFCpyuh3z/i62yKEA4XWu59wNgUuYi+JRVgB+gNiWBDRvOlmY6vZnf/hM/uTg3ief3u7Nocu9TBJY8ns/uzL1+jOZ0axFFdJjQqflL3kzVBUtAJ3S288/b67PHy613sLm/CiERU4jFTJSxQEWTEdmf0ZRZ71WrKkrROuGvGz6WA3byCmHNxfX92ez27BEVXTZhT59zPRYaIs4KYc3lxdXH/ePafJ2dnp5SdJUtXafUo3+ZSJnvsMddf7x//uL2AuB0mjMlV9WjeDgFP0BBTbma3d2fUrawQupR7bmJtkPzjt4uvl7P7+LDxKXuax8keX1KVtWna92PW3clvZ1ezx6uLuyuA/3XCprJOIPS4SssVOOwPZNDZycPtxT0sbnTKHjlf67TCRJBCzHm4Nqf2hG1tnZuD+v01MDOOkQ8A9RNI/F9ias148/Xy4gS1YrQKtJ6gz7NrE+eNmgI7XEfiSeQm2Jtg7mtkd+2E7m8vsNNe1wAtK1t+3wY8fr3/LdpnsNuMR1U9A90G8cbcn91eXVzPYsMSvVY078DBrmgE4Y96bB37cfsV0KA2JUl7aOOIQdK0PhdgRW7FwrxGJ2Zp8BC/63FDP87NgmAN3eyEwt+e3VxenMTGrI6gtSyydC6YYe/uZ9ens8v4Kzoj3rISeSIy6AWdSeRh77qf3T9E7+rrQofhJdmiYN0iVonThdBhpfAZBAGD4/t6tMg4viBUnD+jQ0vhwAgBxnksOsAULooQYIxPooOLd0KEwH7FNFjF2E4R7pAOIdr/EYKK9Ax0cElcAUHIqL1/l5hgsx8GDL3x16fF3fQLQkXs4zuo6I27B3WwMrmf3X6JvghvC9Hux69jV/odiCORwxb4jUbQ2h6Bh9mDBCHCVvBdRMzi3Yc4aGoPN19uZ6dNz4CEB40FaJvgw/1vJlLyBOKz9rAdieGbovHV65DelSaivbsBnZN81sxFIZ7SzIz3qDkq2qTf7u/Naff/Cwlg8BnzXFXFo5b/DQ9giDbj683s94fYRaGPXxXirzVsaRgNbna51PWvVSb3XP9N7ikiAyr7nsie0G9n13c38UlhvfBa5GUBzQ8bjf/NRPd9vaYekF5MNJ/K+Ucjz1zWJjO7+W12B+3XPY3Dm9HGeJSTWl89KOCVzo4m7IvTgEG7abpBpAlNKeLArjqS3d5j2WYgvTz7Fp1hyi/EQnxxTUTsEsIS/7JtriJJzLvX1qk3m3//Qz7dqfl3Wd00QQwb6MU6r/2UfuidWoTcmzd6QuFsAUoCFVU55s9pf70qKy2K31+Lz/bv7wbPtQYxeUQoSe27P8FM7xX63bPOrzf5rkN/3fw55a+rfC6qz++VLGMgtqVoWcw8sv3UJ/aPo7hcCpyM9h1hDKNV4GRsnkbHQDYSnJT2/UoMpFXgZNxMGBjMjQglqZaikpiu4xTgJGwuC4xfOgXADrUYueObqVOAg/BUVOJSlWXnAV0Ip0OGg7Zdc31rY1CR2FN6HPxIXB665tW9UBrz55S/Pn60IIBhU4iepPv+QDDJ8c+/0JN0nhIIBvnlJ1oOlZiGd6Jyc2/zLJ+rxF7VisBySnBQ2lXRlSxLsYxq0U4BDsJzbf4BQFYX5CBqFmm3sixUXoLYBhKMlHf1IfKFPUOGcm5FOEnrV7VON0FQpzKrBAbapcfB/03oNGoROChJzvRQLSJnhqYQMYl9OOH31+LPskog/XgsQEq4EOus6q8RfhN5kkWtO6dkSGnLdJmLSib3nffcwiFHpSnZ2jdcg3HqAuQEs+ZdxjiMuhQhi8yb3j2bz2UBWQB4FDgYP6d5EuOx6BfkIDppX3uIRrIlWZjaBx3imeqSHExb9/qNyrLY0XVKhoMWzMdG9EXpNMtiFhjDohxUzdrlRK1WaQWutLEKIyuWkptvuA7E8jr1OPh/N4+D3G7eBonm7Zbn4Ite9w5KkjNFrnu3hQhJFpnJr5WbyTtyNTIoScqkRPXpOIqlLkHNEOWdaUoQMmzflw9laEoQMqR53Jeo/57296O+Qv33lL9vH6UP/vnihfTXS7Igh11ShNTmEfcIMvPnxL8e5+BtShAzxI6nmzKEHH+9Fqd2v9/Z7N+oLJ3HkE2o0LI2C9W79O+YBU+/IC1Rx+ATUcll3IGkW4CW0K5N4qtsW46QR0uRQFZavXJcPNfr1VOUq8xRmpCtfLbxwaE09d9T/n69L4gBqAsQElQAz2DF4A9cV4tfL2W+rGKWWttClCTrNIlhWKcJ4a+/CB0ZdtaUIGSob+a1fpTfpIgLqnCUZmCLHt76BbFE27Ddzd/mKpH/XbZ/2oKtVLLuBev2/syB0QkNP/51ez2oqor7zoUGK94U84n3CgVa3LdiC/Pzj1uT5yovK7024TxwlKO+SgxWX80XTP+sSkRNHTXFt1xVmfwjLf9hErTVF3r+R/MPaf4sTdtKqMAztURw29IfgF2IsnxVOkGwdyQ+wgBU1zoaXTXaG3jzFvBVmt8/a7VePhdrjCGN3CrNq67cxxl2v7mGhjTJdZ9tj8ZU+p3ClEq/f6ghdUYEiTBhI/AB8FVWdq6Rx7NXWTm4RL5P9G9Sp4t3HP5Lq/ERJqjvMsfgN+U/AH1dmmRAK0y770jsx4Djf/9pu4ScZ6rE0LflR+j0pJtbi4i15ejeIxftUlaNZ262rtR5ti6fb9VriaBfyqqJEBLrSi2MoraK/NaU9nl7+NCeB9x0D+x+nf2PiR4x15/vlboUein7sd07OJ2FP3Y/5EfC7IvcteQZ0J7MXxrfY/+KGRy8FizTv+VTI8jHvhJvn6nxV+KN2YJBe07z5JvI1nHwm0If3377KNh2u62Nzsj0y/GPP3XvfK3z4FnBSWjL07B1R00tS4kha8vTk5Wy+qxUJkXwssuBV8rqaSPCw9i96AsDtAosdCddjyyIrvHpstCdCmzdNVeTeOjGF49gjF0dTtLuuTWG1OpwknaCMjCgtQwPZz/IGwbZarAQnpuAIRzgopFg4fsyCD8CEW5jmFgYL1CTcimrlGlWLmV12Q2DAcE1gTRsdOjhZhtrw8J4vc4yHGBuFdjoqGYYw8k/y3SI0Z++Q8zcAohmnA4w36xjeEnGTUPLPHbePUccOrkp2xgWFr7N1a+rdK4VYqdqSDdxI6tWjJf5WuRkyHmjxUL80A05AXE2QSssdN8GISkgwG1cCz1jpR7SvPq1H+wZT1mptZERjQwJ59Dn817J235ATQDnptDH+3z6KFifz7Y2fD7KWN/egA/sx3ORDbxRhSrTqpszLR6vI8FBqOVKpHkatwIeIHY1aBi7PVe+FXJenYUfOTgIrQbg3CGI0MSffk6XF70rEJBqFMlTumxvUrBxPqQ0oGtmUmS/rilJ+/aQ8Hxw/wnGuL1FxUiJ/t7be1Y8lBd59WPUTsfBmDYabITob93e0mIjjNreugFBu9ogvoeU4COveb/yQ0rwmde83/khxX/oNe+X7t6YBQJaCZr14niF/YeJiIhd1tpCB7HC7qAQrLCb2vCuErP+rYt4xI0ADV23vRXmPB00tHQBaxXU2BJIGT24OCnBo0sgZWzvdUJC++80I3QnP6DE7uR3ctaXSYDbgi5orYPcF4SRgjYGLlTUziCEFbA1GHMi9gYBjLDNwYgStzsI5cR/ddz+IIATskEYUfKN7y0j/ovzje4tI2ZwbxF5xvZaHT2X1yqMc/mGEv+xGefyDSX6c/PN5ZYxfrMwRoTvFgII/5Ra4Secv1sVEsrBnmaQMX43YlSGeL69TAcDuY85GcIN9jArWel0HvMVu2zb0niubvt6Ulqr1zqlFpDMKvzVKHDQDXLmQ/DKVoKWL+q+yrC1je6qkBDF3UsZ94Cwt7h2UznHhxNjcxJ7MWJU9kBGjSERyQDSrSJvbW7zMz3k4kWkmflvsdXqF/nw+t2BhqzoidrznPHOxTqqn+/kb/S25IC7UjBLTPM6UQmpNUZzbjX3b1H9T3TGNHL7t6O+NC3iYpF3GdPV3L9F9qH3W0VqkhXV6kNt+lPl9Db9bUU/wKZKVOuSeFCwoh82KtifHz4AQmXWaqO7f8uavAo3z4J0Smpki0b2A+zS79fyzQTaFCqN2kruNE2/5/LNhN+0yvu3zthCZ5FV24sVg11sWt6rQmVqmc5FZob22/rtcELb0rLa/oIZ53X7Cx9kr7n2bSS4rG3192/rYFdh3zyK9QV0Sn34vmHIgtwodCvEt55WqyKTkTGWDsyOCgNlk1voImahPIJsREBB3G7GUSxolWqJZGwlWAjXpSy/pTI8c4aL0Yi8NCJElF0P0H+J8j2fX1RSi0rp/40hrZXSRomHVuhVZL4pJ6heudJN0VG+irQ6IenqtRRDf+97AfuPzUBGpFaBgW4hUhRbU56DLM3TqBtZY7ZWgY0u1s3nQZSNDAPnUou8GrwtBOCsZeatDANnWp7G7eNHiGmZDDftZHSZqGSdqwVfk0aqzhvDWZuFSSola1cGago3Onqrw0xqZnMq2herxUCsZSZFKa9EJXUqsvRvmdRNA7dUqjVXHc2nRpPPAlPdVOSmulmJ669KXOe15t7qvP41ojqvtfZQ59W50reyyKKiK5281UJp3Sqx0JrNBn67wkNn1pnnSpuvf6pFilq0Gq2F0ubrJ40W0S7V64GYPYncTK7Rp8VejUPyTjjI6HwVg6rj8Qm4LCDyEPj5va3FvpHZ7CQRLWasc0itxkNH13Ic1cjTenyWELWgcDsat8EV0KPjs6ORXSF9PNN2eHsDogMcXJvnaOacLZu+MQecc6JRNzKUnN72iR+nD3WEZhyb9zAqs43HexiJ2cbgmNHX7lvM27TmFALWvh0aB9LCfWQkbdxVdeSt3GsBvp3v4He1ljtZlpDThKbcgbSKLg1JS2irxfv1RRLvGuhRthJUfMMc0HUIL7IiWw0mxmeRJ+Wz+B7vvuhhdmWYSOPvTTg44dcnAilzuVRVKiqZmGNCTdCzj7aS854kuwV/llVyKV8AB4ge/r/LKskaQSZ6G0J5kS8UDtrqpFaHjLV3lmy9GzjMrQgLI/D8uD+C4U6QdxFG3rzxDbFcfPKtgPiGe4AbDRZCzCltD5PinHYHa6GlkTo3z0mr7Nae/+CoG8mF0oVSmd5IsvC3t+MQvNALduF8sMCmMSQutmkHqQ2QBJ3aDpaARgd1YruDtHxeV4l6zc+V7tzsQs5OjeZCaft3rGNY/F1C944AeKXQuxuY2EvBLhj6JA5rh0V83dBbb1M3xzALrDG/+QeKpVbQnclzkWbqRerYxtEr9+EtYkyDbAb9avF8e1FVclVUMbODA7SjwkIZe0vTVZeji5lIvn4bvMjrZjubfwcfb/skPrxlToIhG6m33jwtYaHV6ryM2WNN0xu9RQnZbsWSV+ZVturOuCPzeUxjnjbAypZbWXY7FGX9V4qv9n09FHhI5RY4oN5JfUTlqTHfTDL/nqvXTCZLmaBa+diMrjRJSw86tcL3V8fJFV1v5Tp5m8RHHLztJnf212sx/w7sqZuih9JH+0A0vXNbP95TlbJQedTyyY3bEeJitcl8SD73kdWCXoaYIna20/gjv37BQ2mjhId+g5rxevi7w/u5FisJH3T7rvSO7sLo4sdd+hNCZ7VDjwhDKSFnhC5QzCFhKCvmtWUXM8VLy8Hs0SecTmLwEWcoZ7F+yszNMdLutxHl63uYcyNvx2MjLFSWbW/vY2tXZVlixUQtxsRsP2LdLmjaw6KRYuW9N/WC7XeNVtVq7YH4VGaVoMROGkEedi2XaVlJXbtpf1MK26hbvbofPls9HnKzOqRo1EaHt0VvSP9Iq+cb823nIvKq+iT4a1o9Fz1ZPjtIuqURYu6TW1aKDrkF5u2NA2r69tIxYv+thsucfVnS3NqbdTYlSBuau3uir8hK3yxfaMCTjRjTijD6lNuzBwYec3spJz0IsINur8aB+RWIj7r9VUd41r3LAsRhdxB/v7VcyZXS7zYofVYUZnyEnWdMC314uwnAQzaeHTXpaUHGHxHphggxxbglgN4ImB26udDAYUyrvV+LIKcdIdZgTj1glqxLnu9idPm/iX+8qh1590pdmmMwzHg1Fjqo8cqDRzheOWrSGzEhVvJEraMSr4YYUwvPG+H92IIce32WEI294XZQjL0+YyjH3mmL/P289ldQ9POx0EH1cw8eYT931CRP3/CZQtQ3wu0oxHum4h/pDrGlkd6vPRR93WcQZV+ftqjf169VIs9TkzTZlLyrVNSFGEfpD+/VPiZkV3ZVFOFpoZcafmS4g7h3323reLp/1mq9jMlD5kXvqFYbVU4r6rUsCXmrxE579756UtlpOjceSxF1AWkHfVkrJ11lRmtiz2z9vRR4cBvBmqTlXOiEsKU3intp5Wbeo2BudJhJb+VCahMtQDIYGkXdVWSm5+idRne/fbO5Rmm3+rFZJr12NKp2sIHmm4ywwiSEuLHLPgp8I1ds5Fi5i0zMJUdTaqTZW5NjzfhVF88ir5NWRj37OCp7EOvFMRHBarFfRcRrRQcxbqXopcXO8q66RczxQZzlXOTXKub6sYfUCOUKcv84nLUSOsah5yNtZCg5Hf3+ISni46P7BZE9fuQqgYaUOqhIQkoH1cQaLO2ygTJYOtQWdNipyxCysNNQK9ZJcQUajYfk66TAjcZuWuxQPMTEjMO7CaEBnBNNARwsFkYMCmxz4aIC28JYcUFILmiaIKQo+vggpAlweBBSYI+LDkJy9jlwEJKXcjBNm/Q7s3ntTgbGk3gUPnypPsWFXLD7Ks1/FU+tddQMNwnf0WMmh4RWTKJjYioC2Mdt+7apK0ir7pU9iPY8JiJoyf0qIkrF4aMFpuMI5gT2NQcqspd5aQdtVKtKzVUW3T675T6+bY5osO2yVy3e2qvzOV9G5o7bFvrwehugICutUxtEqXaHfNA8u04ygsupQz7MxdQQRmxS2CEvVUbYOHZIOlg/OSYXbAg3KBHsEBeVBdZNidlfj/o9cG+9myw2UeWQDJqlMpAsNkWlEw+an9I9XvZnmFvZ7MHO3p7Fuqzir2h4FD587pniQk5EvkqjS0Y3CY9ISxdJHrsqnq5z4No4gHnYps253fZ0Mb5FO8ofQHv2UaFbs6u6yFqEnxrcHnbwTreGG6lLcxs7j98075I6uDbiBCRuLqP6ZGo5HltGjagqk3+k5T/S/FnqtKrdtsRWudrXbZ2eGTJ7jkofSCsaM5E0nH5FTV3uABycecmxh2YR7NEPnHmhwW+c7aB1td86ygV173JS50Da9BQdSev2VSPpmDhtBemAGGkP4LJGgEmIuxogK6BXGwJMwd5sANpT6ffIo8UgW7ayH9LaIKc3AXZhznCC7fCOwai7pJM6hzQG89wkna5G+jHYawX9GMx8MTbAKNS9WJAluNmE4VYsyAqC2YTrTizQHtRs4rfFNZsQ2+EddU+e5fx7odIcs+wdiBzSeOtCoxtsh7VHP9K6+emH2UBLklRLU20xJw+7rOlq8n8LZC92WsC0IJywyN+fldbrwvhyMP25L3JQ/dmBRtifB7XH0J+d/Az9OcwSbG9wWUM0oU1Y4G39iDZ/cC2do31ztWqyw43dlMgWS99Ow1vn+TqLDgdzFT+kVtqHomup27qib61DZvrRdyc9boc3MIBmY7eTmWA/NwAn3MYF0KPGjRE5y4rPaYV3PLlU8+/Qg7ehwCGNKUMsulGlW2P048qYm35kCbAAuUcbWUG0Pwsgf1ZZIvVNGnOHaYrc6hUp5AZTHDlydBmRM40vHksmR5hLVWJ8Qz2JQxtl+mC048y23nhGmiE7z1iz0wqC0WZgCeF4s5OeoN8O6Il2FV76yb76kBdavZhfR/bYgdCh9VsXHm3vHdYkTx9228HTkwMtIujPTqsIe3WgJQR922kJ49w8YZm33/++FlrkVQp4oXpC5ZB6vJONrruPKpC+r3ssoO/oobYge7nbHqIuHmrDX5u/O+WwZiu/Z7uQ45bbGqZBa8om74h1J5crmVcEsT4upUMaubx8dKOXszLpR7AJS+hHsRibVuKt+XOEX9Jv3Uq8lfZ/JHBSxtgFTJsdZBQybzbQIuS45jeHaWzbZdtwfCvXWRWbV7NT6gDGrT4LeozaVoinRdRJ1kC3HQakNlsb5pbDTta5ytarPK4rjuqzlWDgM2cpsqwu4nynA8JGBOgw3c2oXuPjM4eI6hUei7mTsE7XdS2inhEdIdYiuQC9Iepm7N2vXkpUBdriDFxaRd34dn1Zwr7hHZ1P5VwlUdlqx4UPaazuItEN2W0t7ci4eQv+5j3sNuEmvgmMufvp9p9KpZ9A+Zd97FYSlXc5gr8osvcTMX+Wt7KEjgN9fKM4N4q6UeSjT+r/mQB6I8TNatJYkPG+WDE+Zi0zk/SCCLpR2wN1Kas6Zcfd/FmuYl5n9qOXsqpTiJStJO1Y6J1d4HVvSh7SvLLhoZtU6srx5gMi2A1smQl3BNPUdlGPWNZ269lIEaxuQ4iB0/aQFjldT5Mi9zRbVqJ9zQ5a1O6mA0uyw5lmRe5ztrBEe51p2heRRcYEOUhbEULKfl5g0x1oOhUf5ULpM1Ev27GkC6WlqFfsfLTgne4WE73bneLLxLtaoxE3KkyUK1FJnYos/Rvd2/tSTLzNuhM/5rcybJzgHViXEr3pmmTEd3TqHu5cO5/U4x5o8bwteiCr5wEQyfK5Uz+T/umLPJFvBMTmv6eNFiHxcMVvDqBupP4msnV8fx9S12qF1C+NGh93Dlk4DXFRi6YgSpVfr7MMtiYd0ao8X2cZbmEaQl1oOU9NttzPaWTiSBf2Ru0pBaaNDOUGr/6HyOjlfwhtOReR57Au1FaFkXPwXt4dZBEzwh68lFdiljMhVlTvBZ66EaGkxK61h4iYxXYQ4Uxrk6twJXPTp2n621JWwsgmrSxH73PZQbHa2dCjvLRBzJ9T01eooJ9qtT1QK5VJEb8vdyFvpDh53yv8UGFgrQ4j6cmzwK+Nl7KaWx1G0lM5T1cie8jr+SrekeSATqzkeivJya/WsVFTPuxWiZH2PFOCZFReNEKMrF+kehblM8lScymrpZVjWGsOuC9o5r2Ue567VPmSAjSzOsykxz//8ofSJONDZuVerRwj992zino31ktcNkKcrJVOadpD2Spx0ta7BBLaVomd9lxpwGGZF3mhNOLIJIKbEpqb+KFa/Eq1Cl5Xi1/518AP6zT5LV3GxyW7iNdp8my1mIkvAa5rD3CGcGHv5k1L42ZDs6ZlbmW4OBt/II2LuPEHcviIfcwkna7LzdzzzO98TquVKOIvcTjR11n2VOvBL26EkdvplYbaarETN9MISRtp5xHm9lGfU5Q0tWy1GGrZeVp3q15BFd2UO5Bzui4NySFdWy3TEW44zlaCiVCrV9j80IPU6hU3MTg4sb7qHiDGUb2bjcJLPcSldFEHWoDu4jTO6d20CM/0EJfALR3AC/RJj2CRDukAUog3eoSJcUXvZgT5oYeMKCf0bkasB3qIS+V+DiCH+Z5HwDjH825OmNd5iIlzOe+mxPibh6wUzubdxBBP85AU42beTQjyMQ8RUQ7mMEaod9mFinUt7yaG+ZWHrDincgAlzKM8wsS5kwM4Yb7kESfOkRzKCfDGukkRrtjdrGA/7JAV7YQNYIV6YEesWPdrGCvE9+pCxThed5ACva49SqTLdQehWuDo6vJUZEM/jsrkVVqujDchOv/SsOzH+3OcRFifzqiKqLIqeWip8igFc2eqlCeRF7I97EZqdCWbmb/+JzR6o7I3alAWJDc6ad6jUP5S6hepzZ/jDbBaWn2EBX+qnMyCv63W/iyo30em6bpWa9991/7qlSxLsSQzYrWR25sdlckMFrVPchuw0WGbpZrHXW+eI6/WeXitWvE8vGHHXd/6/Vq+VWd5Ur+LRmCIfs/lWyW3gnuzxZCj+a0IJ/PghCgt71WhMrVM5yIz5exr63hL0rLaCps5QbfC+7VOi7w0JYlta2X3ZtlgxX8n8+TELNOis0QPSn74at/Fg1zrDyuHaKXvJiVa54cymz+5yBcKzW3+IbVChPU7bqVRudlsgYNokzQ52Joa8I5QYv49V6+ZTJYyASTL6YJ2pRCpcnYRr2Sl03nMgUcXcluamqtYP2Vp+Yyuxo0OaR32sr6ZQ/ST2AQjvU9tFMDJRXbQxUyQPSjIgncXy3WU67KPk4PcldNENqIA9fGsBNPXa4IIcIBWg4vwvZI4vPdKMrHNRT6XWVw6nd5cUZeHpdjYQfYsNKrWjABXrZmlABSrKUtMpFarFDqObQpTM+V53O5jsArJh5sMCqpEIHujEWBqV01YzI/Hv+IINzK8nMc//0LBefzzL7ycv/xEgfnLT7yUFIz7ILyXb9A+3aOsrA4xaR2nhavKWoKpJusArU/HKMBGg5MQz8dGty5johD6XLYsA9EsT77ICrkPq5VEnpjwE66dWBN0h/q+jQbTF05zbP+oFfjosGxcZMULbpozAkxsTcgfCq/RYCScob0URoXTU2H00YBMbIWWRuNc6RulstvoHJg9j5TVWihdKJXBE2FOE8fmv+wSQtNeThPV4aaoD1wrMH1hG2WKw6sluPhig1R7ZNDQ1GmmKjJSpotUAV9h3kGUrmRZiVWB+pAbFaZvaYIvUYBGgIntVaTVudKzzukDENIoLZQWfSViWnMkBz0K2hRGMznPyeojtXsbigE51XUoHMhJmpuL5GhtXGmek1OSkzaPIaRHb8EW2Sgjalus6h6tsH9zFX+i6DPA/ssKfsg4yT7uuZC+eji9k7Q/ksdbTEZaILjGXxEx8B7ciMsx1Ib05af1YiG1TGYrc6M9NheGm7zVFLUmNCdGqAWQNuqobcKgIM4xlH7wDBw1B3mgY7AHRT++v7mAsP1tWD/eqJcyLoO2GxaYMXuKshfFkSS3cq5eTC9Gs4ok0R0xLmYT2pnK8lyrFRq50VpYLS7ipay+6lmCr+GlrJQWCWftRvuanKBgr1MgZaXX+VxEpcxwg3aEuFjrjFEzfJ3WOrBILj/pYPS/N56cz/W0HsHbKfXhY/6QBTncdyvEM8PX/4EAbMrTkKFfIHTUXwZ8fTCIEPCaxwgR8ZCHh3E0ep9oCQnHGaHWI/i8FgM7/QKYzU2buFi5cbOUbxUsXC6AL3aWGX9y4AQTwqay7EnMvyPrr5Vhq8Nyk+3oLvKNmRFruUl0BH1oJoy3ycpz074VhGRuzveLjhwHd5bOZeTz62NaIwJ8dN0zBzlm7j9iXeidUocxc3dYKGbupkK8Xtr4t1lHlJh3Wd2MiHcFR3SI0WcnV3SHGICB+8L4q/b7wkNSnIpKLLVY3St1abzmsb5Dn8SH95JJMGSX8dabp/8kzR9HvhU2bUIrCvR8xNqwEm+nHGasxNueLYkbKabpYcNGLDFk/J3mxgzGIfSDcSZv/F3mV29lkZlktO0mO3rE2Sn28WNPGCJ2FNpdq0QnBMH2EJ0ZxFk2aGvFUoskfh7rFPv49jOEwbaUbp1QtYkxI/BwM4gOkBnKQehMCkVHGZn/aQw4Sv1ExwbJ8jQGdCd4oqME5XIaY3rSOFFzRmZs8nGOkjURckLyMjk43SmZqDnjsy/5UF2Jl+hogZmLxrDepEWErOD8RA7cidREdMRxWYjGlMMERCgy8lxDY96QNEPENqAyCjkt2JFMCNc6+iu8b1IbJyY0Wair+Iev+LxQyJWfs66IVoATzET7gCj6utSVeGsK0RhS/81KvL1sRFm/AGCVOwVPlwI1xorIVbDfgNFqmJ8dskr2G0CZDjXGCtAq2m8GaVLUeDsoO7RV3E9vBu0RdqETJXaNsgOyh5iwgzK9a7wd8XuMXabQJXmNsQa4B/EbQ5xANcoW8B5lwhzyNKoxFsXtYfxWDPcyLOTkexy/PXwpVaNtRO2BJi1kSay6q/X190j25PdWvcbujvoFP3xf5MBB7ogGNUO0F3JyAv3hgYR1VFzkoaC7Oo0Q8CwwjBXwhqeLFPGIZxgn5JzVBYo5XfWTdnp4XFLaQ8hIS5SOljMXLXUiWrZsr6SpXsnzvBIleaXK8IpL70qY2xWd2JUhaypZylTinKQkCUkJM36i032S5tUkSKrJkL+QLHkhU+ZC0rSF5Bn3iNLtEebaQyfaY8uyR5xijzg/HElyOMI8V+gkV/Q5pKgSSFFmj8KnjiLMG4VOGsWSMYowXRRbPibiZEyUmZjwaZh2jKharU5UvkiDnx/uDaRareZtaWKqs/wFiiTrojie8c7ZXhL69mMcVVvqEHbSPRb8jnpTIZNZUTCIG4WRI7TQqpLzSib/A+AZDcPPVGSf6LPb4h8BXqgyrSIOP130HY09mUDjQuhbgXYl7OSMXFEN8NA+/lDKaJfDEHToemBjRbgkBmOH1zXBxj5/lvPvJ6IQ87QKzu3jHJqN0Hwr9BFdcL7WRuaGYDBppKbGFHp+hD+iT+/3S+yHPd5fMcE/8luw2QD2Z/Tp0X6NXZzAvXqf0r1nZ6tbwF6+zzve07Oxwvf6fWTvnp+PHOALGDCPfQJstABfQR927DPgY8X4EgbUEz4FPn5l/+JaopZVlbIbnFzuaXHVcn9LacBf0n2R176P+/ZbY9hrpaqj5F9coXZkPv/BMQj++ID8B8e0/oNjBv/B8f78B158qP/geE/+Ay84yn9wvE//wTGX/+CY1n/g54St4o5Z/AcTlFD/wTGX/8DLivcfHHP7D7zseP/B8d79B35jCPwHx/z+Ay8/3n9wzO0/CGMH+w9c/OT+A68NWP/BMa3/wMuJ8x8cc/oPvMxw/8Exl//Ay4r2Hxwz+w/85HD/wTGb/8BLC/cfHHP5D/ysBP6DY37/gZ8f6T845vUf7OQG+w+Omf0HXnIC/8Exu//gOMR/8AkE/+mA/AefaP0Hnxj8B5/25z/w4kP9B5/25D/wgqP8B5/26T/4xOU/+DTtP+Djhq3qPrH4EyYoof6ET1z+BC8r3p/widuf4GXH+xM+7d2f4DeGwJ/wid+f4OXH+xM+kd2TiGIF+w9cvPB7E7uYsf6CT9P+ArZ2gfMffOL0H3iZ4f6DT1z+Ay8r2n/widl/4CeH+w8+sfkPvLRw/8EnLv+Bn5XAf/CJ33/g50f6Dz7x+g92coP9B5+Y/QdecgL/wado/wHtFm3kUPhamNVP8EMTvUKH4E7oouC9CW1teDa15v1FBF5TnIFrKcOTH7nAmvIMZOsq8t5oH8wWZ+FSj4BbrUO6rQgn4+NTzGvCk6SPoEeEY3nTvJL6RUSuW3zIHTVW6pgXd6aJIW/vBNE+qxLT0Zvi9FxpnlaPT+vFY8ybvA7AoQ496X+/fkfw2dL0VNF+3h7V0M1LRbUSbxQfdSDDw9m+BUQBO9TiITb/72MmI3ceI9iODAPnOqvSuSirx6rCjOZDHXrSQpTlq9KR9717kB0JBj6lMSN3U5yBS6tKzWNdDH22rQQf3+NLXDbfCc5HYBrfIN6/XiN3hj1EW5qeSsu68OMqzR+rZ63Wy+dijWmPXkE+9ibPLAH0VomDttLvJKx9HXrSskqy9OnxuaowLbavQk9ZZeXjXCAANwI8bFqpCrNr6GowEj4SzI9OMR7mF6nTReRx5Yh1I8LAqL6jFm5teSayx+CMqT62x+hkqRF0qA+7UaCnW5dS1/8vHK8jQcJHkqinR4jN1xPAGJ22ZwQIzt6zg07LUmUvcrauFGpurlWEVWGjPJXm4XVRxSaxcrEmXS2antM5S7ifF3Va9JhNTrfMx54kjEgwBwm9qqBIIeqggyQSDeKKSyfqrDdIUtEQtqWsTuVCrLPKdN5z42a9jfDXjlmXskqsoOnHtd8W4rYNYS9l+MNGY9CmNAVVt88+5Ek6T6O77aDYx/ZcFwym8w7rhMAL70Qc+eEpTn0D4SNczU52jpjiQPTYPYyT37l32acRyM42dgXuEb7xoFyl+X20F8lpTCO4SnOPF2n/xt3H+W6mzHK5b/ZqUKXfacyp9PsHG1PK+VoHr5qcZmwkPsSAKitPZij+KisHnqz94n+L8sr4THC4ZfZpRoznxm3CyHezR/xYF4XTAqeTgtcI+P7HvcYbbYEYaeN2Rb416WhjxEeM3Cs5LQjZLvFZFLOD8gz98ZuoCbaff9mg/f5azMwVr28iW28bdR2ztBBzP2avHHIb1RsiknQl87IX1QmhOerpRFVcv0o8mC/mf0QibjRI8AZf9XOaC/1+Yntu9+Q5CHVYmvIL16NfQsBztFGKrcBR5XhQ5fBpTgSs80lOWlzzIkj5LL5HdmQ3b1eMCzjNl1qW5anMKnFX3/Q4TesCQr+f5eY2BUk7aX4mMT9jL5Qkm5+Rm59hNnJoH6FhQ5sYjVmJXCxledHYVHvX6yf7IsdCtz2NemtWrS5bdTaT7EPGNAZstQhxJ5af2NGTEdQc2qRKp1X6txy9cYzg7uryDKrD5ehZ3RyvZKXTOUkzWcpK1pqrjSYjftNZz7VYydGjUzgrmp66MNLQh6hAxtB+jMaMvXyNm/bpSo7vsXkXc19fpEjzJQV7o8OGqaVRaxrPZ/OUNAm1lW2az1Mjy2VEbxuJoIbsJmMwv6dFU9EndWHKNm7Em+q2f8rUxvubqRMxf5a35sb3lZ3g40wZFafcTi0ysYwcB908R60SyiXirC0Pev1PFOSNUGwDCAYtxHumRHIp82UVOXB4iBvFrFXcW53XeQuuRPmdxIxabWXV2Gq/vlZ/otaxy0cPcy03b+T2Vu/DCwAYC1w3AOjxh2NgXehcmMiENHa3NChMOf7ZXeJdpipjh34R8d4uF92R1S0zVemebnQzH9Qb3bbOiQ3d1YViaikq+fta6vc7WQJatJO5Fv3LiJYbUVYDrOOCDL1s5Zigy0ro2MHP2aYbHUJM1yAB2pz1in60v3kMA3c29+tkAjJ6K+WhhG2lgjBNHwUO/j3MrQ4LZjN2ozG3OlSYzv5yo1Q2TGUSgdwpTtlvxPyvdaplE4FzRYJ21Ig20TgreNV268wb6Lgu5XcpzYbxosnCQGRGV7pN8MBrTJpkxJ/CKO7lO6zE22W6qH+LCH0l3rJGkRe9XpOYv7sSbyTktWChVLYS0XeUYOApaIU2AZ7CV2cB4HbIpaxyq7iHOu+gE1V6B5281oczUZ387XM/4XQYe6ck6bpNrVZpVcnkGyDWYgR1tJEDh130qsgXvmJThd7NRRa7mxsRN1plo8WBu5TqWZTPN1rOU8BmboTc6BUdPQ7sXgwhEBVyzzEUb51l6PbainAA9rLMAPkg2WUC8ar3Ao3XaHDgQWK/xoDUw9BoPG+PNU7MxvUiX6hY4pEA7eieRH9jN9BRIxVfj+Ma8jrNRRk/OHpwN2KMwK+iPDG52omQX0U5b+RooQeN9tTOeIBg1G5JUu9y/EQ+QjmCzuC96vCF1Oe1eqR/a8zY0SHCHHxbRBBNryhpsLHM0hepZbJtpdeqShfpXAC8MWPMo80PzDc/kA9+ILa2+/XoM0yromA0y8rzG+VsQ/XpA8hfNi5P6jBbV+pEyySNdNV7qOqUnPNWD1ajvaryYD+leQI4XfVRG7nx6SoH9I09Q6fDLjaCvOA0rfaoleKDNQlNU5FRNupGcg/tuo5NgMZb+/BrUVSkdbgBFczd60PH+HonoZ2D9K0sMvFehxacvUjY4DLUIN1/iHXsefsE1FErB6vYUWWR3keZ4kYEUMehF1q+pGpdwiLBp0xolfdmSnM9/gI087htaCRT+NwTCm9CWaSOdwdM0VvN1GqS47uHF7U2UduIVWBfgXJoqYReSlgDHzMdbdSAFduvKA/y3yqHDYYO4EaLGNfZCpoQJEQr6CtQtgL7vos5e7mL9rZ62Zr3PM2JEND/6qw47xyZz2V2qkWaA4+e/YZY7cRo4xcmgeZstquXaVnJ3AyDT+pt9Lwg1rLNz2TNz6TmZ5yPD9IbiV6yu0yiWbSHGbASb/X9jN6dfyT/SrzVlzMgKdIi8VXemcqo+FWua9Hxo3P0BtQH/eTdvVbdV0fXcpj1AknfFeQE3y7OyD/Ado3G+BWck/QmBQXC9zvUOHQnsJOXzxs8quK9uYU9hvL4hyfMdLY880hf7bOAWLYpTBzTUpiou9jDRBfSUU8MVqPbGuLY6w548ZtcF27/Xe5XkVYnlJVcKzLVdP9iQr0gpmgWrRAT6FKLvIKvLwe0tRpyYbkTOS1PgRvcAW1aJpjdrRN0MHLlJpwh+Qw4JuiUpB2z4s+GhihH4BOhbnVM387EIiJOf9yQwy/7JuemGYKuEA8Kf/AFYhcN2fXhYT2RXR52UgOvDgdCqkLqetFzHx3S5qTd6AHD2wKxEfedndjUt50DzYAuXlwmoBYvgbjqtZwtFnX+Sgpi9VqKrRwTNPRythOZ9Gp2oAGgi9lOerpr2X70wZxyLtJMvUg9qyq5KiI/waAw5ZwCO6h0AWFOKIe144M1GcYoSBsdOszh19bRce91kQ9eLWwZyNYItiYo14MdSPhCMAQLMqmO4cim0klk6ODe4SUd0idhQQN5h5Ru+B5iurrxb1JEZyDoFDyELt0hcXTsiKpq6oKp33Qx/b2HDBfVZ7qsnp5DBgrvL11K4Gu0XsRBX/liL5QBbgR0S5Ke66dVZGcZkRw1GrE11qsMf5yVvXr3mYBzI0YLPPjGv7WZhq9kJczr5XHYo+K0zq+8knlVe3ii83O4yY4aTbnVjK3XcY35DnzW2owis/l3UDpljwGNqph/h2dPDjahjQcwUTSf36vYi3ceE9qIABNF89SospmQy6WqUvN8oTma0JC8SR4ztsrznjKbKX+9Ft8g84aH/6/XAj6BBEPbs+9bFXuTywNt5bQC3emKhP4z+txiEhoYmzcFPRjMm8yf1iUOCsxzKRAP6YtUr2RyJd5sUvZYB6GX8GijvRJvNis7yGHorERv+MJC6pM6uQGVFbXkvJVkhQdez5hgx9zNiEFfKp1mWeRaxc+9lSOG9vRP46sCXMwYFSf1GsY74tw8YFfcuHZ8qxJILJMHFp52PBhXy7JQeeyFFw9vR4wNuNy+LEHC3HlLghO7knqV5iIyjMPD3BHjA05XsqzEqoiNNPQxt3qg8MIpbPc4Boop7JelzZn3PVevmUyWMoGlPXewHXVVEfnOB1W2l3BIlzkMYZCRptUNjMuqepDZs0E3WtV/z2VT0ejvySzCMFWnWdThqVFmsTQ+K73Ppmd/kavhWfX9NrtMlBV8xdHjN1LIxcYO2JVcKf1u75pciTeAZ8zFbVXtZRPjIgN6xuJNeChlwmDDupQJrxGFzI0T99S6RO/N/yGwoVFtHK1Vq8pqgv0QRB+h0bRfYS9fwOLXh0rU/ItWlNkAu62i/gJWdU/fwP4YPT4jevtkFt16fSPJvli37XPW2R8gXhVzmWJ/oLsBwb4sFmMYxVtpfqvIHksLM6lSlchm8+8EnaOWElaKEbYeiTbfgAi7HoiKjii3AXZioOXXW01u/Duoj9aDXkpQQEkE9unm0JmqqW8PnJlbPOQpWy81+OXaCOA2dpSKedHR48SuR1zqocWO43saW6wJxIOLtWA/o4s1gHB4sfD848tVZ984K8xCsbktT9UJujtIUf9Atf2BPRn2Wcy/1wEday3vKhGdUDzIuKfOj5TtjzAaeC3o5oScfza4bdM+NJH5VOibdBJiq7sPM0hnt40R+5jmNiaUd+v5XMqEbMTdmFGWHWUeU8xV8jRfjscvgm/SaI+HLtIv4z6Ea53A8HiCngLlgVz8LVEvEfSqqLOSGMIKHMToyIIgaFRwgYMaH18QhF1i3AkObLwDIQgbe2LvICc5tPfBu4eMNknWXGlY/+wKkF6GQXuaRmRHRP6lXp1R3n3zgsNvwk0jT7eJhdToym80DrNldOGoG0dbefSXqaaMwN6r2mnEVIu5q5TGfJC6PLKl9LMQbd3l989arZeYmt7SdeOAqo0uqqpt1fnMqNePROitFjeujeiGpn2fxrcR3RQRxgHmAB4E99FD3wQPh03Sci50QtraG819tHTklNmBppgud6JuBkjYCtAJrbuavPg8XdQo77WDFloaPbuDr6+o0RjS6Noh56nR5TNDSwF7ScXHbwSJFo47wItMzCVPa2rE/3/m3ra7bSPZGv0v0VdcXvQbXs43RZYT3ZElR5KTM2fWWVqMRNt8RiI1FGUn8/z5u2pXAyQbBYoAGpp8Mk2oi7sb/VJdtatq9AnVotYMuFBXjaMHZvTKWyaB4uiMx1pc7xH1ozTG/X4XcAz1/BWw6+n6pe92vgO1EjQS0HV/htsu0KGkNgGovJquZ4v7q9nzy0M/0+Sm+UiBAo99jaYBsqOmzJ5DuzVi+0hTzMeNAn1X3miwB20JIebhm4IIuG0S9yvb0mgeNXP2sOwCMrYo2QWaozZOdoGWLsTILrCvC21zpH81FFFE5A2vZ077dmi04w3JZi+PW1vel+ndP7+sli+Leyhxx4v798vV92lP87VY26X+hWf6heni/nP9C6N27Y7m6qenk+nTT9OnD/PFKZWCxWb823xxv/we8Y3hp16e7qZPX6ZPj/PFrP6p7/ip8d9j1Cow+3oavQxMp25u9ua/zWZPU4rjivgaN3v0Pyvp4785XBvGeVkQ/abvp6rTw7PkQ+dq6Hs6U1XrYdGP/aqjd+pMrFO0vXJPlJP0oK40yBnvZtP7h/ki5vJpsjTu/Y+Mv4qiBY691rHh8WOHVlzaEI6jdWS52Gxx43egf9ShjH1g6OGhsCuXf0TkTxuRI4MfZGRrK9I1lLhyKPjrgekxZPxRkmQc2IXV09fp1sL9MH9+pH3+w/QP+pLaRtxv+dc2K/rR/9rj9I97/2vjb7wMYqzLA0t/44tDz0Jre7oxpNJaR+jDqAMyeJL57GXGht9y6Q/cH+9mD10TaO6TFNWLsFiv5n2VjVZwRxuxfUdcHMJ2Q/2qc0WJ1zsBsUNyxb3WCXn2IF59gHF8q33MmYJ/YuA58pJ6Dur28LxiUkZtuuldb4t4A3kleL0jOGpHWubEoHqNLUKimhJ/ny6oDBdHBV9NF196bipy8cJaPJh5q0p835E/sDTjNGoMd0vP4odxH1x5coysUm9WZbNvZyOl+nmlnzGz/vwnKonu7+VIuZo6dnTcNxk/e9Oh3YtmDZJ7Ftce1KdTwxILvd6rCBmGDu1WpDw9cp9iJuzp1aEBmXsO6NHQFD4HdylexpKWXkVOWnJoxyLl05A7FTOxRvcO9Q6Bf60zw0LhO3VkWB6IPR2JkBCiW0eGp1XY15tI+RV6dGmMWRYj40KnrkROvbCna2PkYOjd1UjJGA7sbsysDJ26HCffwZ5eRkx80K9jAzIgHNKtoakQ+nVqYE6EQzoWIzlCp84x7a1/vpA9neJKKAPThxzamcgpH+RujZH7YU8HA7Ph+XLxRbusR4m27ZYxDYTfl6uu49uAclQJ6Tp+O8PROmgXy/vZCdqcUMmYL71Imy1Covpsejj498E6qgV2Hde2EdsL/LpPra0D8D/3rrTVsRvzxUj98ILfrCNPy2XHqhh74XtxI4NmQkRE2LXAsYEPYRns78FghkHHrnyf/X69vPvnrOPlaW8nvs9+f65kxoffutUP3OT/ctt77I39Lbb0kTbzw7bxKKA3ssaGG3OoI543r4B/mP77z5M+tKQW5CSvPynpYNhDDsi4R+Ooh2Ls4/Cg7fcUc6/39rvTPCqT4Utno6CM56iStEHVr3R9c7TaoL+svy5X83/3iAFt60Ig8U270jM2bU9X5MC0kbvCTbrS01p6wX8QkNJG78DyeRb3ZUDkf+Zt9K323NaTQTWe+8A+n32b9TiV9mN/8EJH7ABO68jTiIX+RyZS5YT7tOrqeWjpTCXwZfXwph35Opved3ZStvRhI+vN4FdxblfL73H6UIW3rVjgaCvicfpHr7Lt7bClsu0jj/7Tarle3i0jLYFtaW/WhdUMMvoGrLV0xUttiVgbuUvPGydwpJ32eePsfdttdj1dfeljZxL6UIt6M/CEOQZylvNmsGvz3vvp3XrZNX1XSx9q+97nWuibdejfy0VHN1hLJ7ygMYELV+X3cwoUqGOjesUAtMuJeXnepkl8XD7M73rMnT0oj7blP1Xy+5zQLUPaprx+nd3982k5X6w/MoExbq824p9q8eN36n6+Wvs00HHn0hEkr2rJb9AVOmXnD52zT7zakW2543eDKtSe1HOhRyTxa/2hH9hMtr5Bxd07VpOKR5hsNaX47aab/8nr2RfK6TZOf543wsfvEJdBHMAdfK1TXBxxKGWwZ8eGMgUP6lwUgmDfDnaPOzisTz1DDnp2Y7P1EXOaxnGEPm22v8+bH3nzDo7bs7fpkme49aLOvdYhL7s/Y+6g7ryuavd2T8lyovqpBiVCegXjUYQMSHuG8+1uD41kfmPcHl4zfdcL84x68W36EPttbX5h7n/hjd7Y/Xw162ki2NefbbFv0Il4t4dmQr6It4cDDOFRFIGGNTyeGvB6F7xSPU5PvFL9dh2ilFZ35NT58910PT1f9qEb7esT5bdi+ffT9fRh2ZuC9Gq3hLPSs9J7n5G77f8CHA4BUFQSRzBg47A4xE6MQOM4vDMDPBFtnYntijisM/2ZHFI/IlM5Du3CMC6H3JERyBwHdmcwq0Ds0Di0gsO6NIxXIHVnBGLBYV3pzSyQehGXWnBYB4a46KU+RPfRH9aNAU56qRexvfSHdSKCm17qzFh++sM6xWTbWCcKS+uVsa4b5Mj77RjkggM7MzQmR+xOlHCcwzrQlx4h4Y7KjzgMfi+ChIQ9HkPiMODDKRJSL0biSBzWpX4kCakbEVkSrdCF++gl5y9eTeeL2ao3SUKSEvVuereef+sx0K24jmqJfbYZcdD2XR56bJLt0GuJbwG9F29jP/b+XI0u4KPlLtzfobjJC3t3cvz+vXnX5s8w0sVdOztSR+8C/iou/lrk+OCj5It8rTvxEkb27ODYfXvrbpHhIu6cqyWODf2B1Lio0GuJY0P/18vsJS70WuLY0Fez9erPyMf8lsyx4T/fTRf9qS/tXSC5A9kuXbsRHf9IwF+7RvR2bklSYl4jNrXkPi4fHoYQC1qRblWUe1o+PAymFogD25ZXYmBduf0di1JarnOXvpHzaLQukfQ379Ifdw8v97Prh2UPE9SevrDYZxY7dicep3+cLBd3L6tVL6dxezcep3/cbQseuyPLxem3yF1YLmbf3gp87/pZr3VhWAmtrh1ZzR5m0+foa8KLfaM1sVou1+/6c7v2dGO5XA9ld3XpCKkO4xyOJPlNj8Q1JatEoszYc2tNGSohebzppVNbbKxxq9l0Peudyqi9Jyx4WEKj1zqyV2McvgNDQlSDM+f1jQTqaCNu4ODyUMUnlsqwI246e4HPnubPy/tefGwZuBcYY4vZD3zwwbsNOs5huxcwvoqE18saE+5jBIfUFuKNuDFBP0fSybaAR9XG9oInSsHzevr4FG8x1iLHWI77T5YYp6WXEfN0ieAT3EYVzSNYDdeIq3EHd7T12AS+qzrR+EQe7tFBk/loCHGrDT3JHVQT/PVuNNck0+QrPv/VjBKyd++SJCWqfbC/AtUKbbASJQ7dHqfpdHXfq1LYa73wkofEgXTpymo2fe6zc7d3oZY4NnQfMUPhITHxe7GfWewInWhdt1U8Ts+LmiDkL7Vqm8giLdrdcYt7h2iFPkRL7AD7Xy/T1ZSs57MBNq/WTmykv+GbGKS4t3ZluO7eoQuD1PfWLgzX4Pd3Qdh4rndJxr1dirKcv1ZM+R6M+2PK+1NEW4Z3xBjzfZ18Jcb8rbp5RxksPz2dTJ9+mj59mC9On++mDyDu/DZf3C+/x363+L2Xp7vp05fp0+N8Mat/7zt+r/dq69jtKKH2ezv6Wqj9W73hAarCvv7JZ9SbdYpuYXwhi/zeIHlZSx5/Kg7JKrC3I3JWgbd6Q/PFfD2fPvhiDh+W9z3uBfu65+X7EMxHlj/+20IW4bt/flktXxb33vcTeQYir3D1E/ebn3ibzvW7RL/Wn8YF+q2m4eBMEa/0rDVTxFt1cLkY7lXc18el3wx5Ig4geXTt1vCEGPu7tTchxtu9vaqbv9S3v7E6+q/tX3iDN4hpcz2QV7G3a3xKx+BXvNo14br26f6pd/DYpu1fwccSoBnmW9kalrYw85ffH+bPX2f3tLS/rKaP1xRbvbjrMfND5LXoey/6eSN6nM4MKUUv9WBwBfoOsKvxjwm9Hvjx4RMRsE9R6FbsbLbqWQa6Fbi8dfS27mzaxtw6vi6f+82A3dwbLKXn0L2uytUbxvzf/TaLUH2rZysLHAn4y8N6fjd9ZlsDIY2AvZI535I5MvybdY8g/Fbg63XfOkKvQ14uelq0Q7TLxRAj9utA+/mEQ5ReyjgQn4elLwixtuctGAha3mY5+cL5/J/91tym+cDNdofm8HsvRloTztHv/elou2MTl0QiIB3CHzkIah+/uYCzt7P8IJCkYESB6QWNCHT9Ic6p1US+jnl2devKzc159E4MOsdk+MJO9vRlNSWX4v+Z3fVL9xhKiKo89s3fJoISM7h1GNVwqFpTOk3XL88nvQzTMm6WeNffFN0N+ofZ8/P0S2T0j7XQyB0QJvVvVW6k3nehUMJfIDesCEnIDnv4oDaGaZx8sC3AWzPCjtOBARnj2jsg54yL3wFu1SdLn4yd/6Z3nr7DYQ/L9doGfoRsrwd3aXC+15ZOjZPx9dBuDcv5KndphKyvh3ant94g92SY3nAo6CG5XmXcLdle40MfkN9VRh47w+uhHYmQ41Xu0P4sr/E7MjBJqtyJMdKkHtqhXok65W7ES9V5KPjhyTrlnuxN1xmlG4F2/XG5fKDgb44D76EQCgJiGsCWi+Nv0/kDrbE4uI6Wi+mWxK6jK41XC3SfXyES7I20ESFvEgJEQr3JAxAf+O5E/uWFqNNkgu912200j3lB/Pww/dJxz5bxHFWShu51zdGKFhLdgrxnPPTBQB/jvfWj/qaNg+E+Tf98WE7vz2eLL+uvUUB7iQ+VxDebIl4T6nqZbemGl9brKnswZLZgRcFbixoN7JqOqpPlS1cbUwtgiLvz4t5sknzrcxFq6UG8ghf74EvnyxVPzh698C1jnirk0us7LbbhwDfYnBAdRrAalj1AP/LuFAPqUy1qLLB9doYGzN57wisAK7r8anY/H/zqK258JWwMwP+iv3nfUwXaQQtJTRUoHtQhR9kO0sGn2CtAn//V8fLchMgiIoELNkuiKsP82YNmvtv2P562SoAzIGFVMDCtoXYvXe+NEsxKzDggZ4t7BK0Nx7klaSSo/TJoiVgH5M46DGz3G5eEs+d16zCIT6vZt/ny5fk02hSoJI4+FXqHgEuoh0V+twJu20x7Ob/D1jE3VK89UJjb8vPn3iMqRev9zjKHDezr/plj3smjIH+c/jHdiBsRdNTx9jGEbzDW5IOhv4mG+94LHBv4+9X0ccNUiYX+M0ldbUsdqwu9sjjLuPtnbz4U7NNy/rxcRMgvIHeAxcdKJ7CnU41N/Hn5srqbkU27VyyYICCqbtzPy9KG6miIj0UaqzZNmbLzdi7P0Yp6S9yIoOHI6azjtUCuhY0I+HH6x/zx5TES4o20MSHPFzEh19JGhIzAskiAK1kjwv0+nUdceRtpcSE3t+GXh/XxajX989fpw0v33W6nddw8bY+zxXMf/ULAdLQjrceI7g5Sm02fHkaBW0uKCFV88z9SUqFeDuJm+6i2fJLbL7i5BdgRRA4IahYGrA388r4jAaYVM0saD2oPT3wb1liu+MPB97EMydh7W4cOhTrAvd2GObZ/+/DO9PQKtHVkiG/gcNB9vcZtqKO6jQ/vRi+/cVsf4jmO93ZAPHlOlg8vj736wS1jnjb4ZxiSIy8jzkD6wWk3N9/N6cX9OO9uqQtx18J+n/e0070OmEwLgwe4EjIGwPWfT4PxeRlvMQH6K5rbgAcqmQ2Ie5b59d3X2eO0P2Bu/9dZ8lt4mgu/+yD64Rllcm5DbUzRCFDFt366uB9wqdi0jko6nS8o8U3/K0UA6wgCB18otoYqto7eABxVQ38deF/9PMQ9SDt/HeZg3TzEO45m/npHBunlYSeGa+WvAx6mk4eIR9DID+gCGRavlt+jLFAIW7GwscZ8wAUihBv7+iCCD84XX8J0QbkCevn/BQExT5kvy9X84aGjqtOG6WgjbegIS+PWpq3/+fj78uHdHH7YaddYrta+sNj7bbFd5/j+TsgzpXs2q62GUT2KT08P89l9n4z4IaIjL0vIft9pIDE2rZy79exL50i+BtItMSOAvJ+tZ3fr2f1x5xjQBtBK1LRfsoMDwH5eLR/fP3fceRs4Scrn5z7xzgdA9IE+/bTkBlQvbYCKfADkrdovH6dd9bcG5C1pT9NAeYsGGfF//cLyGoBZVv8ArYPhXiOuh9K1RkHMYUK/s7gRQEMZvOh8yW+ghZyeV/xDYC6H7wjrZcz9oP0UvZo9P1Gp95PlYj37o6PK3i7nr3fGSgBjHrnhQI55uIl9iXfWHdiVoUef2IsoJ+GBHYh1MIodiXpOHtih4fuj2JVI2+WhnRi0e8odGL6ZtoMX99Ze7MedplF30Jf18v3Dy/PXHkU/mqAoh9jyM4nrWwh0d4z2peHqaPUSwPZO3n8wyM78sBaU/Zhhh8FkAm+M4dySNArU+9nn2Wo1u+9ufhPQVsJ6mt8OAjz7/JnY7d9mx3FXWS33bZbbfPGFyu8Nhr2RMwpMKoU4X3yJM8Re2Kjj6n8jynT2ssaczbBWYxZHGF8I+1wLGxnw++n84WUVFfbnjcjxwNPU+FgVaokDnmbI05bIccFfr6dfYiJ/ruSNB/tmNV08Tzko6WT5+DhfxzgcIXq9JfpuS3Sszoj65gCvyRi5gquTcCiejarZewBfT7I78NCW8Q47Uw4F3beU2D7k88WA4mHd4Pc9FGXgg47F1yBT6Ebf/JoSaJI3KK3m4bCvYZuNhppNvSOCxo0N86NnKlABOWRilgxJfn0Q/Pt6lsSDv5kpo8OfLe461wAQENdiRgH5sOx15d5ByDJGgfc4/YOscH3IRwLQx+kfJFdgHkWEvKW1dI3PEyCH0mJBFnWf69lzd/LLTtOous/dPxfL7w+z+y+ze8TUDzEvb+M72paMuPrBtuVq5PZlYaCQrfm/Z73Vo50uIA8DRWzN/z0bpiG9Br2//XUXcC1nFJj1HS3uTKnFjjVNhlbFEjD3rYh1EEQ/IDd0iA6fFF7aupI2PuR3s4d1L/pZO+57L3IU8MjjHmewkb191JHegI0zzBvEbzTGgP3bfP0VVqS7HvnNX+/F9/n669OO+JE7NV5/3qgrdFd6v6R7V31qD+4Eyfy8XE13ZY4J3995YyG/r8VFAx2qhHQ7PVt8XvakYgXNY6qGd9On6e/zh/l63n1flGAdBQK7D2k4Vq038pfn9WzVNQahDTVL6xWEcDjk5ePTiicL1bS7i4N8I/TOC32LDpzPvs0638le68CDFzpaB2ZPy7vOl18RdSVpNKg9grFaoMaKxjoYevdwrBbkPeOxDgZKLSNtIPR34+4eA6LHWjDHDh87uCurZffTW+yBFzTamLNd+bfpw8PFdLF8pqRzXXOUtyBnyd+nDw+LHcmjdaVvCFwL/qgxcAd3oldMWUsP4gWVHQz/38tFrP2GREXfb0K9FYFUPdJ1bTWMmvW269AFMI76DdjWKLStre4s9RCaFxEHXPAefclfcEbfzdbTedfqgoKAuHeQzlnX2xD1Tr0ujdE+X2D3otTtkB+w//fyTHWA3V0ra0XcUy/rAHY1W6/+7H7Jb0W8LW9E2HyqX3VWb1pxs8Ceak5n4P+zXMQF/m8WOCbwniXi24EPqRDfGXgvg9Ar2PvH6HWA733+H792LrTYit6LfPrar9piF/CrPy9mf6z7VVFox7/6czH7Yz2gkkKHLrx0LeLaCvtl1cfksh9qqIC8zO97qJF1s5jKxtf5l463510YR15A5wGrx6CVP/J9EC5uHwNW8PbqmrYnA6phtAiJqkaSHtWT37QPHitoQ0hObSO4PzJmlK7wd2/Ymap2/adV11vH3o5UYl9WD2/QiZ5V2ff2QC7MPgr8ASXM93ahvYr5KN3ofObtBd/v3HsdctvueT7/Z8fzb6dpzJ3y9znlxbnpnO6vCeiIRfXM97c7Nm1gXz5/nq1m98eP3Y2XEmAvbvrYs/DmQaCrxT0Y7pagUYCuZtP7PynlxvCpAFHPXlQssDv+/+n9PQrqnM+f17PFrGO6JQHy9P4eZXUeNgJHAd6Djiag7UtHOwjiU+eQYWm29osXPgjgava4/DaL+/5Z5ptMATorB+P1QkYDSASnk+kDisBFAUu8pruNwFGAr2erx/kixg62LSka1EAdIL/Sqk9O8u2WMZWB29t/VcLPFk8vXU/YENUR5H3H13Mvr/NYbg9Sa0z+8/wLvStotigGORT5RmRdX/L/USPB726Nb+LtaYY/BN6AzO9NnEMzvx8CuEfm9ybQvpnfDwH4suhaNLyJz8uIBG97Z2Im44/QjTug3G42cE/aVfSorlDnTbKB5ghy7io5ncZtZ0TaYHZ5owK6zi/zMFAXnSyJEq5Fd1viIdB+Xy4fZtNFhBfrJY33au9eViTk4/J53pHq3QTrZT1tZEWHez+7mz9OHyKMrJc03sjuQL3pxpx4BW4fEsUhkD8/LKfd68g0wULOeCM7X8QAOV+MCHE1e54Ne+GVhOjQnter+eJLhAFkQeONIee3HgaxEhEd3LojaaOJbd2HpnEQtEqpj/COa1njveb1kp9fzIad5uslmzwXs1HO9Armr/NIOL/N4wFtaLjIsfO0XHXfg+qWMfXcrnZBCUo/s2A4HG0A2csxGGItZgyQX2brd7PPU6pH2jOLiwj6y2x9z2IHpXM5sBMd7YMi4j7mwX3wylw5XSM8/WO9mobOf/L8tILcbhE1n8GX2ZYnqBuEo6pxp1Ha6fsBCUA6YuqR9+MQRP/6/tQXETeNgSicRufLL1+2jAx7cfHfDt5xdwH88v3px/ni/nq2Xh+KY6fJOHB2vLGHgKEG8aH4a1kXMJsmY8DBwTFfLt5P79bbVUJeRxW0jA/uHd89d63mr+HabjQCpOUL5Xkis1dHWEHD+NBOkYP1ZBPteTC2RsuxwIVs3MOAxYnKbgVFinXlk6NM36utu99hAAUJI4DtrB0EjWIqCM9QavrDOKoFdLW1H3IsP3ed/wK850bsWjx8L/cHqg0iNm49Bq7vlYt1ALrvs9+fKxmRMAqL4afZ8uuUUmF22YK3G8Vfn2ecA/vjaol//7btf3wNmdB2DIDz9Zzswji3P2xHdLyOL2w6Brx1ZjsgWmd2BBBP32y3SVW3iA/mfLn4ol3WDc92o9Eg/bZc3R9+CG03GgdSD31st1l8WBezL8v1nLgO/fWyPTLGAPy8nt3Xw9IB5E67sYBdvDz+Plv1gbbVcgRwVMBy9fR1uni3ms4XYM912vrbBMSH+svLbPUnTaGH2brLLAzaxQd2NfPmy+6j12w6BjwqaYukmKTo/zxd3D900H3l5mPBvFp+376NdEQZtB4L5G6o2mHQYsSpCYDYOosou5OwTuprwIS2owIMiuF1gMctxwLXxeAYNBoLkk8Z19WmJTUeAeLnH6d3/8RJ/rKadX2rQuMxICIHIKWZ6wJt0yg+pJvp6kuHmyn/+QgwKsf0p22+4atotlvFB7UdLNzp/AwbjgbtRgpnPxDddtsRAL7M77tdHeoW8cFsM0k7vciw4VjQrraoj4dhulp+HwvM9d3X2eO0Ix5uFBlSj10h5pZgtgbnt4+3J5fnnz5c3N78/eNpjeXbdDVHJtzWAdptGNNa/OPZxfHV34dB8YGQna2KgajbW4RStgG9vDw/Pb4YipS5syND/fvNwJd71KtmdyeQJz8fXw0Eefd12t1N0Anku+PBI3nfJ6SpG8jTk7MPx+dKF0OhsnuUBY0PWLssDmAWND7gLRv0ILyQMybcy08/ng+et3BKvwXQ2+Orq+OhRwDDvZ16I+CIoN+fXx7fDEQLMvq4MH86vfz5+PrngUC/sF9sXKhnF0PHs0/Kp24QP/46dPHPn76NvO7PLy9+GgjyYdkjiLwzyCgrnqC+xXonwMOPqgd2dI0L9frny6uhS+n5KzO0x4T59w8/Xp4PxdkrjKIb0JuzD6fXN8cfPg7Eut6Kkn4LuLcXxxeX17FA3yJL9rjQP306ezcQ78tLjxTDnUD+enwV4dbybboa5eLSuOh/+Hh1en19dnlxe3L57vSkK+ygecxL/9XxbzHQHK2m3dPuidL2v/f/ub7pPDlFvP9+Xvecoq8CDt6+v7Hcfjj+79vrk+Out4FG85hvf+eaORjUwFtrU+j+ubBz5YwGvqdm0BN813vsfuz9brMHQG9M6ffHn85vbk9/oqVw++On9+9Pr24/Xl6e316f/U/nCb5XWFyba/BjZxdnN2fH57cnV6fvzjqqa3tFjYr6+vTq19Or27OL95e3pGhcfrq5/dBRxzhIZORefLo6ho3h5G+3v53+eH158rfTm9uPV5c3lyddddD9suLi9kN0cvzx+Mez87ObjrelRvOYG/jWcRQD1XYVqj5bSVPq/l3wl0+nV3+/fX9+/FPH6dsC/19EgrptVnoaCf7/XF503OxacPdKEH8YYHkyfzi9vj7+qR943zbqND4++fn09ur0+rTjJixAOrqb3n2d3fZKkCCIfMV1cnxxctpx75IxL+561HzrDLfHOSfCXc3ue+Rg6gr39L9PT27f9V1kO4hnf8zubu+HLbPDQPOednp1ddnxeirB5g2NSl/0uqX2AH51+sun0+sIc4Shr2ZoNTr4q9NrUmd+PL456Whol7CvQGa8RUH0t4J+etHxZrsHeJ/8mF1hb6mMw3FznZTb+eLzcgzg8iH48fim31yhhpF1zIuTy3dnFz/d/nR5dXZ+ftwRVtB6JGyfLip187TrVJVExEVJSiTdak6vyEbzoesp12g+Crrzm+NbNrnfvjs7uTm77M642SdpDMxbF62Pl+cdVR1RxAgoe62a7ZYjYOpuqqybxUXz8+nxu9OrHpaZrYZxEZ1d9N2At1uOhOnqkj/87azrgSyKiHlNOj7528Xlb+en737qugG3QzsaVLG+VfQrbJPNlhC/Q76Q/e1/omMfP/14fnb9c8TePL38/jB//jpqF1qWwrZRsK/1a7+smItja05Fh7g9p4a8h5afeP2FeNvy5cXF6cnN7YfLdx23cklC1J3p+u8XHd2arZCOps9/Lu76DbMgcv+CvXz/Phbs5efPbwQ65mCPO9bBRP5w/NNZR+RoEveoJ0cXaE+3784+nF7Al3t+evFTV2WkXc7oeDuayyUJ8THC+HJ7dfnb9e2njx9Pr25/vPzUVYdqlxMf78np+fn1LX6gu9lIEDACQmaZXBx/OO09Q5syxsLJQ3Fz3JnxLIqIj/Ls3enFzdn7M3pff7857bGGQgnxMWLWDxjG3fbx8TVsDj3ule1y4uPFMAxbQA0RI6Hk9/b+6vhDj/EMJcTHSIYJ4orU9rueb16WExfv5dXHn48vbt9dHZ9d3J7+enpx0+M63yIk6p3l7Prk8tfTq673xX3Qju7nz3dUE7TflbFN9CsXevrzuL2gPCtv2oVtM+Xp1fXZ9Q21fH98dv7pquM839+zzV3y9mm2ekbFtfUtlXJ9WfXyTw7v8KeL41+Pz867nzkH9/RlMf02nT/0yWrfv4v08qLOSnpJbzkpz4nYFLMDD5T17w078PHq7AOd7uNMsKfV/HG6+vM/M7muTm+u/n7WNc5nb39Ws/Xqzz7FI3t34vrk+OI2+jJ5vpsubt96rVzfHF/dxO3Gerpaj9wFWXPhN3J7TdeNi64EI1lGXA1rw9xj2lZvf+YeQXERX51Wpqq+CqEkIaoR9ebm9MPHm17LsRXb0XS9nj0+rQcsR1H2K0QzbhCvFz6B3Jt1IKY22N6r+KrgwK72PqYP6+PAc7pH5/wmSJesWB3ihXRLV6w36sRgJaq9M5E0qB6dqpvE2yRWs7feJuomnfXAA3rRUxE8rBuN05HO3g/H13/rfZKLIuKe4denF8RIAbn29uT45vSny64oRRFxuexECe98gLfj8uTwnoe3LPfVXDvHt+eX1x0t5Hu6cD9dT28fls+9wjJ6dWFjWP7puGPQ+L5+zFFLhXbML9NeMeR9OnN2cXN6dXF83odVvqczKK+1mD7055f36cz52Yezm9vT/z45PX0XcZE8zB/n69vZH3ez2f3brZSLy5vb367Oejhr9nRlsVzfUuX4vodxn458PL66Po08v56mq+fZ206uKgLw9tezy/Pjm85hcft6s1qul3fLh9tv8+XDtE8F476duj75+fTD8e2Hs+sP3f3Ue3r0jByLt4/z58e+gQ69unN68unq7KZXjMy+3szuXlbz9YBomT6d+XRBDMZ4s+xlQaTFN5tatHfFXva0dY2/7Pdphh8vz89OhuiFLCCqbefH4wuKZBty4G2hOpr+Pl1QONvwk85Lfd3WfTbwkNuGT4bueZTzrRv828ubn7taAl7vxO1y/bWfMaB7V25Orz6cXRx3NAm39mE9Wz3OF9NeoacHgW+sUzBgry67T6W6Ycx16U0rw7BUVpR+g7iRdZgV6ISUgE+d7zQy5Ns7Ovpfel5lDoV+dfrx/OykY3xOA/Jq9vQwv5uOC/X65vji3fF556DjBtrn9XRxP33oGXK8F3C4pt7f/nh88jfQaT5dnfY7/kQZMVdaHyWjHdRRf/1CFvqKnnTcNaBwH/bv037B84dCb84P2Ph7hG/sNI2qD3382DnguQnmaPr01DPWeVfY/rf/4fRDdztjE+zj7HHZ85DoAPbj6dXZ5buuNHsB7tNsNV/ez3tFB7wCOJygN8c3n7oaG9Hmr2C43QAZaKllQSPaNbeQRjBkHgS3b1DWDtZhwVcHAR1kYt3CGsGmegjcQUbULbgRrKaHwB1gJt0CO9guegjUywETdTne/Oxvn93CN9QgewjQYcbKLbAxrJMHAR5ijtzGO9z+eBjcnmlXdrEOSrdyEND+psUtoENtiS1AA/3j5vjqp66Zx7hNVJX4oqOKuQXhaLropVh6EQcZHvqDG2AeOQhgL/PCNsABloU2gMEU+/Txp6vjd3499OAeNttHnXqfbn4mmuhJD5dZC7Kj6cv662yxnt/19pUJkl/LxleF1Pc8f9r6cjd98hUTB51HnTv0880N8Wr+vx4sqbaufF2vn25Xs//TmyXVuROXH49/+dRR7WtDv3ya/uull/LXGTaZ3iKP/Wr5MHvbsfe5fOPAX3OFx7cBfnV8cf2xcw2NVuir6eL5qWc5jc7gfyXC8OVF5E3oGxGEl4vRd6CWk6tKC/3x5+Prnqt5R8Rf7fxqgot4hO0KP4g7H60Xnk06Ivxgxvjp360DvlFcvihijTm7wKZsw/npr10jatrljIH37CIOXknOQLzZZppO7+9/+f70jm1zx3f//G32+zUFF64/eqJUDfnzywLGxlbIr4qKh/r3+Zf5Yn2zvPm+fD5ZPj49zB5ni/WPf65nz4fj3SMkJlJfSfVgUPT3EX9/2eUV0l9H/G2ueXrob/+5Hlpxeuu3fUWgA3+b/jriby8Xd9Ous3GrUVQkdGj88v3pYnk/O+G/7AKp0XosbKdfqGBBX2zceixsZ4tB4HzzsdBdzxb3sy5zXWg9FrZP9099gX26fxoR1bBBqwWMhbA+OvsirAVERLiaTdezH18+f+40cFutYmMhbWO6np4vn5/5dZx6C3MnbLKUEbD22oKbjcdC5qPVlov307v1sovOsl/OSHg7r+Bm45GQ9dlexPYj4KtU8V+r6IdhC2efuBHQDwM7IrabLcNUJ1h1w3iI7qddtG7664i/3axE+DqCuk10HNtFBQ/FoV0WHcdWfcBDYWQ2KorlPa2Ak+WCMhOcLu6W9xyWfDgoUcIIGFmV/zB7fp5+6TKPxfYj4Hu/oi+640K7EfD428XV7PlpuXjugyyQMB7Ga/AVzpiu0BPlRsaIOFEJ+13NrXs3e1hPB0CWxI2A/tfpat5Ftwwaxkb0af252yng28TFwYUQf/n+9D/P6/sea7fZPia+z9OXh/WuavLzdHH/0EV33CclJtbn+ZfFdD27v9mqvX4wxEbjiMiWL8wkPBQM/j727x+vVtMOV6atRvGQzBZ+QR/f3c2eehzzLQJGQPjjfHHfwaC2224EPCdV5caugLjhGIiq4oydEaHhCIg2np2Py4eHjnvpPikjYO2Lbiw8Py1X84eHDkpE2HIETF49OVk+Ps7XfQesKWQ8pAMxjowuVPMGohXFjYD+FyrweVXX9+yKdrv5COi66rRBw9iIuum0mzbxcHx+oEyQCzqju2kcQcOYiJbTtdFdkKBBZARdbCy+QTwEX2bLr9Pnr4cj8A3iIZgvOr0D/HnUX+8y/vjziL/+9K3Ljz99i/nbz7HoM69Jiof5YdnlUkB/Hfe3O5llfYO4CDrunXWTeCgQxLXj1ztZLj7PO7yXNgnxMP7r+9M7Ni5sWRY+Lh/mdx3Gbo+QqEi9nnw9/3cHpWu3XVQ8W709ma5nXzp5VOX2UfGxgtR5uDbN4qFZzab3PXS9nWYjobl4efy9izFOaBwT2Xr1p1/xl6unr9PF9cOy04BJ7ePho3oBDfEdrDxy+4j4vnby0OLPI/46LnQdfh5/H+/3193ttuv41tqX9efifLb4su6gLG/aRMTxMr/vgOBlfh/vt79NV93oqb5BPAQIyK3MXT/Ppp3IKkLj+Mi6Hga77frh+d/kh/nifvbHD//1f3/wYTo//NcPemIm5Q/JD5/ns4f75x/+6x8MNfnhbvlIhPEfkh/ul3cv+Pi//s9+nRH1if6Y//r/TX9I/pEmLp3YIktUovNJbov//d/kH5UU/IVO7KRQLjGJmTiVJzZxkyzPEpfoibYmyRI70U4leWImKi2TIskntkzKxE3KlMVVUCAP3+D31Q/JP1SaZI7a7/yuqv6ubql2WmpqqRKjJ0rvttSNlnqnpaGWOsnVRJndlqbR0uy0tNTSJM5OdKZ3WtpGS7vT0lFLK/2mw/iqictd4hI1SZVNskRNSq0TRQNs8jJRWaInWa4TldOQpzZRBY11lqiS/9VpovCOtCJhpUu0pjb0yCRqYgqdaOv/ln4nc3mi6cWlit574iauTHRBP2jLRJeJnuTGJSblNobEWp0nhsDaIjGGxDuXGEuQSpfQX0+KTCcmS8zEZCoxQOtMYkiuy/LElITOv+p6rNzOWGWtbzZrjHK20zL/IfmHTRNbTHK1O4vzRst8p2VBLZXUsmi0LHZaltRSnE1lo2W5O/dpKVgjNVVpc/YHC4dWgxVnlBKWzu7aUbQgrBMb0yPjEjspU5dYmolZnieWJojKXGKLxE3yvEwsTby8MIlLaTewLnEqcZNUZ4nDfHY2ccb/MX2m5gGq3XWpaLE5GVVzZardpalovblMbNxcnGp3dSqagC4XG7tm493pqmgOukJs3JywanfGKpqGrhQbN+es2p20imZiloqNm9NW7c5bRZMxU2Lj5sxVu1NX02TMxFmvm1NX705dTZMxE+e9bk5dHWz7NGcycd7jkUvSSalo50wnhaL9Uk1samj/4kPOGGyyGW1XepIWhnaplPetMkknTheJpT/OTcbzP3WY7WqiLE9tmvUZbXbG5EmW+b/NIKZMMtrrUpUnGfa6IslTfpCTVJfqJIcQ2jQMoaWXYKtvgL/IkpzElmmZ5NSDNHdJXtAPlWVC58HEqjwpINgVSaGqbzT9hEsKEmxtmRTWty5IcO7ypADeVCcFCaajpCh4rIrS/0mZogc6KRUjL7X/odJ4caWlv81cUrrqm6z6QOOQW5OUBR1JNktKDB7BTumUsplOVOpFq5Rkly5LVEqgHf1ECukuUWk1HCol8ZreR1rJV2nhf5J0Dv9J0ZhYGnqFN54nSmkvTRn/m8pWv4l5Ykv6K4yLKhKl8lpY4cdKKYyNMonCQYunWvlRUbrug6afyLVNlLb13+E3SLKm33D0RjUmS07y0Am0KKvOGupESUcujl1IMehFmShDP5FZEyyT3b1UQ8kx8jppbqZ6dzPVrOiIW7Fu7qZ6dzfVUHaMuBfr5naqd7dTjePfiJuxbu6nenc/1Tlai7uxbm6oendDJXrwP5QRt2M8Ew7G5nn4+jGYKNJSJobevVVJRpICYLubtS6hP8obbhkVmPGnubLima13DwKTApg4U0zzJDC7J4GB+m/FmWKaR4HZPQoMrgA2l24PpnkJMMEtACvEFkmeTbTdbWygk5uJLQwPaO5oQEgnLkmbdvT2MlqbGFO6CilHlyRo5s7QG3V5opxNsklZFIlyLskmWgWL1uwuO2NbNV/TXHVmd9UZrDqXJVZNdJbttm6uOrO76gxWncsTl03yPGjdXHVmd9UZrDpXJDabqAB4c9GZ3UVnsOhIB2q+iKYWY3YXhsHCyNLEmonOzW7rphpjdmevxezNVOLcJDXBja45e+3u7LWYvZkWWzdnr92dvRazNzPUugjel23OXrs7ey1mb2bF1s393Qb3WEy0zElvG89yuulnhcYpaiYmV4nK6FZX0rmb4TKQ5onKsMlouqCWSTZJaWfJeWsLNjS7O1stZmuuRATN2Wp3Z6vFbM21dF+zzdlqd2erxWzNTeKKSVHuNsYNki7bhswZ1Hc6+kk5sBPaCXKb2AlNVpXz3bxIVJ75vVfRtjvRGX1H13O6SJPaYydFsIva3SVgsQSKVEJUVIg0aR85XeELVf2+Koz/fUc7T04GmBJP6fehNxSKnpKWUmi8wCyhVm6S0q5VUH+sM4kqHEsOgO4uN4vlVogbNp7Vu2VBQ0E/roqczUCJKjBbCgJFpiFN1os0ySZWJapU1Te6wlYaPAsA7a5gl7Zuma65gN3uAna0IsuSdsws3x1211y/bnf9Oqzfkq4Ek2J3Crrm8nW7y9dh+ZYuycxE291NzzWXr9tdvg7LtxTfgmseFC4wRWHplaKC5ZpLz+0uPYelV4oKlmsuPbe79ByWXikqWK55UrjdZeJoMupUvPC65lHhdueuK9FavPG65lHhdidaBjtoKmpgWXOmZbszLVNoLd55s+ZUy3anWqbRWlTms+Zcy3bnWgZtJhVVtKw517LduUb0mX/oVJxrWXOuZbtzLYN1MxXnWtaca1lgCMzQWpxrmWAL3J1rWY7W4lzL8mqvKqzivcrU+xJZuHljyknZw87E39HWZLRNtEqTfGLISKroqSlsAGV34mZFu0mzOW+z3XmbYc9N88SWE+V2VZysOW+z3XmbY97K5u68OW/z3XmbY94qcd7mzXmb787bHPNWNnvnzXmb787b3LSr93lz3ua78zbHvFXirM+b8zbfnbc55q0SZ33enLf57rzNMW+VOOvz5rzNAyM25q0SZ30u2LF3p1qOPVKJsz5vzrV8d67l2CO1uMPmzbmW7861AnNNizts0Zxrxe5cKzDXtDhTi+ZcK3bnWoG5psWZWjTnWrE71wrskVqcqUVzrhW7c63AXNPiXCuac63YnWsF5poW51rRnGvF7lwrMNe0ONeK5lwrdudagbmmC2mN8TMouRk8U3SvpRsw2VL1hC68WpNyS2YtbdL6Ez2lS682GhZWlWg4i1yi4StS9IjsFSY3iYazqEjpYV5/V9TfldV3loySGTmxVP0VXbnzLE/IB4kGQWcDH0/7LlwIXp7dlVFgZVhLVw6TBq2bK6PYXRklVoZsJsEzA+uB02T3dRNLyrwmBd+SlRaqvs4zjKOZGGf8SJZ0FpkCtzEaGWrraKxp15yYkr6jp0UWnE/l7tIrsfSsuGngGUzljq+DepKTrRfWkCxvAQCnEH3l6A5lLX1F1w+HT8b3UTuLawr9Ha4fNniD5e4iL7HISVA5sXr31lhqj9NYw95KcoJasrgWRU4WcTWxgKtwmbKYenaSYWqpSWkVOmAmKXlGHTyuNJ/pf3gP2pFl36oy0a6sRj8j/6ijmZ4p+DhdojN4Xkt6SvPepFmiM3pfRVYmmv5ikqNFVkvJ6+/oN3LCSX87MWWR6JymviV8uJFSA7gQSnoHtBBwI9S4G+rwTe9udCU2utwlll5j8KaNH0EYASsbIY2OmRBAvEpXZonGJCVHic5xuTP0XUH3TEJD9kRWjgrYyWioC7Jymiy4zJW7+2iJfbSQnam481AHyTTMWwH2l9yVDJaMFBhRMrvxRGVTO1YPrQWDSUkjanLMQIM3ZOCk0IXBO8gTjUtxSh9olyq8eWKDenf/Ll3rtlI2t+9yd/susX3LF2o8Y3tu6o22lmyJYAWU1EnsGhm9kYJu/pZ8+wVu/vRuirJ6WtIrLGn6ljQshTaJhjJb0LQssTk3lt7uSVHm7b1sKiXl7s5bFu22ybK59ZaBh71st02WgpM99LKnrcZJfrbbfOs73161mxj5YSggcLanut3KyA9DAYFfPDXthkZ+GAoIfOOpbbc18sNQQOAfT127uZEfhgICH3matVsc+WF8kyPL3QaRtxsd+WEoIPC3p0W73ZEfhgICn3tatpoe+dkb2B75h7ZAgVkiWx/52X/O/KgarBdoKmUL70VtHWB0RpSgK5kJnKw4EUqtsNMTT402QcfOt0SX9ZFW5t4ppks60vKSntJAlqEWpUJajWonpSklLPSQAANOi0lTcaFLHJiQBANei0mVtNdJNJiQBwNqi0m1uEKYJUNnLr1fcnXbiS0r1xcxHugd2wmNG2RACTAp/V3mssSk1o+xIUflxGqil2U82iGwYP8AbcbIhiQl0WxCng2oM0a2JSmJahNybUCfMbI5iR9iaAyZjDT2LVPtTAr8OSgfRBtRpAulWZEYMsvwICkMUqi8qZCzAxqOIYagQJjkh8SEyErjNV/aN6EcqYyUIzp+tdeFWUlSE6egIykozgRYTUpTYIWrCd3wWAMsbQF9nZiDRaXjkgaWgzNIelSKK1qeGLXRw5nKqBKjoKGQDkn3v0lJGgvIi/hOp1CUXWJogU4sXQw0LV1oNtr4H4PxbWLzMjFQ6+j/BqNNZ4vRtOgLRy38b4TjGWx9mu9eZeLoahJs6AKTSQVUJgV2kjFpkqUTZYMVK7CZVEBnUuBtGKPEN6qFPSMgeihQN4wRlWZ+qOnEJDLQxuBJI5vjxdO8g/4ORgLpjcaQ38VYmxjij/D8xH290n62wAT7D5gghshQRGgNdCWBOaIC6ogCGQS0Kmk4/AakJnm6gzilAwV6AzYW4uQYU9S9KKuVZ2kNkjHUWMU9C+EE2w7YJUbmXfDDmm+x2QXrPS2hJcDHswGbwmqTGIsTKiUQWZJNaO0Z3Nf5E52clk5SW/J3IcRgYwOFxTiZBahrfybpzwp83ywt8DN2YknncrQbObpTk/VhUuRF+IPBRuiJMDJvVdfuSpgw6PcMvQ1nk2JCs82ACUF3GONw5IKJlxNh3Onwl4PdzzNd5D1cl1u/bBwNXkF7bJbWn0ilyumXMw3jPn2CKhLeS1XAclHgrRiZdsgPtbdfbBYZYyBHG2PgT9BtabSBAadARpPEka6bYfbqEE3AmlHgwZAQaZHwQ1rgmfJqWm4tDCzEWcmg4GTVNu0msClhOqSKX4+bFGkDQrBtGaYJy+vU6O0BARZrrAdDZhJgsWkJCHZS0nR3WfWpGoXEZJk8HiFvGFtgJisHRlCbAt6NApXGZPLEwkMcNs6bRWj3IWWmen/0nslBZPLU77SwRfjvtHckkcmSuEIhlmAHBDHH5C1TDQ8xaDmGFp8ITu48JcmwPl7SdzmGj+AU7GY3sM2Q49kUqWcuGdhmyiJc9wFDSIHzY2TrDD+EAkQWR5wvLmd+JZlsvA5By4K0QzINqsQQjRaWYlPY+hObXMKDJiAcKdNujlAC5UgFnCNlinZFWWAdqYB2pEAkMrLdhh9iH3BgDJPt1JttCqyDtLKJYlTI5JTBkkMXkazwwTZsq8lpt4aDkrRqMCgyUnrgqUxD05QKCE7KtvMjlMBwUgHFSYG01DJOAsdJBSQnBdqSKdPEqUnm5/5GgKDeBDwnBeaSKWWeusB0UgHVSdl2Up2ygkYSEJWUdXtGQLB8BFQlBfIRmeJdPsnzcASEm0vAVlLgCplSPm+Zy8STiPT1kjYxmjbEYt9c25sTDiZBMuQb+HAyWqilrT/RKQDFvMRVJg8vJgGBSdl234qywnoKeEUKtJ62URbCEQIakAKzp22eCUwgFVCBFNg9RmbF8ENckejqQ7cn2qZgSi1hmSXetk1giqedjVjoTH3nW5RLM+8DI7+uhhJAXg8DC0NKO3RJV6GCDDYpPAqkSaSwd5O5KYUVg6wluE1TC/Kf8CZrU1e3zepPMAfh7xApRv9P699Q9BupCdXfgOKk3B57hkByUgHLSTnT/lYFmpMKeE4KzCWr5MWPh2wUV4iYK+h2Ty+JIt9ws6UBxO231Bz34YCF7rWk59AjMqvS1kz+AwuevyKzkfKBHmy3UpNSGbxB8omU8L7RZKjuxs4p7zEivgkpWJpdIWXpv6NzTU/S3CRWwWtBQBS8Q8Ymllwkk5zUZUChv7G4OueJRTgCIUEIwYTo0vBBcUtcnNGSL86KvtOwfenE8lyl4wMXZ8Jk2R+SNt59GBLV7tZQAk1MBTwxBeaXJbZ506rosuoiRx6mjTmT4gstjw3tXzBnWlodE0cqI/w32K+M8vYja3RFczeGbXQJ6ZqwM4UIg40V7DJyANmMNscAoqBEBHQ0BYKZNU60HgiENBUw0pTb41TmhxQ64kgZMD4SBcEkhYXzi6JaNIcvZaQ7IS6IBg4hKqW/8NO0taWPJuK9ynDUkityilpSCETIESVaKgrtoVmmfEBO4aNv0klZWh9VwyExWD7eFkxhLQp23xSOe7LnKvha1STF7ge4WEOMXyNGKadDqmSZJaywjIZuyRQs5TDr00mmSsxcNSFaqDX0d2QzMznWME0EsvhQ5IfFOJAQi4HgTwBiE2thhaaTjqxdk4x+wdr6E1YfrRwcnkQ1sAiTIjO2LWAQo6b4BdqKHX7B5Qkdlr4pJnZKVypn6qfYMMgj5+pOuKz+Lq8AkKHct6h/I+OII51YutGh27RpEVvWZqb61azuRObqT5l/lTarfyErqjHh+DRaTjD6QUpehfnavPqJvP4JRKnRG7e5H6dwfgenMliQNpfNQXhY6SyGFnmaFoK6zP5JeoNk7aN7o0ss/M5kD7Z5pRJbeDuIXGoL3Ldpkyjgs3bhpSugZyoQLm0h36iZvElnLAXvwUozyaze3rfyymfAILDPFpXtx8LLgV2tcN4KRJGIrqb+bgELTmBwObHxCQb5TPsRVLhV0ChlZkN5YMOvVd7wW8LuR8ck2BAaA4mjyvrFzowCbwzO2X6jJgWF+LExGNoP5hldQXF8EVXB6ooiYWF3pb+zHB9OE8hk1VOoTPBLEylokpJNEp5ren1F4fkTtkBMu01sWZErbKnqTzRBHB2QpfEtiWlBp3E4loE2AmarlUnXSmDCqoAKq0BubbMWC2RYFbBhFdNhZf6KEviwKiDEKlBcyeeS5RR9GQiQoo2DMw/E1DYDbSaceQGTVYGcSgGT4koptvTkrFI4EBhK3utKTwZLg87NAs4k2rlS0G3oMMHemhP5pWCKkwYPw7A2BwU3IwVaQ4lOc+wKUGZxaKgJ2cJZySLfASg/mNe2VrYtlG2S4qBskxRIh5rs0sp64VLDfxeOSXCMZ3yMp/Ra0zJ8K8LtJeDoKrBuyYUqTay82icdLTPeeBUznIg3hOEliw6rs2nOyz23vNpxVNJhTIk9Evo7PcGCgYCcVjROSUdHcu38IcO1JruoP4iLgo2Emk3TOGFg24OHXsHElPnvWJmlN0/Ht0JcLC5A/ru8/kTySFlwdPTzJ5XWn1T1d3iXpG447Dj81NafeBOmp7Bz54nDVogPBRxd9FdQxMkTAIXZNQxMAfFZgcrsZC6rEqjPKuA+K7CZnUxnrR5C43L+/oHoYnar06kHtZfI737HpTcHDmTq7UXE48k9Jcz6NZLSuqHw90mGSz4f3Zn3r+GT4b/ntUK8CoMAUeuvF6RuWxzCVmN5aBiNaXlomDEdmTJhc3RYePzJQYSDK47+zesndPvUmJ4lfxeOW7BL53sYakrgfauA+K1A5XZGdogI1G8VcL9VvufmI5C/VcD+VuBzO3LpCXuswP9WAQFcgdLtWlx6eFgl2sG7SJ2nORADUGHPIh8ozRszoTAhCxJGioDfyuTq+JJEigtdYMhsEaIKdv58j4lHYJargFquQBZ3dPQIJ4dALlcBu1wVaTuLTAn8chUQzBUo404OLeeHNf2GDddpURHqiDxFNjOLxbnFbiD31SSnnEiqZI0ucSDE0sx3xi/iEFiwVxR77CwCeV0F7HUFPrqzqTjjBP66CgjsCpR0Z+UpK1DYVcBhV2Cl0xkiChAWTUBjVyCmu5ZsOExyh0JZ6M0VAfRHOjaZaU7ODA0tsqTvmuZzi5dFZxG9GA0ykrMge5If0Dq+NYRIg9VZ7HE9FIIGFbDQFYjljn5aMAgLRHQVMNEVuOWtL0tYSAEZXZX7jKWlsJACurhiTriVF1IpHI4Bj1uVeyZ8KUz4gMWsQBwG5c1NbB5oXKUw4QOmsSp5whfiGJbChA9Iv6rkCV+KuxkeGihoJatsoLAwF8ay7lYygVlNQIzDH+f+8pYZy8oyDDQwvWjN6hwO99R4myYTePB/WPoySrkCBTp1zttlipIpgQTGYaVQC+XVCuJK85pJXWV1yUsL36FClhW2K+KqBstQRndYKHZgXjuoU5q4qehVQTRXqA9EyoABJCdV2kEpdEVCljw9IQ6Tg8WU2+b1p6J+WlbfZWn1HQwgBWVKgwKUW+JyGo/PwQSCX0N2npKQsjJMSDP/G+GLDTaisj39mCqFwzvgSStQn11WiIwgPASkDFlGCHlpmZBVkO1FZ/5iTncXDe2QDyCyohuEGHibmIKPh7Yv8BwdiOzE0M1w7JPSncGooorEwQHkyAcFwyltouR+mJAiAOItFAFmd9JXzPZJ6BJkYApw4Hbm4d4Y8LwVmNttJlWB6a0CqrcCebvNpCqQvVXA9tbM9hZz9GmB7a0DtrdOVbtJVgtsbx2wvTXI246sUs3tnR+yQYt4shZUuEJnXlPg2a6ZCoj3x+Qsx257ijUtfGCNK0QGkw644xpU8BaTgxa44zrgjmtQwR2ZxpomB37IbpTEIMmT968QD4ojFsrCb1N5XnlaCvrET8Hxpvur8ltTqqq5T8uc5r7i2KIyZdKiQQ6pAqRAEuqqXYvM3JovPDm8BgoXPjaf0v7D9stMa1jpFFJNOVixiQrnYDYuKdEdG2tzv6FkpM5hOyzhzUirpgU79Og7i4RZNnEFsxLpu6z+lFfpdtCbInGUgwq3N4de0WbrcGtDaFSpq9/CRIFcbL10GS6rC6Ir2TiXONjw8EuccYsiJZByK7zk6oDWr8HSz+SAen4IxYqsLhzvRanQNAgmaa1skb3F4O5N+weChHJc+XEnNAaXfwuiF6tdZDSgfd5/R6fNJMuSjC0wxKZJaQlQpp0MtxnyV5BGN8mINAWKHz8kuaSZZ/B2lrrR3yC1FAICiP8mWAD5ISYlJaxEnrIcGU5T69jpS7dSH4aj2cqSZsQAoVeInGbsUSi8/xdBWjBepKZ2Mtrcb/J0q+bJT8ZNNrCmpor2ShE0xRMn98uAiDpMqKU5TCOtJxTx6v2CtGOwCwinHv8qTz6a1RmMLHTaZDCy0ITJYGRBCiqsA9JJMhhZKAkaBW6pSZmaJONla8okw+8XNOawstC0zbCLkQMCBjx6Gr6HIEkX4ioyLUUc8DP2kbBHi8INoBZRQrSNzQQWJV06P9iZz69GKggnSTMTrMHaemKQ8I/icHjoaP3RyiOjs4LbnTy/xm8dJSxUcLvTYkPbDN1OEX1VJBkskAghgMM1paHAhZysNhknWzU2ydjhShoBzCPcAmzoJIN5hP6FDSYctiA7GaJJMtmywQ83CQy2Dxm4vDKzddwQUYyZvRkcqAUZxY0nqpH6CWpbCCfISYY4kqwlS1zaPKt1EHiiEdyRtSSKU+lWMMdWFAeGn1ZHHYRI1HoOM6zv21CH2NNC2wrHJGQc9YceMgctsEXpINpEK85UWUq6nBbSrOogIEQrzlYpTnTOtAp/m5/gRNWD3p9n3h/LHDp/8vGk1tWchtUUKjTsdfDXMWsSpwYF1GJ2a08qUdiWLQx5pKJbWBNzWlQ5tuVU+dmNqQD2PREWeP6SGolw2EmJpzmiDLMkg0+HaELkEuPcxBmsx+SLzaCeEpYMtOcCn7LqNyzwaZVksC0DAayRkOwqfBnWqwlJqToIn9GIhslkXiw/LOHUzZkeQh5gY/wHtp5r591f8G7jISnp6A8Fpmpo6nBQIw9kWRnISyjnil2SmkPVtb87GV0zMchtptntquEU1ohJtuCJ0CdvMqddmkMishyz1eDCkNn6O4e5AI+l9b+W4WZFUjKeFviUewQZXMu0weNiVRA7GRcrGo8M4MvcJRkuVviJjONC6aiz3vibZfVP4IhhKXn9qeDEAOF7ClRKRB0RWuHyzQ9dlXa1sSxYl4TzXrFTxPkrL8WsoEPkzuEbL0aEE1ZbH4Kd5VUINq6pOFhxd8LM13VkCc1KtpGzZwk7J7ELNisJxy7oWXil+A4ricLDEfWM63WmnE+DkLGHIi3xSjXSC/KY8aeyWiG4rtG+l+GKSGpSxhHftLpwYcMKgW+LFOHMpwgIbwNBfJdGWBUytzevV/zQJ/BKPInBJPVt1VPZSO2E364onNcAwetngymWFNO8K6qT9YoJj8bWhbW+p4JjSOoDCMv0hjMEEGqMRenlZogmh+oFr35KTkgEnKEF3O22aMy9QAVEXFhGTkhpS+eEQ3AQeZ2PsvOyi01zilqe/rwpI+UrJh9fVnBH1nb7yr4ZFvhIaBs16BLU5iL1l3Z/vcY1gFlcpMzzvTwDJ5o7mdWf8mqAiBlG34UdD3QuxLO1+FW0EACngwA4zdmmCzk5qpBvWgfBaxrBVy0p+4WU0zrMOY3Yqxa/ipbSTod5pznxdCnrT3io2XliX7Ejw2tM+8nGopwhTRRpfVmp+c8oCs+BtZnhjlPStlni9hKqVo0k13uqGwhBYTrM/ou4rAzc1DA5nZbS/4b5fxGWldEqFYwYUgbgMAUwx3HJJmYtJQEOswAjzCmT88xpKQ9wmAgYYUuZnGqOH7Ijk0wKjTwSZe4zQCCrRUouHwRmpeRwx9un/MYZKLjkXc9gMSPfe8kR0pT1m7YrOn3A/KEyDiHiYIHpdgeb1sL6CnMEI2iJqHmSpUYLCyyIctKIM2qZNUIyXx3EJWmj9swaIZ+vDqKKNAJ7cjlNHj+sFyjeGRmS+EKuc35nuk5FAiJYvVA3Dh9+abQvb1Ylvysyu/K7ci5coEHIkebswfK7EiKOdBBxpI3dM9TC+gqihDSCc3JoA813LaT71UE0jzbZvnclrK8gAkcjoiaX0wr6h2EcQsHX6dzH4iPZwyY0AcSEwla5jQrae4u0eqf1LpzD6kMbAxt9Gm8qWFVmz6oSIn10EOmjDa8q0VOkhRTDOgjB0XaPt00LMTg6iMHRiKnJ5chzfsgjXMCoykF3dT4l5C+yIE9t0sA4zHf4IBHYC3Nm7i3L1FfO4pRzzHqoUgUxPtruOayEEB8dhPhozmUs+/W1EOKjgxAfzSmLW16REOOjgxgfjZidXI4z8A9Zaa2jfZnCRrxJMtnDSM+JhqC2cYCHoxg+7RNM5Ijwp7Mip/B9/52TQnx1EEKkbbtLSgsRRDqIINII1snlbIb8sLavbMKZ6ywiSA+HqzGnHyOrGC1Jn+OpTg9VJ3tigxNKi+RS1icdBA/pPcFDWgge0kHwkObMw2KoAT9761ADHYQnaZe2u7W0EJ6kg/AkjcicFia1FpIV6yCURyM0p4XhrIVYHh3E8mjE5rQwkf3D6poExwgyPtdXRqauWbBo2E+Mw1lPKIaSmMRwT278mkwkLkDsN/62ZJEqEBsFPMzkImEicQYaMd+MbFFdHZlHTF5gogr7p+AKl0ggU/jrZE5GUuHqGEQjaQ44anGlCXmXdRBSoxEi08IT1UJMjQ5iajTHzcg8US1kX9ZByItGBEsu5/f0Dz2zbFP2QKkqJx70qpxeGHIwOrZeIG13rlX1AXHtlEtQc5q/0MgaRNFot2f1C0E0Ogii0W4Pr0wLiZ11EKWgsz28Mi3kdtZB9IAGaT+Xs4fyQyGLG6Z1obfyr3l1FcSJLPXZ2cgxYyeINsc0JUoaGf/shKz0DpZBIpkiErxQ4RwO4gl0tuesFlJJ64BDr7N9Z7XAodcBh16DEp/JvBn/EL6Ucm8CGzht6b91BhvDhGXr7THQKFHHiPRNSgvCdHDD3i3k14BxjypCIbCH8jyxca8gPwHn0SFdqUh9fhsaZ8V3CBz1sMPo0iefYWM2kdHZcF04ttJyIhw20FGcew4jOpkMcg6bIDWBWbJFnuRM+6VPppKSG+V/I+ebanieBmEGOmsnsGohykAHUQY6y/a9ZKkGT7DNIGggN/I9Lsu3EoqC1EdhyPUKYS4f0m9V6qpBlpoir2gSFAuVIS0avb6cs5oQdRCnMVkCqXIhEqCGQIO9Z09ibi1k5tYB81+DyJ/L4RRaYP7rgPmv87Q9OlwL+bl1wFPXoJ3ncsIcLfDUdcBT1/meHUFI0q0DvrYG/To3svIt8LV1wNfWORccIW8vpWwNBAjHasDX1nl7hL4W+No64Gtr0K9zK2Zd0wJfWwd8bc2UbOKiCaQjIWW3DqjVGlRpKv8mKLACtVoH1GoNpjR5CCwoCYEAYRoG1GoNpnQus2/9QxhSVAL+UeG2krmAZk7ZaDizB7LalmWdCCX3yZfI0IaETAGUgKStwY1umY9CGnAdcKk1uNGUHEXSUzlLOOJJE5CGdMmhtaQ/oEQgURYRqwo2HEqtKR9aSw4njpVxfr8C3YlCa7PSlwaklwDGJkWLghlCQTTw5aaF4/p85DxF8CvFuKCQHqh/iKx1pioiV+i6dBxdx/AzYCtBPMnw/M609N4uKlym4NACe8RXbOUMvumE3EYawafEv9Ec/Ik4XHSJGQMpTN6UO4uA42RMQYCyXKaPvJYomUeEMI5MR5IexOgiRhSF8ohHwsG3hMRygUEK++NCguTnAFcGdnPrKac5O1LpXsxxy5RQnaNv8QkkVTpAuRZjnuQOZfKIhgzuaUq+CU7CR4kCnfG/nzv8RF4kpM9yqcccwbcpkRcQfEtjTsFQjDNH8C2+y1KPOIeLFPI4+pZAIfwWUkAV4+/QjZI+ZbWUvP67ov6urDCjQCSlOEGFSPqi/gHMHP5U/wAuVRCR1z+Q1+OEEGyMIkhuAMyFIpO8UPxywiUUbOmIDsjlTD/8kGnCzlfVpDRHwImEISiK6CrKTsGlM6HUKqwU71skNg9zm1FchOQQKQUTrsgSQM0cU2PJAF9yuUpXFXak/GJc5ZPYaZh2IDFhyVBqBlYJHfKlplg8hV8ydK/nUHXET3PRTMTE8VzMq0grV3n8qc4b6SO0LWgfsE6JNXjNwJCMBZJ7ZZOxGNSUpFg1g2GBIx+zXIM4AP8xh86lE+Kw0W7p1xsXpiT+osqxLdWR8PUqg84Px3iGUHTnh85izhI/y/JeATaerQbfF7q0CI9LERRGBChuS15ZjLvDmNFPZFzdkjzUnh5eQrFV7NrCj1F+KUxaivXPsRshZw/H+FPetMJW1UtRiZT4e3mR1Z/y+u94ULIk53Kk9B0GvqB1zpkCUANVM86c3wBVfCzrnyjrn+CEAnQb5bKk1GBTR7X0HPciTf3LK1CXlJoWfsejT8b/fsGFSbVLitTVT7P6E95eXiSUiSQFGYd2Z/8UlUnpPRY+h4JNClX/Btcmzcuk4OKk+K4a7oLfGT7lFRa8vSbnMQjt0YjUKeSCIFoI7dFBaI9GpE6hxSLtWgjt0UFoj0YATSGHUvJDcGly6wMiqKwDbgPW3/1UUVUeoPIgfNhRaCYbuSk/tMYlLS2dNy/RejOgjLqaM0l2IaYy0Q9h8RHxiRLPGdZVOOKAeAnYuclK5FIOY3c+vJRyNnJYqcM9FCQpQ5/wd2WWFJxpJaP4Ww5Hpu8gz9Hf5XULkHUN/R2KrVMFXpNWT1GlgH63MP43wlEOlFCEGRUtd64i367Nxvlp6RzlTHwaiTEyX5ytjgf0ty2K5cbrp3QYBa5Y9GcFrliNtHE6CHfSiF6iJSROH0G5DcKdNKKXihb7TuHNu1R+11vlKUUdU2yp8JSPJ9c+d22ZV2GxvBmDvkLzAYwp2kyYx1UUnH6QfE4OOzR/spgtNWkF2RUwJEjQxRQP2rwM+By5SQrDhkn6VHDTglmKhUkKGM/xZ1b5XygsU1oa6zpQ2cv2zG5aiOHSQQyXLtWee5sQw6WDGC6NmCzy10nvRQji0kEQly7NnoufEMSlgyAuXbZnu9ZCDJcOYrg0Qn/aLn5C7QYdxArpMttz8ROChXQQLKQRP1NQzKgkQLg5BgE3GvEznGWzTt26ESCsriDgRiN+hjKViW+xrPhQcMty3jPsYPAnIjCW+RM+8ov9LGyoI/eikBGNVxp57g1XQiGvMK8vulNg38N2AaIY0YuROxzpGkjHILebxiVAo6Y4nYWc6awARYMqKRW2ynRWoFQvnjrFn8IBCQsap613cSMEEJkggMggHqiQSahGCCAyQQCRSXldieetEcpFmCDkxyCCp3DiwuSHuso9W6cz3aQs3yRiJaowpQiF8siscjqqmCReoLaxU3kIJihpnHIKN6lighEqT5ggRMWkvEaJXzvJXFAeOK0TQtPZ6tl5lKOH/ZmkyKPCEJE0fXKQ3G/6ZKbgqVg657d6uhhaZmuCdovAFExFcH/o+oaJRczrAg4qYs/ztMMH+JtKnRRQTOjWV2Du8qecU42EHQ4KMSNWopCTHPNDV13rcK/KEmhPyBiKxE/0O1UWJ9an/Ht2uU8FRNWoOdFTnnmeueKLFmVkR8RIUceZkt2Gg7XKVFXKF7YBsDTKKlELVXUgCxDRUL1S5ThVCKV4L/wQp+RWRlShBQ8BBFZovan/hQLrnlQNTsaVJQX0MkoTU6DaksqSIlP+xwvOhFGW4bAGFarT9qhtI5T+MEHshUHwA8W9iK9FqFMdREsYBD8UcgppfgjtgeLJ4Oek0A1wCinSCpTCgvQWTntfZFsVODgslO4m8JdO0tQkRZb5FFjkQTHQfgs468g2UiCysFAuxBzshYiHKKiGQU4k5F3MStgMgwAKg3gIWE+kAu9ShfdgMwTFHzSv5m4sVNQwQUiAAfW85Yg3QkUNE3DVDRjUuFQ3AlqNUFHDBIxrA/5xkcvzRjV1DBMQlo0nLCeOjG7B/icUvjAB79eovP08UzvcD1ZLaUtAuCmF1hREWQX3gwjO1afM81eKPK8/FfXTkjkfSYEsbFkebngBr9iAJkz6tnRcCbxiE/CKDXjChUxt4IebXOR1bnEOCyISAO/pZEHLkfycIsQK+JToaYFiNeS4KwrRgG0CmrIB65jI8RIc7XPFWxBJYCYnayvhcnx0kH+XYsSCXwm4zAaMYcryJv6KsLICirEBZbgoxNKPRuAYm4BjbMAZJmupKEBYWgHJ2IAzXJSyoiOQjE1AMjbgDNNJJQoQ1lZAMjbgDBelPHMEkrEJSMYGFF7al0UBwrEScH4NOLxFKRZ0MQLp1wSkXwMOL6XoEwU0XT8mIP0akHgpjbEkQGD9moD1a0DiLeSMcEZg/ZqA9WvAraU0FaIAYSYGZFwDcm1RyjNRYOOagI1rwK4t5ThoI9BxTUDHNWDXkvYiIhBmYkDHNWDXlqk8E/GQ005mbsPMQVEqCuhVaVoV1Mq5aGjhdzoHgxSsErTdpJ6Rk5TQ6JUxIaxgfoNMSzksRVjC/A7YtwZsWrLwiwKE+R3Qbw3YtGXaMruE+R3Qbw3YtKVc+MkI9FsT0G8N6K6lTL/lhxTIjwqTfHkttmg+ORfDJQ8FSOkUu4WqFmRzc2VVHDVHLZuSCsQinIfcWAUyE9FpW4KHq0IirgmIuAbE2lKmsfJDaOPkCQTZlyArZFQEy4JjWSgwH7WakMsv5wJthU9iivzZUEZxu8fJSdXYSlVVk6RE2ZAcYg3WLDi8pVwb3D8sUd0XuOyEM+mhWkup8XuoGJOUyvnKMiXdC+hT+MvBYgf5t5Src/ND8G0oEQWGi0yP/M6Ip0Fjw2V+OEKWnHyZrdiwNCIW9TX5PZYYkULUgwISsgHrt5QN9fywiorExQ/1w8CpTDgdY+kSJskbxfcFcnuUhY8V5EQEZCxTHGJG9z3kUqXYXTaO8rWuioPcimpEWCWsxEUVcch5WGEOLzm7R+4JUnQ3I+ONmVBBgU20b87R/GQOB02dUBUwAVFcYAEXKWUHLVABg+jKpUb4RlkmpY+1p0/aR0mWHGvfuPkF7GkDNnQps/P4ITsFLF+kkcoCaZWQQw8+Lc1Xa516D0VaZWpyVaQkVZTlZA7gPeNv+EpNFElcqY138rNA5WONCmR6VPCv0UWa3kJFkk3pnbFXXlUuCwUTNRcVyL2jAp/yzaeiKjAFDzDF08AoAscVCjWyXw/GOfo771EvvJ+6JD8YPBaU55n9FHTjLEzmGxTImE0u+cJuviuq78AyoA4V8KNTHhu+sOPvcGHHpxpoyZYLWiw6q79DFs+CPhUeVQlPCQ1OaThpaWOxBweY3XPtt8L5FVDTDajmiP3KKYozEMDlQBHYXlZVlMg2ZmH+oTlKF3DenchA5D9RogVbhPeIgNVuwCEn+5FgoOeHtUqgsf/QdgAuKbld2YyX+xytrAlY7J/WlxLgEtW8h9NtCJHHxNwNcQUHqttjIBWo7Cagshun9tz3BCq7Cajsxuk99z2ntwdmQ17e6EN886O8RJu+546TyviLHz3kix+RCPji1xyYgCFvnNlz8XOm58UvYKEbkMrbLn4CC90ELHQDUnnbxU9goZuAhW5AKm+7+AksdBOw0I3L91z8hMILJqCMG1fsufgJnHETcMaNK/dc/ATOuAk44yZL91z8BM64CTjjJlN7Ln6ZsAoCJrfJ9J6Ln0DlNgGV22Rmz8VPoHKbgMptMrvn4iekQzcBT9lkbs/FTyAqm4CobLJsz8VPICqbgKhssnzPvU1Ih24CArHJij33Njx8k3tbwEs2Wbnn3ibwkk3ASzZ5uufeJvCSTcBLNrnac28TeMkm4CUb8IxRqhmhdIGAqvIB1Y7YqrTGXg/trA/2ZW9OqbQ/8VDCEbs+1dEu4MGkyMoCRzdZMkvs0ZQCDBnYENFfIiFSIzOsCajQBszmUk6IxA8pKTe4m3VMLJQw6DV1hKvlSqKktlXlK5AQg2HlyHZE7h4KOmSvQInMRnAUGF8OI4QarN28vSqaETjXJuBcG86RLYcIGIF0bQLStck5xiCXaLpGIF2bgHRtwKFWdDNtOP+NwLk2AefacDrrLE2sqQvbbgQIZ0hAujbgUJOxWHItCKRrE5CuDeezpsIIggAhn7UJqNKGqdKU6Yru3sEYClxpE3ClDeedpvB4SYBwhgRMUQOyGc1NIbbZCImnTcBOMyCbUWiLNA0KjgyA+0p7XQ63KFQdIN4X5a93KHqg4NwiPjcyCIK7ydW3jQ5v3gHDzYCwRlxuEYQwmQOGmwEXSxExU/ByF8JkDshbhnNKU8q5pk5dcbc4MTnS/aPqEswiKDFHlhnlyq3oVoUcjXQAIEkyols3Eb0KRWqKUNMMmFum4IxyUvIyfrZVYJCzXpRbXkmGgOsmktuUqvQQUiIwFz7PAui3Bpu1gsaN47CwfrdTKGtQqFD3DkhiBuyo0sjGEzxEiClZffYEOPpKvNqnejfYqBHWTLPLYZyVQ8SRUHzTBBQts4eiZQSKlgkoWgaMq7ZNVqBomYCiZcC4asmYYwSKlgkoWgaMq7KFi4KHPhc757jmmi9kUYClx+dSy9IquSsRc3WmfPl3jvalJI2cNou4rQ6RegXSJxvPkgOjgal2PPtB9tW++mKOKy+x5pAWBPyHEvGpRLorKzZdUlpTf7L1J1d/8ry+0ub1V4VExDMBC82Ue45SgYVmAhaa8ZnExXzw/HCrXDsn0dM+wxRFXHACeyKMEOeU3ZebzMGlrYpQly4Vyg+bgNJmwFBryX9sBEqbCShtBgy1kqqKN3Os8kOECUxoeGNkQg7hBJsY+G7EDhLyffHDKhTRVAGFdSgiJ5skdgqPO5kkEXpL86bEbKNZWcJ4QHTjEkYXMhGXyLrB3xXcIgQa7GCc+ZrShVFd1hCooE4ExDULIlrpxGSVVmCu2YC5ZkFEKzPRC2YF5poNmGsWRDRKmCYiaG43NmCuWZDHKHhIRNBUJ2zANrNgj1GqUyEtDj/kpG4IcqKDqvQUczJ9s3G2TLkMKDlyLE4sz7JRVakog7zqxKExXHSHCNNw5eCYQFYhTbzFvCpVhqSDIJptEchIJq9MZMIjeSU7HPAJDgdycDB/JzVh123QdbgP5BrmNm0qMTYgnlnOfyynN7Bpc+XbgGJlQZkqSftqnjb8kFN2pxkT1CiiiqnbVdEqyuHBhG1KUMvZI6hAIjO2EZpXcs2Aqhoq8fMtCH2Ux4mjtkFa4SJUlhMn0vhZT9kjln+JrENkOChzViqpEp72+fZK3Mn4qfWuOkqNWbXI6hZ5/V1RfyolOpoN6GQW7LCWbHxWoJPZgE5mQdUqi5bFWlY5lClGSfngCu2ZfqiZiUKFVYQ9zjyDRKTIn0txD9iYqYaWT2qDN0XEXM43mrNzTNP5knnGZGF8oto6BN+B2Otg4oERn8JfNNcgqxh+lNK8RKB8lmNXVfiZEpk9iDVZIt0kxcnDSYIagSU0RBPWpbYBg82CkFYW4pXcCgw2GzDYLAhppVzo3QoMNhsw2CwYaaTuiAKETTGgsFlOXFuIBSWsQGGzAYXNgpJGWbFFAU0NxQYcNgtKWinnTbQCh80GHDYLTlopF3G3AonNBiQ2C84YWcnFLjRv+zYgmVlwxrCcc2KZBgKKKjomLX0m4FT5zKfwbjInWKlKoS1NldqmSoGaZrrKbENuYXDmaVvbsI6h9CDnZ3Vm8A4Gyw6iVgvkYbfVp6zwdLzNOVIijw1OBZwy5K+jSNPqU+b5xyVKAuRhRhsbMOcsqGtlKebD54cV15idnNpuCMScftdmfkxoc+E0vFr7wYG2yo5lVeW1B0sYMX5UQ5L3dZQVrZnDqirYYiwHUuVVimXqqOP0qJ7zilKwKCNI5SB9Ql4iWnCpwqqoA/28Q9AuQrqQZ5cIj5z+3tT5p5G72ufRpk+ZJyeXCDagJ2XJ6T7IdMuVCkv6yG53Skqf6s1Hwx/DdxDsUCD2qTQV/dNWSGtqAyqgBbNPpXIqPn7K1Vt9WXQ6onEGZFytg8KFS976nfH7uq88pDlMCX5snW+dzbyxl4jOKHyNc97Y6Z7CGztFUJbIU50q3tk1Khzwfk5RT7yf49zEfk4/lHJ+vxQfcz6SwwEItljOlkrVg6XtQeAy2oDLaEFNVKlM8rECmdEGZEYLbqJKlbxJCmxGG7AZLciJKpXpO/4pLiYat22kDFaesGCqqgx4r7pKKJ+jhmBVngK3GYrX2So2wVVHKDEOAhh3y0lYLlRFr7vkDa30+cHJk5yDjE8JtTjQkdgLTBsgzhJPASp3wWc7RRry4U4FJEumCGQaVyYud1EiEJ+/K3wLlSL9kf9ofMEJlbJ2xx+dL3ChUpV5aCpVue+NSlXhO6FSxeVHGvMpOK7A8lSpnCaLn/7FFhTYMfrVpYXBDEN2bEBqteCotpT45YfKZzqqSv3mPmJyu9QvH47O+Fq62qPdrubrAzEL6+vHGLpScyZ6ir1BLR1U7t1U86Wiadixpcq9fHjmO4FiZV76KDVFcWgcC6ZScLeIq65STkEU1gWzAVPXgngrBzJZgai79Z1vX/Kkatnnmxd8GzB1reGTgqg7wjYnUHVtQNW1nKCXknikE6VDAYIyG1B1LZi3uOsWE6OCK55A1bUBVddy3lwkr5f6IGy0AVfXGt5otaxQC2RdG5B1rdmTBJ8f1lkw68SRmyqglDmYct9ZRJMTVyTbrjsCaxyliyRrHCeYJGeurztSiAk/bcAGtkz4JSMXtsEAYcYTkQzpUpr+uoQcl2xCrRQSBa+BdlV+edquOYm+AZHOeiucz79Y51p07DhNy63c9Bx9Sd/5qDZKzpFyHk18KjmbvUpN6hMvqtQoKcuiDSjHFgxilcrVb/lpVRWGU4Whg2AU5thTlN81DHJy41UU1mfu5Bx65A1BcWK8FJWCkIWkpyliuXUY42EDWrPdk1TYCqxmG7CarSnbbb5WYDXbgNVsQVJuqQFqBVazDVjNFtzhlqzE1gpbQUA2tpz1N5W93fwUBny4XOhKY5MqTfEmCWKdr9ggPS69CWP5skWKSFrlJq7TvqmUEgE0M7vZgF9sbXuCbivkFLYBS9iCndvie7FCTmEb0HmtZXVOrjbMT3GSk21ikyh7l8iwP2E2eLKI+2yWKNgqcMtekbA+hA1osnZPkmErJBm2AdPSWr9uZQOkwLW0AdfSMp2ybciFVRUwJi2Yiq1zWlhVAbXROj5hZTciP/WJoLXzmZBrrjgn9KRL6lbqZIQQUyJoAzcsKSgSbZwJ/o1ijjagTlrXnhvNCsxJGzAnLRiLlG6qmXXeCjmAbcBwtI5PbysrxnjKbH1NdcgotwRV5SEqvHfNp3Qnh46vKAtLzrHndH7VHy1/DJEEy9OxFmDl3UegQdqABmkdr08rW/YEHqQNeJDWZe0aoUCDtAEN0jpeMXIZZX5a7Qg1S4h3TIrm5fSYlOBos/y3Vj2ycSvkWyoqT3tqCx8UrFIOVCAFPIVjkExOKiW3XZPoZAP+peWUveQ0E5ELSzUgYFrwKZFKVTi/8LDy028q29ccOc0pcSqvC3KvpchpwJ2oatyrFEkK+EsxW40NeJ02a3fZW4HWaQNap2VapxwxbQVapw1onRYszZakKFagddqA1mmzPRHPVqB12oDWaTNeWk7k/vFTrsBOTnpcUEnrVNCP6aLGHoOsouEh1Rmz/yunDepocVJbcldChaQYb671RKEUrGBSsh2+A/MNmG7FmLAIwcEnZtzjVaOCokZlSMz9sLqfDeinltPkIj+jMIszt+Ub3mgslUtY46eRSR6KLVCz69oVO5FRpo60siWHcRHEKl5KofQ8fQzRBrtNtme3EaiuNqC62ox3m0xkHFuflDfFmCP/JM4ppIWzmhNhImM6UhXmtqqJZTj/ZVGntgYZF4keLKeW0JTBAbnxKJ7c+FR7BSxQFHXA2dOIb++DZkr/RCHtGqWaUkixVlR1VYn/wUkAEXCk2DpOdVXzyjbN2TLLqjYwyiLiJwtV+LyVVKLbooPgiCCNHaXHs9Z/5TjZHA5qJOkkgj6KCVMcUM7lXFNO6Kyguub4WeQ99gk5nc/CSBSonGv9UotS+z5y9jqEynBkUOG8NY1+veC0o8Zh9qdMbXGZb4HLikKlVpyrauL3dW6CFcy/p9LMbT6yoxWTEFkpLQa48I5nlSIvpcYszdO6GecLQbOco8bw0Wy+tZuPbiNh82soRklZDlWK0UnxZjE8/AfF5tcKDn+iDnHKVPS38L8WzvTgdOKkzkgVKq1r4XQK6NM2Y1tNi9tQ4E/bgD9tc9YkW/yGeVq5VshKp3yQFqytZB3lupOpjzErOA0eLwW8yBILgK2EuvK20g0BLhaOAyp85T32p1CoFdvTyHnECewo9xfH7oF4hRKUDjZ0bNaULAaxYvCFgLhMfnU4ZVSqqoKENvfhYyQuh28cFe3ZtUukxBTZ2qlarkpRtc7keJmFpzKpFHUa+FsoNf6j2nyEDgDDbmn422D8A/q5zdknUspzgJNm1yVdmFm5pbZToQiwJ7fiPqFGFZXOgTKIZOfgPBmKUg8KhUBswGq3e7JtV89Sn5uPfojoT/RDFA4wQflwMrXUHwv+GP5moBFwhm45S5kVMnTbgCxuOUO3nIOJH/LM8nV6qSgKlaZkLtomvQYKkyMXtL8H0P6TIhQK7Js0lfJr2IB6bnPXnuyaH26K2NQleTSzbcgnV1Z1g5EXlc1CiMLCJ7BAuAhnZb8rXHV387hVFhrwAna7ZXY7LRNx+mW4p2KtllUOLsVKvsZJgbSLmU9hy3w/FKqmVE5II1hVMqNKlYU3a5H3gUtRU5XGTLOCYnDPNJMC0SDGK1hKocY6ilrSqPBfKpXaSqFSqLOeN5wlAQ/f5u0Rllbg4duAh2/zfbd+gYdvAx6+ZR4+6QgS6SuvuL9UZjpc8fX0UBxyQbHdMDpRttgcfF+NWp++jhF9RHxFyOazAbffFnvuEQK13wbUflvsof5agdpvA2q/ZWq/HF9hBWq/Daj9tjCt8RVWYPbbgNlvPbNfjK+wQt5ZG7DyLbPy5fgKK7DybcDKt8zKl+MrrMDKtwEr3zIrX46vsIUwtwMGvWUGvRxfYYXcpzagtduibA+P4IfxwyNsQGO3TGOXwyOswGO3AY/dMo9dDo+wAo/dBjx2C1q6HB7Bz94gPMIG3HgLHrgcHsHP/nPhETbgqFvPUW/hN+ApDk2koYWziDJecSZgypT42nFeOp9QUinOVRLWfLMB692W7TVqrJB61QY8dVvuqVFjBZ66DXjqtuRzq4VuIeRetQG13HLuVTlA3wq5V21A+bZgcLcpZgLl2waUb5fyKaNEO5wTON8u4Hw75nxT8EBzj3QC59sFnG8HCjfdCqxteIT9Q5qhdKtn3ici18nMaDjvuzeOKGUqi4hS1hegVEr5Oj70MeOiV0ohBQtx8BXdggTjiQuI5S5lb5CcXIWfgr9BkxtpbrmwBxmemPdKhevwhIJHNC7eWR3MQhWfmctACTWN57dmnrdA1C7cxOAg5sJ2lBQatbuU4cJe+IqZHwq56g2uvznyt1A7sj6QWU1VFyrKF64UMqTAcq6QIsV/xH2JXBEozT7BnV4Bg/8Dt/mYeRhKIbMvPiBTdWgGdgHb3jGhnoKmmskRnZDc1QWcdQcKOgW5CovYP8Q1IdsO0oJPRcHuXSe7QMFNVWZbiS0gFr4XpZC1FhZhZTgKJguRuQBZ1l6w0QlkeBeQ4Z3PN2rE7cU/Ra4JDD0KSlInUEbPcnFEi/tKptk7TdjJY8LvEi7rwjXeUB6gYD+1Ea/B/mn122xVNyjRWE2aDYzam4MhzCbaAYZjXSKEUQQwWEU3ojXEP+WjxlfR0dW5TZdKjhciKz97iS15Beo3rsg/ykZ+heBnhXlPF6tJaAJ2AT3cKd5AyXfQZMA6gR/uAn64A927JWrCCfxwF/DDneJbv+xT46cg2poyqQtsYmsCt5VDVnAzKb1nEtWTKYzOaxOeg0wGIg6Hp+WwxfTgdUIGT6wsh+q2yrM6UB6dTa/W8zfoo66/NJsvrad/KKS/cfgu4wqc4RgE27Pi7Vn2hPFTCklzE9qDt2Ynwt4dXek47J0uCzhSFFVfQlo2C5Q8d0MUwXamWEmy8iGh7E4JhU1iGXZM+OKNMEvAwUuBaghgo+nqYEeiNLCOlUtctl0q+aRcQL93ilUlJ2ap4KfS6DhO370zJiAo+93E1gvaaXbKhjiCPVGxUcOJuWz5KTJokXG6jjFpFm+EzZhOWjAUTeat+lQRkYmpxNDbqs4IQiBZOXjO0nbFBcJJ//z/2fuSZNlhHMm79DosTJzJ+1+szd1BSQ+CIrOqs7IWnZtv+mI8hULiAAI+MB2J5EgjUYv8lNOwsTFpAj+ey7BxkFYykjlsgJixRjU8I9PnQFzSW2i7LqYkPQmoeKG6IGJMSkSu8lGygmUfnVc7K1LIMyRCZY/+eNNu0SBrAbm9KBpT4y5E8eGBI5AMnF4/aUrVOVu9DZpnbRr78NM5fmGTmLiptlir5zPAAm1uH1oE5u/XLS9Jy0sP8+TtolWA1XvGUewIZUuQE6K8ZCXHuAaCMgZ3YXVHiWwTHqcU+BVpcXJCnCRttLX5YXSbYvEEr7tRjb2aBydCqE7OBP6Q0F0GWCw6QKkOHZI7aMVHpN8pPuo7GEuJf6YPMOk+OfGNKwRjHtGHpY5/0USxQJ6Jiuvu8T03AM2RB5rIAymWl7ZWWyo0dS2rZR5UdjNFFBU1AZ/WAITPk2gt6FLSy4f6jByb6w5soZJVCbJDwpAoyS99gLtgeU3FpEKHLz6RnVocV5aRf090OjfEOmK+1U9HjvbQRHtAvxj9m93SnU/XXbKGRT4vFjw2ADc5Bkg4pIuEBTQg1FmIBT8enPW34dZvkQ+wTX/mAdSocs7c5ZxpqM2+jDqXtlQg1DZtMqzb8Qg+R2LYFGIg9gSb+ZAR6CIAxyzXbdJMNgGkbwebmF3dXNkTXOak5ggaJJ4BQuQpDovWM6u2UGMwKWuOu6LwY9czEhmah/06iygsea5Gc0yLJqYFbAqjtyZFgUJ1Si6rQAa9A0GueDChp+6tAsUbtMRSQX8dfuJ17I0m9kaKfVjVym2hqBeYP1m1A92BCXdyk5ihT9MYAORKkA9VbGJrqmkX/iqNOVAZJY2AuEA7zGlBHKwcqvnPdSD8lwbYnuTwtiutEeiyxym/1b2LpAO3ATAwNa1i5gIpkTpGFFBi54CMe0okj3UuXGKPIS2eWEdcXpSuOe5KEzsFcKNoEAjrmAmTY2CA4rkG57KFAfKImnwwJMms+Oa044AsJSeQsxFfCUa6rFJO+E/m1ARQRsrWlXmWXTnxkKMQlm/5UF+GPgXlJjB/pnzwoeKAwpOZh9M0KBP4GJmA6JTTlkhNWa5kWH2ySAq+AtgcuaSJXIJBFKRT1ZqNAivCLv1xRKdQjq4bQrT0YVMDOHCJvY2drDPswWsfW0D16lA2SdBZkI8P8rSjWufZ4IPziXXakMqnA1ekAyN1be2JsZhPp60vlG75zOCzZc8sUejBnhlAOvbMAAe3Zwasb8pJMh5+R+vIKU38k4wUUdDTjGSO2If+RFLgPVH82jUSj0mpF4Ro0tjibJGT9P/xi5lt0s9MYyPFM9NNx/JxkeOKNHI/EvpvkNlrAVukObZIE1sk5yi7rEYmo5JF2rAh14DKY8OHy6bNp7JfOvJKFq40e/0oC2pEYRTwr0ih0nKONVpdAsHToiU5i/oab6TV2Mg65u4nLa09sgBusn6CFcTGFiMNja1jnGMLQEjrJ4l/xn7CyEv9JHm/kuYYMk0MGUxawVNj45Ov9VQgmNlmJhkKUamXq/I4su24GeMRB4NLKDYlk43DjCkp2gCCsaW1mOv/JVnA2RrqrOp+QEc0SgyMdGeAcQErewonGrzbDC0SWMr5/EBm2q9yVmDajxilzLRfGf7ZOW5QKz+KNC3gBjXHDWqk+iR40Ab5cLVOJezuhXmsao1a0JUu76AdtrUHnFZ1jb286/Yp52FuIwmkN/15wrZxYIb29+kiEFGQcjmiCKTcI5AtGZUJ7aaGI3fvMC5tDDKIzYfTsgwTE9ZySsXiEKBmHYX6sc0xm1r5GYSolXi88RGMLsvDGr1UDs9buRpjj3ZO1dYORPS0oEV2x0DFtjdHOCDH6iIb3rZtqiHRjC+qpxeU9kndjLNTEmZuW/K2tB2rCetpZgxLQN4XQGv0XZ2iDS+hcfKTAhiiL/M4zWrF/DCG/WkWcrBuMjgS6EneoGXbT2MflQnoQ1ko03EX/arIWrV9ahWiT+MPsEBAJ6Zxy4FzPPhuO42ge1ci7PjCnHVo/4ptK1ms4Aj0sp2e+eCm+dwCuTZp92hH+tohfybcwDQqLObPxYcNm0gG4foTQuSO72QMJsRf0u4kURGUkbcgiQztqpns0eSWH13cLtMQWc8E8xlUaeyvcumGS0zEg+gFcU+2z679ZXJDTqzhVGUWMCArnz+7fS3XYb0O23mxen1bvb7NPL1xZ4ROIhOTcjvOz7bzgWSTZeBh0Z358eSC0vIrKC3/XweljnDYSMJLAGwHSAW1ZrFkP8psjM0iR2ops0qFdFOWtu3eig7gkggpohv1ZEcFCZncQxpMzJMucnAvciw9Fgm+JDOoVfmQiuaZ/WKwQv9Y01ywKC4hXkCUOTUuYdKds4sbGhPlvyL1B4u9J+2xEre95mx+Kw2emazE98XK2zBJPAu9qLKzWExpfBLayslQoSfjwbO+l5uQZ/yhZ54p9+M6TLu+l0mIxoPqRTU7HBKjyRi+t+uPLKfln5mLXY3a+LI/Yet/9ie3x+cC97J+7E/Y+L+wP3Hs0UYyaMo9rrdU8yiT0A3fbVH2ChHFvl30PtlC1lPwhZQ37j6YrzlscrJkPnQqKjF4PdnLRZG/CqGMtCItHzL3IRLVqZwgkMDcuHhCxfMh55O8e0Ft+81jneabT1ys7c0PLoR880PbF0GWl9580vqbk9DQRW8+EQaYAA7SXaXctxBMyuq6DEdp8sO1ikajSK66F+DYt41kWoT/0Rirf3KXgEAUipIqVIZDvUA40C4bUkFkZ21tA7twsyz9+NtwIbs4vG/71PpECTZHs22i2SIrFxVQ646mCxAFAmHeSNtEg5OHgYD6yyIWUadE5pIXo25tjuRdP1Kf5CLQ8Ij8LbqwWkzel610rf/ZSl8P4v7U2o+tNBs19rFLkmrLtbUuwR47Ea/2c2t92zwrwKLKn9xi5m3LLNwzzl0bZaU6URSSWyy+9RJD+Wf2zrZLVtC5D88tecqjR1pEzdGoG2nRL4rYaozgxywPjwt6+AEw3DDn2AQJnJ5Q0m+aFTKFUIPe70Ig0bJftvUBK7s5VnYTK/ttWy9/HI3scxm77e5ZHCflDX37n9rG0zaUSZM8U/wb3ZpbteYiOx+gddjapyLG2xr54V8M24oQXNm5jlAtQnc42/m8OUXZB8Z1GMLBmyOWNxHLEcYGOYfANKc55ncz5jeSDgskKneFID3juN+taa6PVfzU+j/3Aj/84sAFrTmKeRPFHKTRAM2vVoPxX3De6yZrFgOzadkWfyMBYGgCH5jHh+2YQA7ah+067GEWyRHQmwjoL2W/VvfTnMswyZC+pucQo44hyIUSdcMCEUgDnWX/2ze7mVnE9ZcR3dodJJC4WpI8x+rr9bCkr8G9Qxs3LWPKIUnlPGFitL/GDq8reM8k7BCdWcjYOfw+3PHkG3nvCdZzUecPsHSOKN9ElH/tE8Ek5gjrjfTz8pJZC/jqzfHVG3nirw89qNQ7YnkTsbyAOfp8CMY6p7n52rIRYOp1Ipyg+ZXKIVo73O2hUyjKK8EtjMoTKsDjO0kbOoYO3U05tnrrNquEis0toKs3R1dvZJ8zPzq+JfkLBAGko6s3ss9TOeItesBXb46v3rpkncFWRuDjLhCgUB0PvIkHDjWj8BaeYPTmuNmNXGvMe3V9U3NLZEDObo6c3fqpi/7U1WqBD1FznNcmzis0qqPuNS1/A5NAbbvkHUk1CWaIMJwlQtqVky/MeWDjLp2TKtwUqChLYS96ZzZiGcJZlJeVsRebn6tVEa5KQRdkKzjjwT40KXFunP3CuJ90tEL2JT9QKFj34KA1x9dt4uu+9uNgeDq+biN/9K0fB35HzRFOmwinb/04MDxqjhraZHj00o9HMJQcz7ON8qsfB0TP5oiejVTLt34c2AI1x81s5EG+9ePAFqg54mQTcbJQXvLRjwNboOboiM3oiC9TvVr/U0T5TxHlP0WUuIji6LlN9NyXIsqY/z8XURwRuRkR+SVzztb/ZM5vj88twaJMv2TO5/G/kzl3vOwmXvZb5nym/2TO/8WZc8drb/NnyjogtjdHbG/zZ8p6/m+krB13vs1fKev5n5T17UHcn9qvlPX8T8r6fG4u5v7lXtgCnYTmdBKadBLeUsRs/XeniJ0SQ5u2P46JkIEUQ3NSDE1SDFB/bsf3mH7aCPaYTkehSUchVNRogYxCczIKTTIK4FI1oPz9FYItptNRaNJRKClevQJDwOZED5pEDwpWy6c0dVvBHtNJETRJERTgKJ5WLC0wzGtOOqBJOqDE8vwtEA9oTjygSTwAZNvwCv3MxpEN22gm2NIHU1vXEasvhUZTDCeYuMgoJzCLWkjafZJHnAhBMz+8mD0qhQIiIFH0zdSo4ZJJWQ9MYJ14Q9xRKrluEVUw0I3bUnIXocXfiBsfS+MjVlVvgZhBc2IGbWl85FD/twVqBs2pGXRTM4Cy0XNhVqsEFsn6ZXYfux4+ICRDC6UnIEihMgBtuUs2eSk9FFA3+FA64Dd/b6g7cYR+aMDlkBDaA3WE7tQROnUIXhjyPXDE6064oMsRjzxKr9jbA0O87ij6XRT9GmalekDR746i30mMB6IoSKf0wFauOyZ9PzTWSjhae0Cl745K30WWLzGVXq30B6LMMhbhLU8J6rzSMxgqVGmcwyJu5E20Dx/clvIcOG/cYnFjNbWxkVS+jgr1Fko5PYnK9hiHfFYjoR/bOkVN5bBYKYmYpFiplLYDJAuu+xVBcTs4+g65+7nX6ixkMfCA3IRF3L2vHXFjB5hKkbg0jogHm8s/3OEermkAhAujWk+vE26Oa+x5IkHNE0x/D4fImO3d+OWgp9n2XpvKcu09RNIdO2jMV8zY57ln17ZV4hx7x57O3WdaZ8CI8kjZtn2p0NFgSKnbfIVwOM12JRVNLj5c6k7MoEuuoMSEfbUyuIGw5pNcMMQby7e48vSAuaJJ4f7w+MTug1WAvHoAwfz7cBMzhYjicfc0RlEIORhqzpLfn/LvZztElcbDo9+EnqPI/zoU1xwlKRKxl3e76k5woUtwocS63Wp9PrznM7sMdJhPKrXHD+8fPjJsct4eGfcia/0rnt7zOeGwXw9yXIdmJekepNOd6ElrUyxWoFZkJ7n2IfWI5Ob8IMfIU4q6C7nM3KoO5r8k91FsX4eNBiqPoXNwd0IWXUIWALYEVVq1Fmly3RkVWQRi7I8uOReTVLBbYyVb94N8H+ui1PuAOAib/Z25RVTyEnAXCp9V2XUXK76eT82eFVc/FmFvT+2/9qjcqiylCXHggxuqfx+ViZ3/jzwpt9pLagLSk+GNBcu9E4noEokoLQwk1ZrLdgeV1ou0DMjsPcaZf6Va8Nh0f+zcbKe4NqUKLromanskCjdKWEk2gLDGJmMW5oqSrT3MgBe8rPmZ/DLkPBYhWUx6HfTi5S7zIHaah2nV/YFC2abMoap5hocSeGDErUykDvP1gXId1uvQvsI/VBcBJUVA/eW1POvD3Sk1dCk1lDhv2dMzvu9Oq6BTeuBF2b4HWgXdaRV08vcph/7IzqiNHR3qDPLtmSYBNPlyKQmAQUFDc0zxlZp02IOdcFh3B04xoJO6H9tfqI2zEiA7whZB/IZCs198K+y/KZ0yp6FrKe4uDZXSZ+Rb0Z1aQCcdHoHS8W0uh9ADo8Lu6POdxPUXuTU1blnpbtL1jCjxCIeIBnLyBCKKwgCApEnS3qwCGX1ywZt9q6sXLn0MaZHitUrWmZ7uGmCVrlND3AZcbg47kvMylb1VS2lFMm9I50vaDTG3pN14l0mGAhBwToW5Y5ZDyzj1octI9udFguQoO5RRrvYaKUV3R/3vov4jdxaNjMC4sTvyexf5PYf6mD0Hc6ajhHdRwgHOiHZpOdgiOVZ0FysaJjPhjwgmCEdZ7qIsAyAWXiGYIBxluZOMCzpPsNUN7O26I+92kXfhtxptNQN7u+4orF0U1hKbYlsrpwqK4HOIU/esbDISAXGwj68MApAskMZUoRvmNF1MaHH1p5xPd4zYLkZsQYryOeUFbnndUVW7qKolBBn2wCyvO0ppF2kUNajwiQSd25Houkh0JRbTV+spKCMBa/KWGILQMJl6PAQpcA2FTBNXdFDAGBcTbSSJMgj1XGozlCPEVNEkW40jVongwjvkg4V9K7PjA7JU4qGtk0JGsdQ89rdwmTbhGQQOkpsppKDVw68ejiPXxZErM/TFtNaxhUdkvZfLTawEO/hK0ZwuFjF+c5E3EhNUTGTpEB5W+zCFkZujunVR3Qrn9eDuxr/57tzsQpYUQtRn0lhtNFWEXk3iwEPCZZjaLUX2C3MKpnrLnTwEcym5gm2g+g+wvQwegNsoq2xbI7x78z0qVKp9OBx1R+PqonFBaCUoaaj1sgDjraJeUSiHt449lWC5TckqGDDwVgGjse5MWWcCbwmRwH5RZcRUCLx9FKO7o3F10bjKiudstm6fyFM68DSMvEsHNu6XgcIzXT/qzkN0xmzOV790BS85QcmM4dTYLpDSn7faTZb4H37Q2jKBksnj2Xqk6+xWFKxHuU5WmUe6x+DIVP2XlaEapf7WjMwp7BJzLrsilbpSCiMJWpG/SMcwzsksuQsBUjdYhZJd3D6MbX8smBDTA0RTGuqkX7iTmXemgKgfZQoyK3XauxATKU/yE0Ih6isZnZWJQ4Y9k8Jvwkwm300cy6uL5YUpNewmwTrkWF5dLK9YbLkHbordcbA62UUvQq89cFPsjo7URUeqRzz51iDIcsScTmIMN4qP6pvamOHCeJGR1LqkSC/J2YbNA+dLIfgPOl0zLsArA1pHG27AOHDkb8rN2iTbVGjSBqFjPQX/IF0mcfAJppDgL0g2U7sTlXN8nwmXYSN8HqZwV+I4Pl0cnxrrSKtV2KBywQtUBJf2l1LRZav1nfMG1VtLts+ZgDKSF1ySYZlUGbtjOhDAGAOoS4gPydIp8+bOHUShZBodQ/THxPIIzpD0jjJ/NO1sgc+DV+152K7Dfh2O63BehzKk8Tk4xzvqYhbFXC81/o9yvbpjGfXNMgp5UGr99/KguqMxddGYaly67QGNqTsaUzei0hHOAy3/cX85CUKSJQDmC9SJvVZv3EFpG6vTT+Mf5vdk07lhCcrtPbxfumMwdTGYalxcVuvfwsnqNxUiBczQ4LMhhPmf1lkVkDLWYDqW3LwskVzqzl5HSe4/pZZ/mNH+V1Vd8lVUKZJB8g/NLRCiUwGiFr7XqoeGRdQyGIBZ6gkBdSYmAQgAwmrlM+XfEU+w3tNNJ7gQvVYrI06oCFdKUEAisdJYEOGBsvDA7rH6zzqbLAZ7m3t7gQGQJFvED0jlvVQfDTsGVxeD6y24bO0eXCIIKcg6XbHlje7GkB7AoDikNDwNE44Lj41u2E+bqu4oW50MrBd+uhoFkR8EzxNMzz0dRhMxyOSOULTS9DLadggEflTCiEgWdXM6Iyi7H9OEMOcyOPyc5IlwLenm6zcNNnlYuCaIuNVw2QvpfFchYyixYaLgz1b5zK1sNdyOfcWxw0CZA+JzJjcMWVL+FEDZmWD/VqjYDhWWywcanIn6m8N6HPwfiRyv08zRaIvMUhUIBwMym2ptax9JsRMJWsF9eW7Y4xlKgq/8WYv3x0R/J0p8GeE/Ueu6av7AYlLz/ppkqFCdJYATSU4EHlAWR8eg+dzAvoD/tz/jW+2PhccR9LoIevWliNzOCj2W2MT0Y1IfAIqft87c9jLIMMt8eMjsDIDma8d65D0rAsKe+VYa8TCMuvFuWfBjzZR+djQ6yGf1nssxjS2VqsAmjV1wSnEf9ntQ8k7WqC4gYin3Ikz+DMssVKq30j1+CA6dPn3uVulLc39Qp81chog9lESdW+MYgX2W5mstfX9WX8T+WIvM8jDHlP27UuXErysQyaAP1Kyz/p25mE8evrXGqSG2/t42AXGxYepEJ9z3TYAehJulurg25Pa/t22iavR4JIYd5bOTwYkHG2wY2MblGcknbaSbqHRwD88lmaW7qtLoi3xZ5XQKgUtoyZLZVx8t33RmMlDGOvQ4hyEo4NaJ8diUb5+SHE+fIUQoehyHAbYwSwqu00w+C7G/5MAU4xZ0Wcd1ISD49/5xuOBSHNX6UrlnK7sJ8Pkmk39LNrBvEKQVmRFwdsLtV+I1yrmpXoS0KpcnrgfzVVdHaaPtjlJIdmFHQa+2jlL5ZxLbbWdHkV2sqVi3jZuhwrKAM4/h46izXdTZGtuHq1WLy0S3kF6UCUEnWyOH0T5QXZRt687PANxPrtakaTqZOniDRAqhc2nRGwg6lEzNioFkt5uLhKnGVhRGMZuLFKZRXngRIH4YMjvThhZrAujvxnQjuSCZltdmgQ0r3WpGokUlrWexINW6/7ZWiWapXJe4t6lcniuoc1yeUVfjmsfkUOfPRqql799ThZkBUZ2zJkw4KX/NRkluUVVr/0E7FDD3TyOOiucmSRhZdhC63NRMP7vVpRKdhsr+Ezoj6Hck/RCerZKYZ8jHH6XDZnfku4vbtvRfpYCAJ90dT7r3X6WAgCbdHU26y9a7tnhbIhI1d3yI2+UiAU8QUs1rV/pSRwkV9cB4tDtidSdNGiIBgZ1BD3jV3fGqe/+Rswlo1d3RqjtZ0oAORJsKNp5+cYUZaELUkoBig7steshhokZKfJq/UMNCxuI08rVj9U0uqq1spYlK7/mH4EV3zO1OLjN2c9GePTAr7o783EllBrot2kwE3OfuuM+dVOZS4tRawH3ujvvcxX2uL3CWgPvcHfe5k8oMlNKTgdAD6nN31Ocui1tMFRWTkrtAMDoc87kPGx3xdB5Qn7ujPvfRfvADesB97o773MV9DvkBPaA+d0d97iI31xfoTeDF2h3Zs4/5g2HQAzPW7jiQXXar8YgdQV90JMAuEiC80aLfEDindsfQ6zP9YCj0wDq1O4pZn/kHQ6EHFLPuKGZdFDPoGIe/IuiPjgHW56+EeeCe2h0ZqpPkA/hrxaLr/j7ojI4U1EUKgldE+BOC7uhYQV2soLcBEdindkfa6aTgvI3qgLPTHWenb85O3J8Dzk53nJ0uzs5bbwpYO92xdvpm7cS9KWDtdMfa6WLtIFiKXkXA2umOtdM3ayd+FQFrpzvWTt+snfhJBqyd7lg73Vg7b08y6JKOtdONtfP2JIMu6eg2XYwaBJvhkwy6pOPJdPFkag9RbAFNpjuaTF+C0YVhXECS6Y4kM0SSqT1MtaiVcBYAeRjCzZv7zckbkrf1XPWz6CRIBhGjPPzl31sYjhYzRIupMRrRWk/Rykx7QdjLCRgJ750hlfSWPygpnN++by4h3udZfyPJ3YgNjFDwRK1X+ey6I5ZAWKqaLCoh3N3OilBZEqgwYbMBlaXm7yK7u9DgivjIapND8/pcGGM9CqDqmmyICOOmLg6EMOZh3Ka1scgJ+53xLXn5mynuZrhujDAYVCM33Rt82+R0hiwE2OLijBzZEMadKMtdkapjGpJBQsaNSJI+zth3ZLX7W6zuFlXKjT2r1Proube3d/nbUYG/EcIDOri0Nc5u5O+iubuQOXjoLq7Gsw58M/0jUOKP3+jiLgBpTA4p7JD11kAvWQSPESnDJD2qxP6+ursveY6HpuVq/Bfc13U3Kv49nTKH4wkN8YSw6Qnf2nPmG443M8SbqTHQUq38aUhlqZp7MHO4N1ytE0SCzRYHCPofc7ms0nUZiWGvp95JZP6lP4gxEVQohyOoDBFUaoykHIEj6HDMjGHMDNDpwZZ3FzgbBT3cdmRlCGbYbrDmTtA+Uzg29jhPjhUxOoejYwzRMSqo0sFUkJ5Rw3C0iSHaBILQ8FE8o4bheA5DTIYwCB3pGTMMR0cYp7dlncD4uws8Q4bh2AhDbATmnL51NHeBZ8QwHPJ+yHQR/MnoIY5d4j/2NMrhSHtr1vpZgZ7QFqI4X2UNju+yzuq/2o04AvBR3A2w4iNA7A+H2B9JAy5MGY0AsT8cYn/IP7DG6FG1NkOZb5NvAj8hTK06LIYi0ykdGjdFlvfIgS1W3D+p0sqeXt51nl7fEtd4+E8OB+gfRNeDGxcghtWYVDw9MQFa8pOZHNsSt7F6mjRxORq3Ij/cejUV0Wv6SfQwf6Z2hgP7j/wj6TcCtP9waP+RbQTOiBE9cjACHbp9CN2Oemr4CoMx6NDtI7f3xOMI0O3DoduH0O0V+q/RjwgGoUO3D6Hb64onogDdPhy6fQjdXlcY+I8A3T4cun3IkAsYjOgxBIPJwduH4O3oYlGwGsDbh4O3jw1gjxfQwKJpOED6ECAdfTi8h6BHOkT6ECIdpfXwCkGPdJD0IUh6jUGrI4CkDwdJH4Kk1xX36RJ0SQflHgRPL0zTQY8sGwxI6RxMWYiNL+Nd2VAmkyCQwphQ1OMmqSsYBhTMNJmgTKwpBBCkBMopLXj9nbquL+A25szwt55+d8hBixAz+80bOHeLFSVcRMYrZ0CQQZscuxGjYj/KqlOjcwDVWOjeLJfgdphLsL9bN8wMyn3EC0aZtmAU6o/qydpdzDZNVAO4j07dT24OUzH6BU2UTfUWVYloN+RQ3EMobtSFwvsJRq2DWA9BrFuMnR01GLUOnTyIxk0tRq6OGoxah98dwu+2I14FAvzucPjdYfjdIx4xAYB3OADvkIlCS2E6cAQI3uEQvEMIXsLho+cQjFqH4B1C6bYYpTpqsJA4uO2QGD7GdXgPwULikLJDSNkWl5RGnbcNduJumgz/WQ10SdIJjcFPvToB4iFZTpYeEV7y6r62jURpQhmUqkf+Fl2nlxo+sEzhLQad3uFIh3CkGGnRFQK5+uFwnkM4T5jhRq8qwHkOh/Mckqun4k50D0GndzjMIRzmC1R0tKDTO1DiECgRDszhFYJO75B+Q0i/FsMaRws6vUPiDYHtWo6n1EA9fThw1hA4KywrjUA7fTig0BAU6GUTFminDwekGaadHm/CAu304aAng9gLLqPgL7kwvwfd0YE1hoE14hg2kDkfrnw/VL5vOc5+BPX74er3g+X4EVdpR1C/H65+P1hcfymGjEDmfLhq/OjWF+PFkK2XvOFtd3TNT0rPEKR5QsPlFwB/gNRy38XvJvYWSPD4lEm4NVK5njkYV/YfLOO/Pqugy7u6/+jjR7ViBHrqw1Xlh/TUW6xaNExQXS6hRA+3dEvHdUmxdBMHoyMrnNk6cbGpMf3dG8+WLdvQSG8bz4fjRpO0ziHrGT6dYDi5ev9g+R6Y3aCMMoJ6/3D1/qF6f8MLeip9qFUb7qPL4R7gglvcXM1WQjZ+TAiwa0EOEkmv+gWSdFLhC0UC6noxJm1MqComLTMwnxgOWTCkqh4rrI0AWjActGBIVR03GP7YIiw0cdBt0kcwUb1GgtGygxfcT9Tjtjl4RRBY4HcHsV59AQJbiMWfAsUyq5QIniYO8psQ5E8KVIM5QzgyImihtWaSEu5BCZuypBe9tiQGCFyUfW40jCeYDLmpRQgnIg2ixMjBOaimA6QhQWd82ol4YyQ/hA0D+DktO6JfIfFdg9gsIFKAdUvM5E9yhECeTYcohYXSM4s/E2jvNs+zlP/WWWKrG3F5kg0htIay27xY1RUolU5gM6+A0WF/1gy7jbMkQyZuvyi7bWc3HDPp53fuMORfqbP9utjQWd9n3FwtNAn+MBqjAZpkODTJEJqEiceo1zWDn0KuSIquRoZNmx4BYGLZ0g0EUBLRRMLUqNYjII3embcEzg9vsFM7YpBCdRAhx+HImgF5VwRjkyeKcZtaXTbXpdbIHuVkR9JEfhRhHOJlGOIF+cPoV/a7l42y+ke6b2WXtLEau6H26aoIgCFzziS3+ePmbtMI1YK2WiNS6zmTuEVF8BoshOHNcitOmCmGfibkll12HfVCBpsAe7F3Qt4B0YRTozkT3SsY+8JPkXpaa/bqwJApTDegDkZgOYw9pS+LfXVPUi7pfCYCAXdqwh5U0ioGTF4EA+OcvTj2iMazmIlS4+Scqi8MOczQEGYIbzzs63MLu4AdcMo3si6D6pte5krjVv9E+tg8bRqsW2V6A+HhQLRxOATSkAp7Q7Igek1LJvCZTL9rhIjFRGFacgRIG6fceO2bfYAbkMA8psUkauKgxDps1ymbUvcQSNSHypRQIY+ZY0iy7dTaQkGqSuuYuNcvHzpzRToq5xFLeY/u6VZ1Iadaj8O7ADk1HHJqCDnVXur6AXJqOOTUIA7qLVAPgFPDAacGYVAvPk0jwE0Nh5sahEH1FBJqR4CbGg43NSQi3WKhJLXK/qFqdGOxNOA1AP1cUo05PDa3JW1FnVM7GvYFWtpNHX0vbcI8Y1YiwWnNZATafKpNQ/uIzLNvPUOAYqpgwomXw8yMCxHRgNILwz3JIyOFCT2VApfZuAaJXRjVx0SoNfkz0P3gnPvFzNm02OKoS27c8NUT0RGjg2ErClbJHSeMbmECDrhK4TuJjGfts8tI+uBIwIxGc5BG1Z/U/Xh3QLUxlcsNQcZqPG0DLsjDIUxGu4EfLrYot6pfUHUkxkcIxLn3uSpCZ8nZ36FbOAhrw88NEL5qxBQ+SADqDI5hrNC7LNcwK4/js75eB2E4uNwg+u119M0bxT1xewZN0i0gp1/ay66GDYsa8xf0Nk1L5LTzN5OW0Oj+5inuw2HwhjB4oGmFA2rZTorFbsI9pGBsUjsXZkas945UvJYR8J6UuMZ7JBoAi66/HTdNruMXZoit7CVVvkBgq5O/OAal9cFDUdw+WVMjHQJhejeKjsYouS2Sv+p7jJIuNpc5ImiJBxmnmK783JqyZ3i2MA7p4lCLReSdIpWyNoFNitzDuwwHsNGSC0wWLqaSEUS1vCb5HYzgpqq0DrsxkFIzDQ8ezutwnYfz0KF7wg7wOAzwGOKhArjjcHDHIbhje4EdBHDH4eCOQ3BH6PCGVzgZ2GQccYZKt8CMVCWQxK547CJlXVQsUyqb7I5gbKfNWRKVmqFfO6V+y+WFcDGWjpNfXS4nBAY+YixxSRBjqdbTCYFGHqIpJUqgTga6zUfbDsM5hOFssZSTWi/u/DUvXsoFl+FmOgxsc5ElrjzRxaJX/gMzaWdpvXji8XAo0SGUaJtxkM3WM7o+X9lIxsOc4n6PW0zN/lvPAYeY+v4SObjmIjsJEKp2C6VHm5tjx5VSM+f9bf6Dlyh9K47lQtJh5j6JelPastpWBnM80x3PcNuBYIdAsC9EeWvFtAPeFmmspwY2iWHJ3qp6NH50lwVLNm48dr+1bjZ9pTDt2oR4BK6VvqpguHaS1KHoN/h2GewelNEAA9f48q2Mky+f8ibJU4MLMBAImfgl3sF2B0G4MA8Mf/LYvkograFHIMNCJ7f6YaIEwkU0QIF91KAjmJHSVxGRlQgLzvJ9mDcPf4w0wzFzSnA0V4u81hB6FAvETrksSYHj1DA3tXkss1LBbN2mSLCImiTuXT9NvRI3srJFTU2UPpRfuIUDN7pTdBvqL105FcikkM4JQSveE+5u0jkO7FruRcBiY5pFfiUId0RRp3HTse2iTIKc/0qCPKWyJcjN5YVpnrIlyBON0JjTIRVREuSpm6cPFrsq1Vn7MplGIoWQ9JMnsywkA9vZcp2t9iQStoPnBzhTMw1DequdnXouvgu52Ei47bbiLJ5a/5lhw1V2jn80fh6j5r8wVpKu0/+Mms7tJCXbpNRWHugjhzQfMmSAAWE4bMhuNl3jK/Bi6nq0dPOgVZYFcms1D9u2g3Qs0wV2Ll7F387fwGsKuB6GBWrjbA5VBqPcD+PIyl8MWr8cZdPcepCxkrJE2x6MzWTWj6aN10HbM3PSE+0VmxRzXNzJVbyUxI0Kuafy0EubRYvPZfkrUlMAw3ZHan2ZEvFx7GxrlXwARPq3x9KBYq6mg9psD3XgoUvxAUCMuUSI1dCAbZv0WepOuiL+ozQ59iZD/FVMb9w44q+GUVJPY0UtWnqDNiv0ZuoR2AAx3UoDNwkzHvQq6NNiX9OGQP7F0q2Qq0m6L/y2pHiUV+hye8IVupzjMCF1acj4vNp0dIIpwgBVM55hiVqreM/jnp2RiwMEphimkcHNoIWr7h6eYtFj9tRaP1FE5/DEh/ui1SxK5WsLS/ZVbfEzwZwx/i5g5qxQGGUUWwtTP5blazqDo8f4nI69MI29ECLK1CgCuZkFUsmCXdMWr7pXL+TWR7Jey1ICcOeUpAD2kCPgIEKVlQG80iSXQRpjbuEhLXb43FDnnsQrJIrpaAGEfAyc3BIfdyYbG+pJthTmtZnk4LhLG3jNLenZLM0w21ZZSXOLrKC6rHQKxHg6r6uq0EHDLo2QhvWSPbR3yy1k5G7Zl4kbMtUxRI/cuWMN5WqCVckkVlDEVeZjdKoV69yU8gzUE/joKp+T6gR0EOXY4CE6g0nTqOjAO+hcDrmOdT5faisCwKQvSDtDwj7Srg/06wrj+uy8PstYll2L1aXlISDTUVKmKCk9lqCagW/MdDySSdJGQjI9WC/nSSRhuujkZhCs/K2yQKvyLsO+xdToet5q2X17Ffm7qO4umu4izGmqVRbSkzouTd+TKNRLc12KyNnKBm+jfXi62cM6j55N/k6auxPRReJ68AxcbKYjdkwjdpQQdDjNxUYae9yfzK0KhlSjVqpx6q1QULcpKhkWlWS6RHLGOootTKOcBixH+8wkLaml0MO8+g5msjll48lVmo2wCKebMCHPMk5FFdwCV0GdlA245nxpKeOg7oNmunydsq2+JjQd0WSKaII8Yfik5yk4XPfGb9W7TOmURWqzdSHlc+s3P5IZLaPexUe4LjDdzj0gZrZBo1keSe7/2seb9sg/EBzRzq/lvfEjoUy7PZxU7hMhMjNuT43T6cgzU+SZHpvOWCvVG7gYEWZG8UXSyyhWxMpXtaSsQAkimjFT1KjlRyACVleDJ8DNmaAFf3cutiMFJpbKUVs2t2LuOPBeGDV1C+nq1kiZlmxr8rE8N2ZSktQaN00ZBb8z5b3VMMPbZLl0/iuxMJpnc6lI47ajMwExqOIzfc/yWqnax922e31Pydd2D93poNemVrtZpBABybGdKwIj7twWFlWxt8bUGreNosWDAHcyoEql2dIGo51rZ2cqY52hNy82uMHDlhB5LKanFN7hD6n7Y6Hcbc+nJ8EVRuphlFQqNKzGCnTfsXGd52Fnb8agSF0lcgy3Xs+9WTfLZx6O6+y8DpUj87Gg405N0aN6i7s5W889i2Vpri3LqegewYfV6zsTWnSSbMkHaI5BNcWg6rFiygwYVNMxqCb5UACyPA0nZsCfmo4/NeUT01uYyJwBg2o6BtWUoUtvIXxwBhSq6ShUk4yoF9+PGVCopqNQTZmX9Nh9ZwbmJdMxoabMS3qsL6LWm3/PtV3dMv0sYame0KR/CrQ8N7OM6A/B25my6y2qMk/HrZriVvVYL0StQS71Yh+VgxUOwDbODOqtxkSwA69ODiCRdggJDUiHyTkgIE1H4JqiaCH9enxTdZtuNj45pOIMYD+pjC62pbwxON9chSBxGRBOsfZGxf7U2wxKQtPRtmZO77yomZ8lgumIVTPnH7yoGTCrpmNWzfxDTmkGxKrpiFXTiFUxq2kGxKrpiFUztx/7PzaSTHe0cSlRX3r9yEmAJN6v16RpD69E2XYM+muFx/aENT9/W268b7pWiHBX60a4U8U5rY+AQSnflEmF5kAgoluAV1LSbGyduV6d+ZQ/7qR4PPu1I4TNTQgLIe4zIIRNRwibmxAWQtxnQAibjhA2ye9CpSyAKljjfmuFD4PO7lZu/SeHluYBWjbAbigKxRzNbJbjB91kBjSz6Whms6QfdJMZ0Mymo5nNkn9QPWZAM5uOZjZFM3shasyAZjYdzWyW+oOooVaG6Jh3KS0pwkaV9mYQSl+vjIsJPoxI2TTgKZudPDBwOuraLO0HN2MG1LXpqGuz9B/cjFmC9dhRyqZRymJmxSzB4HE0r2k0r5hZMUsweBwxaxoxK2ZWzICYNR0xa4qY1WMplxkQs6YjZk0jZsWVtBkQs6YjZk0RsyB8H95D0M8dMWuKmNXBEgzS4mwtxh0ikJpii9csSvcVouyBFMCngPCRIjSjemuVei2p1fwuEYo6Y52HYMd03K8p7lePcWHWeq1LzEqA94hNs/wKYbvTvguBjcoYUO+4pjZJyqM5Qf+4f3Pi3c1wwnO8sileGfS3w7sLhpTjlU2yxGaL55qAVjYdrWyKVtZHvGsJaGXT0cqmaGU9BsnMGowox/qa9Zc9/QxYX9OxvmZ7t6efAedrOs7XFOcL6eEgngkoX9NRvmbLP1gbM6B8TUf5mhLXD9XnZkD4mo7wNaUzH8MPZ8D3mo7vNdsvkasZ8L2m43vN9kvkagZ8r+n4XrNZb4xnxoDxNR3ja0oa+sXpylr/bV5S09HJZjNrpnjeNrLZv+/u3CiSEHLodKU2KkvM9MGcl8mK2rKqSFWjLlzI83zUzRypbYrU9uIioFaq/R9AlkBOhrMyLQDm9/CRimO8TTHechwksJHSqYNAAAFaJjF6jYLtSAM1c6ahtlbJKhkOlJP8d7th3H8M44AqNx1VbkrMdsXPJRjFjik3xZTrsULVDIRrp2OwTRLSoNgXTcZsvAweuq3HymBAqXhr0t4BV3OrcJEaDEFjAHEUBzTS8QqT7FQP2lH77QbdJCGGXOzoNAOC3HQEuUla2otA5Qxka6fjsU3x2JBJjCpMbH3ufzPHJgN1pk0WQDeF6Hn8SyMXYlOQzIGqlXLtwrom/BOkJxw/bo4fC2FAj5uOHjdNDvdlCxbI4U5HWpsjv/NVZ0Bam460NkVL67GKlVpZ402bsIYybREIQUXXYsS1tB//Id+OgyZMU3rhc4uTM4GULBeeslLr1WB4VdxPXsxKyiyvM7fdDWmRqJ+RTSJ9WC5+AptABtexK8+gmioDP+upXN5PHXLUU2jNgW2aSrLwkTO7DihTCMyBwiDRR5AfpzjiFwbh4qmp9quacysbzdkolybTDRw2S+tjZuNFF/5YXhATWfpOpxGdnen8LFGKOirXyXp9tNntJ6ar99lxHV5fxnvU4bq+bAmBgvmAqDI7W66z17etdh12g1SkzkJCf+TrHdFtiujWYzEXtYoTdTcD6DKRWAbXxL0kCbzvrkDQTSnmnXWW77YBeOWMVyhl14qZF/Ys4lN2hgFXTW6X2lRoR84VP/Q8ObTB51G6TmbZEfoH4ZYM8fVGrHyi1sztEAhDKpYM08gSzL2YA4JsFuv5a0Gwk0sZTLgWqUSHPDMIxz7NiKA3zlfYvjLjwARIhX0A/3jof4NbtMTGG7HWiVqzbM7PW7cb53Zv0YHDLCwyLRyFestylOLrpPkE38mkC2thpFaq3kn9FqYq+VJ4Vq/CDoeJho1jXicX5/lHR3Xrnch7I9YvUWtu9gqE/1RHsHJ49KZu74d42Vb/vIrMZRwIULpL7P7ELCxfUNKWHTZW3NHnR0zmqHZTVLvxktMa8+5JsgmHDIBBPegnVOyBlp6CXvZdRm/2e0UxLua8c3MmyYZlvqDvd8B7IZ+Qr7pzCSdqTEAAAmyN+lP409sGQ4/Ur8MRIdqn4/pNcf1gbhbFEIHe+HSsuSnW3Ehx9oCtwtzA76KZ50YV9a+qRj2m4Q7RNU4LdaKuiM8LHNT1eAHizkT1AXJK9yPC0Iq5XRSzjFk3n/WaRLxaVjgGxud0V19FsKbzdSDRaG5s/HjP25ud3S+rZDvokigYRT791eUrY4f5OizXYb0OW+S1Ph3DcIphiKcSPu0gMnIMwyltdqriBAmzgGI4HcVwTuPzh10moBhORzGcUwmvHMdWAcdwOo7hFMcQE3g9vin7HxHsLxzpbYrXBkz5k+Y4A3H26Thpc9p8GCdgA3H26dhmkzwvFpWCnW4gzj4dMWyKGDZyHDsE4uzTcbkmmUcLtZMn9W8G2uzTUZUmqUeANNSKcekuEHRHx1Wa4ioBahb9hoCrNB1XaS7pwoQCozNQZp+O1TPJoCGsNbpAtTUBQiXaRfUPccGMJzWjrW34rGX8NGd/WrIXIqQgYIrryVQdCp5mzs7VIAvGbLkWOrfTW4daV+J95Na3T7sgu/jrNMphjuxDOzo/+zuu0NyK8nHKM1CUn45MM9e748YM9OSnI6bM9UtnZgZ68tPxEiZB+y+pjkBOfjqQ/1zrV8IxEJSfDpe/DJcfJxzX8RxFywG4lwDcEHUPBsE6nsNoOSj0In71BWOyjucoWg7wughfjVX1VwB3XQ7uugg8RS29A8rn/v45oy8HVF2EixJo8pDqXcezIy4HL10Ei75MRCtAly6HLl1Cl44S7j/W8eyJy+EuFxGHr+/g2RWXgyguggLfnsGzIy4HIlxS3h6xieQKlLeXQ4+tZB0xxAmtFHREB/laKf+YUlYA+VoO8rVSeZ1SVgD5Wg7ytdIvo40VQL6Wg3yt1F6nlBUAvpYDfK3Uf0wpK0B8LYf4Wsk6YxjmrQDxtRzia6X5a1IKxK+XA2gtAbRGDCNegfr1cuCptdWvQwH1lYP+6HBOK1t/DCMctZJsNu/6skoArFxtgwmCa6EiAd1+jy3KClXX8q2QkWL0jRQOVGBNTVumvwNppUEc3EO9dTlU1RKqasQYY2s9lW5VWenENRMPYY7V2fT7t/r3qfkt8DkoUASfS3iW4HP7407Sv65DCHJwx26wCcWFnE8Qxa4AxrUcjGsJxjViF9QVwLiWg3EtwbiQ7QzvIRhwDnG1hKmqL/2s30RzL+UDE4oBg/S3ai6qP13+nyh0Baq5y6GrltBVlBCKflEwfB26agldBXB1+FRn6GLBpM8G8yt8rJR7I8CGpKpM7a4skCF+0NxoAeAVA7TAcqitJRnvEQOMV6DjvRzAaglgNWJU8AoAVssBrBbhUujiwRZ2Bfiq5fBVi2gpqYU8O0wAr1oOXrUErxoxrngF8Krl4FWr1F8jL1DxXg4KtcrPcRNAoZaDQq3ya9wESKjlkFCr/OzoARJqOSTUIq7p9VUGy5QDQi3Cml5fZdAdHQ5qVeuO8QTG1lP2xrJ6KPoQpQO+TCE0aICTcIp6atJm6hWSZTp3ev4ApWIIoswpeww/ozio1RLUarT4XQdQq+WgVovAqUwH6meEHiCtlkNaLYKawOx7QvFXIIC9HAhqVcmvUmZounrnCvSvl8MpLeGURgxiXwFOaTmc0pL+9Ygx5ysAKi0HVFp1bKg8ydHuAkF/dzilJZzSiC0m1cppHFrVsNqVy1clnBLO9NRoIB55EemFbMBBZdDBHHESQ9DfhRs01SbxOK4KsE7LYZ1Ws1ET5m1WgHZaDu20hHYasT/iCuBOy8GdluBOI7b1U+tZ9x7TCtviOUBzTMs+WeZbsOmGbKEeIjheKHzCfQDLag/ZXMuhqJaEs0cMa1wBjmo5HNWScPaITepWAKRaDki1BKQasZqdWrdqFNlseJPUUkg3MYPNB8pkKGDgaN4jaR20r3ZCF2534kadAFkjRj+uAJC1HCBrCZD1Nvu1zfw8Cu4P24FjiAY3t5pnrlZiSPOjOnCByTsVPDcVHgG5cnYoICtnh0J6o0BFpV2aCr1dgm5jmr7IwffEMm1pxo1Ox+BgFadNhQUIBVhhgTuMIeULVBsoyEECKAUmWW3v8zpkfR3tg3b0YGClIVdvVij72h8dVEjUB1hBs0PWzId/0m56MmhaDNxRq/ZZTN6zjrcLl6wpiimbsqFLaPuArfy3CgXAKkeeIoAWqn6QAFrEuUNhs3xB7SEBtFJtgFAU8Buav3k3q22Z9JdBE8xqDnu2iBBbMStCjexE2O1IfrQL0YA337hBYNHPOlQ/K9THTMarhSCteLUoXBVWiwCWLyoWrQ/rvxTNlDDKSfFHubdKWmHWzyJBBV8Nf4RO4zNKwOhkGpSZG92/cIeBW0St8RJB+MRG6l2Ufo0jFub6WY7LrRtMheVISmGkPabW0bfGsmkbJJbhC0ENgE8VqlHl1W5jz9SWq/booKUi6mjW2c/xSEA3hs9tZKZqY6+zCEiwxD4YJgQHvhUQAqJ7avgugGI4wA5p/WIbJY43BX4gL4My47oP4MEragAOatU9toYOFbiECgSEJuqjfYtWQPZaPPVFXeJEpKPpKJutY+1bApPcWSk0pWxPnveuwBVFdz4EvD2Tu2x1i+V9CvXaaEupq2HASlMBMEzyVeeSKln+JkMCAfrO3wyJg8mXI8kjqkWnvJ9TnnUrJTWNdl5Zo33sEquUkiiWIqWkVrdSEmQHTCkJMimmlEShFxVmiYwqrL+gRJIGC8ETfCmTHdNh0qF/QW7t7lq7Y+k7tf6QvssSa293ETwCcqCYZcz63G/CeJeUWmvy5ax/VfD+J6TvGi1AiSQYLENND/9YDhG6ugKSWPpOrUNz37VZOrdIdzPUvQm6uJrXdmhwN4Rxnw7CGmpXmMH9lb9DF/AIcwosQbTBCDCny2FOV1egMuNApXcLMxAxmBABbpR0kWEwD6RLNY8Bl4JOWr5pZEYCmB7yByqtlauFoEiF3ZtQpJJP6BX54ENU28HDSSfLx0NwkRJBpmvESQU2DoPGEcgAuHERU9+EA2YdFyhD2MR5zjNQkFbakrP2Rl6giCl8RJWWA8qbVHc8ALNYgvFMSs9AQeHTKI1LghznkoU8l7CEMDcVlhABGnEZEw4GFJrGXyyuMIRoHOXYsAusJIxUk0qnzIGaNCemhMnOxjzXOiKkxXLw3CX/ihFb5qmVtV9IISXLPFOal1glygvBg5ZjHzsLAj/HxreUZZYF80O94KYfQXUhrCZSA8LkQYwKRE8btRDwlDTdCFl0sKPZEouFUXDOUmx6R5AhPwMIayWKRKw9qyMNWvcXtLlvRDI70EuWXA7VE7IsFyYXVugiQYpY+ugQhDo/15JN+vQG0OcIO+WVR9/n9G3YB1tG/LNkNDCXRn8il/qgqBExr4ewsP2U2cq0khxznyUsRyKTgzMckZFcyb+QQ0nE2u8P9OtwXIcUDeIqot0Bzk6pLnnY83KA7EUY9AtZfAW+Isvhptd4V3hbAW56Odz0Igr6xWhoBbDp5WDTiyjoF0ruCmDTy8GmF+GtL2YhawQbX4eHXYSF9pg6uwLfh+VwpIuYTPTboJA9gkXAYTgXcY/o2dFLHMFm1QElFzGHGBDRDQQZIodRXIToIbyOpvARZEQdpm8RoddbHNIHkL7lIH2LoLNOdOJDbnsFOvjLodQWMWcY4dEzDEBqy4HUlkBqMzZttNZhAg+XJvnQPnLdbNhvidjJZWiUy6R2lbJZH5NqEvS5nigIPin0y8HglmBwmF2irhrg4JbDwS3h4OYRx1QBDm45HNwSDm7G9owrwMEth4NbhLUlLOVRdwuAcMsB4daUwXMEIVsBDG45GNya8xdiIMDBLYeDWyaQHiIGAhTccii4JUXzGcO2VwCDWw4Gt0yx+wVzEODglsPBLaLa6Hb/nDUCFNxyKLglxe55xHnlAAa3HAxurfoLtbCC3ujgZGvDyWLMQQAnWw5OtgQnm7GS5QoAZcsBypYAZTM26lwBoGw5QNmSlC3MRaLZK4CULQcpW4KUoeAaIXkCSNlykLJ0CFMmXcrHz7Dmv9e4n9wXSe8UNWt9XCP5a0iJYkQ4WWt9XCP7a7wjeqzxcYniLyGazPGpwM0Xf416N0y7gCBUeCH7j5uuSoIlBUexFeWCMKgb1qm/AznYYvAPZS2h20Uxagm5z5QDnyP7/j+3K/5jiiZFa31co/lrSDAxv1zjORbuJ/c1TDIx2hJb6+Maw19DzPr6co3neLif3NcwsaeXXvQcEfeTdg1Dt6X4GmxlHYzKqFRXpjgU33znIKBgI6QLKVOyAAE6g4IuByHsfJjsVHl2spzG1Nqk3s4jLLBv/nOjhtFHFD7S9DcaDbvkh51gdMh+h+M/wNHdT+6LFMZxYW3dWh/X8ANPaDpQW+IbeS4L95P7IgpTUrg4WfPjIn48CFUHgbLnEmmtIq01JUxJjBFRrCmlscpOjqKSmmlGktMu+uRu+c91ZNO0BFl2GmmlbjXjrCTldh9OWZKY6SztcOeY5XO1qx7ZbM6Zwzv1L1MuO4dHc0Ll8CgxqBxepmQoc3i5zp3Dy94Ewn7+n6fFkY99czxcTs3/Y8sjY/AM03zm3rhXTaWinPGxSWGE2S0SNcmuGR+ZckHcW+YtvW30e6IfjqQlJ42+UAIZ9lSZ9dBDAwTPHhqvqIzx0mPvVm2zjDGS45YxXjv1aULaemyY3u2xHSzQpGw4wJRZXnvs5e2J/HmCnPcy7ISi/jbvvkh01ln7gdG5/rSnLvQhS+eKI8WWRKJ1Zz672x+nTK9q6jhn8tWPVR736edW4TTRj+NhHk2uyU+ugmrmcNtsrWSnEUrJ12W4s5Ut41spEyvO1JYPB2hO1YV5VhewWdHowoioSkMi50GXB7Ab1DfAa1fVlFlHjT2zUuAoU/67bhFejbLjypQnFR6YhtwlhkwSto0ziNtbh6GJnDpMKmeuPPmKoz2JPw/u52QfSPHdT+5r2GQfRr3W/LiIn+yF5JwxD8+aHxfxs73AnDOHmAxrPlGGmaUD8HGV32cpYRxbQCATNEsbQNDHTZOI6gpUyQXB2/x8ZzY/38cN+pWEyE+U+yqqfI9+2kyUrNzTApERD5PYTDSfpYnOgjOL08dx7GwADG22BlSXecOzU/ilSgqAM7Yct+bHRfwMLhDpjB2zrflxET+JEb35ko+z1sc1/AQjKb4ZksSsVWZw6yYlqzgbC0FL2ZwubuDbKUkJvJy20bVtg0wed+RnKyFIZ6xqbs3UAoHhCBP/0qgDlIo5+lH2vRKDcbmgMiNEd+TMOX2ykEnDHuoJTDp0UwdsysvDQ6zt6//cLgY8umJl8cjfbTRHFD9HSBFwxlw/a64m03GJXZ4+2hciuBxbbLTQP5OuMIg+TKZH2r6ZdskhIti+7M/NsSoa2wvtVq58024JjgTqIRMhQB1QrWwylT0M85ZmObbI/Cwpkru3a/+5Fc1gJUyfWjOhNsiSK8a7o+6TfEQBvugGl74A+KpkQalc5bxFI0REl9/MHlFKuD0sfhYTcnfGRB1r3m6TMHGBKmxhXQewEJ4pRetv2fW62c2BCSipSb2P9DE3h/5hiePILJoRF9UpN5IUd9KphLEmNb0b3/4yFyOJhsDWQvUm8B5VZYKnhGyzG3ZZic5QcKQyS2tIilBwhOnXZkfUA6GnizwwEaE16nxAlUF1JpQju6Jy1s6S3b1MWjD8KLJBYQSZZWN+V/0HVx5y8gS1m7WbNM3CBeWpKeuZWT4ga0EQfbDSCCjLZ6m6hRCcUSSL9Oa4jbhEzwW/IxV+MR9bZcKZ0hmVhhe8QG3HechyF8OXJiGVueVPstwq0r5sJ76GZ2c5rzXLJrAnKsSwyJomgzH7APFqnKRYNNQHWFNj3M5S1j57XbeW62y14m0y4JoOr2+r4zqc1+H1bfzB/JUctvtsvg7L+cW02anHc3bxq6kEO1HmjId0tJoWv5qaZmecgwqA6veT+xLzlSJpjU+5pWmTqfm03eZhAXlzofa8KQwDJiZxxwQnJc7Ij9vyyzPx7DHz0hqF51zlM9tGETPDUbbiOzgEF7CYCh5qPaY02x434VdkgehhTBMkwK3ZX6T6dVIg9xljo635cRG/UEpSdMbQ5t1M3VqAASwryCn+uJPIaIvaCo3FdkjAMGCchl7NMbFSnedKQDOy8lgJql85JV+aZigEu5t3QZ8IgkRrPgAaMN02yZ4d3D9zMoAxFocsMUX8OWVoZQAGibZeQOkJYkDPTc6G+SOdEmy7qnlKaLEADVGmywe3rlwiEn21aetKYw6uQHhGh8FutZRUTJxLphXbHgIohXrYjxKsYRCsxikSMC3+6TwRDlD0S/yumokX3I4XkpkxpAPaiHTAzrvLViIZ5GGYfRWErhB5aMUo9GNDXmhRA01OMZUr7VoSxNLPqoIcAutD3ADQr8yaHOZwcnDUarG5IFz4Cqr00BhdawwMRxcnfpqlH7w/gpDTYZdOkvg6aMsxlW75pLQOGS6mtIo90JQWMY3NoF4HZeeZUtBPSLmO/dnK/iHD02KPLtHfgmZ9XI6QMGnSB7Kzk15SxGHSy0bXIiZony3XYb0O23V43iON3fdZfsVjy1d9RCd5XLg3jf7N1Y+QegOy143pIO4Zmr0Xgl2+OpUPMu0tB1JNTVjCyRh0eZ0q+4Y/N6TojX5YwQ21f/aGtt/Cf/mG/AIpWgtWpvCG+v+5fKuZIJ+FUP903LiD18J0KQwnesTKmABZq/OwBiKA9kV/7ks7WEC6ovuKFt3qF13xZYCBC68xLY3J1Brhsv3DkChn/TYI9hjEqdoMdwLbet1m8mtnOBcjNPOYMSAt1oelXFfnfIIy06B2eWZeT46Bc46PgjDAGyfxwhhM3CVQBW9NZZWwqAzicbkDppsth04iBo5aa0l5CbrPEJpMKKRUqKkGRpcYwWih8MYvTdzDSDRpEpyLKTBNfpmdpfLSM6yoPqwQRWjOI37wUVax+qhAJKEZG1Fbs79I81GBeEJzvuzo2KzpzHwti9n7QQrKUpNZ5A9INhFIiPWaml0EritRjCP68dG9S+pTIE0wBynhMobreLH0ywPpXJujKfgncG8fAvG/iG4L0Yv4S1mJ4S/VfeCXLLMiHJFWw8TTKof9rXUQGO7SfchSlEmKY9RWZOKUOW/OpItu5MhrKczOto2bt0PM7+ysczZ7Com/Yn9gXB+Y19l1HtKDtuXHNrz5KEzUrBmjJ61ZUcou2GIbIfPRDpyglVRokAHfK7oI4GlxtKAsupn0yRTlEhPMhZjTVNjPiZTsHImgHzH7WGx/kmRIPbS1yoLZTg5AfnbKmRITxSTroo/HTNx8OCfiF8Dy8c8up0ediYOygESINzCRdDpjCrfT8gMiaN3YIIti8IkStfT7yMW2hZV+rWlKuVA/A/M2TaomMbcP7ozdy5971zq7XhLIAefsfnJfhGvjOl4SyIF+9/3kvkjXRd46DxF62G8XWQ2P29MUJ6TaOIfMG+gByE5ORp2A/hplF0+t0F8Yk60SPlD1U14MR52bsNoeS13zS50YausIWQPWzHrjgQwenTVL1e4QU9HaEk5kRVHB4VSWUu9mtuwUilL+CU5nk0U4UB5W498i9MbmsbDmwr5iV5R+BNg37DbAm38S4OimJCU8evbkUbv7P7926te+dfMordz8AiO21opRV9b8uIhfYUhnSiuGPVmzv0j3K4x0wFeMOrLm52idnKTQryZ1pMsx+A5skEpvwY3RJY9bJDpXQnhHGVwSl/Zhvg6LBvHj/v1kK04RWOnx/efNWbGq3UGVyZs1JiXGar9bY1ZBtqk2nGV0u9L2s7RZ0sSG4b2u5Q8T51X5Q0El0xJanTRPM9Igi6XLIXKsPUNbwpqmmeiOmpYHAxh+IT+wNMfjixcphrzvRX1X3uPcB8sOSLHjAYPgx9P0c7gIQCu/DOVuliKaaruof808RZhBX8kS6Ig/NCHLSWT/wEZyg7mH1KQf1SDG+7g5P0mLhrPeKku9/vcXGG5FUdlr/6IVpvvFQQyd9VbRCig695P7Iloc3mo/koZnZRIUyJnlErD085T94g+BR13T3SMjiPdGq9vqNVPtmn/uQbN9LGBpzdE9cNhR0/+/egd+BhY7Zb2VgwL5+PvJfRHNwLH2ojU/LuJnYHEWVuzra82nlq7xEdulpcuQk7Gwqv7rD4mOSyZs+3JvpohrWtaU06UILkoijKDxdAsHJLITZeyjKg1l9GMuoGRrk7qCjcGUvSyWQjohU318UW+YkrOLYLGHkq79sj9PQsvIW1VH5AzyUmj9S7tl8HnSwi7xi4UbJef19V629rd/vktTfizOZc2Pi/iZThr3qHiEO6uArnE/uS+iGam8dKKAsnE/uS+imSEWzrLmx0X8zCD17VVfwkbJb6sqkbRTxAHXQxIPueOr6ppH70qVstSr4sxotkHsZW8QpxmcJRLVyeT/tmEMLSzz/CMqwmuFBO9WKBkotBsDN03bFzaCjqsdaV+I7ZD2hYslAuUV1rlFZJJO+0LAaGxjyAwSd4PfBDyk6Mk0+p38LKhotjm0w34dzutwnYfc+/FwVa7/+O2rFhPESYvlo5Ue8crw06ekxImyDV/UULxiZfp0llpPwTQl82jPfGq9XTl5ydRT8v3UfyOyXrl5ESyRLaNDL8Adjzv20610w7FKxnccTbfDT7fS2l6xppc1Py7ip1vJbSP9HV6EzYO5xinNE7m476J7EoYFMLp+tlKknboDlBKYz/3O9HOddKhXfRn1bGbfHqaai/yBBDiOJQUOAGrJA12DwQeBXB+6jX+PundAaVq4CZil4k2MAE7up7MB3ngZetcU58DwypT1TlK5T0zggwOeCoFixBu2IUr0TgekXWkFOA3LQJNmGmsYcirkWUnZY74WZ5urB/FrGDuJC9E+26/DcX1gXmfXediP61Cqho9odfqFQFyoFbv4WfPjIn4hEJVpxXo11nwOyCfOXsQrQu1O/MQ1HG+oibZFGBOJwRqPNwDF23icftERc2rF8jjW/LiIX3REnlqxQo41Py7iFx2yoTB51vVNzZdfA/7U/eS+xmAFd8UI+4BDdT+5r6HiNHBxrfnidECiup/cl9D81EM7LGt+XMTPT2RGAZMSYcUCKtX95L6E5pYecaGs9XENPyyWDYsZXyMaFcuPimWjIgacB5Sq+8l9DSImkbp7MqKs9XEN309Fq0qxlas1Py7i+6mYVQvwzCe115ofF/EdlVQpJK2evFBrfFzC91Oxq5j1jTp7QK+6n9wXsdTRermTqKd6ilUSxYqb3qdeszW7iyRPsUqiWCVwQ4IxkyKOVfIcq3RY/ibG6qeIZJU8ySqJZLVGCh9simhWydOsEolMgGAFtgrW+rhG9deQK/cRIW1SRH1KnvqUDuus8aKWIu5T8tynJO4TvdWfwzdF3KfkuU/psN4KVEvvw18j6KzJc5+SuE8rltSy5sdFfGclyYgqgE+OrLX6a3heUiLJSDYGD36ntT6u4buqeEkrltiyZsFk6kTNpiNam938y5kQAytLyRFUYVEXFUFbAKSDmdW2Dc8ljDK8xpx90587Kz9WjRSRnZInO6VUf6waKeI6Jc91Sqn9WDVSRHVKnuqUkvX/ODKxZuYqbmo7dImn/hUTclC1KO0ErwunRCM5kh/ZbsqRpNJI7hqxbUKtIbA1ti/+c6MaYyPeF6l5pyOVhUn9KtEoRqT3E7H3DY5bxGRBYI0smi+Bkbp5cjsOYuyYr9QdI6dNS07LTK4xlEF/3Lwf3CL4rFiKy5ovKLXM0U5PSUKpMx85+nsewvdVosbJFDh96XmjVR4e0E8NsBPJs3qSWD1rxhkRNXNbBB83stL6h8l7JGKYlK/Cg61TG2ycYlR0h5MY1am7ViGVOAXQ/3RK+1ClhtWzTHXpYb5dfAnYnjTxI5DGZwKPynWTG6t6OsWxwIQnkhbhjbA1S4BCVAKQlvKk02PlkucoJXGUVixBZc3+Ip6vk8TXyS2ms6aIsJM8YSeJsAMXr3DVjwg7yRN2kgg7Gcj7IIhJEWEnecJOEmEHzzx+JtGU5Uk1SQLsK9a9subHRfycRf5KyXFIliLKS/KUl0T6CuaCcIWKGC/JM16SlNOB6Y5/TLRme8pLyjb6XqaGQOX8ftIuQh5I4bB6LgSBzPn95L6Eeut4eSIRdSR56kgSdWTNOFeTArnz+8l9EfQ8zm4oYDxuJOqsnpuRxM1Y62VOCzTP7yf3RdRZX5AlKZA9v5/cF9ECu14CzAhSnjykPAlSjupnfJGou3pQeSrqrutlUgsU0O8n90XUXV9gJ2oWkubUMB+SIwRdXnKEhdCEJk9FlMq4foEueSVwGgM4pGoaNXQGowVGa8yEUzn16Tphd3C/Y+HFsaSEdxzhxZPHiyfhxVfsnWrNj4v40SFA+HqBvaRAGf1+cl+EslfHC+wlBfLo95P7IjJ7fYG9pEAi/X5yX6TpIjly57Pmx0X88KhyKo29WK35cRE/PAjlBLEnYsamCP2ZPPozCd95xApJu5kihPUjfpERphAakipUTAka1QaWZ1I2ljYSbkaYwsJHwOCQKh/sRCnLh64+FV410+cD4I9B1EGE6DTMdRYKH6lhgdzxZ8xzA/gsfT7qJLOigveThefOW4gVQoLCryMiIoAdELRMcDnIg2VTGCuJSeDTVsLtqVBCnDiIyI320zAARSnpoBh2F0C/nhypdnKkCvLk/K2bgWI0o3RkewIM8gxLmsXokkk1K1pkq0j5EKWrSjg4P0BIqq7bxESjSh+firAFxEWWHQbqs/k4JHxbcNivw3EdzutwnYdM4VNN8JAHtc5uBGgm/3+frdfh9W3Jvu3RL/2ES6RrholmlJJLETo2eXRsavJGfaF9WzP1RtW5lZ8nLFUFEwO/nFAd2SLXZsBl1cek1buVGWCllMnIx6ZGNRNwOaoUEpCozKzIAwNHgDPeZ2crePhSJ0eZMpmYspygC2l6hLGtTyeRAH848okZykT2YCNSqXDNDttUfMdidBhgJx8C7PjH53HBiZhT7GKjhKZaCXKt5XNa5ZzbuUx5bNA7ywlsr8o15E8jHAd4MDnlkLle6D79XNo89DURFArd0HBvIFcCcyMSH3r1S3G/kPMq3YQiijQ17FXQJaWHiGJTphn50Vc9JjUR6DljRUVrvT8fKY1IOglSuAXSoAQ2oT/UL3xSjmQkf5Bg9PB0l+W57fY409S0zOWXZY7NZVi3oVEwhAUE0uZmlviqwwBWMIA2+WmUpYELoZ8K+lGWYA8Oy3UYy/gkD2VNskg4XoBGamaFsomKBUouSUQA5QuIDoBa5SRbjLYLfXvxgdqH8zSc30XkNRnpaVh1YRptLZsiMU2B1uFINYdpxa5FphNTI5xBpUkMWmvZSxbpQVxQkI4Q8A8LGi+LvHMW+2mlvY5loarFOKbCO3mNtlIBeFMFgf+wAMhf2HQDUFJM0+hd8limt+nkUgWABZclOBZ0zt58UYM3hU5BrEMag2RfXWWQHgwneWCpdMvAFOpnLPHAoBfceGWIdpFohKsAvmq3tVe3lM7VrfCQL+ugVMTYh8g8ioSWKgV++dnGR8GH3CmhCwyuUXb5bVrS+IFJMdmDna4zlYWjcS5HooOpU67zLOkGnX8lXWGdvVYxIVd0KLrVc07yAV1TQBf7OlrzpgTNQ1jEyynlkvfA45c/ihI4ZAkpRwvcjRVwqb0GM45IPSB57HQivDgfL1gmNSfCERtDr/btRuiqBAoMThKofAzeuyR/NH3ymcM+8Ht4iXO78p87oRlVj/FQaiUzEYtgYsg2xb7E5ki0QSzL6JgUWFhUga7Gx5QMVaJCVSeJstYNhKsfUtGpr47rVMIXcCDa0sFMHcc60aYHA1csoYcEAipnyEPkIY51Kh6TrEn0LgcTeUxDM1Gz6BUUTdBYDqrdZd5Hb5vtP2nboCtPppYRoBofs2El1zR2+gngI5gcDsZUyEAf5N2Unu0HFtI7IeuPhf/4DuDOJfhsMgKSkq6cRQq2l/pBkBHg5AVEYOWMgbFeRRKFkc/cstAoK2Dq7Ny9gq9q0w7K/V0UVoQsQ6rWDFlw3UJk4MH06SB3HjgPzUTIFjDepoy3OKp9frDYiN4OeIluaUrKO63PlD4CbDNqsb8Qux5SdprEMGrmeb0pZezaiCa393hoIsc0oLdLX8rMrkZiv+boJluZ/TxSLft+U1UkiIuJ4YoJ2MQIWBbo87wu9AF0MwS76DdxHOlsPjitIyjIB5+SHabzA6SV2lkODKwjR63XYbsO+/XZcZ29vk2Pn2fbcR2m6zBfh9e3tevb2vVtrV+H17eJw6vD69v69W39+rZ+fVu/vq1f39bt2x4Tjt9HNO0jYmskazZbhVNrbHG2oy4NRS1Xv9nSgc4hXTGxOdbR7qWdfNA0TJEQ5rkwEvIbla6NSn9JkUQki+RJFomshXyMlxTJaTWDzT7l3A7OrRZ3FNOS444SI0TViy4PJzLBCftin+VEuKZkILFJmsZGh9Ryol481hGFOsidgxgEht3kfAUU8uJ8pesVGh0dVMwhkxRespyvkB2jWtuXkpKcfSAd3mR3MrZnVKGjKLl9AKjR3Qa/T+QbdOR1SDdvUpRanwNThcWasq1Q5KXS9+2kwh04WIoWo/Cz+D/Ur8fea/OhDOb4eJbMel1hEmNKiNxqJ+XxMGMq9GVC5OxQAgE4qtfJZt+bWX7j788H4ab5IeWUPHclkX6Rj7ciXI/Sb56ykbrSb+Otg0bpN0+tSF37kreKW4/Sb57ikLo2DS+MVzUDGiELlMBW8pQjU9YVm8NB5h+VXc5yuEiJkibNqOL2L+2ioDgQDmrPo0giShxv1TS5nZzb5ULiJMyRWZ/FxhkqX9obD5aepWDCSi1dsdYhmjhuqpnSW0Z5P4wKPcciiURxvNVxepQ/9DSJ1JU/fKvjRDSJ5GkSqWuSfqufRDSJ5GkSiWyBF/dLa/XX8ASDJAbBsY44tzsMi2QaNIJLgyqkRD9c3ZXoh5jWbQtPTWMkkTDWRUhqc2yZvl4k1fYYyp6TkIaGMjIf4e1l2adlJmVv7teX+lZYkGimzdxPbKlJZqr6QDkzxC4GAshywjaT78dN+6lDhhXHWyUo4kAkz4FIQ1PHKi+/vIp5gExXEvwBuZR0SDaP4sImAXrNBMKuY5t6kw1N9Upv0OFb43+95DQ8zyIZzwKRb7TDiXgWyfMsEvH8A+p3T3Vza31cw4/uodH9VrEKfDLuJ/dFNLrXS/QUofKTR+UnIuyRd47UU1MEyk8elJ+mAqS3alZgmXE/uS9io/tl9xnYZtxP7ovYGHx5wREcPHk4eCLcOgP2Fl8kGhMeop2mOj3infAi0XLqIdqJcOuMQRBfJOqvHqKdpog/b9WsCKOdPEY7EXCd0xFakFrz4yK+wxJynaEoFV8k6rAepp0IuYacXpj3jlDayaO0EzHXGVmE8EYinHbyOO1E0HVOL9zrFAG1kwdqJwG1odUb4kYipHbySO0kpDbcCsOcewTVTh6qnZZ12JdYIcJqJ4/VTsRdlxo6P1jr4xq+vy7rry/xRgTVTh6qncwHIwVu3db4uITvrUu9Nb0ExBFUO3modhJUG1bLEYI2Qmonj9TOh3priksqOUJqZ4/Uzod6a4oX+hwhtbNHaucj/1gscgTUzh6onY/ya57PEVA7e6B2PuqvAmSOkNrZI7Xz0X4tFjnCameP1c5H/7VY5AirnT1WOx/j12KRI7B29mDtTOQ1EtcB3ipHWO3ssdqZuOvX9SZHWO3ssdo5Hb+WihyBtbMHa+eUfi0VOUJrZ4/WzgRJv4G2cmQikT2uOqfya6nIEbA6e2B1TppbU7wE5whZnT2yOhMmTXJnQLXKEbI6e2R1FnQ6nhZzivqqxzxnYZ5fZrScoq7qocc52dQab75zijqrhwhnQYQhC1gXKkb+IlFn9aDanG1ujQPxHIFqswfV5mxzaxyI5whUmz2oNgtUi6pD4Ltkzdnsw03jHZs8yARfWu8kbGIjKE9yElRZswJCtlHfpkp0XH9J0j8PH/fnB0LWQHgxMckRXjd7vG7ONhDianyO8LrZ43WzZO4B/wHuzr/3CK6bPVw3Z03bL3YBOcLrZo/XzVnT9otdQI4Au9kDdrMAu6/dOALsZg/YzQTfEtQBaOPjRqKh4PG6WbLx6QWYkCPEbvaI3Vw0FF7UY3KE2M0esZuJvs3pReUlR4jd7BG7uai/vqitqPnGHqGhcZ+WeoHaXJZoMVSyqLQDSBkSveZbkiQinO8WzZ+MhITlIhO18p9pieyBwZkg3zcSrVqpzUFvH4KMAE/qlovvdVgd5EYhIucIbJhFGgmyTYm4I6hn50SRe6B7cqLKfXSXftgVbUZflE7UTEl5oAh0K2t8CDP8jiohSGnY8Vbqd5XHrOORyrlonJa3Ttm3ACZeDIsOg/wPSFr+lbZIAGttbQsCFipFItqWiyBkgiIopyyFhAvhrU7NVjq4UwCZqhIzDZOEENMe2rpSGYceE13Xv4AEmwImhSooEkEAW6KgBJENOaetTiGJS0ILJXHJWzOJy3xKXLKkqTmeF6uETdDcpVIWo1BsSTKHkGyHxYh9VnKYuEJOEmHNPCzXYb0O23XYdfh4Z35aJMj7hYutxlMXlg7fBRAm9pdCNTF252OxKCS4lzoxAZhJdkFj7F6UH3Ix2aPMs6HMX6jdaj6l9JiChD7GJSCV6NSwdedQLpKNOaE2vDdUBFhN2kpnTUByHKIKT3k0G4KNj5ND8HjklbNHt+eioPwFH5JLNLl7wHmumtwBBXnKmarVa+Ru9OBDK3cKCEfjjLtC7q53pBIbZ2SPYM9Vq0UNRVat9cXHJJJhOBPppz4KbFXrt1QjpmFqrBT0orEJBGJocvi4Ub8iVa1INdQ8tta/sRmz17Vc0/TNc+dKcqdNWgQAtcjAnTeFkYtsdzg1e/x9Fv4eXxfeXrnd3r4vK6tzwi6YXjjoSZCgDw1stDHtqAaXrZPP6/4eN+VXNeH5MeOFN1U3gw9fQrD3pLQ7/IkIEoNOj8w6moGLahKnjwjaZUA4PmBMWU2a3mYDQkyaYCh4qqw557R1jocViAD4+CTpF3cJ1cJEq1mpG6Jxba6tysoi9VXCplwRcYCFCHPU6uHsPkzoaJiie+X6IGs+QfQAA1z0JKEy5cHafd/CyIK3cYHApSmLDFuxKi1kzElmoYfyPRBolZJ7XEoEPME8n2u5Dud5KEUmLhqUayc6svKnDet+un1SF9OXhh6CpzdaxJRkTyunKmc7HMlpEAFF5RyH2Y7futZzHvChhVgbeCFhV2k2OwEWy07aP5tVS1WWfBP7S4fBt3PRhIbx1kys71RAVc8uQFRyMgOqMKd2hNTZ7AkiWQSR1F6mg34bb9f45/QEN9ZzrF+VLXBTVdjS/chhiQgVxZLtBPOmFpe4s2eg5KrtSXsZgCOg0Eo+e5wUWg2ufHoqZY6kTCnwi1UrJ0SEv+0QgVYBC8B4QpqjCxdB5qGxJNVZGHFUbVMB6N2U2UWVYlTSU2X4QYhKalJA9mDP7EkzWawYaBmF62WNNlSe4ZDFcEgvXhw5Yjhkz3DIojCkFy+OHOl/Z4/zzwTYvyjKZIP5y2qB4m7jIAxb8aZmy9oUCkPtuQ4pMBIzirm5UQe6AbRslGch3lBgqZLqp/YgjH9YugVYl7MBXXVkfgPwuySpsPRzKoSoq1wgwHQQ5A8MCgXDCJVBh8aCmE0Yvqz1WVJvAzZoMhBeRVFT4vrAqIl/83hsfsVu+YceQr4EuBFCSFObKm/qb3LeYJe+NNQu0ysJNOAPFPwVipj2LbFmYZ4ibJBGAkpg9jyF3MoP8QW1/qtveEY33OWP5qED2RMZcqs/lB7U+q++4RXecHp5wn6VEaMhvWiFqZkywXVtT7EixB09tkQqygQQZy4i3MHl1UyGDeBS8QKWULmYSwutvwpR94269LDFlhwbLJ24ISzH+nQOB7QMiw8ThQ+xOHWhWnW9VJJ5aKRKSesqEipcRrGUd07QGISdctp1S3vS2lN6AzjMiTLZoN3kRIikHTYdPp6nXwWFqk8v6E01703F3kRww5nHtqXETojBOsSA1REwE/W9qch9s29yInQz2FV4QH0WoB5wxvi+orScx8LnplXkBfSpZgv1Q1/NC9L2J7VUKXyuX5govUZ3XP5AGp4EC7uHzWbBZgGgju9tWfwhsZut4EHqALb5J7FBJr2EtV26HefD162BrlOppPjUZ84eKpsFlU0vykVqfu7cxjKHQeKAaDQpu5pc7+J6J3H7FL0sYyvqXXRt+s58y2P+8ojcLERuehEmyj1KVXr8ZhZ+M70IAuUIv5k9fjMLv5le9G7UfMaRN9Rk2l3nRE3ijStnqQeCHRsg7YotiZ1X3o/ziT6Z03hJVHqMaBZGlOSk8Eb3nq42UTbbZEQJZj4pbYgJihEtFakzgLhEYvmKcU6yKUCUyUi8Z1IuEbPAzYvsRXi18SJUhk1zT2EpM61ExxD630gZp/N5FcbQpPetZy7LA1qzNLvfzPfUfPrLUfWLv3YQize3n2H/Knhhb2XWFVhdm29J2ln9sX55yGomRvRNTE+tT5XKc5m9L67DvKCuxVX2GmB+LQoz0/qtKhmJN3BfcGmK9wQXZo9hzcKwgmYXd5dhXFD60m4LuvPO1UG4Jdp3Ht6vkm5puw/oHN8v/u688cfd+hlfYFnoB8d3O+8Fg2uml7gsaTvnDk9rGgiBZ9HtjmLG6FCCBZ127+umVQ4eN+qnfwFy04tejZr3Yz0t/p6zrnI6mDIp0sLASt4ftH0l35cY04Om1nIFlu494v9iPNTH7fo1YWhNeEEyq5l7cGSnNhFY4QHywdTUoX+y4oMCKu/BSLDvRaohBkuT2+X66JceSJwFJE4viGY1/7ojSIHI2Oi/e0d+GRF2OL1Iw6j5XAGiYlVZ1apRsETUdC+RksXM1ZY862xl6RfzpxC0DB/b93gw/7PHC2fhhdOL/EyO8MLZ44WzAYJfQMdq3ibFV3p3TweJGHus2/pZ+ME02jYTMRYIKHrMzk9BgCpWJ7M8NDbS3EDgcLB18MDhPLR1eMHr5gg4nD1wOEug/Xgxu1QzJytkhhGizaNbsAaNDnUxWt5mFdUyfwMW7+PhtZk95jgLc5xeULpqvvzwiuJSuI/U0/VCuoTlJu4mmsaAq8faHtq6UXNbNr/7x9352Vdg5vQiZqPmX2OSHjLgdP23x6SfZoWMTi/KODmCRmcPjc6CRucXZZwcQaOzh0ZnQaPzizJOjqDR2UOjs6DR+cWiSc3K4pb+xw13kNHSrX4LBjcW2saMEBV1u0zhzvDmcSt+EjGA9XyBu83yX7mVtm8F0UoDz/nXrfipaNZ3SV81XrXKaesQFSGoqM69NOUfbuVLrpuz3YqW75VKj/jOQnyDCBw/mlN1gVlh6iV0pfmaZfnoscThicq+1AlNdBIJeSXy05ZNgW2PmSYWkz0EF0aZOywgytyBKCwXI2wWlMOb8tyCCkq3FB7otErhdbQyhUc7QQoef1kmPw6Z201N1dgsdD0hFLCfb8zPooSmc24PM6Jslm8lWCK8Twx75lt2/ShVy4hme1bgWSnNWZLpT0j6KHHDoIeFAhWfFXZZynIC3WBZzrafVctSZ0jfZaXr9B257nwndBqU74SrnWwMW975ztS2ERExJklaods3Ko1tBgXbdUuM6vcpMfqsXXgkf57jl3i0mp+bTT4cYEdO+s4FNjkhJku7T6zCy9aA/gd3ko+YqZM9VSCLKpBfLNaseZc0uWlE4SztW0qqJrQVB0s9Wa0zqTZEFE+VN0R/VDY9BSFLKf5NOlvN3ImB5L8rU9qIwebxQhFcHmoXikD7L8AF7o5UimpkgnlKxNoGTcWrDS143L1fktbxS25bzU8cz4Xe4Z92So+8A3k8WyIvW8NeNi0SvWcSVUCevusYhcbWGE0avEgeCtkj3TKMy7WzCfNmWmveGHB3I3kcbrOVhVtUK40wPEhRxu4SaYUso9lBJ4rWpLeCWkaxsQ2h15uhLcFDqN5SUZY9SlOiztGfZq39IlEAS0c6jW2hwnUesqBJa16iimiNe4gpzaO1nXEbZ0pIH9j4H8dj0vQ0k7xs8X+J/SKaSfY0k0zKSM4vDBE1F6KTMK2yrpSs/2PRlkgBnzOe32Ek9tq368nY1XlamPACULCQcxDS4SrPk75HvxTUEZXuIwv90AqNkaOJk9vzRIEu+hVliijhxVelC/GG8iGjsoLDxRrkYwx5skxe9Zd1VI7IMtmTZfLSWv9CMFHzkyzN+WxR3eJMNp/ojEtYnGohVCOhUaCh/TJ3+iRQ5mRcysd9+hVXhJz8hl5n82T4XbVUAjOS9b0DOT9+7WDmm1/Lw8fX+oWKhJyc30DiEYknexJPXvOXLYCarwgvAqFF0DPCu9oXDlW6Ng/fwzxPC8rk+LwZDaj1DID5MUYLnTLhePdXUHyFwvf8IuKISPMne3JRkQ1EbFegxgvBoGQrJqEqy6R7xQPlYCWUr8jA3BOptS5wnIFkr4ggxbnn4glMRQSm/II/LxGBqXgCUzGridgUQa2/l752WJd+W/mKJzwVOVO8mCio9XzX/Ni3mXvo/9u7Lp41VcSayi+KiyViTRXPmiqHzVrxtriY/cU/OQl8cqaI/Hzsx4tnWhW5YnzyoLlCBmi2YbbO/g7wOULYoPCDfor4yCQfpTFXtkYkZHsp7EQgLkC++TsPaP3RAHRSGxQJVG3nzB28MlY/uDFgZZv13Eztva57U5bNL8zFM7+KmF/5BaWuZm4qihRwoCWhcUgxt6aHh1CJUirQOq2CTNL1i1FwNrQxomWiWfFyaOKnu+cHGvF/tETvSbCkLARxkXJ+ZkK4Vf5Spti4ZDIa4SKUBbHk0VL74+cP//NFfviU/E358ePPyRm3ZSBus1GbFiqge+kpUD6AEvwVQQN1WwDZF0oaG4JiRuc75INrDR8WENKY//H752fRqaGN8/lQlVXAbMpJ6OejUGq/OfXnL53+l3LPgAisDNjO+d8aZJOKp9YV0uQSsTnBalYial3x1Loial0ucRqyRNS64ql1JSmgLDEntUTcuuK5dUXcOmQ4w84fceuK59YVcetQcYkvEk1qnltXkia1F+/SEpHriifXlaQ4qcS1whLR64qn15WkCaHE+6QS8euK59cV8evyC2S8RPy64vl1xfh1gMAGiYIS8euK59cV8evyS6BcIn5d8fy6In4dioQLBsb+Gkny7tvu/jCvFMEEoHllRAkoanGalKrVBvArcMF+pBK0f9CWJxl8v3VOAZgNqFTLmTVnQtyfUNHiaX1FvL0XZpZaNaF1Tecow2ywEYUW+SsQauEihdrUmUn3sjTtVwpba3Kj7zV+p4rALdukP7LyN1m/QlXSDDgsvg9HSScfv8ePWdEAATOOX2jRpgVZx3zN2Xw99BMmQjQjj/HHGhY0lf16SLbl/D1N3hLAwvGhmSZTOYCIti/k9MxcBqFE6gSOMvUGcT+V/XOWt07yeKbiyYmFRENssSqSao9fVuWcwqzpMJfmY+knZagdMOuUKSScqUEG5KVAYti56w0BdyHHGfBCoHOuvzAtahQVF5GUWFlY+0FLI14Z7x4w5kJ6Uyd2Fu+005AWkpYiJ+HcoBo1clpj0YOThCXKZ53BDBQNczYN6oZDYrIeafPiKZhFlikvK0jEwCyegVly/7H0R/zL4vmXhVzKF0WDErEvi2dfFrEvSyhoUCLuZfHcyyKzlJeVQ8RMYucb81pI+nRz8E7CC0C6nKB1luuzcYmYq/wwVkPzsU2Wie1Fylfe4KgQMgeWP+wZONEM1s84BcBDiBXRN5bUMAwo7tqArj70N6a1O6Q5CHy2IEVA5RnIkVhsWot34t6SMD3gqhXaJfUh04H2MNAtnmxaSBx9e/sR1bR4qmkhbRQb0cBfoURE0+KJpoWkUUx94SWiGMbTTIsZw8RvP/KFKZ7+Wci0rC/xS+QKUzw3s4h8+dIHI0+Y4pmWhTS+F09qNXIvjw3+mRGoljH/1GlppVOwnEtZl+uEARN2BqudAIUaJtyLZxQWEvra271FA91TAAtpdS+cgBLZzBRPxCsk1b0wAkpEwyuehlfIgHvhA5TI9aV4zlwhN6297L4jz5fi2WyF/LEepx1L5PhSPOOskO3V44J0ifxeiueHlSqzzZdLRN3e84YKiTkvts0l8nopnspTyJp5MVJWo8jAH5M0/lCfuR4mdo8dIhVLYZ4hh5JpYvecKqlYjaWc0sjF4G20IFyMjQzMwIoiptUyxF/DZyXxDmg4AfJA7whUSZFqwpdweZT0eRFMQyTK4cXUfYb3D7DYrg4P6swCbUqZegAcxOIYH4rUzzY/VIrnmUzNbYlwV1av7K8npa2RKOP9gkslpfmKUjmf1Vz2EXGdU/4sCe3DClNfJBeW0T5LqviITfaZvg/GlrVnzbWa7C09yslhq9Le1KUhX3PQ4w958IP4oCTNfbo/2uNI9FbJdWuIs6B2TPvKJGn+oWwLZMzXVhhHIjTb1VKx70x1fyf7SUXGkxrhg4XucV5s2rOC9IScdhLXdrZSVX3SM/H8DZK7ZuKmnp9rJkie6AfQWDlhZyEvnD+Cf7H2j6UQNmgAou/xKtT/xTMku/JJgy2eUVbItUpvu+TI06h4elapirheJvOInVU8O6uQaZXe9sgROat4clYh0eqNVV0iblbx3KxC1hFJ1eE1osnYE5WKiErlZUJna7DwPtfbf7zM/knbpzjt7mlJRbSktwBH9in/sts7sYn1JTLwJKQiEtJb2NKiVcTzgkpTyvqlN7VoGfFcmCKyS431yEqLtjOet1Lk9PAC61XrxcEfJzxvmFlPYvlzUE9VwDfAMEzRlmBd84zZTrElsmItnglT2q8cbYvGqyesFPJEFmyWvv3/svdlS5LjSJI/5BJCHIbj/39sRVUNYKQ5yJ0d2enq7c2XKibpwROHwUyPHlOfduqukVlSmlAL9aRcVU4S7CUSPkqTX54dtYfKie9RIt+jNKcVnr/Rie5RIt2jNLcqfzjHKXiKTIzS3Pj04Ryndh+5DaW5leTDOU7tPnISistoP8SS7dTuI02guNT1QzB5UrouEbxfXOn6YZg6CV2XiKsvLnT9EE6edK5LBLsXgd0fDPvKSee6RHh6cZ3rhzGtn9ppBJQXF6N+aKf91E4j1ru4NvRDOz1BvUuEeheXhn5op/3UTiP4unTXaXw4hx0FZTQGMlPHQZDMSY6C2icrdlAwUNGlKbssvMZXDjQCuUt/S12dBKBLBGMX4p8ReJ4kn8pJ/7lEyHRxyPRDmz/JP5cIci4Ocn5o8yeMc4kY5yKM81MG7ARxLhHiXAhXfpw/TwjnEhHORQjnBym/ctJ+LhGaXBya/NBvTtLPJWKKi0s/P/Sbk/JziTjg4srPD/3mJPxcIlK2uPDzQ7856T6XiBYt0n1+ULgrJ9nnErGcxbGcD+P7SfW5RMhlIYoxP8jKlZPqc4nAxzK9FnU+x0n0uUQYY3EY40NbP2k+lwjGKw7Ge2inJyxeiVi84li8h3Z6UnwuEcRWpPicH9rpCcNWIoatOIbtobyno0xyS7IF2iUoU32otgVVE2EFWE0h2V1bxPmBo0ZCKKAOmQlp83oYIBtcdhCEwIQ0YBuoeK59Y++ba58ghUiUp70LFb8OZHst+oOvR47dar6N/id16hKhbUXQtlqReC6RyVlOyLYSkW1F8tRPKx8eBaTlB3XT3txEQlT1OvpRLesmVme6XiCTggSJM6cwOlOZJnN9980ALRHnVgg3g2fu+Sb/YComyYG0X94Yx9tQkTS7hg+s51gapioSnRb5pDe7Ed7FpLt+3W0YIKqEth/qzDrKik1dEitzKauM7poovXrrxXyYSWptbHiJ8lV4DNmT0D1I5jIiUQAMS8RwBdbX5voSwiKjHzQJRMCujrUf2MyyfljAE6O/LPgImVoQFJEgWF9n6XsfiQK4T/z2p8zliEu/204UTGUBM1E/VsIT8HLLrK/m+NVrhOpVQfUeat46umTIbjY7i8at/xYd6xu32rnIBWCQzG0AYsGAMAVuY6moZcJQvzm0NQIBq5TMH5jJOpocDyUgv2QBu7mJ7nYySW49mD0Lx16FPlJUWx8clIwZ40zBDeQvVfLuKKA5luyTh/vIf917jvdengegetJPrxEJWIUEfEg16OhBYC8tHnbiyAIvmpNnjYRTeZSos+lgfAiUlE9m6E39MMoW2FfHrBFzWAUqfHriQzBUI3qwCj0IDCrsSb/69mHYrhGsVwlfAzT0RJyoJ5X2GhFvVYg3ErK/8Lb1pNJeI5SsCkrWrk+FlEqJ5zjEQjUiyaqQZC0dSVT1BCSrEUhWCQqDnM75HIdYqEYcWSUmDLSWE6CtnmBkNcLIapL9RX04x6lDRBRZJSIMScjjp+XRLrsizVTyMhL3f6JyIPIQuAeUVeqAIpGlKxa+Eq8x3VojEK0SVAZll/N9nJp6xKFVibxDwPRQ1q4nGFqNMLTqKu/lhJPWwa0cySkD5Qzh4+tv9tUtiZCoLEA/Roq2ZJnyUc4BvzuKStaIbKtEqVEy43RfY90XLcsFB0rrLqDsoLsw+iCSR8GjHLj68qEy1F9G5oclhH3TnwUFXiJWI0XEdY0Yuko8XJ7n5YKOBkFOV+Qdvxy/b1IHYBguFzH33EhJBlI65lgI+zmFiP26wTgO5BccRj2h82pE51VC3sp1nYeBk/h9jSi5SphZAWXlMCrm0ygQgWmVcC4oOh57Tna5bycKbuvQJMgfiZXZCTM8CSOLQpXfZu1TqEWM910uc439QlLrN4OmRmRZJX6qPGTS6kn1vkbIVZXq/UMmrZ4wVzVirioRVOUhk6ajfEeFStMc28oavRJRQgxqUKm++fbE8vNtEYzYvgPECNyqhGGVdHYI8aO0Gp3FA+zmAHBw6Jo8yJ2fWxV/idRM6BPic9yzNAOFM8QyUyEmxCazLbtRD6UR3Ek3GyHaJQ3Rj4TWFO4Ls5U+hXSyiiBVSpgIgIjS4r58MR63T5GmN1YhWRjz7jxEXIyZx5/aIYjGawC7xRdO+TWC6gfA7Nmv8fVK48CYteA7s3rrCclWI5KtEqVVAAw/OFDUk4tAjcCuSphWKWdqfz0hu2pEdlXitMoDLFxHqZ5NlsbO/GZiG5N3bi4WWO9ESAoKCFUfPgXVazVXJhDyF0uhRphYJehLJrbfWPd6wonViBOrRH0R3XF8L9uNgJpQ933LzxgDNIcdYANKGftZ5uqORPIiFwxxJD7f1x3FQUm+Ag+VXR29qV97mNyDHmVw3B+B5VpwMG/XRvLVqC5TmDfQFmbaipm3Tu37uss47BGnVuycgKx/mg4kAh7bJQf2+lMRstGmFVxewI/7z/iSGKgRClcd7XZOFOoor8mECtHU+CzgZlIqHybKmMYAmeQsTWhQB+PJotRMjVi3SuRaecCI1dJ/XbxQXJRo9nbtLQqy4OLU9yHyuzGG+V4WR5RclRL+AxxKR7NnU+6ep9tAQVO3oS3GyJb9NjhTNCKxCXtmY87fNxSHJCLocJpzt5nKckk5nVEeuUrU2gLDiTjpNZRDIrt40wANu5iLtH3dRRzUCMLDJzzehbT112vh7RCP3l2mU7cDMqnk6MEgLba4pPtdfAqpBoe3EjGAlYi+0h7iiRMIsEYQYCWkrzyIZOooZyYrt95OoX6DviW+OVW5qA6GoZg5Ed+XveRWiNlvX/NXBBRWwgPLg46iH+Xb63zHElNrhM3LcFnSZcgbSRVyEFQ/hH8oTBah9l+oBAWB8MJk0begaI1IxUrcYXlKFvEowybkRTkNkTy2BU4ZdlDpeg4XRirA+zHDXagApy0lgL7mowh7rPUtHXKCPdYIe6y1vQTc9bREjGCwSmRXecoh1Q1XsSqFDiz90lK+QHzmydutyd6YVMLiBiwWod1v5g4ru4jOCXMhDYIl3m8LjRoxZ7W+QFjqCXJWI+SsEj/2+MJOoVFEnFXCx8o8E4HrCXFWI+KsEj5WHuTX6glxViPirApx9vA27BTNRFRYFe7r4W3YKeMSkVuVMCxUE04+rvWE3KoRuVUJwwIP6vw2fvkGHPwCVpbguyEya0naDItTjbZLdW/RkRvBPok1s3+tdyI6rNpLyaiewGE1gsMqYVmPb/yUeoxArirN4sf2d+oGEclVicsqD9glHeUSDEsrrM4wpjHzO5cAyKhig1EfLl0O6NUqza7mhT6UvrNkekClYmYDyvMQiQc3GQIjLIwgELmYqkfC61rc58qV+0UhkuojMox51t+2vcVkFH9Hyg3+fe1rkDD1La5XIzyttrc8ygmeViM8rbb08oVP6LQa0Wm1ic/yMDpIq5jJ/EQO0rhktYIVqnhFeJNcZkMLtPgeUbDNfQZTk7GKxHCY96NEjePYlTuTZk7WKUySzWgVaxEOPpsqYMD1IErLKurM6fsKvasusDQTKy+4EWrnYAVHZ4kfWhvyVvCbyjU6NH6638kvtR/q5/AvuULnX+blUVHJpZpoQGq0NK+qfk9VNZ3rqxFEYF9tb4WZE66vRlxfJUivAid7yG+2+ocE7W0oQjEIviHy0Tl/ZkowIPRkJYpDGRWQqexa8kLolqXZRWFypLi+bjIOu0QBophVG0bOeJenACQCBytRgPD3OOYrTsDBGoGDtb2V0avLC18/hkCiOO6e0HnwSoV+xwKl0y5oiLzGN0hA/vTkAloxrYKoacYxrIijYVCNUwcaMgrAzDzp+lOT0w+Gcw0uGqqIQyACAHuTp6cB4k9MRV9ELSDFnFhKTj+Xy4BeP51dSvefyciACFaeOudkVlh3Iw87Q9KAlIOWJhsyHIfKpxaZJn0qJbXI4CKHD1j2yvdA7xq+CG3xRuqnUjCB1jC0F2oUy6h7i50RHYkTLHAWlaQQZNZpjUAdBcnpYYg2XgHCzZbWn7KFX1imWdlHqwt9QYrDH8La3tfXDVCVT3+xr9HEr4BnWPLHbvSKAhunrKu2/RDN9lbzT1nbvkIb652IjYN+xWQjz9IXj7L2dYm+L0FODr547f6evpp4nLMJUq39IfUkTWoPbSRpdY1DtK1KKz5ikZ4JHoQ1dSSlJe+PiLqyDANIMARzSXB3kyKzryVcxM9WgmFh23VcJQtda66LzXSQtM/uYayvSobug4PvFrSX6AoHuWGebqr04Mxf4jE14nIrQbYcCU/VgX4tWU0uTahKVm5ohzLP1ZUh0d04xY2rS84er5NTWPVeL+SEZ6O7skQSavRsNMMjNjisaVNxSEbNCwpCZR/+roqJi5ZU2jrKmIp1dopKQrKzshKPjziG40QgWQTF/E+dC0RSKR2gLSp2YuKcxf9yUmvAvma6CFGuxBvXByh9PUGUa4QoV+KNHzPWJ4hyjRDlKojyE2LnBFGuEaJciTdGLah18M/iOU4LkQhRrt3eMsQneegaUcWVGGEQx47dp7dfoXVboYn8TPMdWkues9iHEqMoimPuyRz/pWIKYQCATjIp6HmoRyYmduHDkli6kJYQyxKIf12yADl5hWO0WKDcAVp63fF5ZXyOsxjjc5yFZ2dkbdfKjtgl15evXFdESlfJViNqnJDCjK/ltPKJSOlK2DOqvuemtkZRSitqZE5CeFEzkpPAXOHv5QKGvbqLbJEydqIsFX4Hk7Pqc3dHT+c0apizd1UKyXM4DS632TGUmcxKj3MKYjaxyXV1Mr+lfQp+KQp4cfBHlvlqe1/fW8PlrOxawlZG7ShtpfW7JEdbOO+UfbTuLY3P8uWhBq2lvjaGG4wZA+xM+7BL5/36KnG+IJDcHnDB9YQ9rxF7Xgkktwdc8DrKwMx81ULKpQAB1B9bNik+HuP7VTnzdq8OwlZJwLjq/YUi09vzKU/N8M3Lf9wq+r36DdAhhVy46osShOeVE3XN7CpZGpnUtUTilPZtTHFarnvLeApjpRD/7/sIXXLYSOfRvqlGyH0dryi9E+S+Rsh9JX7eHiyh6wlyXyPkvo63VdMJcV8j4r4SPm8PYlT1hLivEXFfJa39VHQc5uL8IAbz01zWf7lZcThDxVY+qvRUIprkItVxZXtNaywEOi48/DUARhh/HW/JoxOKv0YUfyUk3zA9naaWE4q/RhR/HeMNQHdC8deI4q+E5NsD51ZHN6zoFnP+Zck+iUTAK74xGtucHYt8+apYWf7m2wbp697iSDLfMjgnckCN5IBKpL/V69wMT+SAGskBlUh/qOydz3HqUZEcUIn0x3xzPsepS0VyQCXS3x5USXRUaIaR7wUHYaGYZ4Xbpw0ro9H5pwrXyuVXfjvMXfhOmYArq9UFvJDbO4ls1chCqPOtIDJP0VdE9Vdi9KFVf0xHn2D9NcL6KzH6z9/u1M0irL/O1yTtPHWziLqvwtXXh242TxNrxMLb9dId7Dp0B4swcCPommg/WI5aPMehO1jEadul7jCOr9SuQ3ewiJe2S91hHkc/HS2M9aaiP8J0hPepCgOn8N+JMtJMaubu68Mm52lPBjHNk7MiQ0YIV/F0qkBK/DeTjG0u+1S6oTEHNKZAkbgZYyfCXySPTRJV5KkFYivD06dc8JKk7PJeDTILBflOxYgErkuoDDKlTLbAkMAUg1DybtlFE45PGKRR4BxALbO2/7bvrbGPzrWvXWsfky0DsleMojpMqklXwP0Z0y28Wlsev6a4Gnfa/Bpf37bEb1vfmulh4rcILjdCxaEqd0I96WiThjkFVyD6VgU9G8j2UAcOGYBMOXMEmpqwkMp3Q3HzqA+VJ6PjJ0CbZAMAtkzzTUytRtE2yL5bdydlpAXpe/wxasohiCASmUGEIK7YJSwTDSoKcw5GgGuPg6dFZLwR5v6UzbUTMt4iMt4Ic3/K5toJGW8RGW/XixSbnZDxFpHxds2XhLCdkPEWkfFGmLshJXaYCHRU6TRgh6UdDJcABRrqAlkwSH5OIdFM+AMwjIfTl2ycgVoWcfaW3uQv7YSzt4izN4LmDbm5Q5JDR1Xc+RQq63jVB4gv8T/m8BGs91X/oUKwjhIJj1Vy8lELhgbqEBgB0CGSeFw0tQd2jcI9g5hInNTWgIZse9aCqrOKkbisVBaX6oxMo1IVnbpFNDxjMh3oP2P2etIwmznj7mNNo30LbVlYXrnWn0p9Ehr5zIpAoM+GQJnY1/ZWX8olfBr4NE8a8EhQWE4xxlUhaWgzr2uxufC8HJWx5J5rAWpTqcGPMYPIK0nmCDwT6hx9LaUtUiCMfIb2IMOgo4zIkOQRvY72OITMXDtKQ3pHLu0YV8jD6swtcNkJY45rKR8rXkN2wui1yH2Yi35ao/cAAnb4NGRXTT4ZehLSqIPL3aSxHvvtzGmRsWGkTgDrd0pB6iibJuQJKREFEAAmH1NlGitfpzZlZXSutgxFKCel8sbwIjUJcUyUQCncC6B16YBSTZsnqVu9leqa/fJPn735dO8MQB8JVYyWXOi+Dm6y1ywxeqgexWlRV1UTRNtuTOhgImpM6KDZNCZ0qOzD3jDpmVqY2ukf0OPSz4QzhDovFGyTlGexjxPuxN8yCQXTQJZ2x5e2tUXSipGB0vKRlKGDqtmowgZGhpyqSvrcyRkmsPI0f9/N1a0Qpkz3A2Zn3Gka6amCw6S3h45Id1fKsVeOL5P12+lbSj+y1/FvG5/8crvsxrQnKRasB0OHt3Gpj/SQdFfxt031YAQMzMPoL+S03ZiHwf+Z7Pl6c3HuJe+mPeRPdPQWsvg97bAK18qvCQgYOAGbG4u7MOJj3oHOXsWBe193FGdyMm7agzyXneSnLZJ0jDSY9iDPpaOL9fKL7rI02W/aJ+gGInbebsZGLGvNvx1OmhiWfE4h7GL2yyIzx8iEQUh3jPpO4tYWyTNGKkyr53bPg5JVnbfbGJcKvXm5WDhBnxHVxvNq4szZWnN7MPFxhRJdDspq7NmxMIljdWUCEVF9ZRYTdmMIPjLDUTV2NguSEgCvUHNGzEky8s/k0U4uZ3ORYSCdJDJMBy/mrlEqlnv9RR971hq51dY1Ku8vpw9NEXQHslvDmW3dX2P3LV84XItUIyNvqD2ggXVUPkldeBbUqEvxDaXvs3ldjvV3HkRQXyVBnd1tiCV06vLNlaGfDOaTKqZZSgLZV1wlb+gI6nlZheHMsnUmKbwS2IItz9lj6BZZBL72VCtga6x7n7E5sJxa/WqN6zGcpallcKv7HciSDqM+l2MDsOx2+ftoTX5X5jZXvEQTARfzX10egG1fgvOOztL31pBuw9enigGnlM3RHk4L95x/ufR9dw5FmkQYpGWptz34Ep8JhSUtlflSJFtcnQbf+qLBc33LCZfLLbb/vGk3aJvK0KvGxbEUEIi7P3E6JraMX5X72J9A0SfnnOvylsyFKpqqJNfkV3WzwHZvzdVPuMLDGNi4qkQE1cS6Rx/jGo/9pFdnZDWXbPhaMUQunJGAhuzbcTmWy60k93GwRfnsNa5D8RCXsog4hnl8SHKD0rLsWMK3L4RW9ZhFL+TXMnevbomXRGRBgDY+ciP3MvN1TD9vI52fURmhBxdKoiTn8S8ICKjjuwXGAJEMuoaa6GmEzxKmYqnKI0LIpqrYl6Udqn6gAZpanGyCWtBwcZ3r77X+/WZYp8GQWvhUjKvH5at9X5dzqSD8GQJ+LegbMeB6zra3+npHY2jf17PHiIzMv6fajp3IghbJgkbWXnswybaTQrtFop9Jof0hPXNSaLdIbDOy1J5qO3YitlkkthlZau3BXVtHswo49X+TsL5kX1B/pa4bVcUQH7aZ9TO5bNPcnWsi+BUgZMXBr5uNUcWbNLqdCHQWCXRGBlsj5PZLLNFO0ugWOW9GAltD/z2lQU6cN4ucNxPn7SGXbSdxdIssNSMhrD0IHdpJHd0ih8xI8GoPQoc6qmprrQeZj9ldoKPL36g6j+0CNoDtAUq0jTBjAAEac3GACUwR0KHXjCGNRjeXpIe+xvBIQrPyUvazcup9kUpmpHcBa3hM+px003/tXOcYb03p1Psih8vKfG1Kp1A7MrCMFKj+oM2oo7sH8xOOZT8CTBU/Yd7yMQS47Z58l570DTGO391Wnw75XX06s68eHOlZRq7V06c7sbMssrNMEu0Pr/0k0W6RUWWkMXXGEoevf9Jot8h8Mmm0P326k0i7RbaSVUmE0Vd1qQf9OsdKDzTqaXimhmhX2N9QQH1YUpBYt42oMHjAzQxX6IbMuKNrAf2UXLsjDa8fdEqPIJECI3QUuNrU2joLKzBMOwiF2xf8llvK2VQPJhkCMjkHEB5t1SgljlZ1MaVVdQMeE12EYarEQuM6oYVH9RQfztKoUU5PUUGDkWFIqkx5pHkxacN4FeuH2tfPBGydk1NQItewCYcMqTqCV2kFQ/wR7c4kEg499ybgI+TbybmHGXW5/MwMe3jmdLVlvws3F38Q2CTslyof8kl3RPNT0eDv+pl9yBfOf5Druqecq9KdtCGae5PI4EpzIlarfG/e5+XL9M16b9r9W4a4BPkQIOx7xyrxZbuvxuwyyNA5813qzwQTrl/ZhEins/o2WJ/odBbpdFbfwOx20la3yHMz8dyQ3DoGSyemm0Wmm5G3hrZV+8/8vpHTcB2pbiZxdSJOToOPXb8FprjOBDV+CE6TKKdvPwj18eUq8YlKAQHGLctf8PgZDwPDPylMgQIDW6H0pTAVIev1NddGVp3Za4XlxKqzyKozsepwl+dHlqRY+hCXj4GEqPRKRx8YTAytPbrYBsAXufTW5WszaNbS3gEib1xXIK+rdEVbC+WrOf8GJRysUi7yWnwJjPhGOV/4UTW6DWBtwhoENXi03MUil90Lb7A66hn3xV6NmhAh/9AoxqgFUGlmEl9/oVwzlMmVYWZin9lkbPWre3WnK9uORKH8JmC4mWTpDdNrLUQxwCRxEmjCwA6svfSi0F6OdqbBaVWPkngOPJmzGmhBpmEIZ0BX8T8zojSxUsd0TKQX9+Z7b/Hvk/T4eBEYC+697T5Z196vZhNnaenr40+PXfbEpbTIpTSp4BMmcWx7dQFcx4dLXnGjWRk4ebRx6QtE1S4GqV0AnkAKJC3a8B0b7U66zEdH+wxqbxCQcBEJDGhkpckU+jBGikWPNjrB0a1Nbnur6Pv7QWMsIUonkjrnB7WF9wQIXiSCK/0WqVuSc2yPlfesVCiKUXtg+TWcXHwi9i5M3xhOsFXPA0ucF0T8NOY3TvfbdhLiw0QipBOUi7g8jr2KL0WgWOBJCdyXZsq8ACHuCihfseJCfeYfEPw2JbzmQhnn1rwSB4K/sledjZDOYCwUm+O3u/gJWdGA9vnnY7sw7sWolIzDdfqeMSOf1WR2gC9/bvd9KTuAlqba+mywpTGWfPRJZ9LdVUpxTuoPQIwkoSgJxCV6O9Up+ndFMfJjzRzheD18LMltM5H3u7eo7GZ1lQIroyJfUtzF1l91T5m6oYxH/AYHWK4r1R2SVovkWYJypf4kojItx2tf5dLEUtcPX71gB9wqe4us5e92Gud8k7wyRudDjH7Tekn8ZassnqRFQ02cwaEk7LlDcxFUtBlVM5D+NuULhyuPon0KOs057xJwqBNKXqjdYkyBX8gYyv8QZak+/GjyNBtm+kZaC9VPZQiJAS1nQYsmo7p270UbZcYbRTz+4OsFxYDmjd9rJ36vRX6vka37GOCdCL4WCb4mCu9ToHKyn7DIUrXm0tEP6RAdLq49d6jP3ZbvRlL8ZEaXY22hwrA5CjcNMk+pxIRCuESAMgK8joTw153GaU0mF/R8PtX4RYel7oZXd1DB0u3NXLx8iLkuSVECayPcUyPzP0tJmCBVNJomz0Td6ZcvikUWrIkFi9LAqc+0ta4F7JsLJySNFqdEJOtUHXiQF/AgJQV0iN5kUAWNWK2m6DUq1zC0fqENSvPaB3mVXDeiVKyV5iT4jpUt4JmmVNIWPmBgzcmh/doxG91EM88y5DUq6odKgwAV9nJ5uamXRSAZ7LtA6QyST0BrGVxcoQmli26T+BPakHsuPbOqBbuN5JlwtLIOwVxZYU5iHIi5SLREhfd5lhwxCTZZdqvatPVbSlqLTJ5ZIP3W9LbIRjZSi5+wZycyskUysolu/AQjPLmYWGR7mvicT9izk4uJRRamiWeJD35slqflW2RLWn8TwraTi4lFiqCR7/eIzzlRBC1SBI18v8ci/YkiaJEiaP21FnaiCFqkCFp/LSWdKIIWKYLWX0syJ4qgRYqgkRzXH5xh/GgUOBnCvHQPVChge2uekKY06h9u2eNa2dJdAOkEaCELL3zWVw400vasv1V+Tqw9i6w9I2EMVz9GiCd/E4scM+vzrQRx4phZ5JjZUO75Yb4c1xadHYRDSgZsq87/SmHcctjGEI90A6oQEojYHRmKR5bWfZfe5ld4ErlcNt4yzicql0Uql438wu+xE5XLIpXLRnn7Yicul0Uul5GY1R80TPyoKstbnVCkV8TdgN8y4JAQOwurUpExKItlV8/VmgHFmp7q3mdHSUKLTDEbL2wTO1mzWOR0GRla/cFmRkd35HWLMG65ZBpuKJoSMA7IWuTGpYe/pfS3ML4AY/Rr7UeFfIucMRtvHfhEGbNIGTPyvx7ETHTwXy5mYpGTZmKdPUHXT84yFrljRibYk0qDnchjFsljRibYk3qCnchjFsljRibYk8qBH10AB8Ke6Ru48R4ivlYS7UQQWcsygBGY5AGwbFMZJFIwqB5SHOdQacbCcYTUEgCgJVLQKFEgTEMdC/chjQLQPyBD4EepQzApmz0cC9KZrzngPiL7zeabJoCd2G8W2W8mftsD6dxO1jgWSWlGitkT6dxOrDSLrDQjxaw/2C/5USelbmtIydPTY4TVzo6PR8cbExKJRpA9p7VBfU54tGSZp3wtzCLRzebb2HDiuVnkudkcL5RUO/HcLPLcjKS1xynrxHOzyHNrZK31B0MnHT04YbC5o7h3JxRVUCaTql1egcBCq/5QNfNON64kI+B6hbC+TjnLkWLbbpFS166Xeb6dGHUtMura9TbPtxOjrkVGXSMNqz0w6vwoEdTzVb6bnA38c+t3F6kiVF/oMkSldzQCWEggS3miCNZOIWEujeHCzTIi1O+F3huoA0lFHAHXuFzdW8tblvuzFo3J4dqQQRJmFQVd4VOHCYkpGXAh8FC27VwQo9zSpdmC+EIk/NE/XaoC2CrrLL0kv0YXxiROwS2S29obua2dyG0tktuanFMev/ZhEGqRINbI9urljL3Q0WXixLwRlBN3nxETmOXyFfwWptRHb79revSOwHfsEnEG87isKmBHRRMsyq97bfFeX0amduKhtchDa2SV9Qctl3YiorVIRGvXfBG3bCciWotEtCaqGcCqh4V8O1m0tEgda+ltvDgxx1pkjrX0Ol6cHFpapCc10ZPOaJZ2Mmhpke7T0hsSpaVTZ4g8lSZzlQfjHB2VLb19Fj2rOTpW+nHmdGAQolgexdpies6NIx0ZrczHXUl0YGDpqRRWSMgmKiV9WO/MEpCCDXyjewoKceaaislXMRfWrQQ9rzshSroqs3799CHB60SKkGvBmdgiF3tPIZUJOTSMkWAZFypbJiLSnHAE6KIr19mCouDOhTZhMtAcMYLxVGVlx51gHZWZ44TZpCTdcv8Mlobx2EoGJoJp+b4YX4o7iF8uQAkLSzoTfmB8yWRZjX3WhJNJjG+BOaDe4ggODMaZ3D7IwubM9+yb2U+WHeOvvfXetHuzeWE5i7fle8e9OffmvK8276vNfG+WfbLpV/tqqnHMJS/nKW/RTh4+LVJ5WpJ357TzANI9QT1I2nQDsw1/XKhHpdPBB7tRj7+wjk5EaswkV+aZVSHuhLM7EvLGP6brolNBiXJyLbKIWnoRbW7pNAxHkk9LbwFiO5F8WiT5tHy9gCjbySKnRd5Kyy943HZyyGmRT9HyGx63nSxyWqQFtFzexj8e/Tv+/R3//oHxL5I3mugZ0DM9jV0nx6QWSRAtv+Tp2okD0SIHouU318B24kC0yIFoWcMwVPrSJm/8OskpKI0siEZKw3PXHX+77t+u+w913Tjpik4DTe9j1/3teZeXkSLXxtCMEGgMdVwCfFhPpe0HvI2UMeljLQ2npBeJ1QLbj1zgQ3K7RY5Ne+PYtBPHpkWOTSNj5nFoOJFsWiTZtJLferVspwiGyfMGONDbD/jvW3ROzovI7VXigWYmwLsKk1NpwAQir15Q+9LybZG604pAIvO8+DxRd1qk7rTylr44MXdaZO608pq+KKcxPBJpmog0jy+5/R06/w6d/8zQGQlbjeyrDGmcY687RQqRsNXK27LpRNhqkbDVyuuy6UTYapGw1UiKelry1NMIG2lUraa3Jc+JR9Uij6rV1xG25r+d/2/n/2c6f+TrtSrg5ZWOnf/E12uRr9fq25R7ouu1SNdr9XXKPbmLtUiHaiQ3PS95ToSoFglRrfpgeMRXthMhqkVCVKuvy6b6d9n0t/v/U90/TrpVKgQPFGcdRtugMdHlNFdyxxr9LUErg/Fm8T3S74O8ymTr8RUElwCsycJErrj7C7m0AEmycYJfw6ehMim9a8BiF8+WGnos2F4s3ZLc2pc4xiVJQAiTmhNpoTKTRNZFiXeyoTm1L7EjZKGggfrg9Ul2nZdfVu/48mLvRR6P2LVQ21Jjpj0Geyx0zeQgAwE+qAZKXJ+mIz8J0potLz7unH4vzU0Nqjd/sdj4aNWcaAtiR+OXxVnEWANyGiut62d80iWTHPB3kCVHh0GbZ8saIJrVsq4HnOp6vxIF5IKuSTsRvaapzScivUnVwn8vCcveRNaLyvXqdlAtK5fssEAjusTqA0hMlDvtHfdv597LwUG/lfaO9uZ7s9yb9d60fTJxt7X3vprE7rU592/JfdTefF8t31fL5f7t/Wz5vlr2q311qxiH2ttK/+S52CI7tNnrSv/EDm2RHdrI+3ueEU+uiy1yBZu95u95NC+Yg5AUvTtf3ty1AnikLrEbE9UAiMC8daU0UE5AhdntRloYC9SR5L7XoRom+hdIc5S4hSMVHRMpkcyu4JtJJgW9aPj3vW5T3EkPJHYMnUcSt7gHju76bS5OweNM2O9NQsO+lN1bZEc2k1h5PucyNjkSrAqOp2CMcR66wJft7uHFvgsOqLQL01hwoLTUI6sme0QG5OmC+cHXmVP9TM3c3UdRaEFprgeOMXGMJhOfnwvSW4lDF3SgNIxSi1kC0/hiHCihWKSBEsJBigQwZKC3XlSYLrwGmH2wCNcdoHngKGVtMBHIVhEUw0akKGaS6cZhhGNWhhhJjlwX825VIQG2NA/D7YDPDxsa2F2JqAx8n/ZZWiYp4JXobzGy6vYapQkwIHZNOEg9SaQA+8rlD45g4xKgZnKeAT6CgU8HtGY2Pzo4COGJhkIghlm2DidEHhLtTpjldTseioDFSN6gTuBjMc7PsViPQ86ZNjkW6xJstxAHS+Kc6fYZXqAZQRlfsdnV17jtm2Nv8h60KR0GClCUdG/m+wf3yUq9f2D3Zrs3+7057s25N+t9tXpfreZ7s9yb99UEwUoULryvxjmTDy9klm+u1pCL3Vez+2p2X83uq9l9NbufTdoUfHjzZ/saDOLyxt6KQnZa3URSb7PXotDJzrVF+muz96LQydC1RcJqs9fVjf1d3fxd3fxDq5tIMG4iGMO77DgH/+H8Qlg4pcd/+b3Ui97vS4KNXADxN9HCGJv/UKATv3HSaSH1u/XvUSFGiW/03nai97ZI723tNUo80XtbpPe29h4lnvi9LfJ7mxN42xk03k4+tC1Sb5uot09DS6t/h5a/Q8s/M7REHnYTDxt9/zS0nNyIW+T/tvai39RO/N8W+b+t9df+f5rQI/+3kcybIT9/Is22EwG4RQJwI5v3SfetnQjALRKAG9m8j91f9OC/3f9v9//Xd//IM28kjUMl4chFOfHMW+SZN5LGn7r/iWbeIs28kTPey5n62k408xZp5o2c8Q7Ex4SgTTzHqXwTaeZNTrRgT7afrwDixDJvkWXexCOHrL2hp8RznEbDSP9uJHPT8umgqNBO/O8W+d9N/G/4Y37TR9uJ/t0i/buRyw01icp0dTzHaSyM9O8m+veDE54fpZRo+tDbZ5izWVtyN0gsapF3N8ouAVRjP/BAp2HMz4W8Ra2SLop3E5ne7Y3p3U5M7xaZ3o207Q7T1gNLVEeZhJJWHbhMHNNB1lOZwYoEOmk/VVw1U3kEYLVk1OMcIFoJTeabqmOYOBwitVSHZE+gF8KkJBQ+VIrIPt5DroSpM3ptUd7TONwz1+9i/pervTFDh5z1nk7cVg2JbmrFc0zl4ERPFtkzoKBSV7JNEwSMbbL83aEJKbOgNVNQm4sZlGtNFI2i8dnd31SdgIJKZRYKZ/NsGpsiR+UmiwbdSWUKCooslVktPK1xMqLAdHWnty4nArDV+XJzRtPpe4tSYGCnuUyMZ8vgGNNNWqaYduQEhH3Fr9+Nl4BoiPGNtfzpEkmF5pKyK7l8uq377JqosE81Fqj6cJLj+aSciZtqZZ2FNkzax8cgMaHts/T9u7H3zXXPXfk/SgbCi4EuVDpZL3trX4CUZp6i7wv0/Z76WG+xz3XDgw/Bsg4/zlcvigO+tA7G2S9WR83rYOw1aAqyDrS0ZG1tGeGMj/iOYI+ypLfspuGRo6Tv1RQTIV+sutqgHtr1szL5kBCb3XUZ1VcqAguXwl3FOqr/sNdgfSzKJZOdfMe0dGavQcJcqee6K3hGY2s1x76Mkm25ZiRb6Wgk8hVgVYQcCrCmbFsvahqhUKV7QeUI10Wnmt6XVOnLNN+gIqX8r68f+ENh2PQul5RBn+xoypGro7Xd0UiuVVb9Kp/K5k1xfeXXGY7yzHS6quvl86agDmHecRsdDfW30FXjeze+M1wCtFKvJbox4yRxNEkGvin57g4PUB7uXTESvqbS12iF1f+0D3Mh4T7a3ur7d3opEM6ca58KpujqimxxFg4mzIsXf2V97kvMfQnqfyI3i6/K6B06TOtn090lB8WN8fEQl+tPhw962Cp+/cG3iJcyLttH297i1+vjMy4OJhnz5lxHVWM2oxDo9YN1zEj7GqxrQKcYAqZr33rdQ9+MW33dC7/et59Yi7ojjTIf8KY69+dT8BWVQRp1Pka+zrHoSRqkRWmQRiGO8eCKrqMsnyIwkutJdrZtdZK1ym4yFMs+8cFmXZI0EysjsqGvaV7lQ8cr1Ce07Uo2hmtGXrgQeyGMhArFHhm9yPQTzDCO4tBrMApUYgEks3gUBGQSbyR803QIUtPyDoaiIzXGcJah8m7BPp7P8Lu+/4IKpAW/k0QlpNKudZRaZLgu9Wx32Pr7RccQlXIl44nWzKO3pgKdvjCtKjkJG6SKZ/tBR91e3k5oRpqTrQCgawIN+LNBFvMcXxXLKJzSKFKCDnVuR6fQN+qaNIqUjAeBBR39XRoGrT27hGV23h9UPj4S18ZsqeWZhmfawaBh0IcIw4vckQYsW3g6yFSVvrYqm802gUF9ic65XPh1CTliOCurWAz6viq9g+ZIBmzK9OrwoMINf1aTXwEVaP7B15uJAf2b03c7ibW0KNbSZnpb7Z3EWloUa2kULoH01vEDnZy+W9Q6abO8rRhPWictap00Cpc8rRhPUictSp006pY8rhhPUictSp00iZk8rRhPBtwt6pI0qowMGMAfz3FadUZhkkaVEZRyC0wkInL5JEzSojBJo8rIqA99j0cJ1FC6DBr0Hw50EiumOGzV4E6PZokkOYBjKTVjuJE1ES6kfgjTi0LfKwSm3vuwDOHwyAGFtkzw92vskchLISaBflbmuiFTCBxzJ+gjk+Xz8pOhGETxZs6+dq2jkm7+crFtUWilS2jlvJrvJ0PxHtVPOrVMxoP9Wz/Jn/Qof9Iv9brzFN1P8ic9yp90CnUMO/dcHZWoTnOQCCANmkJm0ZhZOaLCrQ8KpAw8ZfKI2U2ejYMi0/aFcepRJ6RT9QMKPwMgjXg7hx7co05Iv9SDYXL306zGc2xd7bn1walCLZEyLAXgu0KfNMEBMI5voWk1TupRy1OuaY2cxSZnjqSxcY6l8iud8EtGFWiw2RsiN6bL+g5GNFg6DrZmbXVpVH89s8VnZqRlZ2uh7romvjzk4qxJtB8Rp/tb9I+nEFzStfoHh2u3lrYAr/Anvbnno0u8Ag/HjOnYNvGd0tWygEsrcOPYQG1GaCjTojgBIEWhVFxXM2tnxy8/wOXoLV+Qi6MdeKXioLRcJ0NsXWFwMECMwm9WG9PPgBrWzxD+qn2G8F2IqmkcOGbs6z2qsPQ3FZZ+UmHpUYWlU1IF1rTnj3MYhntUYemUVBntrO2ko4w8YP5M2TJ4q9LNC57INPNCBUBagtBAU14Pr1/G7ljpUP7s57rKZ0AGARf6QO+oMIQe1NtCsoVgKLSdr9uOIyVVXEa/YMBhKeTn+kn4pUfhl04ZF+ZkTo9+Un7pUfmlU8aFPkqHEfsk/NKj8EunjMtTYNBPyi89Kr90yrhwwf5tT99Pwi89Cr90ymuM/tCY0iE+6VGRo8uqFx0J9h3xFIfwpEdBjp76yxSY+m/RR4W6GDPoHA833AETOYo+woFwbTWXrxzQwfStsY9OR0WMcR2RED2qbnRqaCCKP85tJ9mNHmU3OjU0xoOUoY7mpY5a2H2w3pWfL1CGGv2RsOsUE4fg/6AsFI4SzU0RLuDpTlnzHkU8OhU5YGR5vKMsuWOcv88P0/PI7+LWTPMMdNuAgI0XikofnbodY5yrUf0k9dGj1Eenbgcsqc7nOHW8KPXRKahAhe/jOU4dL2owdAoqjPkQKp00GHrUYOhUVMAMdz7HqedFEYZORYUxH5rTSYShRxGGTkEFDObnc5ympKjB0Ml0HzDeOp7j1DUiOb6TiT7mU0M8FKR6JK93UtHHPK8u+om93iN7vZOKPuZDOz2x13tkr3eSxukJczzHqZ1GnnknaXzMh3Z64pn3yDPvZI3P64x36ieieY9E807WOGKi832c2mkkmnfSeef10E5FNDeuuexW6/zF5r888FCUQYnUJnHoxuQYlPLmZ16u0vmZXDSkL5OhHnnFnSTheT20uhOvuEdecSdLGFWI8zlOrT8SiztZwvN6anWn1h+JxZ00YejWHr/2iVncI7O4kyY8HxS9dTSjNAtsgpbO45f6Jx1QJsJBqtOCN8AKH7OCRicSCFd2QhZntV8+ZYi4JX24LYa+bjZ2MxJF54Mgto4y8kf1khLiRFRcbaktyqjWBmskmnTpSM5lQQVYn3mHyniX6QVOv0BgQIhDSqZgFfDMX7cbezQ5qfAJOd8uj6LNY2VC2QoYpXeeHg4XuGSn5f1M9hks3U0sQ7D1dfE4FJDNKleg08WZ6VpSI3xpSJDq40GtEW9IyFOZQqE82erS1cZ7QahS/INOvpdxDqwir7aTJDsf6gt922CCsSdrxKGmxywSl4n2kR5/SVqboGBD52j4h9D7gj7USW4aWGRO7oOyM5O4WksuC/RfhubiLCCnPZbZeNXf4uFZIkA0JulULAiRRio/hSaUND1CGp0IALzQQZ4P7mowGQVzJDobEfk/6MUCINfM9GCd80OrGd/KbpBOCxfs+3q1ceAldXg+aPjqqAoZ7rpHVyziscztti4IqAtY5VWVqzvTx5ZJei7OoarUUedvtJSH8IrATw5S0AkdtUXnS5qhYNk+9CGWxPaFzyZUQVpllsRsuuz8uhdXuNXvLebfca+sYMMYl/kYVt1MlnwoSjJTiN85ImB4nX3SbZEP081rK1jg4uvpDwYJHoAUjHrvG2ufmT+QAGvWpicK+DsmCri1b3QqY4Iuk9veR2LjwNbwu5qs7uDlyITU6nevj9NbfUs3nIjiPRLFO+m4VDjswA7Gc5BowWl5uIUa5AyZNymaxrHq12CFDJVvwS+ujq/lSeT+drIWkcI6lRN0dEcOmcMRhgZKT6N4rIRir+ZDGQKGyhEV0xUK4pnVdw3sWGfh+1H0++vW4nRrb2nbE3+yR/5kt/S2pDzxJ3vkT3bLb0tKsSvXG7oF0O/4SYvLOsevl9BZyqNWUvODWlsCE6G15eENRVZmt/K2thQr87+ztow8xk4u0+Pa0k5xbqQ/dZKZHteWJ/5Tj/ynTjLT49ryxH/qkf/Urb+tLU/0px7pT93G29rSThFp5KV0m29rSztFpJE80tv1trY8sUd6ZI/0lt7Wlif2SI/skd7y29ryRB7pkTzSW3lbW564Iz1yR3qrb2vLdmqnEdTfm72tLU+g/h5B/b21t7XlCdXfI6q/t/62Ljyh+ntE9fc23taFwvz/S9aFkSrQ23xbF56oAj1SBXq/3taFJ6+wHjHcvae3deEJw90jhrsTkQ1wQKHbTzxHXnZ8zR11zOGoqN3Iiw6eACpLIRbTtFnamjaTqRhVfmAFNRgCIN06ObiDGD05NYPcPEtVJeDrrmN/IwZ8lrOjl47SqBdg1m3p1eXOOH8ZdGHBpCoECOmFFOZG+w/cWZcTIvQVQdhmEDPpk81CRxm676+7jT27v8gL9RM+vUd8eu9v8kL9BFDvEaDeuwi4/Qhg7ieAeo8A9S5/MqyAv1EP/YRP7xGf3vsb/bafAOo9AtQ70ebIbx8LJCeAeo8A9T5E1snnc4xTD4yw8i5YeYPn6s/4+iwnXHmPuPIuB7FWH85xmn8iqrYPufWNo+55PzmI9Yjk60PcxTO+XUeRspEVXloSpACNCx0HpRUjrzyxegcEfGoopQDqCphsBX3m6z5iU5dPGJDcx/s4NfWIBuxErSWAWU+1/XFq6hHo1uXkBT/dQwi/cG6i3nbKdoBVxdQMBkqmihLxwcuiK9F/GPMGLFhk0XWbk9FH/md8xbMR5dYJWUvgTJzua2xbPUjP0CgZ6My7BKu74GK3dy/e6i5oHD/oeATaEx0QacbM6J5T6ag+NIKSxTN/3W7sqsSRzfKQwOFROmQh+/TiyURzZqNftzck5l8k3worNLmNd04mV49mTD3C2fobnK2f4Gw9wtn6fOMu9xOcrUc4Wyc2zcrZz7uf4Gw9wtk6sWnzCZwjYy8izj9SAvrIhCczY+aKKolrO5niAuKcm9K13fl7hlIy/GiobWP0FBq0bS2OLiSsQxBF9QfCpoV9aIRSS+9mEPOCX0/aawGsOBcK8YORZG3VvWV7y/GQs/a9axwBjD0i9vp8m4ZPiL0eEXtd5mTI7h20NXWU3Ya0EeIfhslsvpDEYkpkA1jSqpdojQgHRBgT3EfigqZ7LH/dUBzoiOV7csfuJ/hfj/C/TizfhKX8gT2royRf/OBVK32CQUORHpIAgu8iIe1u6rn+eipjKR5d2cbRl7NHMGEnMhCYqZNxrI4u66SyDJC2dZIst4HY0QdAxpTmYWhGk40PjXQyjQH49mQeCEnsSc9R7Rv6i697jeMbEXuIf0v56fPrXk+hSAT5DUL2pp0Ne8cJ5Tciym8Qsjcf5AvGCeU3IspvELIHdaTzfRwGoxFRfoMwO9C0zvdxCEVGROYN4uwmXMcOXGwdZf5ZlDJMbNNB/MjVK5U8yeHhgIXksTKqQ/bmBLp9wJgtVFsqnM2AoFMdinPKJDQPkE8CPcGQaxwA0XJ+Ie1wTnXaVv18U0USbrFIgrqMwE1XHKdGBBUOIu6w4Dq/wUMANCJIb1ztxc1xXIdxYUQ42iC4bCKCO0xNOsqvAJgm8Xwgsgkcf62cf14Khw2/IL+sjOmYeDIi6VFuW5IQVIhKCOTs1Z3oCOFJJDxQ8oqmrMCQEeRYaLuDj4qkxeyKTO0z+TvoLk6u/HS0esERJu/rL9r+i773jb01j+i9EaF3gzi6J6fqcYLejQi9GwS1zfHUiefSXAM7LDmbJTs8kjpVmKK3dyDnyIJHZmUS+Y2Lg3cHXU4+v/xegDhzLQ9cKaF9mImaI01ZrKm/zQVNZvHMM7ECAeIRR9s6FyzSUHijBWDrHHYTLzNpagq06RzZHQBZ4fmxZh+KoOGWv95UHDIJ3ZvjnAEYJ7TfiGi/QegeKtLnc5yGzIj2G8TuIUw6n+M0ZEa43yB2D7J3x2H3BPcbEe43CN6b42EKOeH9RsT7DYL35nxofSe834h4v0H03pznsvs4Af5GBPwNouuQ5D8/yyHLMCIgbxBdx+7eAdqN5xiLpnTBQpyVy1ScKiDpCDT+lFZsjPFKhr/GcA49Iy+/XxS9SUzAuHcDuRkzAZq4ZxdXXe3DXX5Bw9HAxq02HL14zziT7r6cPzgfoQ4JBvDaag7pnrOLtPD1YuIQQ5DfRNc9RHs6uuDbqt/C1HNhslNyxLNeC4aeuvRJk7OHbZXNER+ybE7gNbmXdS4+FJQ1bjB20opvfkoVr22p1vJZOVhBGpNrEqhnkh77AxVUvdIMSAlnjZp80jDXrHWGXSNCGwbgpPjhT5uQ9pR8YYUeT8qRDeXhSVIHjswpm1O5sGXx4q9LoAIo/V753iza/PoMcfwiBDJd17n6Pk4GaSPCJgcxkOm6HkZBHuZ3QmtjU0WwQ1Ve6AuQW9qnpgcrPvZD3JFjPyljLNTn/msW1+A/yYXRC1yhNlY9GvzBb8XgX4gKmZxbIPqrMR8MNI35nGE55uNC4PciQcLNrsn76x3EAZgYzgRB3+NoccJ9joj7HLJ4ux6gTeME/BwR+DmI4kxXehg/T8jPEZGfQ+5b1wNuyQ9zpZO5mqf7YHJ0BlUrgf7nN8YkLs2gkoW8gESSlkdgSqnD4rNoHKN3EBmmGUgWyfbkShqUKPU2NcohOODknaRjUH4g7SMmKqAawkgAr6XmAFEcxQLggSoYMJT6hYdomWuwzEFnUjVB+4b/RbroCO2bDBbI/lBMqE2eCaIOlNTkrSWK4fFp0pWGP0S6uCooX6vrESG0Qz5m14ORuA7/m/UvAoLy/7an8X1+caRGBAAPonnrQ1FSR5M7P/NDgxbkfFZNr8ivOxEv84b5eH7DSI3YIvCJJjsqZwOE9dXJsSgLYQ5FqWlSaVd21rVlTrDQ/FhrOpypMAmtebX/QdTDxxBLMIEHKC5eughaA+o/XXJizl/TaEQ1D0KUH8hj4wRq/rVznWKqdT1NAYfUwYio5iFLrguopdPwd4I1jwhrHsQoA6ZWr5+Uv85xCoQjrHkQo8zl8/gpKa4WT7DmEWHNo2gYzu3hYU7DcMQ1D/lnXfkhJD8Bm0cENg+ilBu9tn+sxu/Lo0o49ZV4QJNmng/loELzNUPDVZ1zrixZvoZnASswZw1bHXxG/OIHYvzQpCYR5esm4/AkbDQSaxwm4002tVAk9j3ErR7iNkRIxJMhmJJXLbCnPBcLGdljrkroHVjmmhvKT/XUH6By41NJAEMO3FT4vSZzKPpbEWOxz+mF0Fm5ZLHGLRJWyOOjYmniJiFH35FshGcPYq3TVR5STaX/tsyjQy+fkSjLfiUvA08qStn6IIOyA2AA4TlZo0F+Q58mXcSm4aOnizz8/MWiGRECPt6spcYJAT4iAnwQzv2Udx4nBPiICPBBOLfVc6VhnBDgIyLAB1HWT/7K4+QtNSIwe8hb6noo3uswawqsCGFpVL2GP24wuTTxCSSkgzI+DFYMmeu4ysK9YWnHTnd10m+BGCtfWOwRsdiD+OinD3ZyFBoRUT3kKPRQGhonS6ERoc9DlkJXeRjIeJghALIgnLYOGA2WI1LpLm3C4i2TZcjjZGKKSczdkAio29cfZIbKdHSHqWKTIi5jREjxqC+CoOPkXzQiKnVU79UP6c8TLnVEXOoQ8vTx9Z/6XESXDmI6n9v6qc9FGOiQjcb1UP3U4c5c5ycrEMq3qWeiw8N0RxhViaWMd+GDsIaMKOcEuhdPonwJDIwIMx32oow3TijTEVGmg9hOaI0dTOvGyaNjRDTokEfHVR8ibR4W7wHKmPSZ+UETGRtpAO8M47ohQXqnSz0AU97erNr8upnYeU0RRH0YoU6Q0REho0OK+Vd9yC6eMKMjYkaHtZco8wQZHREyOkz9qT6MIrYFe6zeCCkNr2Bio9yOwlb7NUT8GhkG520qb40FHLjqcEJ3usT9QGh/saSJPFe6UGs84LxGxKoOSfWjzne++VNHjmDVQeQp7vY48fHoQh6QSAzdgBs0mKWMtEpDlOO7qFOhRykSJ8Jm3TvPikUjYmDHm4D6OEFgR4TADkFgH2jv4wSBHRECO4hnfdLDGScI7IgQ2NHeOOvjBIEdEQI7JJ9+2RkVqcNMnEIiRIItiGQTw26sC1XWaAuaSCU88StWfQmySJVDLMA5wiyArN+4NARZRUErlJe06taaG+twtmJSnbglNgO/vNyG6frFDpG/BpkI1R1N40N7SPQ0+1XkvsOeVdvOvDpQRZXxMm9cZXgbf1DRyqa21SnqHO5yEdTSBfAaNr9uOI5F7W0sOsGCR4QFD4l9w/Ln/H37MmtDNojSezlLBrJBNKssOx2qWvbqUqmkXblWo94UwcvU8nDbpgyRDmoo5uEKqUhYMf8FXodU9kBkcH7S9COJ8nyQIXNDt+HqQUC3SCyS9K6khD1scfrKlUtYFQlsprJB1i+85EjDJU5h1F35gETAUO4QMoq1+i6TKCHn9uqWSo1K1KBcdRmJIYmcpTpa+O2R8isulZgQaHcJm3bKHfpfyKoOhA4RqZCNEglrmOfycPUhhdpi7AaXgDs0BKIj2yX/HDyNjNx81NefsC/reulqdm+qOJxl+YaVKV/w8Kp5uihhmtlW+7X/TJIw/LMujh43y7233pt2n+G+WicqGBjFi2/n4pfl69EPxn01WdVxTSp1XT7v8Kt9NfY4dzXNXeMhvXNSpR8Raj6ackRPdc4T1nxErPmQLP31VOjkYamwFy8rA9SVPElbyqLKNVeHlFMhqTtMzw0OwVlvW0ViLDZY+xHlipWZXL3QA3qbEnoobEnoEKpwtr3TYKQFiNogAylTDrmRn8ciDbHdAAWwWpSu5BUcKvZKgQ/BIQv7IAN4RRpoTFkBtsyvSsBa51cdjtVK0M1dexn7+Ga6NxkkML88i/bGTxCh+qOrUjMfGoPU2LUQ2KjSX1F/So4c/UW6ZcA1VlyC/BETKlI9SVCp5ObXrcXJ/03FfR28XMYR16q0jUzQHRw/xshn9ntzaPPrsjFekPL7g3DdOCm/jwisH1J+f5Df0lG1sqLIroJg0Bfw7tZLQXZKiuK+jMCgdJF1RjzRdR0FU0aE6Y9uL8LpOrrThsIHAkSRBSFC7ZBZQHxA6uoqEUXOG7eIaCEJsa+84bC1DPRbT+0rcRiZAIOw/gxDu4P3h45uON2OPXJfIYcx4EJ4IX5gSqpVFM6F/VrJlzsMSZikFYdkQmR+oE6bUes+Bh+RdzD6C1d1nHgHI/IORneXkHp+6NNwHHkHo8uPqdkZmXYiHoxIPBiujP/Qak/EgxGJB4MsgsfecyIejEg8GMP79kMEysNc6UHn1gX5ktaImaEENVuba2EL6NoJ0hpcoQs93iSQ24dnVFEZa2SrN6BVshpVYe6i/AyyqoqH4gnRKsNpbBb/ZUpXXaF3usgR/a7lRYrEGG9JvRNDYkSGxBivSb2T1vGI7IYhdgOCyWMLGiupV9rnaz7YA0YSbQmyC8x0Qn+6EwMP21dWv+TqBaAYvb6+7isOCeMtc3ciTIxImBjjzcpnjFMnjeSGIXLDA0dpnCR8R2QcDEL9HzhKY5y6aCQHjPlm5DNO7IAR2QFD7IAHjtI4sQNGZAeMmV84SuPEDhiRHTBmeeEojZPY7YjQ+SHo/ANHaZyw8yNi5wex60/8Ih39H+AXjQiZH7O98IvGCTI/ImR+zP7CLxonxdwRQe5jjmd+kQ7+K/hFIwLaB9HpD/wiHfwH+UUjYucngfAZcfFhWtfR//nxdEY4/rxe0urzhMafEY0/Ca1/Gk/nCY0/Ixp/Xu5q2M9v59D5Z0Tjz6u+jMnzJJQ7I6Z9XvY8Js8TpH1GSPskPv1pTJ4nSPuMkPYphdWHMXmeJFZnxHnPy+PIoyfnPOG8Z8R5z2u+jOvzOsxRMyKgZ7pexvV5QkDPiICeKb2M6/OEgJ4RAT1TfhnXdfR/YFyfEUU9CYl+GtfnCUU9I4p6EhL9NK7PE4p6RhT1TPY8ruvgv2JcnxGZPQmzfhjXdfAfHNdnBIHPpBXfAyRTh7lIpZcBgSsQN5WpBOSz/3cL/WmuNZ6SROVarEfNiCqf6QXKMU8qrzPir2eab6N6OnX9CB6eAg+nB5DoPIGHZwQPT2muPqgnzZPm6ozg25nzyzJ0nrC3M2JvZy6LYHgAjukoc+AfZB2RX0K2OiG9RavJT6dLFNI0OD7IjEGifLinJpDfjbZIbimFNl10Mi8qINVT8BuEEaXTxal8Cjxw0BXpr4R8V5X/Wla9gaBHuTBWuU0Z87S0iMpYKOOEKjfkMr2CwC3a9VCtnHeNFCv9eNCZZdIGjXjZTTF/ogsie0qfSpSNEtOwyLzKuC25AVVD3ppeTwTp04oKr02+nhhZZUVFuIwtb6asswFXb7w+CijGswAgTEtMTFiwd7vwrT9Qrdc9ZV43Iw3Aq8HXNNNjK+HM7khX3NoKeWhpt1GTjV5HqRDHg3cC/xz+KapZhQfhccUMLqcP2knhBgrNloCKqjRWgg5evfTWUSSq/hiyu7pmcZMrvExAY/Ro0PO7fjKg53oFyEj06Y9hNFFKSHoP/YVQ0GgGSlNfxKLK0JRS5voLsKzTalJNrx59rfKlDeQ72C4seWUnoaZMtzmYRjS9eltmqHjy1pM34zb0Dvqn6a4AeLjWX3Q194FczeWfrXvLn5/Oe2EFiO2aI6zpaKXLnZ/PdFfVzeOAmpXlFs83VoOQWZbI3mq45mZV+As3ppI50cVMDlh7KvENPiQYgLJczbBk0yXwp6zK4XRTH2s0Ip0v9rfJ7oVXP2m+Rb2/i/ZWtIG91IuYqe7rq3shB+01qQ+qjEcTMrnH6jYph6aPhh6Z2A4N1abEIhikGVPSG2qcvlkFQ1048baJmU8stl0iourrYNVBPzBSi/SacDzTdI33mNX8cQtZtc/GQaGve8xqL4MsHPOPmaCQsPY2lQ/HJ+VR/TulrA+FOkFmu6XPWrn2KysaizAjFlne0TlXwyCQ9YUjA69W5r5a0aPh1ivbG19v5cDKQKZyaNUPal/vFEqd6hOp9ms9cdXbw00aRykkF5OqoHzTxk4PmlBqvF9eotHRGGCM1Nif+RSN4zVvso392XrXAA+by7Ffnwze+B5kzqZNbySwv1Rf4l7bH2Cw+IgRChnndeHBFleAeb/YTvHEOWn0gStFzt4GcuYYj0EsZ7Y9/lV2j2LsVdvDWjX7uXCCXu9N8w+UCwdn0mKLbAmRrS3qv0DAFo7ZMDUrPBcBvoXRHmm5hefyvW3/VO523Dn2zrm25AEJu+SicYk794U0/3Gr7q37MmNfhkMZH7TQ1xOvMpexr8NhV1sye8QDzbwfc+4L6Vvi7RW69Wlnu3f2vXM/z1zXqeyfvDnNK6DaZNmU8u40x+indW/Z3mp7q++tsbf2ZdJ9GZlO4tQp78P7IhzU/Idsr5hAa9qXSavdZc1v2rmvo6aG56457Z15n1MDpY5zdC24ETZL37uvxHFYl8/7Suxv/ALq/vqjsnpsrnsczT4o6Af13tzvruxLlf3uyr5S2c9EBIhupN4XqveF6n0hjZbauy9U94XqvlDdF6r7Qnbtrf3ubH8j29/IdkOwfQ3b17B9DU7meu+2L9L2Rdq+SNsXafsibV+k3V+n7au0fZW2n6TN/Xb6vkrfoVnt9ysTUAY6CZWDCwei2vfj7PGg9n2hPRx4xMQTjX2hPRzUPRzUPRzUPRzUsS+yR4M69kXGvsgeC+q8O8+8G8DcV9ljQZ37KhwK9NhzX8YnL27u6+yxwK5rb6X1yu3K92ZZDdH2WGB7LLA9FtgeC2yPBbbHAku741hKe2feW2Vv7YskXeRreRVTGvlF9cYPip82hZ9TeV8l6Uk2PwviEM0GyQhlt69rxhRIfpPJ0dGFuFQStoNyQvZMUYRf+DZElCEpjkSZmV1XBoDeSTwbFgwpkZaRvzSAZmT0TRLcnrRudNTTxHd2WPcDeOcvCg+FbnJaN0SCDzMxLNwTFosxUTcJb1vepEER5+smY+oj9xf5Gx2lxjlw5VqSLsc0SrKyco9HpDw1UYmMJjZ2rTJ6JZbKulO5aVYtLjcUfrgQQUyUObJBwSnLgxf6iWQUck0pqk9eKzq6qxZhiRaFGwunQjtr5GKKcFllOQ7jy8sreArjpp91aqsjnhl5geekNwzAopS3AbUTJg0a2k4BzUSSCeSj9bWky7MCSuZcEA4miWQjmKOJLhB/EE6VmzQDNASU7Gkkp3Or762xtwg3+u6HMXXkhMGzTpCO8v5ReuDCcH44c3M6Tp4HyFozeiKD62ctaIoSGSTOE1A3mtIWeXjaotelc+CWiMxR8MTdkxXMkPF801GSmD+IhcToP1ccwjGzEgTL4Y9gKpoXEyHX3AxaK6yt7Q7gvqy0i5Yu+HBJDn9ymU40dsfCOAnsiICfczGaMidgzlKcL4tVT3jQd5UzkbXiKY3iTC9lcjKnXWWCirNScxPSNHnDLnN6qiL35KkKSJMqQYFbLorYgI3jLZPex5fMfVoYjuLe9uUqO1fR2AEQpJWPQmyej3MmYiKPh6Gjw5mJTB5OPSV5P8HPFHkgZ6EwAigwTv/4KJq0cQ7TPmwNBWzTcxaEEil4JqB9Xb9d+tjmeQzQF+XMDZfB5q7njYoJkH9QpkLXaAwhIPDX+Dx4AuUn8Fa6B9PIShT/pMpPIO5UBgJ5NEftgfIlu3aAcfW3zXwMQDpKyQNcaejNt4VLRUecDECxJpiMldBNZ7O91XmnnjuAr/AkYBSp4Lk/BiGpuoOVLxhrsc/0txzfEVcmrafYFRSd8gRK2XC4GSbzASwVGZ0AlJgvpUBA0b76ehk5aSGFVppmuTebn9dXjaD35Mxn5hnW6qGvKAwXzsbf4iGyEdNJZwrjR7XBTQGs+dt6b663lU2NXJt9Xc1467RFNEX+3OSLR+fMxqFJv+XgpPNqeNLeem/avdnuze5fNltR22dWcu69HCeIKjWG/743r5nKGP7zlQhKjY+Vrd5X07TJ++UCoH5hOGfka09yr59U2nRUOorjo27XNYL7+E2Lbd5X8ZQynNwFql0iNMjktuZrzr66mHIMOWtMBiuHQ3FDm6Yr/Aaq1+EjMYXwLmLCs4+/THMkDTTZR2KQ8TUSI82jkRjrCI3ELI4o84z8lslZvvkAjM+vAbgkH38xQ2v8RUSi8VctgY0Gn4bjL1qDxl9abagTDR90kSZQNAEbFQ2/1tfwi2ctXPti/aCBuCNI4xvlUa3ykNSoyjSugbgwmGNDrNmHX8LOOPzilfnav61U8aQHN/tMW8MuhF407OIDaNhte9hte9g1eBBP1SJWqrgREMevSPQk22b3sRbEK2nSXA72TFyEaVxFYpd3h+G4Zy3WzAdTJJg1mOKtuB/xtVK3oHtrMG2z+hBqufnA2SG1wf4LjU8NnNSN4AfSFl1amrKuSFCvkRPP6OMlOeUaL8m00YDZkZLTgNnaHiXxGnyUxLdLzdbH86ER6P5EKD6e0Qe+usc9HNZYhz/3RVyj8hB/iXvhsCcTHR/20B81kvU9kOH+fCDTJl8EGrkPZPwpuy3/nGOXtmxvtbVV9z62vH4YVGIpj1oMT5KLOip23mWr2GRSDcHAJT4QCg3q4wRW2tIAkQ5Th+Ia/6Ln5TM8tq4r0jeyNMK3FbIXRbRO5KeCbY5qpTiMHqZTw1dhfcXauEiSqQ0kD/nFsERIymUCwc9hd35uqYJfryUqUsySXhQgdZRyd6VJ/w6JM8lVgbWp17MGPhyTEiQTuVrk2LIMxs9IBWlb9mBoiiBlYIWHeMDCt51Vq8Lyq1FDEgbizmfgAjoNf3O1TS+PSxIB5wXvKP9UBlD6vYtP8Vl5k3M5ineTtUomYgI9k5ea5DYNco2yX8Bb+/yuYUehjlnyizSkjpLWkeXf3JaKEAWAVgtMQvUSHS9yh79YJI1KcjeszBUX1gKU+/ohcbQt6WDgGKDJsKgi1tKq87Xuql8jr1eLa0n2C4OfEWlct1YahYMuP/Gk8bOKCFRIY0Gy0ICuruyk1vHZDNwGKkQaO843QXhGnZJJzZEnqUcdTQ6XJnyiLC+sywU4YAOj6Xl6TTdzscnyAplorqaG1HOhuVgrqyXitnkUhlFoivIXd8E0AEgu6aoVZ5nJOHx5ZMm2DIO2UYYIqCxNO9yisJNRvxW/A39aRs6FxcH8k1lX4iYaLLRxyH1jWWP4cMSqBP8oFxFopymfjq+Gd713GoWhZv1KK0VllynHygedRB1VlXhqfYwKIl8eAlEFWt0JDUR/NJ9fGFYB7UJwCnIFg4dG+pCHBD65cijF1rKWgX3W/Fk8SvJh4yKsydMlI3uSBFVIT5JgKGGSBMokavGXhyaYXPNKjQAkwqEZ1HVPOUzVkJHScOu4i1ZMojsWp+vhy47R/I4lroXSg8S1tGAXdzCJ04qMka93YD5/J04wrpcdiqQiOVT8mdIp+Lo+8GNISOQmUrhKKRS0cnY9XZZTgNphNg6xSOBnoxCYRR7IjLo8U4ajDzKXOkriWsoih2LlqUFLaQ9p03I2hALJIHugVE+MXS6GjmTUkjGkG6BeQJuulAb3JLefQ9KS3xIlBdd+rOtbIiDwQHJ/S+pVOV1ufUtU+5n20OKBnxBvXlMvJmv5yg3yHfnh8Cf+ucgC1QP02taHgZJWkmk9Oev6RoRrXAJ1oR/qIzH3oY8k7jTbECp6+kaDYYXE2g79NCZZ5ej6oN+po/o4eX2bdovM8o65YM56mcUjmquuT8LmJeW0a3WgvgjeyJNkWSp2f9G01eRLnXm9VLiK4lll5WLmImYrdYjOgHIY5SmT/B0RBest0iSySwtyJwunarg8Z85rvilc/XI6B8ooG/vi/JJem1HeaMp99kHBdLq6UaIdqcSwB5mZ0vZTU+9J7xXuVklhGJpN10s0b9dYzOh1cqqhxh/pWWzr9GlV0NiLK7JlpDFn85BSbYSC9prckLmuUkadntlhJpdDKJLvapZEXl+ECxZ2PJIwQdVOCqu4yZUk+jML99D80SogU3bCWy3gKBnmPZAL+n61MRcrU94HDVQdVccTaLxJC/WifYFTvZlVpPqO7UAbaQpJTSM64dsjvW962/YGOs21SiF4qtkY1VyjS1JOzfU1BlX0JXaXXcAU8S6KC5hE+wqCUvP5GzelcAgRvHwWcD5KXPFGPTKCTiQo6tqJGHE/CGl840t3c0ZJqlnmm+6mDnN6TM7TR+MQmRBBL2fjVDT3knrf1XkdG9dXhrgtJr2XJTJVxPTGkaDIHv9Nb8PgwOvdo7SgsRlACrVhYCw0IpM4mWXvWbnI151pyID0G5bb+ILdB49M908tgcxHj8LQgJEcx14IK4IuuYsQDjCl2ytG+JyWKSqnVchBzjXUIAD2EYYQGQ73P1hfpqlmXtsabShwIZgIMs0+ZheLvPQZdcAmRb0edBx0kBMgzs8WTFsQgoBtVRKaDzQSU0hkSXBBcIme53WMxLVOvqbXk7jA16Sf1wiOaU6fxvoWHQWkjy2/FLA1zeXkfDYbe9hgzkEkcMYojUsk4OI4WGSiDv2NUndSL6xXr/wqNGfSwFWKwRHPVJvIxp7pm0mb8eVGgbRZ05scow4z8iveK2p1cT54UmgS7HKvkyK6VviWlq2BOWqzML/j8yEeRfNhXW9zpD3eIPrXjDjWhAh4PWLPnw5eTFnLdp8abem2Iq20ZsR5z379nvNI6NWchwFKE136sv+cUQVuyoD7QXJSR9VfffAoa/DILppqo3lTQ/bIkx5zvZKR15wG7Qy9ElrOKekBVCgdcwETVNID6U0paQH+ofQH0qWe/sAyQavUslUEKHM72GIoOqukB6Zffyc59/VOSvpuPHFZSRW5JwlNHZXiife/vARheHXV7jlKshdkL+Ij8tULADbFpRvHGuiKZykldjQoDYfi4VoK5PWE1dYDtu8VctS/m7W+KXnqMId3y670gmIa4w2shKihUronHnL26dfqqm6zLAmQgEYe1+lgc5hbmAVxcJbGcWZK2/kUtfhMwE8l2KDKjNfKXzNpxrUcO5cmVSyylILHNOrR0Vp4o5yk2h6yeSs68veNZiagVO9L8QKkLCNC1EiJNs8UCwSM51GVGvLi3esF3QG1UCzyhplWHre59nH62Z2WaQKt3uisrWrUvNoqe6Mk6tPMwLwpqRS8EJag8trk3j5WJhYCNqw7JUeH64Ox3lL4vGhR0mHXXr58poqspntvvveWfTKBAPgptKz+0gKdUStx1je9Vh1F8IiV7SaNiNuCoX0sfybptsIH5OjURHWGaV9Z3aiDOOubMquOcsw0ty5NKy2BD8bcDiAjWWwpDmoX1RXG757MAQxTpYAzpsID2PD2q0tL4grJbbdw7s3VWBNXkyTgMzFjkkTmN3AgEKY+OTp9PXJcrlT5REFT4sRJqTdfZ2XDkB6TL09hc6HFVGkeL9PFlmZgHXFXlaWYLQoPwh1MREYYM2GAEgog5q0R95KFGjoglqJg5Kyyk21nnR0/zOlkuj9dWzMSsrqT9COaRKzkr54HaC9Xti56nvzTMNNWiemZC3ggypKHA/DLfLJCi3c+GS3P+DQyTsuIpZtyboB8cPPrGWPE7oboD8ZCfpjZ5kE6TKGbi5ojvLMyJ4cOIAmFcUD4YMDxgwJRZ9uznNbUgbpvKtJnIJA8qfn5erqyjMRkRWFOk8mK8sOENybO8pO1XIa8ydd6JEptTnuR0tPB2nwBDCABTMr7Cdz24Rs6adjMqJ05pZ3JWLTia8WrnjhUUT1zUguTUPQjCfOknzmjfuaUfiaMLr4lOKeduI9R9XJSwfIRdWZ1tQ6MocrwF9eE6ksEm/ltLpAg98GBrWSflhfjOtFxw5cBWMCO6clq5Umx2NWqbVz1V1JbmQcAqH6lsmkvmK/kE+nwMmhijUAYMhztbjC0Jk2UMuVRMFdGrfxU2/Mm7iul1ldtTXEv2jpnSOXAOS0W0Q+1rsB6Nmf27Ja+YqSoEDqp9vmICDPbIdLUSuwyp7SV0lwVD5+CmCCw1Ir/hpMxvoBS3kvDh7VnxtLJYV4YsBTPpCSYF6zSWExFSMTqtJUlfVe7LfzgQg84fvM3jovFNs72VFXTXF7ywhHkBRVgUUdRXVqhFrM+ggpg9GalfnqaKjO97ACIX/AsRwpcGykAFU+RjoqDAmyBszKr/vtXRBO3Yg66opGkAPSg+gkI073UTzArgfYo4AmwiESOcFXgfanUD9i+Sv22SGF9Ji/wE2rF83KOqooMHUtlbviAny2Gl0/amYGR86Za9XiPmf0umNNiQXHAVj3eWl31+E5ekl7K5jhh0PPKPMt4gjLZrtEzUSjQAJqAh45rPQAQSV+hI2JVL9zjt45pYjpOmCYWPdMs3hYc00TEkiJ1ZjAElmkbhdSEN1qGPF67b1qx82Jto5C0WYSP2Cgk/ZZwokZ5UMKJoEXkcCLtFexQYKB07xUgZyw4kW6yVn9hjiHS1Wrfm0Tcdw5x/bo3JWL5tS6Oir/T2hvIyBRXuuOh1qgrnMLQ/cu3ql40taxeet15SChDymGj5vzLkcprEnUVn3PNayZHNE+Mhjw2+FGNNHRf55IpMBlTcsWbL7dEJBCCmo5fDx7jR+tvQIhbphhJJJkMluz2KT0tYdRRPE3SbaWaUMd2Zfhrm9nW4uEz+ZySMwN3l28UVUzP87WlHQhJzAYo97UwD+XnWmWVTA1SXx1n268F+CVf/tcvS6gZxY6nKQalGO0B9GA7LX3XtBZB/0pKhFbC+DESFpYPiwD0mJaRdeaWwqx6zV0/ysxL0g6VDRveNT+07jVG2CwPGen05csIcUa95WmKM7sdVV798AogJOebx1oJ4PtMXun6ncngggUJd2HPUbu6Mxkq51PUduc0hhpEn+trMeWo7wLcirfXwnMjxhT1mQIL6foO/WK42a63WnRbadTKGoUmLaY3oJxWlqastFPzAlj0vuwzm8IoTBYulbpm6jolW0tqhlayfaVcS12Zj+GhFsTdPLVhPsl2lt9l6NYcezds7Jz5qlIDDuOZDVdRTsyveQ/iBKlzKLGB6UnxGIYfpTiAwJRnFL6map0gLfjUNxYHebSVZ6NQ71C6Qc682vKqp3ATQ+XoKT2eRLC3F0BR118ZD3JaKe1K1CFYf0msTVVIUQz0yYwXp/GYOq2ivMt2RbukzdoEz5NRnu9VBeqqfeUrWAhUUSxVL5yiFWNEYiPndGguOvsVJ0aF79nSW82bR4WtNm9j6KpsY2utioXkDXsw504wsAHk+jf+ITs7hHmpvAQKcOob7fAL5MAPVHfzsfob4/AL2cCTzNVpmZzeyIY6F6roxjio1VBjdqEd1Giou/MH7sErJFdSDXfsjLXi1bHKufr+m1pMB7BVISekaaMYvCU0zJlLPNj+ADTo87MO/V/CNmQVB416KYnAZX7+/j2cRnH2SaX1x2o6j/IjI3qWMm/zsgyIux6xr0wo+OBO7umrimZjJYh7astQsa+iQd/ePoArsxzCFZw+wiiraoBmMwgUhc3Y3G3evwZjTJW50q6oAwWUNFKXutdZ+G6qrhMQR1ocV2f+BcD28RXXLGUV2rPIqMTI0WxMNfer62NkYexVfu/j+7XHFXUrr/VNHjYfTxWYrCQeljWqb1ry+iYK8SzVzbUc5ngmqMm1K5wKQQlhWoXNXNoamscqZxbb5cy+ACbsXFllyunlTHNuVWbWWeXM1tcSGUISHuaMVc4E7dbLmYMOTWl5W/lnpMOeypn4TF7NXINu4XDin7ndqBPOTForAODi1UwCxxyAkvKuZrZdzazpK2iKlgGTuvpP1cy2ygx8sxygilczc3ZIWJdDHTJDXsxsC95It1ONDwiRVM20nbywVXVDLOU1zLnMsUBI9RomhDhUw2zFa5hjQU2q5B9Uw6y7hFnuuiVe2Kpb9r7rlloQXbvIpLolyQ+qW2ozafPrNcZchLsRPNUt3Y3gqx53MWNw1+NYtuxt4ZIpjcGRspVfhbn/cjmOJUrgXo/luLp5i4pjJ2Ua/tvluGh4MGlf8FiibMv8seQ/EsJIWTjCjJ1BNeu5sEv0GNdyxJZ7LV6dL0emPz7ZVqxGtr4eH5kyR4QBosgRstddDF9NJitvrKcvuz5b03p2u76fPa7GZMXwVIps/YZwOa1wlvXVUb9W4I6FxUJnVcdFA0XgRejs0uWoManw2FfhEdTjocfBmtM/JteUX7cel1Guu/9UemxjD9yKzI0mYpz5PZtmwx1U8QCeRPO51V08L0JAGJoDKDE2KNJlgBbTtpt5BIWraApmYkYZMkI/ylIuqdXflDtHMDxloFxWhoxwIs0LadEVEUlohqh5ZbrAClHQZW16zgtNR2VJMOF91hjTw3f0UPHnx1iBGK6uxCoVr/NiiyhhhadUmmo0j+NRfVaBEjkEn1x6Wgy9bqtCeZUdGDBCU/KJgiqcoFGH89C8tQ2EwQCseAz93xNKeGGeUGI+UEF6vzYzbvaxkkCTgTeTQLP0lQTSXn4RE0sh3XvzUphTEkgnkz2H54A8/0U6xtoUn+S7rcalctNSeVznpXKbIbjDklAB/FgAZkSGO9rjFMVQKgnkaH/EfSvay+53vYgh5GMNoR2nD0+oDhZOW6n/ERRy7kfaRPiyS8C+7AaJ7LyYFBzD14frAnk65FfcBvIQT/X1muJim3YKGcy942vSYRX1HTOAyppQrGO9uDl8UZ2y+++y2sfoI+HNJXmtCTEwFwUEaF69L+Sy8JZkeaFsGoxPvCSLdY7X19fEhrdhDlnNbmDB7PslxAzCQ36xnFmAkokvtasSE/f+PgmHFRAS0Z2/RAYNeomFORJVORhEKrzWpt2b7d7s9+bQZvwM0cRi0joi440eE1T9VO6KdhOzi34yz05vOqxFnQI1eJ+U4S5NXrKH97Vgqjl7CRKxlqyoYbZHZ4/puQS3IHBAC0ZKVSUpDqaqJIbaSqVRUnlpedpoM8nyJOB6K3eE1V0h/ckr5RQl+H55cT3RX/TndfC/XJ+c17k+Gf0xZq+v9cl+0jONnhaz22t9sp/Ee6PjxKShw1N9sp+0e6MFxOyvqhi9L+j/tt5GvUBAg4UbgtMlVTHqXIyOukL8tiF2FBPTmrYuVlNdIN/rWsNB2ij0vjgeHDOFON1TMWt0ZAMUyDWwmg68g0/A1/TJFnZDynWAnislDPxFZ/6perLjYtgsJQwK51EJA6KMwyulm5HXx0qKQabHJS+ApVgQUwaMUwHoJxet+lpbihcckCR54Zvj3px7s6wTOAz8GyQZnThmf5XC6ONv4fNv4fNv4fM/u/AZrXVmf1VX6PM/pfAZ7YDmeGWAj+s/rvAZzYzmSK+Fz5H+PQuf0VBpjvxa+NTh/8cKn9FHadIV6bHwOcrfwuffwud/r/AZ/bbmqG+Fz1H/Fj7/kwqf0Spt0qPssfA57L9R+PyfKncOZlaQPAuFz0yRoIfC56na+X9U4iyU3hjl/7jaGe3fpuzfHqudo/2tdv4D1c5osTfpl/dU7Rz9b7XzWO2MLoNzjNdq5xj/+dXO6Jo46YH4WO0c8z+o2hntHie9Gx+rnfP696l2RpfJOdNrtXOmv9XOv9XOf6baGd1M58yv1c4ZoWz/f1Q7o2HrnOW12qnDf6ud/5erndHzdtLA9rnaeTK9ndH0dtJ9NmPkP1Y75YnbKTuGnBB5lXMR0SRRxxKlFOZZo3Q5eSzlqrR+2V1EncWay6BpgzJh/nTkKb5uMgb/88X7WQf/66XJdC5NRgfdKQfdx9LkyUJ3Rgvd6Ra6T6XJeTLki363U363D6XJefLjCx60+aL760Np0o/+LU3++5Um/dP88SXTc2nSj/4tTf4tTf4tTf7Hlia9l/8xKOTn0qQf/Q8oTfqT/PHg5bk06Uf/k0qT/kh/vIH6Upr0w/92pUm/rz+ew15Kk+vw/1OlSb/pPx6yPZcm/aj5cFdWXUb6wG3pA4+V6MvJ9YGnV4nyqhKN4vLAc7g8MK1Hmc3tS7+QpQFVkNqakCGl70LBO8UxtwonVQ0Vqq1S0tx62CtOQ5Dt4sBtiwPb8DhtpL6qRnkVixAnuIUShH+kDjy2OjDU/aUOXPpSB+aiTOrALCpJHvhWBx4uN6t3kWihSj3KJRSM53Sh4GZbKLjOXWm6y4vtFgqWq2TyO/CkeL5FaGvbOsFI9JpGzta/mkWLzaI/lxH9qDJizWsbZdlp0WGX7aJVr23g1dHC/BYNLsvh6HLBMURBq7RRlnEW7DdcPTitYuGsSwkaumRe5JjFP3btSwkaGule7rA1K6S01IOREpN6sG39k7KTx8jzuXowHZuUKunzrk+19TlR7/bPyUSzCwlftqqFbewah5WlI3zdopRl1aqQvnL7Qf+B1zjKjsZ72d+TWTCj3li60tf37PF7jue6oB/9Wxf879QF/eX98a7fVF798N+64L+2Luiv/fdnSs+arn7wb10w1gX9xfzxGt/UW/3wf3Rd0J/xj3fyItTqR/8z6oL+MH88+4sgqx/9t6gL+r38cetvAqx++G9d8G9d8F9eF/S290dbtZe6oB/+/60u6I/9x2tqL3XBdfhvXfD/al3QX+sfn6G/1AX98NdJ4homUesLPvaHuqAfpuE4TEw4alTZArun5EWHvCVPTT/yy0dyil3Sd3x4ngNpFsJi8VWL/DCRUWDKf3w4EsBpyh023TAYMxi78NXTx2RG6zaVMHaXhzDsoehxO+ATxfMMmQlnSvdzT1NpIw3PpUhpnL7r88PEfKJ3QvEH1vwBQXxVORIjb/zBNbonWCqhz3nvk4flWn/DF1IpdWBOEzPTqI9oTslYa/CJJgYIrlKYOOzm1pup62peGKGpNE0iIYKdxtjvmzdAzzMas3Nc5GdBIGPbtp13ojwezzsopnvJFY/vjTbPfHGJ7l6XbN14eeixZ9odpjXbAYLMMgf9DVnmSDtvlLIXXlIzGoShGDM/RS2Htpndn6DQxjDVtfTFK9SUqcmz+DOXrkskn0Z5Zr0RcG3pR3rN6mUbiGVDUtrtp3UvVG7VFpJYaqF0KNOz+lyMDFdeb0mzMhJ2ld8L7UF+nFw2cGpEy628Zf6FvibGO12WrobZb09FogsC2XrwPj/G86F1GD8YWoHpfLBlbfxb/I5VBLw+Y4UHLd3G5d/HDZY9nLvkrzZVucJyQveXlsFyHp/GJ8crbbn6szU2qOTS1+hxnfVWuJh+mr+C6qEHOoiqU+ihjTeatyMzer8CE6TTVDW6Js3c9C7kHIo6QtdbhkkzqzWZnrN6Z4Olh4vL+S7/abNPZ4tG0+rt8vfd2aIhrSvXUfhp9DH9lrvaKEaHmf1b9Vm8D/Spe9GkcAnizn6OFaryl8mN3y9aNsn+eQVVyIEOWyPE6KuhI/+ifZORI778tL1PA1VfNTvI/s65vq2qd9SrvjS8ZFfY1xNxgrqcmcE3yDr1pa+EweZS751tG6NaU97g4so4pbwKpSnpy3OtXcxfvZuoZu619YqoTKz2khIfEIvwlMbqDSnNywP4lOVoi6EsyyKYlr+X+sFQkcHPm1lB5v1mJcjLlNWf3kiC8zyaJ+KDJidU/IBLAUYMqD+pB6Xc+/6zUb1VpZLSejuFvZJ/VpKql9jLiQqW6alwhpJVTkvr7fhIhPPWNL0HMdmiQYFhFu4BKRjNehf3rikx1dbXE6tPM3etzspMadOsg5ts19ybvPWMk7W0JrbUNBbglTS5x3OvWjburF99naFfYz1F54vKrLG03Xa6plD+2dAPuLnvQX2CK6bhYzgShhwheLLB4Y8WjYOtGymRNPgt+CZH3xee1/ShIM1U/M5QBfTfYkHsF84pDb+znGXGLkmEtv7Ml9dXlgukBoecNZ6wzKPqL/kkZew/62WfV29Sm4x5mLNgDAHQQBaEgD9Qg0HbyWVHNrnYevisVoIhIDPpK4ewoqgDFy5jxQS5yHaal+DYpDPMfTJNZTher7x+6nMZrlvT+sRZ7RB9KgutoB9occkSF2+3cEtjzpTGv9p0rnQx5xurdT9ZrXXdeG33aRUTcC+fgRANrGvX3Qg3QmNbTccEC12r42W79iVMb1cmyis88PI9bUi13ruYUVNkUzyrfHFNlDVV6gx9zW3M6+9NPgXt6XWT2mz3Zr83x71JtQ2sxxpHM+7VlNq4M987y71Z7027N5sPL7mxY/qmsCPcnPu36b6Yhi1t3ldL99VS3Se7G4bGCd6jmoh2jvuv7ovl+2IM7HWufF8s3xdTvMCT5fvRcrs3+715Xy3fVyv31cp9tXJf7e5VrdwvstxXK/fVmFWwzM1xn+y+Wr323nq/yHpf7W7pinZ8875ava9W72ejy7b/du4vaPfV7L6a3Vez+03a/Wx2X03xOs/L4ifdbhVq+Q/uZ2u727R2X63dV2v31drdSO5e3Nr9bO1+tnY/W7uv1u9n6/fV+h6nW7/fZL+v1u9n6/fV+n21fl+t31cb99XGfbVxP9u4n23cb3LcVxv3mxx3Dxj/i70vy5EcyJG9UCLg+3L/iz2YGV2KoqjsaaCXh5n6KahCkQrJ5QudtOVuyXX/2r5bct+/tu9f2/ev3TPJ2HdL7nG1w74H976fjZtNfjrvmWSmfH9a7k/rfdjuw34fjvtw3ofrPryebd5TybynknlPJdMW4I3Ddh/ev5atJR+pBV+yy/sVzWsnDbNzHNXWMrOaxl0l0yfYbtB8B/nYRXMdVDtlVkNXaazngLZURRpNFjGNgBxm0uSbNNYzo+KrV4X6XZg3w2RISUFGpfjaTaGIQMN2b3zmHP4iT3Gq7w/PRejFgqRfnyg0+Ys8vVi+PzwXIUAfk1P8OE83lu8Pz0UIPMLsEl/kiT7//vBcpOsibw37lG76/vBchHlFzInxRZ7iTd8fnosQ7l0IM/7Msv1FoqRZ8UmzsvQ4bw37hHt/f3guQiURApmjLGp5Ar6/P7SL1PQL8NxO+4tU32OrZC8ABV+f5ZukRh22+g5La3pOfGEyskYdtvoOKzt7TKRhu9aow1bfYWnVzXksvpOow1bfYWklzV1D+HJq1GGr77B0UuZ+Y+Qro/t1kajDVt9h5a+8008DKOXxcqL+Wn1/rUry1pcxXKP+Wn1/pX/r/KkEi/srRJ21+s7aNL3Ol2HTos7afGelgSfDi/giUW9tvrc29dY1Xy4S9dbme2uz3vrSqi3qrc331qbptb09TtRbm++ttP0rqG/P8SnNXyPqrM13VjkFQn0kvEbUV5vvq7LeQ8geP0zUWZvvrLSLYz4psFC004+L+M4qDzkYL4dPE3XX5rsrXdbKLCm8Ro96a/e9lSZrzDOE80hgzPb94blI+cXR0E4zlJr9VCWLQWa1z85mvGgg73ViKha/aBMGfoNiqkUkFEGzxPPP+jM+2GCaASCCNDkbqg5OL8C9HuFg98Ol11+cDc9p3l8ax6jb4I/Ak9LZEIh7PBjq/MMeDLbCejBkA+RsCAqAHgy/pweDVIycDRu+XWgdt1I5YeO6HhGVBXswpOjM5LDIgHnq8PG4fmDLp26WHPeeg9dGKp7b7C2d0SRITjZL2kqAb5qGiUrG0hkCEiZ5UOduTqyoJWGTeHg0gIdZcbkfW3I0iJVncP1MsGO5nHnrQSosIBDIh0LGuqvKBkzdIIRs5qMQw+YVrBR5bOCvKhtaN25AT5j1MVFdhE0pxHiwQosMrkq3WfVc5G+Yii3kETBPKthtvhgJVnSlFoyAnrglptAy6+FMlmXWaktTBXddeK3GahfxPKhySd8V/05i5eyw6/Dxqv302zX9lhG/6mj67X76laEW/Cnj0SFmZDKHeVXFdx58gdVS8JV4YAK+5TeKdswUnp38AlmdSPyZnCyqpnms689WpXVmHieNCvBJKZDHsk9rP4fk551D/NpGo6HRu2AZiGz5hcez+2WDBlRvG8VusOhCviDnBeT7xFVkQxRWT8UCaGMYIgerocHYp8qL5bOOGNbOjQUoNYw8XTFJb34GzH+Gdaqez2bDzlxpkjmsUo+wuf7hS+PjPx7UL21mrIUC96U79fWkVPsozF5XFnKrEqmAWrOkKygIMR/o852VbN7TAELv8ft+VZTjFUqc0A9+tPS1JU/3lrwJnFHrMc3sUHKaxEcC3sK7HEwMEBqRt7U1C7gXtYYwUv5Fl2d8U92vfHY6UzXiBvbRIn4JyMOVaMSCnGu9xb4MT6mXgZJHmXQPTl7+2B7quw3oalQwmYcrMk83yjdPk+wCJmDSjrYXc6GdF9mEls3XGBzseuviSaHPbNJksJZtsmQSId8coMi8s3Bj429SzpnSZ6Wd7nf1Of9owwcbdOxBHrwBkPR4sixqDeYNA+EQ4DelxLX4LrNksvguuQxKO65Xw7QhKaf3W/I3crTKG2dUvl8wyjr1sAk/xRirKojmRBddcBeIkAUTYHECwml75YAs6I2j6e35E1M5c/DGtt54/Ty4OMMHT/TTKagshxPrOLjRm3HTikEn+xA8o312Ps2DRK0WTda1Cb8HhmCwW86OwnZlD16ahitpZNavu9hU277KOmaRB7gU0ViYHet8av7DzIcVPnASg2xzOCxR7itfBotK51MZibP1eAWk/ZkEtUPU16Fk/sDEDR+2jXe5cDv5J/IU6zanDCCDND0fmItoZ5qo97ZeBkyM5mnUgCrXMMQSkiBAjV/TM943McoknLA1jIeGd9s/40nAGT4mo9vMe/JnRJut4Vf78ZsMuZ1+XMQv92P8ml8Y0XZr+HWTjiPv+YURbbeGX5NoBVEAIIrHR7TdGn5hkX1Eedv4jWi/NfzMLPcEwrWii8xowzX9HDhtw/XCLwysAb4/PBcpushLpnFG6YHpBw5F8AtilfgiUXpg+h4r4fzXzXAgnP/94blI/3UTGgjnf394LjJ+i114lovkBuuFkybN5zmrLaOcFfqra7kEXrly4zWx1KVF8/lGVBVXcq4k2o9i99E+qMBnFGkR96AiDx3Tq2W/790PFAq/v8Y9PKt4EpuUDv5yugzn6aVtsNBFRJzYpIVgeagk4HnaZ7VhK+Mei89TP9O4P6CSnoAT1uB8iiYmXmn6PUla8sPH8/gxO9evMYxk7X+JYTgXU5L1Px3NPB7NzyRUpX6NYXjW4lDuF7nQbD1S+QBna7FpOetLayeKAVLTYpd5mBB7jBObFiHzdRXFM0gjtHpiIUWuePeoeyNMmRbj4J0qFECFfzKGpwU8F2dsXyct2lOexrAGE2GTlQGIscU9/HkFPqU8Ipvp50vKV2dgT8MJZkXz5fLzJbWjN3YY/ZOqZ2esaLpcfrqkNDPq5a0F7BSdZeZoW0AAfBtK4uODFQO7sk8hFQ+4XnJcc87N6ncZ+Y1hXL3MccPz00p9GUkB/tXjRv2UvBTL5JdYkKcF5TbFlAW2Ozk8FhtySqtk3rUTEW5iKbgpOZkoYNuqHhUjPZPHjslNHQeTXSEZff5AureytDoYF5LRQmrOzyQLHRwGRJP6OxE5+7gIG+C450w6jjb5Jd+HlG4CJAwAP/RdYv3a/YV+Hw67jZwVc+Jgcd/7mGCXX6YkgYwd80Cw6ts1WqWWX6WkowvGPrJFfoHRWcR55LOJqDRt/0lnTtaLgTlH/kqfieOEGj2vS753htr3+GwmzmrSFR8351c/CqBCeyVchlcUri2/Ci2lOWoowXVOU7WIr6Eyv4DAGzt96M+kRIIidGKYlJ1Ca057rxCQAcn1cSN++ZDqaH4LtHT6/HzR/DeUPVYfuu8E7J3xqdaW41OoCY7o65P6I0m6/Gy/BBF4C7R0mkJiR6eoaMfatCdVZns0W4PJ/LzefgaEf4BpRy55Fzgy183rPe7NT69b0yuMnSqEzNy97Wh63X563fm3qGlH0+v20+sWFuCNorHPDhbSPBIbRyfSgn0Yn9BOIZID6lcKZ5JQ/fWTLs4M2P0UiaEiviQ0sARq8LTyo7QhQHVUlyJ2dXLt4nBiANMwLUF2/XxY7w+ZlUS35SJHTRqETVH9YPvJe2vybi/xtNQIG6YIzNBfnRXMlQ8QfY29AHfeueZkICNQ9cboyvgfuvLjRvxktxWTt5dVhKetHNO/piolwwoHD7azXBYqVUgo+8Heq0gXBQnwCHWUEdxwxnrcmp9DJeNHsm4UGEoEMGijzrTtny2TAcC1WaZdo7wX5HfHY2hvP2Oall9/2RLyNMnm+9A7gSK1FIKVOZDAZkmBpgsMX8dRxidMWRzoQ/cG/UE2CVBxUv/FNKY9CJwQyOsueMQpBYVK5kTh/CYSFggrBAcTKjpFigMzTGmtybi3MKDPqSmTg1VFac3RhZXXV3PuSk9PweaLWpMJEPvqus8zVkTtJtM+Lo3n+/ZLCoUIwRgLozedPdAqtt9gPYWpt0kRAO6wCputUA4JV1NgNTicKegBHs0JzBD/WjQ26n1o4drjlv3iI6nE/FYG3JdqBmgzV9Cl8lM3hiA4IZR1AWWP5a0tlZui0ieX/VasVMhU4x2WcbpCUFWpsYYxoOQll7NtIRUEQRAEDW0JID21u/3hVs4tkeutzDW65bgLLWNewdQ4kVvO/DN9Yco0EHc973hNG5ZHE/pVc/+6RwqUIr8/1DVy0ur2AqOw07aEaDLbx8ECZH8qKYxmiVKyiDkYAZUtS8zyzRZGww5OesgPWywMdiYkA+Vd2I2enjkRqpyTE1trn3bRN7PWfjukaBVeNzWadDR55B4/e3nFTGm1jIJC/PjBwpy9HFumTFkGOboT4u8vEqSJspc2y1T6wjzQxic/7iNIEmWvDZYpspVZnEUd9XGRIPzOXpgrU8Qqg+cVt0iQJMpe+CpT8igjBd2hzdH9RYI4OXuZpEydHYnNzs9OjzsJ0prZa/PkpCC2xEFTTkFaM3vRmSzRGQTg8UW2FWUtPma+CgsBqmBDR1jTPnVidzdYJQSfqCBoJ620MpIv3QvgZK+sknP6JZLUWQy5/lkpUzyzqSIO+h8WbFL6dFOZ2SjNOdildpYUM7iq3Ev4e/HyJFnyJPWlWJ1zNHq8nkfOGj0lRoPlHI0eL4yRswWFIwzSdbpiIuncELBmANkwthRSSODydNLxmAD67KSW6h/qXrJ1sPqxdQYkKB735IejFC/qS8Up52g4eimCLCmClx11ztFo9Dz9TMb4ZlTlBYXt5OMSfiyKY97izHGOKObZU8yzKOYIEAIoc87RSPRY8iwseX1BMOYcrHnZw7szodq5vmzAdZryRKjxEb+C1YZ4m2KEc0Y/LJEjvFP2dJKExRWMlCRGEIsjDza/AN6k42W1mh1VZmxqnSYRAlCM9l5IinemAaCwINWOSjFdU4waYlBmUrUzimuFVOtMxh9T7KxxZQEZigyYeH6bRmYuklFD6FZMEmgf/SiUOHPltn8OESErhBt8+3rkey6aFl7yCjrdD4uFWklNMlAMqOatS31BvyDHdXanrPhlJdiH7USR/DRdk7xOsyD/as0iUFEa+i22SjG2aVoGfGKzIN3GRpGUCxuF+j9sEymjqTa59hYjtFJ0JvMVckucKRf42ZWfbn36aDQ/DQrpX1929zotJFLrd5OYJ934MemuojiYihkU2hhU1pKEDZamraQyhZMLFYtNxgw5wj/aNxN4hpo2HuCnS0QKgSI3K6xfvDX0782rEjkpt4ISsimVKdBhtQR7rtyp7YcwavYkh0zCQsYjxO1Xw/Z7NpvUYhGRM31PdZSo/f5hq0EU5K3ViN/a+1/RgM+mwuG423Leh0uHj7b0K1fRyvWS2dBpVEW5OBaKCCcSRKs+UoqjcrODXCnr/Xxsy2nisSuVJXPtyr0+bsqvhEWBKXIaAZ5fpzF5CqvJyQpEk6LtRWrfmWFLwdjdYVdstwQRD5TGlC5EbpGnHzfnl9iigLe/TXmSwiHOgT6UV9tZi3FZJPbzq+3+yQbza7YoLtosR/c0/2wwqhX/u9rLxwJFYfkLhydHzJnsmTO5KBjoL+GniDXc77d6yTSpvjkl4CJlJepRS9WS6QFsB7/VloQf3dQXwatBdjRZ1eZSYKIM1gdVXqkGQoRF5VLoc95aTPSkpCxmToQFQRItI/C0Qwka8guVNaHCwauZh4dKCzFUV/ZVh+X+Qr0P231oP/FoVx8fiUxUx8vLichE2ZOJclUQMF5eTsQmyp5NlMkMgnpGm1fV+Osa0dbAk4kyiUHQEwhITTpZDQCM4J/aRMouLL5oJhIwTNq2ukaTyDUEkBq3CtOXWrInI2USiyBIEoXgPMkJaxncAAqCjXX39sEPwzqBKdi1qiVo8UTKxdKIE7u4x134KZTMJERU0OLwe6SIy5Q9lymTl/RW49VZpWDrj4xbyw8jULTlVKZOaqybimmV+aF5sJ5S6p3SXgIOo1BTyeAKCoEhqEhVOCKalfAdGnXInfcfLtS6HDO5k34gS+4Q1E4tlAtmbZmChyadWrbqybxLlpOr1CikmYaFPdcpPEWV8If+vBIgQWwszlznVcx/7BQ9tytXzdTzZaaOyF3Zk7syiVqZybMn3TRH3K7suV25akadI97nRfSu7OlduWn6mC8jP6J3ZU/vyk3TxwtHLEf0ruzpXZlULQg+RXvniNyVPbkrN4WV2DxHu9aI3JU9uSs3xVPrJbbXac4llG7nBMCSK+eE1q1EtJEGYOhAPSvWs5DCUT2rQsyTUKhnxSB7qlhuiqaQ4Q6mxYgqlj1VLDcFPVDTi64RJRY8VSw3df31kn+OqGLZU8WyqGJogPgi69Q/kLMm/In7YmIhWBclfgh1J6GGoEmjUAAQIIbY4DZYdRQVgTuhXY7pAIgAdjQllSoJqkpAlDAcQFgJw7FP9F+IjMplnl/h+m65bUQcymjXxUjtoUaePeUtN41hQmuCMazT89QUGaGAsqFe12hWwPItNL9Ye5x4bCCJu3JmlUkzHe50H+Y49vN8utw1P+wYtWan/4M36Ml6mcQ7OqYEuWuepA8GXbAuFCIGIzFuTPQyW4GbRKdgZTsztVG4tTTMWaUAdYPtSgaAsAsBjk4whBaHe1AEbcyeG5i70gfgXQcY4GzUQYpWFsrtdaLaKqvyksa0KKhn0kiQ8czIfyK6RIa0s1QpedHNbSwtQMDDp6M3wIuPpc6z/3LXfLpf5nWeZlIgzRvEoLHb6h8ghm7MRCHYF4Ey5UPrrinR73EjHG5ggyqc+GhOQy6gViiQXy6ESm31l30ACyrV89OW8v3pwTagZHh92AhNf74xvyiQPsb+mS/Q+ldDtJOvYJmYilGj/iFpnUkLuSWtGUWJ8UbGXLYiW8ESwdTEZq1wmhr0LVptuQci2pQlo+GD0hCQrbY0BO1+lIagBJwSZSxgKFFGdpB+lCA/qqY3picZLFGCGTEamujZWfwiRXZcxjQbd5ZolfKMuizKXB8hniz3aJXyzLRMBtcbJi33aJHypK9MFlaGI1Y87UUBmmduZdKYuAMNqoQ8yYQaRhBhBGXfeKkbI9fp2oipdBLHQf3CxiCi0hVq2YYeUBQcPe7Lz+miSwFGFwWfPCumEVbVKbunQfCjamGCFkGrGT9pSDbssq/DHO9xPPkpk/iT2wsaVqeF+D3asaUeW8P+LYxv6IFrPiHQrBb7nqE/kSLhyg1aUuM2ANNEIxwAo2oIGIAMLQrhBGAv4imh/ZPT3vbHmdwdyoFnvanC58bFG/hZhC2fw34fjvtw3ofrPtyiSj1azi8hpPzI5SuYkEY5tptIwQm/C020TKQSQyeCSDoN9bA6NmkudhksAWPWjfM7zR70cUt+tRDpCAyrCG+p01Bv4O/mQgBwIqt7EQ+J6bJoy0yh99Vs3cswDTq3A1bF+cK8D5cOHzfpJ3KxidpbiTliE2XPJspkBsE5IpwcxqU4TvnPqfoQglQ0NawYSJWyJZ2rBhYneq9Sch+IPlmaFMHOhlWProRiHs8n9VMpmUe5vdXBefrP+s0e+U62f8H0NaKwRszDxK8sBQE4X2m6gEx2bSd9HmXZ/6j4/MOU+r+q+FPu2k6VcsCj3fzyQbJVhpVe/Han2g1rraVHoM38zTsRllUoXLmkqEFAnGysPA0DNhrbpDFCBeyxkTOTkbGZxsZpqgSs+tOIVWDRLzHDCMy57UswGDJmR/uCQOu1PQJozyXLY/0ajIpqdoLRQoYKkFJXLHp3YeXfwJeIQ1D14CLxCbRcY6W+P2gT2XPVMnln2DrES5bWUigLSPAcMn/iAhxhckDH6QqJ7IBcdA9fek8rDwNFOFWNrT8rmXGM7GnWPo5sWGOYqKYOghzZWjH5b8V21K3PVlZmd+zyjCCJ8xjSzOssfwt7LHPWxW4knZiRemn8noEjAZySwSUsx5bcXyoTkJk6x2PLY3f8TOt30GEmqq5JkTmTwSLOC52eqQbBszTM4dHI9htTPCt+Nq15ppLvuxzVCJYZJArBArVUJehSxYkEK0wr52eyqBT2KfF7yKYiKAEmmpK7rNk12peW68/4VkewGvkghyTD3N7q2vPCDWD1pRTFNll6qOvy7plUlxVOVc2R7kP0LNhnt5vKmSFp2cgX04nhEeG6WPWRNdy9j3BHuTAFXKbpU6NkB7Z27IVL7AFYUBQKopevXsDxVrh9YSppWm6iicYLWsGklzFkvtc5K0As9xNt2RRG2WU9I4NJg2M2kq5o3oE0ln1XP8QuSTc24jTpL2tTc+MioCuIZsUviGdVHrOvp4LmqYjwRVpJp3/fack8SPlnwia+t1rARIT7K/i2FPOg/i/ttIhxnc8MtGe6ZrJW0brRvmJenkpIYmkHjv7GXkEdZIJeDjV+b9uC1osHRT/ZIqaAeqpcYE3jfxoutNLThEV6zENw/lRufwkpDWV4SnSg341DjpeYz0TjJQFut+Gsgcebp3G6QCxLf/9oER96koKb2xuegKerDL8t1jmqS0xUsIf0/EKp4EyFJ2jiuV+78U2lcqUFGUCzu7S7u3R9gQj1OU93Qee27kIfCnWX3q/uIpakYW77gfXgdw3XE4wjH+eKg4x4Im6R4+AEzd0q892sJRNAai2ZKC4zq7ObjGCu9A4ofpexqco/VERPUnrJtgaCSimHoVUUGOVPIUajmMupdmYsrh+bT3lUUJhmq3LUvixNC92XBv2mhmkJ2aqJnak4CYhNODvBTQEDRetTa+dvG42G6Bkm4A0iLq7WUHOnngPJHlwCmVsaxaxD2zjP04TnAYlpmBlXm+mcFOYdI2OePwA4HoH0+OlEevEzeRoWkVp0uaVZfw2rhGUSKuv5EzI79BxZD8JPm5DxjAP5UDrsdkePHuM3NfPXIkPEN8+eb57nr0WGGaVvPO87T8Xf/WXfIlo494YI7EWHAcsJzhYUnkEmVEcZFf716c80smdnZ3Kaa0ohKSPPKN/jadB5/pbvmVE5ztODM6m+gDSEew+eJfUAtLDKxDYxdXmYbyT2ZcCIcAJvtLYTnxKuI1znmAOeIuSriURLZF9pOvS36QnImWxi7PzCnX5EQM6egJxJ9AUmL9x2rKjg57nBmZzWWl+ydCuq93kabF6aKd+QNxEPNnsebBbTNYUWmnlFY8ezVTOpp1BAbRBGftxGNHY8WzUvGzsvs/6Kcp+eaZqNSvrGkFjRWPAk0Wws0JghsaKx4LmcWVzO9oYYiric2XM5886/0iwiMmf2ZM5MWuPbwN5RT/VEyCwiJHjj8cNEXdWTGPNuvzI1dtRVPd0w7/4rU2NHndUTBbOIgrBQih8n6q2eCJf3r4n6HXVWz0zL5FkB5NuwdvtLRF3VM7MyaVa5vYhl54ialT01q4h79TZoSgo6a/EEp0Ky0tsUUCJ+U/H8pnL4TXGHLxG/qXh+UxG/6a2jlYjhVDzDqRyGU9zRSsRwKp7hVMRwQiAWvZwSMZyKZziVw3B6ezlBby2e4VQOw+mtYYPuWjzDqRjD6bVhgw5bPMOpGMPptWGDDls8NamIfIS4NmzYHHVYzykq4hRRQe4Z75WIUlQ8pahkwQbDkLFEhKLiCUVFhKI24lyPThOdA4QSw0XTqEUW6yZbgRPcPmu3n01ZBtKuGFHiLx934fu7KETtBYlpp1kMImOSWg3g5wsXCtHISbYXYHiodVw3cO6P9pWRaGTxTKSSbdjsMDLS6bvGd98UyzMspi2WvRBgH7GKCq6ttqHY54xPf3iLF09nKllD76dT2dTfxrAXM+ivdBDXahCgCDspzI3YdooRQWV+JSOE7YPMzthtzU8tvm5WPDeqkOgESnEUdeosN/4HhNzFE6fW4TCQFxPhxFsPIkxP2azNZWCMxvJaJyRmzCvUnkXnH3fppwk5eLYXoq9OPzry12u8NQKgQX9r80p89O5SjxvxU40oXHgLwbZIZ6/a9Zd8AuEef4i6UG2W5gtdslPTXh9IOJvoOAJ/WD1AZftxa34CEzEMzvPRrfHsv+DW7htSnTJQISmeU1XEqcJ2K3x9kZtI8RyjIo5Re8GZ6jQfEAk2FaFTb1/bvU4pL2gZdQ4ZdEf5oSOhP8TExlZTnZXMhZVPoRVjJCqpFk/mKSLztBcIaYkcS4pnsRRjsVSovfXul4H7rKCWR2W3TsEq+xfOe5DXwMSSDUjOonOHPNniqStF1JUGP+loiohsT4qnmBRRTBDbxm0SRRyeE1JE+ohj2xKZnhRP3SjFnIKxMa2PSCFibhTP3ChibjAv9mnThyyR5UnxLIVCxgHMn8M25VnWQdKZbTlYqTZG3AKL6GtDcxB858bqId9uW157oXh6QyFVAeXpCEtfInZD8eyGUjUc49RWidgNxbMbStVIecHP6nQ3IP4RXyPudc9TTcZYZbYHjmONjCDqwBBFSavK1Y7GWluXBlsjbOIp9VE8+aGQhwCqYQSh1tmsEvAFcVCskEf9XhUPQlHTK65HvRyktTuVB2GcdU9RmfJyQfKpeGJEqb8lKkvEjCieGVGqjc8VUtBL5PJSPBOgiAmA0nD8OqMR6pkApa5fUqYlYgIUzwQoYgK0nV6eJhqinglQxASAFWT4NBEToHgmQBEToO2XXUXEBCieCVCahtqOdxURFaB4KkARFQCdLwyAIypA8VSAcrD+L0tw5PNSPHi/CLyPPh7fSdRfPXq/CL0PAEF8kai/evh+EXy/vcB5SwTfLx6+XwTfb/ul00dOL8XD3gth5hvTe9Rf24FG9kxAdpNH9qWJRO4c6iuUhoAczq1QqXkHSUMhT6Azp5kHNXHNN4BfZZB9IwHK4iHwRRh3zLLhE8txRiwmUruBKhxfyk0UaaS2KSujpBtzxgQNt0teDQEwtsCsrHXKtcp4mOg7ajj1ZBpO/oY9JL4Y6j29LDM92zIDkGTNal+7kQVRUf4mrcUBN2A4OCjySf0sCF0N1ShRcwm3XR7xXoR4RwEsvqVoTHs4ehEcvb8gjEuPxrRHchfilnN/QfaWHo1pj3Uuwjr39LJ8RFjn4rHOxbDO6WUkRWDn4sHORTYcsN+NLxKNaY92LkI7k0sQtkk0pj3auQjQ3F+wvKVHi5CHJpehsQa6ZHQnI1qEPKq4CFXcX6poZeSvTX7mjp4SDKsZNJU8Hkq7ibGLXRWBmNAXIzmSwDdJrd2bVmJZu3Rvx2P/6hG8ZWhI5Jd1YURDwmNuizC3GIzxRaIh4TGxRZjYnl/WhQgTWzwmtkhhnyJK4Z1EQ8JjVoswq2/I2hIp7BcP4CwCcPby0psjhf3iUZFFqMj+ggItkcJ+8ajFIlwi/CPiho2GhAeyFQHZ4kpaifT1iwdVFaGm3naBkbx+8aCjQszN6y4wUtcvHqZTiFLhatwuG4uva0Sd1QNbigFbXuLlSFu/eKhDEdQBntPhe4mwDsVjHYqp579kEiOsQ/FYh0IYwmvBZ0Y91SMXyrSe+rK0SnaekQf0eb52aPeUVo804qoX5j4RS1yw+e5lHIhAF3UOGgb4lrKducvM45kr8hCJQsDDe6NFA8JjJMpKvxZiIgn14hEMZWmNeNGm0mlGkgvc+EZ/tjuLOIY5Tkkgjl5nHZYekqjuzOPT/ZvxnEQ4OkmG89lKHhpRlpYGKDJHzRRhI4rHRhQCHQCEDotEETaieGxEETai19ggVqcvP2jznJrfAbqZONM/xjIV7GzwmRk04wJAl+qlQCNvCrsx8u3MCSvypV51ekSZHoVRiKl4k9srEQyjeBhGWVqCwM0OH3kIak6YOUwHKIcLmSIZAmJLMgxEKZJ4P5RIE0QFPJo+62tswIsrOQ9LgGNmv0wol4hjKI0Wmp8Dpk6U9QehutBvCzQjOf+hekJsHKk9UjoBj67TP7Aug6th/BNUSEuhTtQdqU+JsknAbxLExzbPhHMjMSOsHbDledvRTNPwcpNYN0B5qGvPqsQiNQvE5pzE8JTe+OZjbqnonk9pIKhPCV3vhDpKDYbAJDoq8mJNV6AhBnHjvAKGiv1ZN2g8PiU3NXO318r96QG5Zj3+4FaGyE/7dNwXm/r00W38TC7kDf40HrLRVO6RN0XIG6ZJw763DNoLdSpp0RpPOefIMYTIVKLCyFabzfrFAhmbWVagJ/EeBzVAJvlribhDDk3WP0h6I9yd5F2M4dzbPpZ7nb4k9A6R90t5lpU8OqgYOghpzvBB97cGssoTKX/vn2+f+bwtP6DSBihJ18TyNZ1oOePoouMozFtyJ+AtmFj8kiMoEtbK8H55mm+E00AhqJndd6d2Y681DQBnzzdDigeRmquY/u7xqAFQuRDgVz67d3uB4CTJoAL1PQL4Cyo5qdlmfmSp0QyzpQDMesj8hvJp1aDfm3BrfGavj/2i81PMSrlzus7tUery+KoifBXefNjvdz6SPWBiXKKeK5suhl7pzvOrwItk9/hAIS3DtxBrKkZ736GUZ/ForSLp/Y40Rfiyiiz1CimX92gRf6w3Y74NsvtpjtTG4XrgHtjaAxNlFkd0/sg/hxNsqpeVTqYimPw8STTneMrzeKqxxNY4l2Yiiz9seiardFSvI5YoH/3Uo8yKUGZvdr0lQpkVjzIrQpn1NxxDhDIrHmVWiBh7DfUjkFnxILNCwBjKF2EpIsKYFY8xKwSMjRxznUuEMSseY1akft5f1LF0mm6+CAeqLagGdgeVgsuuUbvn4Rblo5vUizGaC+YD+e4ypTnO8iecOSYscsz2ysZtxl+IxlG60ov4ixMmVJOFEza/inRZfypR6MvcgwXDl6o6hyhlT4uxPDI7NWqrmfB28pcg3cLpmJa7Ul/HYi27Ybwu3shCCMUIYtp6g5X0xBJzWCiBA65hNIgl4wN7mcGgYSeOjXUE+zu1nfJ4TgJ+hdnKMMd4bp2Vr3HJX0CPJDBK/4J83Pxd6ZSDLSVxRgI/rq3TXdS6KuuPm3TLSiUAEM8cwah1FhP8JA1rMJiG5/cgDAip2gxxgP15CFhUDy2sxAm+jUedPWIEmXu8McclJajnHXV/2V/cNj23EYaefMlMLkViBNXjFavwimDMRYNLp7mwd0PkmAK2iSjdqCHpEwy67nGdAQdNSXW8UKIfsDA/7qj4O6q/Yad0mj0GrAOMx13FKJ3TLL+TMQkXS4NkpNBgwLhSGrJkGEnzbJwhS/be2uZ2pkgArKjKgAEhswkPX7HcxrCkvVSrFsQPCpgywTn3zyLTcMgSWR6/P7nIaUaYMn5IEz3pKWFAdxXcdTiMCpa7qbDwcN2H+zpcSYePRq6+kds7LqxG0NDqoaFV0ND+grGoETS0emhoFTQUos3xRS6WPAlgnLnyVyBH5hiYe3f8dtPkbnKc6dQtds1Co0KjkInuzlCxX8LQRjMkhewikKWLA1/nxTdklCQCGZcKEciaPi0WMxprLFMndzE2ftg8VY93rcK79hedLp2+VQ7u+fIWm7hmzmoOwt9MlTv9dOsdKJuCGZb2X6BFPW5z+tvU4rzi0Fynr5j8enEs06EiuETRn1+ROLtzu8YfIvHvV8mxBg+WLihZ/wrAp3zhgFbmOqrp9Pud/oNXKf0yDm15nsg/k3pi2vTaHghzP9MmzyC9esBwFWD4TdLATtPoE9705tp+bSglaJAuAUc8N3WZaFjAFRtb6NaO7kGjjPE+0gWIdYFcla3kKHJkgRnM5XefKIFCc0spGyD7c5QNcjlyBpRZ6/S/eTq3Vw9xroQrjxXr4OusiOX9h1ESMjUgEgK3R0Zk++EgzfCyxidrm3bArmIaE0DCqX9Ig1r2R4rYEqZT6dFiDmZQtKegtVg1TupmS0QeH0mjNn0WXKVosIIpXB5HjRBpycLDaTmbpA34+4qsuqiWKAbJlRCbQ2q1Q79nKDcDlRuSbaFWxnvC3WE2SqQ/cwcDdqHZw2HB7TL/sk/pDP1hKkfi9fxX4vUwgzTx+sxJiOr1/JAxLt3cJF5PiqjE6zPL5FopR5M0sf1YJwcUSYisR17M1pCtbZ/W+9NmLZGxj7y+wFmb6RySj+3TpXbxvchj3Ksw7n3HCUE7/T8ZPFx91/xHo+gxdv6JEZN1nfHH2Bnch1KVT2J89QGyqh6VX2X0MdLLlMHTRwX7DsvkptQPRBMzllI1UNRrZdqun65BghDIzXH3x2j2IP8qkP9LxJBPUAbBmmr6CNNIzLI7giY0h9syn1Akv6QEYlxwdE7ba3Xt0lKbEn6AVKt4yVn+SVAZONlavJrMXQ3JwZQE2fnQnPG9Qjp0pwAExu+J48Y2xeqUTvq2SetBFqVSKkgoNGteaN02XAntLoUOoEjWFmNZYyRDdpFZznayuIgO5VCKhK0IxpjnuMvEX03jDBMFDdKz1jC9RJseRje1D2yVmL/dzfyd1MDUkshHNYI/0tfJ30JnKOu+8GxZ0SqvMLhE8gqDYQ+dOobEfx75ueqpF1XcCuqcRLFKvuoUpc7v/M6XkzJX46qkG4Rz6j1OpXeAmVSrP9ytqTDzwZcHVjwqtcCZQ2KhCF+0FprY0Zx/rmfmz1EZd1RbGvNI2zI+gxFTNFB9FGxMjxgsp7Pi+Ss1QdQ0u2W2taydxQwp+5mt77JCAVw+VUQAtuQ4SATosuCAF8vZG5LWWQtYOtkKfm+qiy8iKjKFkLQeQvenDF4YyVGS5qF/ZStj2YfwDykCiUbvdXRcu2UmVj/aOPnyDUSJWxkYCCkNXlclp/TZoHRwnHQsn+ynY1g6oiATzB5N3JNpyCGm5E4fSyoXFyxSJoyD6rGSJXNQxlqfLekFQeqCTdfYTio/7CVvOTtEfzBBIdUyeAeDqyOXtcH2pYImAFj6gXySKuwm/f7CuK8w7++u+7sMcNm75OH4AKlUT9+pou+MFxGxGvkRVc+5qaS3ZOTn4xX0kG6YZ7pILMRr00KXKDTY81EjxUQGZaeLgHAcY6zHjfi9gmg146VUrtNcr7H2kv9gJr1Uqy381XFMuKANex0qIYPXAAcpaL88bsYH5UatealA18gdqXoSTDUSTI2RlNXckSSgyD3MOhpvSFZq+ZqXXA5FlWWYjjhFtuvYsUnZLVVbrWa9XH1SN3N0yg0lkU8yD7ddh+3XaF/DUp9uwtRb67wEcXALXBr14ZDJBRcCaWvjoJ2DbqKLg4q9j5pT9aScKlIOco1he8vo6EjCaH+427c8rZxG9+WVWK4d4vqRvGyd7Q8vXrl+V9sqYq5DftCOZBdxb/pNN+YfiMVog9jL2R+SjqdNIT5UAhUxNLN1gbZt9USjKqLReDEzstMU3OAiRXQc9TVJzqPoFItrzZK7wkOIpscUk+xpiYHAqmvIiIGcZmCQWz3BqJIs9KJ3pJN6bdi+YTVYMqhSPJ4YYWjJW5aoI4rla/8mvVCtfcuEbehYXs6ORAPF1MclhGPSb4jsqBdT8vza+JkcHGwUWAlgBa82bfe+doXjTNX3rhCdCqvgtFVwVcl5QEDupJfAJ7x2j1VF8yMXtufXftKiRSBVGW7R5ptLBTyc7g2gacYNxua82OQ+EDtHpL6Y0VLwhz+keJMFel9bQ7UEVx5pwVEaCzpOvOQfGzuu/zwc7NMYGnmoIo9BR1dSbdaG5Cl1OO9P132otNojUvQ8syom2ehvnb1972ssq3Nvay61/wgZrb4/mANDTI4NzuN+fPgmttl4UbupEduserZZJXMMKJrAsKRGXLPquWZV/kOjv+RBI7ZZ9WyzKqOg8WIfXSO6WfV0s0ru2JuNTI3oZtXTzapMccaLw1ONTHGqZ41VmeKMF2EYnf6yibr3ucfXwRy6WS+T7i0IAtwFcxMgr27l/UYPq9vV89CqeGjjReJFp4O07M3Rqom1E0BHrmTsVxmLaAtenjxKYgERRRrUD1N3RNOqnuxWxWZDLjd9cvMbdp590nJFlsBe9HJc173BXenbcZ1WAmn8sMRHc4c8+gpLTp7iVmv7hUBWa1R88CS0WvtvBLIasdCqZ6HV+ptcVo1IaNWT0KqR0F64XzUioVVPQqt1/baJ5FnyEFOft0T57fGA9AYo+eN+a5og8YaUyseccEcE2OOwxPi4Mz8bHGpbjOXX6YPlp7Z33j9CLOXyJU0rdAliF90FHLqypm7r4e3u4Zci9iDVJersfsI55LkYzF8j8lz15Ll6yHMxmL9G5LnqyXOVTDhU5yLQhJ09b7CyVTCgTqX3fzjqNEvQ8gP2VmEY5yl5tdXfmDc1ouRVT8mrrf3GvKkRJa96Sl5t/Te+S40oedVT8qooeW9UlRpR8qqn5NU2f6Oq6DQDfkzSlBoVZaVJjjWIyu83yMUHX0bQbb4BlFfPDzxj9TS/2tZv7JQa0fyqp/nVtn9jp9QWreWefleNfvdCLKk9GlqeEleNEvdCLKk9GlqexFaNxPZCLKkRia16ElsViW286O7UiMRWPYmtGontraAXkdiqJ7FVkdjgnhDfSTQKPImtisQ2wLKM8vI8XY1YRYA45TjviZc+P+QTAMiAbwGPJBVxbhzsrLSOyWXnj4ltNRg2PRVVqufJVXLeyoSN9PgUP23o7AFsMixJu37V+Yuw7Z3oqcLkSWV2vFOeYRm0a1AVHRt1+UpOJhMpzTHaz+rTYJcQRS60EkIDWPKEMa+KRtICBrajNH4B9cUCeSAolcDASFoYOmxWHC6z9vvTocNHy/iR3rW61586PzU/XuCyBVbJddwKMiD8eW5jsamdgFghh9SOyyHWsAhs41mDVaxBVMTjnhxNEZ41WMUahN92eJGINVg9a7CSoAcp9rY/uVd/jWiG8Jy+OuTclH/qehou1ojSVz2lr5KeV+ZbnkqnpQiM1BJTL9Cs0vYT/iyswnQ6TedFLjHUowqydktIQbgO8PBxN36mIc+v/tSOJLK/lWZ9A6vS7Ul7ufk+w4ucqVNBO3TZUFFYZ6zLqRaJ9PEpD7+h6gmHleTBMpG2Cka06IiGaKPOdNoRgecOYrvKpGIhzLOpUPvZYQv3F57FWMf4bURFJMbqSYxVJMbXcRGRGKsnMVZ5N7CohVKmv0a0hnsOYx3797EVDVDPYaxkJJbZ4tl3niw18GUq3xzp6Yv2bxYNtFwUWnbKbrSqnwsMl6plsuHDbBjZWUxlGjUW6fOjrF3oZYLKZ2EVBwrelZBQ1O+r0FnjOAqjXmdi/F2bG50dxNSDwDNY4tntVIqI/SPegLLmmUrOk1nFkeyXc6WZGT8VsD8xs9vz9SmhfVPFQWroA5c0ab/OBPRs9T6UUvtj6Hg+aJ2/TnURH7R6Pmidv051ER+0ej5onZrqINsedYv61/3pqyX+aDgazgGjFsHadfro6t3ojJO8lM7ZIOCZy4dcebhoZK7pKGEzMaXf+KxHgOU5tZX8WPiOxvNExKmtnlNbSZAtJLBElcIpvcDEoaeycAOWQ9AEQbSyTfP5pCqYOxisRG/l+KEjpfp2rqeaTW8pzjAktHKGwbhlmltHBOgiO87MdTdrCaT766l1c0/GjP6V7l9EgW1yAI7pS+6nwD3yZVSaD5PPikgopy8WkRSMCgFCnBd/lvs7IvOZokzZbk/4DXgITSLDYDBibi0lG5IDhjVyYiAKKxEaxpxI3smmu1x0yX5XqjshX+20iIBgcJIxIFhSVXsyam4HCJaOPQYadx8kWKJhDIcwG1BIMITJubDWzQY2RxkGCSw+4CWWaar3GYfrPtzXoane8zDr8NH5/JIrZfn5QkqrERu7ejZ2FRsbCeEokyaVea423dxLsq10kKCQe0k9hjJ0ziGgHA5XZqo1jn0JDZeGeYqYuxZbj4CTotd29CtyUYFSb6UeTEARmanXy35r3l4nl9NJqZf71rrgqiz1mP/WvPy3SluX1ckTvOvp4JXcbu4ber/AeF/NRbY4F2wjOkKkQrWeZjMbVleV8EoVaAsMN60SSFNx1H06M/SbnqOAf3HRrPkHDqBoIQy0aoDdJog0wmlWq0ECnSwII/ltlgxr/exZ7Xo5ce4vBNkTtingb+/34bBftGJ3blkIKP0Z9OCxDGDzN7u0arHjo4bReiYgPSm+ihSPtx5Ov+uEWJjqi+AzXWXSQY2lwqHHLgl/Z1YNgf1mvXQdfmmhwwoH5zK3D1bl2CPb5RVHe2xVBfFY+zjJNUKrsTVolEeCKbvaGCvzoF8QVp1JyiS21uIx4CxhdCoRsIVJ+S2EPhZ6BI50H2YhLTOgkkX4GEAlKz2lbVLZquaO81dyiJ/7sWP22gFV2gF4Y+Hqa9oBMB87oCsw4qeByUgMQQrj9F7DXqRl5WPhSAQ2kFMsAoxttJHRj7d1Jh/nvNQxT1/VXEAwrIb6kGdeO1fUvL01WfDdzGve3nmdeXvPa97eGtbJOJA22NPta6QkyRlCjxb0waMEDrBGRbMkz17sLNmOngajqtcly8MdMKV6EMZVZaThwWSKu0V7Yi0q3NOxAx3rycd9+gB1KVkH4eOARlYjEYXqRRQqZQrevOvqraGwjf5v8Ccwqz4rCZkpCUjULro1O8Bp2i4Uhmjjieby+ghV+gjzhcZcI4GE6gUSqhQQsCKFGb/IqKJ6unwVXb5gRx2l8de06Qr7OI2czEkJUbdJHsNfyyQNsial0aW6BviuuJW7bdsIAKlwzIaqbQPhjSZY/lrLGFjcX5GBBQh5rcnk3Jq2fJmowsJYSXMTROdgQaavZQ1cHkLyDbuIw7HCvrA0pkmA95jmedVxOO/DdR9uHT5a0wcd0g0oJcXDSUFHZrgrx88jibzLvHdW4oqyoTW/gDU6k+10zMmT5uPDIgX+FS2LRFYAP0OzDxAcu8rXal+On+2OPkSBaQctpugj3bwnakKY+yeXVcYf6abLAJptUxIZ1Ob/WS/mU36ok1evQ1BJ9H9z0dXZf6+LbvVSA1VSAzCfCqxkamR6Uj0pv4qUX0qsH6PTVxGQSV24Fd5JsStdR8tOduEC6y9JdAvcQgmgo2gDsZIZV3Q9Pb+Knv9mE6zT/2Gb4OqJ9HUrMzHi5GLEo6+eR1/JiS/Y4oWzbcSjr55HX7embJSLohuJZmzPo69bu2oUeqJrRBO259FXkuL7W8Ih4tFXz6OvJGkXbFLC+4jSkZ7XXcXcniNOGUVeLdXTrpuI1RBBD67RIquW5vnUjTzmMumOGlwjSKE1T31u4jbTbjS6RpBCa56s3JJ11B1fI+iozXNxW1JHnWFnbxEZt3kybkvqpzPM8LaIi9s8F7cl9dMZ9vUWubQ0z1ptSZv4Gfb1Fpm0NE8pbeKMwoswCk50WqsB0rOZG49ZLVJvF3OEORu6PQMlJBB72WSO2BEYPp99eTizMsFMs0IYylYwM1Qm5e1H8ZuT5rmeLe3fZh2dJjQVjEpmX/LhQ9XjjDwMHovNAFNnq9i+bzXbZHPLkIWY1RbGsLBiP2GlF/1iHpY0rVGZJlupWbRFW5GibNY0bRtgz+CHmInBNBD63saYmvkwphBI0YsRxZmqnT9YH2IVpXUoU1AsTOcjuRvXanoUqCoLUYpfHSQDA5/CxBm/tg+UTrhY5hBLsZsjsv0g7ZiU47cU4jADdoj7PyUJrUr2f7+Olp2tSmog9JHxMS5fehV5c6kD6I8m07iFrDJS83d79go/5YnsOl88GnRa91UJAqymmqAAgJFhpeZCV12eFguo55du/L2fInuMqRtb0gj2N+bZlY3EQwibhmJ+Ol1NSv6uepZ6jB1uq5Mvmoiy2kg78MLgWT1uxE/GufyywNnZq7DEDUX/Y2ci8bBrZ6IUE/ByFkznYjIAGCtCZSOjiZix0Kt7XAg7ccvAC+KWQabBKZ3TOXHG4aG6GgVXpOmwSzu1JOxM+H4KWT+FwnjaWhSmmOywncMmrmpnJxOnFHUywznwMN+H5T4Ul81TMJqncDby9jCkApyyTiqLXpCiStypEcEPcAMR/IN7MkwDgL+TvLb0FiCKUxeJblX2tYBVcjpDVl7Zq140nUECbkz6xHdVAiZUmPHnSBnOze8gq4rr7C1KwCg/FOLDZlG5L4r4cBIEAD1zvmEBudZToRQNAE0qwgEabPD65VjdVpP/SJTAq5xK+yXPg5Qb5omkeW6oPTDjFU6HndyTxD5gdNHDFoX4CbZoiTbCjU1JR/lB/uouxowDOBK7XV1uqPYAMkchUaiqR+qmALJNH/h5j3m0CMc8D4SJU69gsL6B8pumUChggXaK1YXFCmvqJKvdSbgxOILaV0tScXJO5Z+uZG0LMoIdsfXwkADt2FHVmyoEBqcPUjcw+kbrzR8ag/9sVWNgIKUbJ3OpZft6hoiHmoKFkXQ8oASg7qLwSSaAG1s0xymRVKPzpJNpynzplhRPlFgirEkvjCRZ+4GRzhsgl0+NRy6f+mmxnoaFoLRpNwPCOgcGJkW+pclMxyjnU7wrXbcM9ZnGQUtWMJKv2NQl7lgLILzX4bwPz/MWVEbPpzvdh/k+LPdhvQ/FLqG6xv1r+/61ff/aXvfh9Wsrpfsw34flPqz3YbsP+3nMlcZph5WmDh8zlg+NSbdla4ahYG62LBAFZXRzxjPMTDOKcGRzVCrl+Zzhhs6e+CelnEFVX2fuWKYEymSVDLrHTR8X9gz4iMa6HygGWl1WgwdCtdyXjVamyqrFZUpgYQiK0go10amEDwodWfTZ9cX+FhOoVY0k6EBjuPDXKDjJOmJX6UmZmat4uJnQ0QoOuZXKoMyI4DcnXLKmpLIxVgM0lt29cVnlgi7qOjuVSON8t9fhvA8ZXgnisa9D5Yy2T5c2T61uZMMW0aKjoKlfqo/TdB9ZZKh2sCWWBNqU4QoyA8y1OBSpGHhYluPKujnzefF3kQOXytI0kcdVTDjVKIBfNvTUYtPs0Ql4wKAtsMhrH5DKOnU8UYVaDJnaeq7cfmtGTm9ZOd5W8exfpMZpiT8abv6G1NDpfytSo3kWdMvrN6RGy0Eepnn2csv7N6SGTv9FavxFavwLkBrNs95bSb8hNVqJMnieD97EB39Baujs/1mkRvMk8SYW+FvNW6f/1ry/W9BvfmWT+VLz1tn/Qs27eYZ0M4b0S827lSgd7GnNrfxaaW4Rrbl5WnMrv1aaW0Rsbp7Y3MqvlWad/ltpjivNzTO8m/xEuVGIQmIRwLkhkZbeouI+x82wRM0cmg8Q2XMaRTWayz6UubjDkQ6dMq/N5gpAHUqXbDd0+TpVP4at0xBjkbDxNI2ExDlFuWLKGedl2h5dKgmIkiWFjHuVftCupPBIEwpor0KL4MVlHJsMKSBQCkbzDLPagnSRDcluUbABm2vaYZG2uPYvynYjQaetDGSJ2KDYiTEml9UpuomCVx1OHT7ekA/M5Nb6ggXQ2b9YgNMS3w1X02+8G53W7nebtv8wSxiEo5dyTCbLrezDPyBubWvf3r/3eGyGagO+sBTxtdsr284OchwgrDMEMuwS8ChUpJUgzjyZ4k2DvamNnnVLxgyNAvTsh+h2gLz5BvH6B43SA2/gCJ3994Ijmhc/aBI/eAFHtMiEt3ldgiYT3jdwhE7/h8ARzUsTNEkTvIEjdPo/DI5oXvugVcuLxHXrSPqgeemDRh0DqKaEZZ9I+qB56YNGGQNkWtpA2dVfI6r1euWDRsEB5IGjkkTkvtu8REEziYIXKYgWue82LyDQKAZQsCeO2jTSD2heP6A10XpKrG3TIv2A5vUDWhMoYcVW3S1y322e6t+O+24sStEiqn/zVP9G2n7B1jBskigO9Uz/RtY+oMJhN4uI/s0T/VtT7qvEjO0WEf2bJ/o3MflnCvtZ5LzbPCW/kV4P5aJoYW83KAHZU6WIGPhRRg/L4FRekAXEdbJGCBSaVTWbadD8FPj/TCgsPm7Kd37S9QtE5sOXFPV9z/BvctAlxiC4RkTwb57g37r1/RjTE/H7m+f3N3L1Cybr8BoivHEb/0UNv5XEpUM8jmRcp8xXvWxuyqeWEfr8ROrit5L4P6UfXrhgJZShQinxQvsKMcsntS1ZGl7yTniwxZuXL2jmwfuihqzTUDxrn1WzrZXIjjRS+SEWsiQGX8dZQRsVYeCZYGkAuuc9ycnNyyC0bjNEPGnq7H0vFDEaM7yp71tBJCblx7JqCnnSzYsptK41MdYX0NkjU3Pt6SHUxrgIMZ0kD257xnFbMU4u0jgsiyAMrOIF8JTJ5E5Z5ODn53D1cg2tay6rL0ONZ1s1bMXdUFTf4GcM3xtTld9tVgUDYYFvqZ0f9+KnRFkXK48TdaVoUvTqBU3WxW8CmHaayAhmVi9LgrvJIVso4Ql2TApPJDqLN25DkX6weobkVhjc8ZUUwpz4StqDdtu81kHrmivryxy1v4kAN66l0vgKvsLVnLePRRYSAKjOG6l/1RXqoDavl9CGJtwajxueJRQEvZlKApceF3KZnS0CPQ9aNAr7Q5wNEUELjHzqixVy76NlxIsvNBNfaDH0T2e55+Q+9CurCA+tK6v4lSPk7Igd/J0tvHOE2o1SlZqD7jP7donD/0G2EIJp9Z/MFn4xwrhwwBs4y3eP3C/BdXZdaNJtmvA2U7OWtTirjyeyymtRNGlRsFNEYcsoZ/8GXXaSwencg4XHNIXQ+zprG/QyGyTd5QHC3Yd5z6WZmodU5m2PidLLWzTpV6yY862zSlwh82OQpvqtNcaBi3TBpXR0mxKpR0JegkQ+6bbST+Sp29C81kUbWk5aPD4jG+zmVSkaxSAalFHTJ63HNfpRUuNKjm0YSvKXQd5VAWxatuj6fLzyMp7rBGjgJIYjy8/4EqN4BdhFahTNq1E0qVEgkRNO1WOGAnGFYh+Uq2JBde/zYJivIYrbZQiB+ESb5qEVmXoHfNrgtfklgJIVlTo8Hy9y0SKRi+ZFLpoZdYce2y2SuGhe4qJJ4uLFY7tFPt3N6zI0iizQ/jPaes387barnCIgNMqF0sUkcWzUadYSAANWcsYywV6dQwI+tBJNbD+UxKX1Lle39ll0W+Gsn9MjR+RVIJpcwV/cuFukAtG8CkSbNiPE6YT5Rz7mTsMoUgL28B7+ViRvNK2+RIfhM8+ehGGzTX64rJ5C3brmxRaaxBbe0gyR43jz6ghN6givvSPah3pxhCZxhBd34xYZjjfPcW/kq/f1UjjV2ROeLjXw/A5Pbx/xdemJXpWpTu0e/L9T8xHrp82+3JlSRh/nH7fph7SZlvc4mp6nynA5sMGNUPDBaSnZbZ4eFNpnuZkFU33GGkz9wyIREi6VJkOEeahsQL3oq+SrmAA4cYUU8zgYAqQgiynssrUh5EaHsfw0t5asqnyi9Bfz2AgqihKIVSngJfQOCrVL6B3b4g1StHmtRTF2Hu5W7JAQKX23GP2ZUkxKCOCQWYFzWE2HrCyif+2w34fjPjTNssc783MoKenvC03k7d48jb0tRaY9ngsuFjt3zN0gEwTJE55JOAM8mpLJ2qsvpCnNgHY5gJUhFkMhhIjRhllwp5l/ZN4B/2DBR6q5u8zcDHoCcwBmhQlMKkRiwJvJ9vRtnhJUWhaAooopH01Altrijn8160sU2KX9BPy6p1mgtNMbdDjH0aOWCbbcNuQujC9Ici5RUZvYObBgrGMACQP1aQrSX73BDrk7QgstVhztMN+H93dZfpzPMM9z5Js48rjnEGS0ooSMp4k3EcFXTBhrK1pdPIW7La0uMWFMZ4k1Q5XijjfvKBMvtxGy2BhcMjKmr84zBoadCJYUHM4wHPbk8EaO9vuoWdHq4nndjRzttwgoYnU3z+puS5pl4yV3HLG6m2d1N9G23+KXyAO9eS5zE5f5LaJYUTjnab1taaP9QqyTuzj3d+tniLtFtVuo5FsFdFqkketxKkQx7YvEJWk789yu4uiAkzMIgaIoox0iwTY+fT5WPU/9bbIRf+Wd7fT/Ee/Mc47bzr/yzsQ5/ss7+9/NO/Nk72Ze7C/unDpdkgmzHDkaoQaO/ioIMAzCmMIh+KZorQbfQbEd8t3UkWESXIsr9keT8Jp5nCsRdQmmiU2+XFngyDjYsovCvrLkQ+C5JSIjkycEEZOwYwnPsKlx0cZcUpH77TznO8Njqs1Mpn/QWSeNrKlGs/tRuClLw5cGM/k6KtdRvY5kMv9oc7/iGXf9jevH0/8Jrp8nxLf9+1rH0/8Orp8n1TeR6teMYwJZ13uuXyE6FfnP0g/RTgALVlDYWypxw8lUjrXFoKrRvuYL7hN6Lt+0QNmZwb6lC7FlbmZ4HqJE8H1kXRv0MId9aXL3wIoxBZYgmpQTPWEXq0K8OVgN55Uv5h/mTuP4SfuIn4IQV+iRWRbHNrAMZdHumRy/xSh5PtHlXmygUTnglUe5x18e5T/No/RiDG3P38w57TT7Y5FsGhbUq2J5FyrzmShv82PibbHqFUYQqR4TBVrrTVOyZvfmhCkrT+yK5iVUvdIpLJohGL3GZFNKE+rb8Los+Y2QjcIcdFCE9EISTUISeLHh+F1WxeK09jXTnbqF1bCED/ua9Di9UWh7XfVxjAFWMx435YNOyky8kVv3/ktu/Utu/Utu/Utu/e+RW70OTpcOzhu5Vaf/klv/V5Bbuxcw6hIwWiusuOusCu6MH2lGvC3/n9syHBM/2pYfq4ZGXdxZ6Q9y1vYBy9gQNLYy9GRaQXBkav8nejDX8+ki1GL5Vbd7DaUuDaU3jq6d/t/I0e1eCqpLCgp3Hr7Ro6YOTydt9Q2+jomTG2w4tLId2jxFE+6COZKwFioDsmsz9Lqs69mEWI17stqc9igI7dQf+8HJoMrdlT5FqPhTwLRsJBvC1gMPr8ih2PlFNLk+ZKky6XDQUox9Zurw0TzVN4+q+ytMCtpZ1nWMGAFqsAwjmgXPNDdn96De/tCu67KovqhpzGMJ3g9+bFLWvxkApfWL+dBE0hNtJR9u5tr9YE2oVsuBLg6bsvrzMDOZ+BIzk7OKmJliyLIMVcHMrFVlJCX2gC5BaowbVty9bW0Q55TCXATKI0U+6OTgaae52dxN4fJzYDbf3NpjrxBj1CNBsO4FwboEwV4qrz0SBOteEKxLEGztUNysR4Jg3QuCdSl+vZmO9RQkpbsX5uoS5sJ8Gt5IUB7rXsapS8Zp7XjSzgHIoHvFpS7FJTKro2sEhZnuxZJ6loYjcqcTbCh/kWKZ6iqz2A33kA+4aRm8o8mOWxD9LZXN4F/Dw8cv+0kuC2A64oSiTm9OJLt97f0ALxV7HjGAEG3xNrCUG2WD4nG0+eteJ6RLJwQjN2xUsjpu71gSQ7ARjUn9aC5l38qkL+HGpEPzUMPV7Rj9072ERTcJix2DwHSapQoEpplJntqOXw+MEzshJaMfuOe5O84RujtiTSac4piRLgu56gCN2r2qRD/u8jEcwU4jttRLusxMhXNppPA0c3OUEai2MPXQZ/OSs1Dhe+3nvtcFVGCgEVk8dq/k0KXkADxxVN3S6amZ+mbtXu34DSlVQ/JS65OBXfi6N5gnXw35dm9+gpKkw07xJJdNHnhwjBlJaX7Wo6jfvcxDl8wD8BXhhbc9M9B/ZtSzrHLGBYhe8qhMCa2DXJ/1eUrG6+0Am8QWEPrIQDqMcYnRQRarbHrlrv4IbL04QC8S0IW3zUiuGNojaYDupQF6yb8gbXqJpkhPmO/kf6Os2OAp5y8RlK67Z4x3UrPRjRrjcH+NgETTPZu7k5ldYIwUvcCIzN09mbuLzI08RHiNaCn3XO5OXnYhPzG6RrSUeyp3N4/qF2Z6jzyqu2cwd/OorqHjRI8sqrvn2HZxbEfsWtEji+ru6aZddNOdQrBpjxyqu2dodllQv4nL6PS/VVyme4ZmJ93yVVymRxTN7imavdbfxGV0+q+4zF9xmX+BuEz3FNxe22/iMj2yB++eIttlD/4iLqOz/2fFZbonA3f5oL+Jy+j0X3GZ7xb0S6Nc4F/EZXT2vyAu0z3dusto/nUJjwjXXx+ei+zfxGV6RLjunnDd5dj+Ji7TI8Z194zrLsf2N3EZnf4rLhOLy3RPPe+t/CJdorN/pUtOS/zRcPUXWYwese27Z9v31n6TxdDp/5AsRvc0/t7MqnzEaQyd/qKICYnQvmC8lZQXhFK3z2+XQgmnOEpibC0Zh9+WB7kLT45I9xoBvZkN+n65wWh/4zUCOhn/i8pDQegciQR0LxLQpQMwZozj7S2aYD2pvzftb+ZLUSVi9XfP6u9dptxYOwIqXI9o/d3T+js5+i/ErB6x+rtn9feuWWXEoViPNiSe9d7FegciIkKu9R6NMM9W7+SMIyMfPksUVnqWeSefG/mQPlEH8NeIduKeAt7Jw84s1iE+9Ktnj7qq5253cbcrSQ2g3/iLRH3Vc7e7cbdnLKzRe9RXPam6m4H8mvGo0el5xnlAKFVqGFibwfmAU1OlGA6nrkoWow53ug+z6GWPG/TjwMzpdwzWstP/wRv03OtO5jAkUqLuIOo1JlHA6DCHc2N80vlISVNQCp/U9EiUe1ZyJx84wxIyXGaGiWx0bgwbHde5nUHidH3SI8L0/OI+JO8U25XrLFevySrbYPYYelvMelD/jWEt4CuJkkqV6hRgN5eHaFb3HOI+fhvkEYW4ewpxF0l4vzRQNMY96bcPLUeAQUQjKyL9dk/67STavlGZdZYlng5M7DAhqipn8qUQISMoujQXBBAAdKWRnQ20fWO6CdoWnYIXqG/kQdZBeeDLu+f+9qHKHAJbYJT9PUYziCf/dlJ5sd2JrxEtdp7920nlfSVI6/R/iCDdPa24z98W0cjtvXuebzeeb3qZZSOib/dE3z7rL9SePqNF1JNx+5Q66Qu4XaeZgwO0JlkyqsoWWNBJiCv8mRpMs9ypQeLuWA0TmwJ4va/cIFFLrRk8guUcXoPlDG03/kz+qSoybddGOu2dEOT+DXuGOzNItBnqKXdqEKMlU0kSYuhKiQ2mzEA6IRP0g7udgkERi1uYm9hM+WGf135WvvJ4eTF1qXwPd0v1zyQbcx3MsmRhq2iWi+VH6bQ8Vro+FS6K3xV2pkgH8/qw3V/tJ6M31rg/nffh/WO8Rx3u+8f2YcNkkWXs03p/ev/a7vfhMFHPO3/46Gp+Hp7adLzVTucf8v+X/iP38qMSXysdSGne7zK+FSGFySCpgZiadWqFsH2lqGOHVmIlCKP8DCLRZyt/oIi0hWwEFFFkkUL7g+Svyce+PpwSy+BRvj98wRZ57nknkTzP9LKgGDUdYUIzO27mlUlOrQAo8nkXMZ2NVNzzwIAii65G0Cp1KlMu2myj3HuemLgZ4qs/yrljSsTylGfqOnw8hl/SpiSH0ss+Ug7wgsBcd2/3zu3kJqimXBpSS28Gr+jCdykDyTcD8ZVcpS+EHf1gnFepd8VXw0/1QuyQFFNkftO6P9yc/J891q+GIsbP/LL5E6u+24sQpEk9AhCqNsL39fWWGlkL7Y8XIsExIBBJGjodC4bhek2Er4FbTpmbDs2cx3P4FVm28EQXhKvNIXAi+Sr+M3o/xwIouOMCgx5pNiWiZ6TRxr9HZrYw6ZbKoeaQ+VlMN60zaZf2xbLb5EwS8cYXLtYJwZ6Dg3by07pI6eDTExOJVp953IdTh4828RGGDN7f1LL6irbTnpXdxcqe+SVNIedyTrZQIOoGAGxKAJpcM3YXSljWambw0NtheRERCrNWfDgx9HP9OfIG4E5Rte5Q8zCHAzCO6ZFKhVq0DFA3itW9dtmH6sPaFXNoR8aJXdiWMXy7mnn81kspVIQ2Fh7N6ic9P1AzzJODXVzRku/Dch/W+7Ddh12Hjwb3cdMywdqXCSeisHdPYe9yIYf+RpiqjlzIuyead5LGM5JLYfeJdiaeZ96X8mzlJfiKmObdM827+YcjC5c+uTyeJtqbeKZ5X7L53HHBKGKad88078tmyxzPMhHVvHuqeZeDNKa7aPe8os2D5333Y/n8EmhEns/d8687qbdA1oeFlR1F+Z6t2+W9DKZXw7j114g6q2ef9m256JcpJrJO7p4p2snYnDUWEuiRc3L3JM9OZuLKL/nsi+TZjpjnGD9k6I11KojcBXwt/lw82lWpF3WpiLpELjFw040svgoBHCK/QRHU6lHKT9/5JHXIHIS8QE7EYRTWz7u2gVhNhb9FyDoriXGYxbQ5fKwWnoXZ9/g1+Rp5PndPM+ziEb7sGyPL5+6Zep0suffEaeT53D2zrpO48pZTiSyfu6e6jJR+S3qOyPN5eMrESPm3pOeITJ+HJyyMpBWhxknPEbk+Dw/1HwS3gzjeJhY9f41gjA2Phx9EbIMpHGzGR2T6PDzGexCwjapiAM8eEcR7eIj3IF4bOSBwxpq/RNBNh0d4D8K132atESG8h0d4DyG8Z433NyNCeA+P8B6Ea7+/laCjDo/wHoRrv7VHBPAeHuA9soK8Gnt0jAjhPTzCe2Trpv3lIlE39WDtketvs9DIUT/10Ooh8HQ8C40c9VOPgh4EHr/OQiNHPdWDlQcBwS+z0MhRT/UQ4pHnr7NQjrqqx/qObF01DilHZN82PK535P3rVJajvuqRtsOQti+OGSPC2g6PtR2y4Worhev0iMC2w4NtR7HeGkdQOl1JWV/jBiorFUGRREmjEFiADRkSEo3bbgCLhIAARU2bfaSUQO9sn93M/aWS4JNn3QIsP+7YDw25Qc0Wb9Xt9CU/oLIQSbk9G2RaeXWKenPHg7R6JS8qSWRbmpAGPCcDT1rG/GOpFus6QKCEN+2HoqyhkIWKIuYRoYmHRxOPok1Ee5lqIzjx8HDiIWsoJGLjO4mGo8cTD3k/tbeeN02zu1oEVz8dIRx2pVBEInygM98hkSXINg/mOCC0RimOQfRJRsUu4pEMj04eQicT+Ro+VzS4PTx5CJ4MdGTcwtuQ6Z92ADTAADEhpV3xqTzeimfSxiboE7Uaqml+qaDlScz+EykxPO55VE0a/aXjR8Dn4YHPo2qJ6zFAYdRo0vBQ5UHYMTp/tKseEVJ5eKTykFsMBkTUhWq0wHnA6ajGDnqJCCPA6fCA01H7r0MzMmUZHoc56u+jKnJlGR6KOOqvoypyZRkeJjjq78MgggkODxMchPy9v99oifMowUHE3+v7jUCCw4MER7PO+jLhCSR4oJiWj6QpANOte1CXFJZKkCA8pgCa6pk6rvt8RngA+MSA7hxjIE7082FVOzz8bgh+B9x42OiR88vwULRBXNkbZXNEULThoWiD8K8XT54R+b4MDxgbBGghER4xNEbk+zI8pmsI04WpMX5v0WjwmK7RVHHoL9FaBOoaHtQ1CNCivABqTNNfIxoNHtM1hOkCRDO+kX2Ik/AXABZy0HKvkYgPCDoFpj9Y/jYRcpWMARK1mfXmn9THAuBxYaPbAvASq0W4sOFxYaPbmIqzTCNChg2PDBtChs0XzcsRQcOGh4YNQcNQpo0v8qed2LKKvrQioPelIAISNreK/Q34oegXJAhQ5W2fxHoQBDuitdYjzkbXyjJeZp4IczY85mx0rSzjZTsZgc6GB50Ngc7meBlLMh5B8g0Jaipr7h/WBEcOmEsSoqP6HCdJoelrllDd42b8mDTjkRc06YjAa8OD14bAa6+zJU+LF4O7pPTylEjKyjlQNmQNvJpqClU3xBFqpxwy1kk40g+G+rztp1+1cfQaMQ/Qawo5NFPyC9jFXyqGS+nLXax+kuetR9CPcADV7gqpQWtqcJvmtBwudUhsgZQN+bJoVnOLHEpjgF+dIl3wCwIP61DSiI/G9pOXofhe8Ew6fSm38gHWVa6dpsGMVbUY0KajAtyXSbgStl0JRxKnncIW5vFRD22pfioKs7BVAlHVUDkw8PEA7eExgMNAfvNlDI1ozvM4vUEsHSBCYYfj2SG9ikrwSiGKCBg3wNe5DTEhCVmmXgV68L7kUNUvZRcU6iqrYxQwUXHsyMLtNsxhIC+TP0Gpu0k4e0E4m3aTBXoiRAYSJ7OrfZgn2b7zYRI0PF5wEN/Hi0QBGM9SrKOOe0xdKqFK4yOpfsuESs80n/EFAqYoE9QsY44fQIRKZEfuR7IRAp/3ONQzU8+/UJMDG2uOcnT8a2zKChQ79nuUUqcQ43Cw7knEyDmgwjcFiJLJlYudh6G897LBliTai52a5PXAWzJd+Zr392CevKIG46TRzXMP6hGUQwhKgInizloNYgVmk5hWKNmSIFmMjtXnUVJG1YKUi1qyvQ9UiNX4vH2FvsAcsB3wAvVCqhGz0mcbgSNfBA5iNrOgNv2H+jLUTRmiTxgoiioRVNkthYwOtJWQJYBnlcvEVywNQQLKoTEOjfx5CssicZkAFAFU7bAYB1UNCbCC0pmxGFHtsXI0QWISYiEPj/pdYlJqZrbDrMPHO/Ir+9DKvl72jEKhkhI07JXMfCtAak6oHA5SKz1utdBuiMzqbou6LvOAceRsdp7Ooo7zzf/Eq46LU5vzsF5au1gvwApwwjAghbQx1wMDMzx6dgyFK+ttqu2BTMO91br91+7NlHI/eIZ7WzW5q6L/VyKwg35orM7N/ZzVfDgkfC6QFOH+JMLnDo/PHTLlgWBa/KTzS8JLvh1MSyG/SWcHziL1CKsCokMvog+IRIsJUQAhIB3QuH4Im1Ul4EncRLngaAPPP2VMS4H8ZVpfj6fwcdSQAetL3oJnp4EGRdMqJl8F6yzFU23eyBShNtc17ZC3xewp5/EDP6mUV+uXUxgrt5SVBTdZ7QCFtU59KmiJUhiLEkCzmMeDoSwhIyyUJcI3glOgxrTp3oG/2FxziFNJ1PVilo3OfYhms6rCTMVSfFdJuMVex+TaTiHcZHgo85CP0dwvm5FxgFPIDdZsaXAqxBK8RdFRcOo5FUyzZReMnCjRLcI8NLTaocTm47WeqTFKXWRhdcA/7NnUOIs5b5gu6OpnmudqKaxrrTbh93VY8E32XknEaM7zSMK28wN9nRuhwfQHBOdhHuvNhL1BTR9UTKehNovxRDG163s92zIwxvU98ftx5TnOZ/o1bKItN/+zeRGiVZOcPqr0FBDWoz8KKIyLUT/sU4BFpcKaPhU9n55wc0uFCK+fOFb4mWUyFc4Xxn0470MK0HFd0fYBny7JSj/w4cOD1wcB4zD1GemTm0+URdZVw2PMhzDmNc61RRjz4THmg3jxN4+kEUHMh4eYD7lFIfoICFIjgpgPDzEf8nt6UX8Zkd/T8NjhQQDteBEMG5Hf0/CY20H06ojZsCOyexoe7zqIEEWHj99stNH1oNJBdCaGSngbUe7J4zkHwYwIyMM5PnIGGh7/OIhlhMRFuBGI4I/Dwx/HkqP9CM3VR+RJMzyibxCdh3kgbNII0Dc8oG8I0Aep13Ca1ulpultXlHLLcxWKooN385UGvvj6jZsvaDnWehg10JI193eIKESqUsNDBocgg5iJwl4cYQaHxwwOYQahWhs/azQUPGZwCDMI1nZ8kWgweMzgWNJI6CvuhhFocHjQ4CAAsLcQZTciyODwkMGx9q+oiAgzODxmcAgz+IKKiBCDwyMGB+F/eb2A4UcEGRweMjhk8PEKrYgwg8NjBgfxfxDljqaYCDE4PGJwEP6XkWOLHybqqx4yOHb/FZ+xo77qoXfjQO9eoBUR9G546N0Q9A4RaPw4UV/14Lsh8B2w+fFFot7qwXeDULoMm91wwovgd8PD76bgdygiR7imGcHvpoffTcHv3qR+ZwS/mx5+NwW/eyEMzgh9Nz36biZ5oM8QfDwj9N306LuZfkE1zQh9Nz36bibxk9JPA0eh+mv0b7fQG/OCjY7YmEkWVov6F406NFpEJgUzh1mEThmsAMLAjOlAgorW5ZBipLcI1Poet9v97YqTmsOpc0ZQv+mhfjNJAa68XCMYFdND/Wb6TQBuRki/6ZF+M/0mADcjpN/0SL+ZRRmNNY9mBPWbHuo3DeqXX66Bs6zQNSZpskUDevODg2CRv9Z+Wq0m7HMHEmNkM6jPzK+qoLxY6GMqb+VYoHJ6OOE0OGGsUDIjNOH0aMIpNCEy7+H4j9CE06MJJ7GBzOMEG5UZwQmnhxNOwQlBI4pvJFgmpocTTombrhwvWDMCFE4PKJwCFL7IjOns/1mZsemRk1PIyTeZMZ3+KzP23YJ+3hNs9EVmTGf/CzJj0yNTZ/lV3GtGyNTpkalTyNQXOSqd/StHdVrij4b7dbKPtG+nx8fOYpN9HADPSPx2erzqFF51vdAdZ4RXnR6vOoVXXSVGiej0hZ0srFPQc/fyJ68zHR2HQnwwsnNwnj4qU1S7oHIyLQjpIJsXWN+wKn/coF9JiGtFhbGhsPjop8NEYOt3KuGS0hbGuJtLdqGZ9V0EGSx2szCeUjoZhFKPWnUGNIVj9nGXfqmSeO8qcQl/RuK908Njp+Cxq8TJhBnBY6eHx05CUt/yezNS750exTqJSIV0fRiI8uwR3pVEGrCqirOxENDQjwrvX8DiJWUPvJx+kMP9IF38HXlI7BQkVoapQdNIKpjl+fHDPoof57pgHnGz7m/p7kuwezCLtDgXc05fLJyOZVDzvMowlW5TdMsPKPn04NtJJO2btvWMwLfTg29n1RzxwpvU6WZqKRcE61asu3HOlX1bfq5E0CPNnmVx+ad63Soxznl6VO8kQreuONlkZ7nyHcH03ar1EOi+5zYTbTW7OoHQeHnVJBl0HOafCVzU41b8DCZsMI2qw3vpXyruTTHeN7sgcxcAHKrMWFAGvIgGKpVB4l0lw005aUSXn8IeUWu4PfTY4yns8XphLek0K01w1qaB2DK3PIBRpjmzcf2tpyAIB1vzxPth7SUBMS78wPhhASUVVuUIy5I/VVbcWan9PLdpOne+/U34QjW9lpSaVbPAGVUNq6NsR2ACfONblqceAj7+LdVcqPXClG23I1lZwaatM5REhNYpsQIpDFWxUO8cispZmct299I7xvA7LnMwuuLZNUz8GVeW+DP+QpWhy/sKxa8ly61Vf8Bfk7nyphlyQcixrMmIMhEzP9PcFqdNToY60ZU/zGZrTFJTsgQubXYBeSLrkMU0hi9dGjbrKM9QTkMSN0VqMeV8uup1rVWPTECmOI98ixaDMfsC4XKcpFiS1BdYsWPczkLZ+fS+bqv3p+34IRluTof3r7V5H6778P41PnCWL/H9a4oPdVivH6Zmd0vP2cWvptL7RRE1HtLRaupR9lMo+5ccVISxnx5jP+t+J5Hq5FP1atlkSuOwi8iEeVgQ41JpxdaINaYoueQ6c0PSJjChnR62P4nBfyGm6qRApbv+mEHI+KECKLdGU1o77QvyTMEUncUNIVzzN+Fx/1O4/9Xj1PhsUb7Sg/InAfZlv+S1ddoAsjBjvQB2RMrSrJiGw2Me/vqGESohD/3QeqDGx5I1cD0XqrsfcSfh/Qr0Uyw+hJWnGOulUjwGGJ3SygH9wVJDBarH8/k1nOB/uGFH2WWdJXEPHirCJxwG3zLdZIgYqWgPJBE3w5AUyVnq+M0mdRi9a8fO+EUDFMrJNNDEU81izvBm3JyyIUhRUDOEArCrnHWgMGg+hdn84AvjB06K69Lpb4PNDfzC+hnCL9DzgdinfoT4O0RqaHQzFgVO8gdpPU3LNAQzcAFeYpKeDeY5PSV/vzPNUGmxuYREQ7ZOEzZAO4swgUbrZ5NGY/9gI05iqed9uO5DuY494gzP25hkYWBHWyGv+HiXR5oNt0Sr9wQ0Do1F65AXLlY1euFCmLpW+45SV3MZ3Oeks4E5ktYPjKTkZlvNzTbnHy5KsPeh+yYmWRmpVto6oifhXbH90EdoloqkiV5IlhFE+lAxm8o0iauaNNLUg5JQjcS9VDgGKurIp1dVuuctc5cFKybJ9Zi456/owWTfqBHGjgYj60rPVNyTbFABvKOCXa+XfW5hj7Nv0b6U6kP0HkXyR70QkJMm611g0BURoWOyZaA4xq9VhG00PoXtXuctMQ2x5SRLK7tEqzq552KJH7wukCyD6x9NqbM1tBnq4khms5XhCjIK6ub4y2bdHBoagEolvtDN19YAoUy0M+6jqesnEU7kKsrNLF+UXIoZvdDkSB7CeO+t2v1nmfSiiTgvI1VTNEbkoZuXwiW8wVSWfbeAAZkI+ymZXr1os5I5oaIvlMwGx/mWj9UuJ0HdNvxwjvdzF/YS+M9e5vmFrh/Td/d1SANdqhh1jQ9+V9Eu0jFdZrtwU5PbsT4VJAn4sy7nX33KGAudDRbR5yZbswaDIPX1azTb1SENnaG2BmXJ+9CMoR+Tgt98kFa1ewxB0dnbllM+pmZWszGChTudGoNNpmjUlk9nRcMOrTJ5RiPoy4xTq1xF9VP4PwxuTZ2ZUnLUpYf3J19q/0AxF2bjUtyzNaxwjqRf5X4GHp4zNsn/At46ftpx1eSUjcF0YKpkUALLTLwx/OSahax5YUy459GcwxZGD9kR4BQ1GZ+2MoqcEpu50vRY7hS7wsYLruwgLY+zzGdbJJRu58oArCR+V4jH5xrug9EmKdj5EozqNFUOMR9WY/Oo1EByyDJVRIofKv0uv9/JrsZorNuyTD9UPT82WITcQkZHrxvWuPIchd/N4achBuKMSioV3zH4OHjIeX0KvUUePp7Xx83k1u0V4+V0ttvMUGU0hJfHMMyCGJMhSBTTNPcHrVxIMCzFwwiDTRV0i9AzTnyDdHlOths2edJx1q5pOtKQLL3iG1t1sjr8Fkregpp93IfyFcrUs3SAJSWOA1ZihQUoWg1tl5B74c4KS6rFMqCL8zN00MVnwA1T9vIDSrn8lRmkJeMG4JCfnvizkIWRNSLQFnT1y4KLE0muVqgC0qNoYAEQlgGLepA+R4Gcl7WgB2XQom0qlee6bcfpc8vtF2Ke3g8ytWuSCbqF3wuJQrneZrqtUDYTRa88xbiMZafyFMiyLRlKD3SDKgVIOSXhj2WUxHQ8iRHFRkoGy0ytkpppiqI6qzcMhxCFrSz8txNJ6mVDVFYvGwQVvezSzwSKqUIvG3oHo0kutthrR7ipaQYphiUeBn3mhb6e15w7lF7hBIfb0+sEH9VeHIkT8uWmz27XfVQsv5z4tAk5vlT2DomdbmOfL+h1Nr5Ztsys1/tcJAwysZnTo9jliaqTpFNAl8P3ybMiu5y5HMGm6d4Oe2l0eFadcJ65HIG+3sEuZ8GCmLrmcuzDNJlD6kOTeb5aGRWgxRojHCu2nJn71cgbLwX7MDIw6Az/2e1M8Cz5bFn8rnnm+kzyB0lzuJLN+5UhA+XISn4U3Dwfd4qPm9LLnNizxf5g7NoC2H7t+8eB+avvnx6vuW3T6OO77yOGGF99P+rxUT9vKou0aj2eiDhRhPZ69HPAqfQGGrlYwzpWTrl893is2VzH6RK91iEFcYOGCQzMlnLelnJUV5e3OBQZzbxnPn33q/df/fzxanwGgYxl6K1HxTieZLtiWHBAjSqiBai3XKzAHONijeIk+zczuywz5n522tAyzmRVQCNJb4a61/wLDEijz5VpfR7xM9gGpLxNegv13H40BSzlfpjQYF3dEnFIlvNHxtVgo+WzpiNDyMANkQVaif2e63/njtsOsw4fbeezEyJ3wwsw7tbHU51G6JwLNKXDtM/iOlLDWKhl5pIT4Cz9RHhpfMU6NiuM8R3haFaYw2aFwsWXgC1QUDQ/HPAAAAWK9Vay9rvCu3TWQIXYZ5zPR3znaeSTlHDs+CLBTp29OHnHUF6NcCbEOc5We2mSJgqhnJB2nwce53nRoHpeRHijKIw7wS3lzDUahzLWqqZbvFfOIxc4z1pEqx0OQ9oHkWZ60vskgZ21jfXUlNNZ5YCLTWMsjBqhrdkTUjyWbwN0NGGtiD4xQXArnqSuZ4CG1BWzIl3Ep6gfzDF8ioqa4OPW/RZEVHtUZ+M+ewopk0QdbpGzyECgYzL7gj0fky60DOMcsO2VYic7uJndy4S+yw+NxsDpVYqFOXG+bUQkOdtvaB3kYq98Cpqm1ZOeYuxwpPUTiVOKXckNnZqAuqVM+jhRDnI+yobMY53JZYtpEQArmN2kULixdvNJhmwbXtjIwi+42CqkKJcwQ7PB7JbmALVa2Q08o3Iai6woXsWEksBkymdE1mHpDcw6OcnHM42zSKR1pTIokq2sBeNnTvlc0yxDwfShVgawUJmWEEfIchFoPctF4NnYaRIJy5aX2CQ7Mn+A+VLpA4nNyBthKnuAmXid7IE+LPd+tF5XYvIAcBdLHqBsZMkDO2TyoD7SBF6TYXbtISEDF+0h+7yjLZMuhzGBGdKdTDB2utVEE+QDwOVJNbN60r/lBM21nKxvP/LfGRlPGRakejzN5g+M7KhFry5ERiyiuM/C2tgp17/XzxKyptQzimE0npkF1B6nsaqIu4JWNKO4R8v43WaXavt6qd7qtJ7aFqGMRPy2mFO5coBJOPp+yEnP1AbjYLCWYgijQD6fJYmzGNunNVvHCRVbJ8pXAibVAxeEZF5lzJjq1VbY6vNy6HeDtrHojMtga1gmGUkMkCfFVx2HQXdXIyCwkhsZ4hgy1nyZOzS+OTI6OVWcw34fjvtw3odLh4834Dd23UzQV2TVPG/xiXq53WwksyR3j67I1QBmxYSkNXY8VvUbDX+Zr28UQy+5SH/CCi5VtNVF24PBKk6iO/rk/Jd0+HgCv5WhlsQr5EVn2Z4Y68WE7BVanOHGGs2lrF9PPlz5OcQy1CxY9A6gDARnFS50i6lvIgyP3cW3yj5DuQ+yfrKLB8pvqBP1H70wRFPEIFemprRbeeIAvWTGlHsVxCZQufJDR2ffn7sdz+WLOH81QPTckpaAnvhXC3Ddgo/Anw+ubRcLS3y4r0ePHhisSDHhr2dHcFtC74DpRTSmXLXKizicTjdxjI38m+EWXY+QP4taQBdokgRvF727Mutj+h9bzOhCyq4yrhjwm8bhCIs3YW6JaMVBhhotMRD2Ko1FqwFGuqUwwD0aut+P5iN0qVG84YjGpb5ErABfWjMVkMoynV4QxnYhy5pp6MvcA7EDXsvgC2osWwzaYADppOopEA58QU0JIwhYyOSD7+pmGn4/hg+xKWNQKCwaTDGRb9j0ygdTvmFvbvA6ffKSBDUrykMkbspEEPLgwoGKirnTXulJWaX3Uzqd/cCeUzdLI0xNXylFooohCVK1hZ4nUAMIQJEa/oIKPJjphxxuQbPuy27CXMxHMUgLZRay3JWYBCsWZRZii7P825kVQHBUSIfG+S6gLQkM5fp7YUUASswUSeEXCo3I+WmhTBGzh3Wdr5ZW+N4xq7O1PwW7jS39Ltby6nXUpDlSdu7X0biO5nW0riPNPo+37cP83yUkZiQhMb2ExKQaA6QAUEz1V4gwJF6+YVKCoNCoL5xaluSsB2MRosHWBz5SBVnH9amsmc2mw8ev+ZVY+gbrRcRuRl5t09Pdp7za1osAnZ0mAALaC8aRIuAtfasHT0I4kaGh/RABkgRFQsnzhk9+6+/mti5cnFyRH4GxJ9ZPEevXemG9RdT66an1U/Zt6y2G5GmOvmJl97o1I4xdDpS93EE2VwY80RVtZxELcDSJu2gES7Juj4kwXb5CCixVF88shAhMd6WKoO+hOBBxNeU08JeKEvCX8rBuTLQ3O6IWHGPszRCbSCrQI5jqRcv3A2nPVl3AEYH25EgQQcL0KZMEgmUVg/2tr0Ou8bj6YoDJ98qnOF+Y9xfW/em+DnfS4eOl+aVNdnnrRcxDp9vZTmqRa1svCUV1SrKBgjMJ7GksKDS21hLSpPwchelshk+ZhIRKERSWVkwKbSiPNsZZsIVns3LlFBSvSPplURWF311U/ErEoVAbbDyzTV5+YcrhD5iX+LFPumkPSzf1Zs9BhQ5GSoT8D2KbBoE1wjBt2kFnWkx2QZgMRtjktq44O+kxaE5NyCFFYJ46b9PLPkxZxkFEKb73iBnmdR+mvNZ2eiEcRMoP0ys/TDmd7ReJAZ0mLh0bFb6vuzUlW9ZsnMN8CfJVQLMvWhZWRu1Ee6HVKqvjmfUkzpIAfs5zNAjaa89kqxeamLIn2yBaBDFQpDQxvdLEnML2v+TtLuMwxKfSv4GkHZ+6W2W2bBMTGie/xWQ36VatHlXG2U0AD1kjSUVNqnSyjJKHqf806gCRxFOyibll4hCYYifXLWmTVFniTBRM3NKSQnZWMU5RcqgJqE9SwRJvg/Cj63ARo8f1tcxTReb6WsnXKG3LUxQbMWr69fqciPyCSR0NypMuFKpco/Ls0UmXrmk2FbHK/T22Cw3Kc2b7OqktedQ6cU/Un3+4vU6v3zHlT4YniwQ8dPpobtbjdsk2K2cX9625qQIicMCpHG09IUqylTckg8llD9uwSXhqVhm0EvS0OI/QapL4EeHLKt80xe/snWEQNe01qMa3jnSmEMb8UCsKkt3n7SECVSRBmX9loSb9Qsc5nIw2eYiJStKahRvNc6ibfTSvjxKoU1J/akeiz7dt+Sp1SE0TQLP/x9277UiSI0mi/5Ivuw+JbCPtRg4G836+YXFQ8IzwzHJURHh0XLK6ZrD/fkAlKaqkqTI8q7oHexb90Fbh6TS6GanUi6gI1TAqR2vm0qSdks6A2Rd0Zv4xCZAxU0PaiuOc2qNIdSk1Tqan6onJulhxwrCQA7DGsnuW5MHnx5s2Fj3TrJXpVvr1C+nuUe2ckOGZOY7+mnAHM/XA+mWpEpu0/GZi8SoPjTjwYgazHmiz957MZc9sLalBVrW0oYSgKS8YPu+5pLFkEHTyoGJVeSLiURJkgPhUPpSpKQRaUrnNIqUnchUyMQnmH0YVpYSRnnMxJAOcaMQsB0GIijBnrtPPjjKcWWwqU7v5YzWx54TZMydMNJhYdo0TZu85YfbMCRMN5pFd44TZe06YPZRj0ogFNE6YveeE2UM5Jo1YIHDaWToZgXyrdBwGkq+epwxqKb5FQVW3rgWFusmJ+Oxy3o6EdokStF56vpyz73GYf39mZg27FGbq8w+VB7I0p2YkENAKLmdxlk2AFHJ8v1IBggqt4TOdF19C2rLFuStyxlQ1LhW+TTS45p2c1iKDFRiXsE15x8XqWJa+rIWwIbF6k6mIUrxJ+gcxu6ZUEycWX5p3JO1YmmOoF7FcUM2MLihlc3iavfeQmXmSFdCfJkF4luIhbplXd6WHWBrFoit9Yilsyn7kPNfesfQDVyIJdFtiJqU+0EhNz+uRQqFn/Nkz40+0Gijj9Of9YsIupAbW9Z/kGPdcQ3vmGopW46bGNbT3XEN75hqKVosjfZwbcFMtMpAmvfcx/7zc5EE/ZMsFeEpZErbGJeD1nry1wxx6a5/lDaMhgZk/1uZA247wCz87g94Cx5wqTE9BcZM1oqO9JzraM9FRtDonNaKjvSc62jPRUTSUHneN6GjviY72THSUgnZ9kD1nJrLEb6EKXjkPT9E2pQEyPCo25LZrBp6l+sNahHplGp60eZNXQsmD9IZm2tQJezLv9WrJAs9pL9AhTLzqVCNIOZFA+4qO01RGz857nH0V+I3Eq6Ik6Xu2pj2zNUWrATLm6Ii6ilOKJAFCcmySHLGYsJsugRBibeWS9+oNXSZ1ioZy166ROu09qVPIpE6pOVBLKgWN1Cn0pE4hkzqlxIs2k6CROoWe1ClkUqdoiGkFjdUp9KxOIbM6JaikPshcUcwLNQGVi4yOmEuWbC/p8gTV3efSlpmRPskJzrmxba65sZwvySDtlVq1HDUR5Pp2+lNTecmU2LnomtC0hRybONh90WHOKbF0lVNiKROUU2JUf8ws4UQwm7Nj3iMlllo9Sk6MgsmMlnEp257Jw9NYlET01FxQ8mLlcuPLwJcRl3Gql3EhH2InvPdc1G5czHGQ632e0FNnhakYwE0zgEHjzgo9d1YgdipPZlwbQ7F/oSe0CpnQioix1AWzZd+rdNY7dEdDyy3TOOawuSrRceI4VU2yEh2r0xFHXk4gZ97lQLUNwvQfgPqhp88KmT4rnfj6jJWMf+j5s0Lmz4qGuljQCLRCT6AVMoFW6lDSB4m5LkFszySaQgE0+uRdpp2YKNSrn1InIgkUkOZAOKScQs/BFTIHV1wM6+Omio7cS/ogpXBz+iDBQPeCNCV4ftzJkaL8T8pvUMKoRnMuFNc5MSNl3zntRDpk1loVT298zljnLOeRq+65HTADwTNyMRCBSE4WrLl7Op1GNSPranN0wrOk42jN4m3JzSD5wCn/ldir01gxc7rTKUZYhbSHHR2I9a8bX+78DwL/NeJym/gyay72nnfoicxCJjJLJkp/Edox0JOMhUwyFg25m/wxNuSRGi/zqxI7DigPeDsKooO1SkQ6IgsvcFjmPLD2Y89oFjKjWTSkdYLGaBZ6RrPgijlU0Sn504S3y8m2DE9JefmUl92/+MTwnvWncxxQu6F98uvCl33qA5PQ06GFTIcWDW2foNGhhZ4OLRC1WTpFlvjFrXM/huJLhp4NLRDhFzU4KRXRoKmrhp4jLBDlVeKxJzR8P4Rm23qSrJBJshKKV6MqDpq2augZrAKxUSUeC4VfJmj8VaHnrwq+7CmVVjVowqqhp3IKvmypoI+hOVY9lVPwZZWrJHVBY3IKPZNTIFYmKt8onKpBI3IKPZFTyEROKVpX/VVNeDT0ZEshC4+mJgqNYTxowqOh50IKxGuUMoBKFjtoTEihZ0IKmQkpg+uUxa4xIYWeCSlkodCUmdJnoq3UngopZEFPyiAostdBE/QMPXtRyOxFCTGl7hlN0DP0nEJhzovV6fx+QSMVCj2pUMikQqnpQn2wmqRn6Ml/wjxCzAdN0TP0rD0hs/akrtcjO0fQ9DxDz6kT5rJYjVNV0/MMPdVIyFQjyYfQtq/GNBJ6ppEwl9WamDC2rd80GtVI6KlGwpwXq6EBFjQ9z9ATgwQi6SBNQ4V6O2h6nqHn9QjE0ZEKaxpJdNBoPUJP6xGy1mY0BMHyxxlMsoRUt9+Su0hleyqF+MLkmjNNqWqVGIQyEXwmLZkoTb2WLxTBlv0gjhd6Qo6wzKNTQxPwDD0RRFiW0amhKXiGvm88LOvo1NAUPEPfjR2Wsv4NzyR/TEkboQUUpkJ66ym7mXQ25hWEdxnNs1CzCWVKSYej9J0Q/SKpgSfn2qXCDTHlHiba77GsEpoiCH2iu8jt5nSU27hMn53UVFzN4nSJ9GQl5FLqV8jwdCJTypMnPshM90LJ3zzjjSqUfq1p3tRxvmEucvL95l5yQGjoheWPmX6NMtI7kNJEv0Z4uqS8kuT7iBNoIaY5Yhckgrx5DRU2mpq9XVKHTQn0w+R6q5FlT2MwUkP0cWZTWT4TqinR9VDDWiSQZFKyy60w0C/boZZFLc0FUV7l4RK2nUjAvpDeRSgyQzshKDzpbO+1YzmjAAJRzOWyHGkxUjUvBors6BcTE8/EdUyCiyd8qovUIefpjxl02BcsQ9/XGrIAazQUsoImwBr6hs+QGz79qlNgB02ANfStiSELsCZ0tHrqawKsoe/RC7lHzye2Ps2JWTWL1be4hayUmp65/kw0k9U3jYWslBoNQa6gKaWGvn0rUGdMsu36r9GO7L6ZJlAPSbIF6gml6ZuGvu0kZH3T1MWj/xjtzO47J8Jadp9hGlbtzO6bFwKh+mfaVseDQJPODH0fQNjyat2NJ7Jpq7VH0Yctn9nBSBZt2mrt8eqBkN9k3VI16DARbbH2YPGQxf9iNGyahhYPPVo8ZJ28aKALw6Yt1h6EHDIIOVUh9EG01dqDkEPWsUulZH0Qbbn2OOSw5eUaDaO2acu1hxeHDC+OBvQwf5zRlFBq3yvSifibAyXEiHzGF6bUfH4lBhvOIK3kwHnqAF0KYtgRBUAuCZDIa6odHGbc740MVk5HijpjTbsr9BDjkCHGqeNUH0TbHT3EOGSIcTSgj0GT7wo95DUQGNRPBvQxaPpdoQeQhqzfNRnQx6AJeIUeyRkIlemndDTtqX25H0TbHj2SMxAq0yf8qz4TbXv0SM5AOMnUGKk18AdNwyv00MqQoZWTIcJUPibWh+Vz5iQtJKvJNaTmjdoiksodVKdytfM5JdxAKZZpodJypDYQN2ehwLTUc+vQuhbFwAT6nishTaZQo64hakBOWmG5p4TkpjMbxLoXxUCir6HS0kSNVVORHcz1sGUvzSXpq3PmXJvJocxdq8tcaY+XzLfgEg0BjZFUTYivJpGX547YRMuUac9Sw2LmM0s97IVXdQWv6pwS9bVZhUgiCzVpAhcWygSfUdLUC51pZ6hfJROAEsNl1mJMNbylEPFsyQuc67hrZq8l3UB6KhmoQWC6ubqB+d/6acrivKmjhWgqyuXOl4EvIy5BUeCpv63+tXYBeNIMqH9d+JLv5srdDuuyN7gZrjulZ6yl5DRluNDDUwPBRP1kUMWXj6m3Jy/uXCAo9IaOsEiEJALuKcN+ST858xrMxd8ntNKcWWWSlM5UoEm5aJOIEpesqpASlQWKuxHqNYOhiIeNWFayoHqq17qi+bwRjmkmal/CBMbPG7UHpi/uHgAsv2VgagrW6NxJC3bNKIR0GE0F/eSnjH7qH18Pqg0EA01RrJrQLJjazKVAR9niI3O5Um8lUULP1AmVOLSXnGtIBA4pmkzgOsJ0Zrb71NuRQrzDvPoDhYCWxDWoxQYFj5pRx5lDPZZaTuLUmIknO2stzJlWPdEyrrmyTTrG1FVS1Gx2f1irPc4zEBQyGJKO+VP5fLI6SZZbSrwOiZ0xo8QyCjpRISbmZxIGSEwR+eHlWc7HsLtHYoaQjzlvHHNhqdWutGwSzp3QtrlRh4JZAqtNBa22fAlrkchO9fkEkFkJW+qnLESQEACTn/lSl/4JPdgzhHySGqit/DGVSNf4udJ4Z7LDxG5JpjGh/RYysnOh+ia6S/pSIngodBSZVMvVlvcC3yeAaDnLMnukD7lxaUoAzr2o18ZMmEapEbKgWSs5ERnM9chKZFU+t0EGQhcV0gYaljr8Ct+bq+eYz501mQiWhOiJC7mcVAmBtOQ2qM9UgaRfuOYJTL7QciZZ3HWu1EArEVCmzGFh40zH75RJXj214GZWuZ1AH27fqRk3j7ITpXiCZAeizExTDttefgZxYX5JPyES70ZKHqU8YB6l8LP5iU+3dDqUp0XcZASep8PLZYa3qQgETZmOZiG4OP3blR4FPeStUKquleab7paPNPoHmbd2okW3USorXe04jgpbLn0e8dfcSkHfyq0A+a98imUIT75c8uVhLfcOXcgO3Wyt5a3AFggdMGVgZ+mJSOV6SIJkrt8lMftRAoforXOONgGQSgWZ9NpSL4OmOBB6LHMgcLCfDFBX/tgRtnMl12slul0/Zy6h3LQ9f0mVj53mnkm3svmkZz6Hz3siSD7MpHc3CVhLDTTaqZ4lNIkolzinJuJBp/2SgiPaLqlxiXY6iTLEwhNbGvLX2pBfqGjS6VcQgcvnzFEaluyBLoSfINrowi6WMnWZz3atRMBE1zZlUYGlENYQ9xjt9S034RCdb6i0v4miYs+WaC3e65L7MshwzeQc5PE8eB19YdQNlFom3t9k2hKpzl6ofatK1ES0j8k4TORTpQz0RL2XqbE8/8BMcZP4pdLBn4lZs56QL9IDWdw6c57NxDCXeV8dcZ5NBI1cyGKkvb5kMuJEohqqUHUqKyTTWemAV1fMTir3b4VSOBZN9CQsG8lpT35/JpRJb4ToaBPQJFuilC0gf5uExTNPzxY+p8MmU+LvxKuTphSyuLhLpJ5badMKxD+TvpGZrognuzAEJ0xOHS9kre5lJWh+eY9TNuTExEUPYydFJFpqJAaQbTQ17vq9Pg/ibcnzdUv2BOc9KxxkA1wEDKgssAWMm6gQ8mQIbZN/E+2j/Fc/kVmnBq6JnlK5dPgHmXcn/zVTOW7pcuHLlS83/rc7/5Xvlh8//XWd+NLxpedLvtvKd1v5buvGl3w3CpDKJd9t47ttfLeN77bx3Ta+21budjA4fRwRchyxGZnXEIvCSUq9V32ySNaOtGxICDOhfSilk+CIqTcma5Hl1pjU8CJKOz55kNUTovZ2zRPqA5WYA5XNSJFoqr2hR9IHQsX7aTdSJPTxXsRJSAJuCrnFkfyOuejPZYaDZBMp4Nw+E1HCnDwAwp3Rms2UUSFLR6YgKRQxlKTmnFl7if16zlxvKzWHeqKYntcMx45kr/J4mblkIpZ84u3b92KvUnaMFN6IUTxbn6Ravk6ZRHQBEVcKmKi/OyHkiHgk/b7cyZQWcpyy1l4g8ev879y0ZdalOUubpRbzJTNG5Om4mSLwfYePQv92z61l015jbXooO+X46K/EIJxHyFxdhNGLK9reJ/rFROYzZYLKfJnZc9LVwn9cy31B65V8b8Ld+oP8U+h7I0JufpisIpymwxz65oaQuxcSOlAfREu/9f0JIfcnTFbFTWtQCH2DQog5aDBYD/LHmRAcyEykZKNbhIRZzrqm4HCn7m9i2kQ5PDemZzlTn6q4GzFL+sQxpW7qvgsixOwSWtU0+pjD5UwMRHyHewmcUztsjo13Kj1n1ROq1G7UDEZKcQtNai3qcD6V91WvsG+wCNRn4KnBQoEHakLSoW9NCLn3wJLAC5qQdOh7DgL1D6SmKz2g13oOQt9zEKdsQuOkpmWj1nMQ+56DOGUTmlIL6iBKvjv2PQeR+geIjE4Rd4lay0HsWw5i7ikIRr9Z1JSkYw+HjxkOn2iq9F+j7LfY4+Ejgds3HeOTP6xJUzoKSBANuNlCIpHCWlrASyKNdFUgjJrIiEV7Iqw2UabspLhG5PozKU1TnnchWen1kDiMPfY+ErTdp5YbZVVHTUw69mj4SMj2jZgytOem7IzYg+HjVLpyvD6PIDW4UTkSQGOCWFNLLz2bFPPjeW0k2JwejOSQEQ8xxdflyUWSWTtC3mOPvI9TdpWMum7UtKtjj5uPLm9Do64bNfHq2GO+o8vb0KinRg3zHXvMdyRM9Z6E5RUYQtSEpWMPw45uHhqVjNJ2ruhY5f6N1IeZC397SuqTU5BWo0jpkS56Siqnsz93eyZytyL1uc1Z7rE/2mMP8I5uGZqrrGide9520V0iFPzUAuVa9N03gN2L7G6uRtIGpcWXQUFUwCCnLFEdHSbdGxSXD3CjMhw1UHjsQeHRbUPTlj/OvcQuw6FSbtVNWXqT6OSLjDB7BoV9L8lJsfRwos6s6c7FwR+Ieo4z9sjz6Ap+K6oZj6hBz2MPPY8EJN+TgiZx3vZjKIds7LHnMUswT0YFO2rY89hjz6Mvh6weTUUNfR579HkkKHmqQ2kKzFFDn8cefR59dmqN6nbU4Oexh59HX3a3no2KGv489vjz6MseNF6wBkCPPQA9+ix2M+kct1EDoMcegB59XvQp/lEH0Y6+HoAefZZkmXQ+sKhB0GMPQY8EJ/fOqG5HDYIeewh6zGK8iW1Fn4m2YHsIepwzgemkC9BEDYIeewh6nDOsd1XrYFFDoMcegR4JTe5TVlGfiLZgewR6nHOnqUFsETUEeuwR6JHg5C7pfWs4sqhB0GMPQY8Zgp5EpzSXPWog9NiD0ONcFqzhK2gg9NiD0OOcEW2Tbhs1EHrsQehxLuvV8Dc0FHrsUegxo9CTBGQCbvZDaKu1x6DHJa9Wp0dTUQOhxx6EHrO4ZOJ3VhD1UQOhxx6EHrO2ZPJs1Ne7aKu1x4tHAn97altXPGANLx57vHgk8Hfq2F9SArgfQluqPVw8EvabgMRKE0rU4OKxh4vHpQQVKrNCXLSF2iO5I6GjiU5eaVSKi7ZQe0B1JBBzyqQrnR9x0ZZpD3uOGdfsV71NKS7aQu2BwnEtC9Xw4TSgcOyBwnEd+gEaTjj2OOG4+uERruGEY48Tjus8wppEDScce5xwXMd+gIYTjj1OOK5jP0DDCcceJxzXsR+gAYVjDxSOhPpNNUot7NdwwrHHCcc1DF0JDScce5xwXMdegIYTjj1OOG5jL0BDCsceKRwJ9Wvhc6MGFI49UDhuYy9AAwrHHigct+wFOMO70pDCsUcKxy0b1qh21UYNKBx7oHDMQGHjxNNgwrGHCcfCVWwcVhpKOPYo4bhll9VguooaSjj2KOGYUcIuTumBbNNhJtpi7VHCccuL1RkxlkZCHHvgbtyLbTViLA24G3vgbszA3VRg1qRe8see6GnCZ6Ka2D6n+D2pyCNn7rIMQYp3ieWLyBAInpCaIUpreEJ0rOWbRHRDl4f59RthLw6G4clqmODYY4LjXjaCDryKGiY49pjgSPjexEi+JIh1/941SHDsIcExQ4KTUrD+a7St0EOCY4YEOyOVHjVIcOwhwTGTu5rLWMMExx4THDPo19BGiBrdauzxmzHjN52BQYsafjP2+M2YAZrOyoIHbSv0KMaYqUGdwY4Wg2a4e8hhDHm9Gixl+WPRKLiTOHwoWbVELu2zpv2UFWlnQg+nml4uJTuXNeapDY6ES3dSn02SSrnslLir1IxTj0aMobjdKglO+bQqrRKFZiLWkxJlma4z14FJRKukMiMRuKayOKECk1zTnHlq9lWKrJKJSHnpStEXl8wesn5J3DBU0Cy0miGjDx0hoPZMq5kuA19GXFIJoVw6lYIz9lDISJhDizwif0rkXAn9QRjNlBUtUmWJrHAv9X/ROku9tqkLNFL7ZMqqZmmWkNQGnackfHqwifFRf2W9/chASGdQneWPF9IGSJrANJW4k2DvRvq3macj8XfTVJbEwHq4aW9vCCVm8FnkD+k5JOxL+lekk5bvPRO9JT2aKVJhPUNm8wMJWY00PaXUKVpm5A/cY7GHqcVCuWnQY+SPQUk9+0JyxIyGaVEkApNMhJpK7qTjleGKNLdUVaWKfKXeXHMzTrpMSCbi6yyvc015/Pw6p2Muvke2xZC9XQNjF4NmNXu0SsxolQSzVfduLDi99HSpspaKxOmFzOUxJDGAzIVEegq0TRIdlnNEzbiT4mcCiBKpPsE90rI5zKs3xBmfEkmN8Tgv+nQuCoRooTiy6NDEfALYcwECRFdJ/XJJqiK5wTdttYUKXqlVihjHlgSf66fao2BiRsEkzjB1qq5Mdc5PMKnMYbvnCgl1bWxZ3WWX5QFX27+J8DqBTcu0Er4l1QnUzd7jMWLGYxA5mDbBil5PMyvAJNr6pKIpprXUZrOV6qWp83iteAZfFnvgGR6m1R8bGeFBDGDatGbRZ55pqwWXKE2Luq/pxRJT3OxLk0OZAlFABxIaSKhdJr31GUia5K68JyWgcrmqDKKxh5XEQnu5qIxt+VMixErwVWKRdvmJTrmhw3+J9BCz4lZ+iAnjxkqN5ReQNHr+BRtp6NG8E1CvzLtcUt/DgU8h9kiWmJEsxHSmzXstKzVhO/onXoQ3qi48PWa8BG763315huSuz2QchSEUL2arhvIw6/7YyKgWigW0WdOnxPiXsM2xMG8WRcyiHFQZChJUzhGxdipd5xb6GUz6iRs1a8xFCFcn0Oqcu7Rc1Qkj6ZVIPGaJU59+MvG/ZWWPnRjRMsl1EggnmTVS91mWTC++ZsmZcrmSXhNJFJH8VgLeHh5Kf3JlKE1iV1ONv4aliT2WJhYez1XF4+RPaYOHbGNjXs6htjds0BkNS7VgWQ7bkT1NV9R1s69Fq4HEBmnIKZTDIuHffAr8tqS4e5hyf15l5E6ijlOnHAFy2HdhvLKVSPLLsKRccU0cCrngmmdEPJmBkJTZEV7RdOJWHYoVO3DQPGVwUDrtj/Msn5Kkmc9bjbq0qNuvHF8JDkYk0tTABhb2bD5m6lXYC618MiWZiDU920xjUWwCSV8Rr18q+y+Zkd/T75zJeIS9kK2TNETlbZ/zik4eJeHUtq4bofyA5vfmQ3DVzuvyaSbkJiaLbakM4LMrghY+Vh3ixFWUhTJTz2YhA0/Y4yzxlVo0s+Y10ZNOdFi6wliaupVzi2YipvBE/5kETDNDYfpGfh4J5Js4+j21z+ReuOR15164pDS0Zz6MLa9TT6rRWcmX+l9cls4Ja35cc55/yFz/DqdJ6r32fqeAZtoOT9H1TzEHfbqmVPn4MIjvB8lJCl1Tqnx8GGTuB8lH3Ko5NfXTrYRyWXnBbdn6JjYRJnUvpN+yfZHQp6mQnnX7kvhVtrDeSd72NeZl/TnkrvV5LqaW1sJE2gLUcJitLnGU+Cx66rYqWkK87dkYkwAGkQ+SvkXWk1mqJU4jkSWmn3R4PEv/eFaTEq98uBZBXZ+ltef8lJKLTxQuC0ReqD6T+bgpNk1yRlnHkXSny4LLkP1UEV6IR/ozsUi7EMvBlhgSCbQ8haqKl7r3MqnnHIuMXdooWQs4/d7cs5BaQIkL9su+zZ9p25DEciRy3TnGzzHz8CZwcyBzQfrs1PWUAmcKWeg7h8e29o9tswmdyqfw4rMwFPH1UvgZqi5ulCy0OfJK888MU+kL2eGYidJ+qyS1JcZKfRM+tfcpnAZlBs2Ed5s9qnz6z55w0Ca8TRkhdZjw3k842FRV5dN/9oSjOmFnPOHQTzin7XS21fJxPTKyWdlKqmgvcZ0jynNCp5MvOpXTJDtwqTsmNzbG3FaUPewFlnolcbWkG5MJbdeVBApS63skWW1PWpp7CcscUVgvpOtDbTnFY5+JVJmUgUngZMksGp7UOYtaMLVqbiSuslSSdkc4/cydlpiXHRk2SpU56vEol6txhPSOR4ZDOr39pHxMnk/y1kt7IDUFpojCucwvX6LkJA1RdKc/JyGp3Bbs/Fbbhz1J5Ryx3+U+zbxyUnQzTiUFYSn/WAfJ56PetVI+LrF2PnnSGc9BtsDkNwnTrP+af6Ej7tgUm5DmSGJyVjy+cq9mbvnY3dX8c/2YTpqZe9Zz76ObZ+7MnLN6aMLlM/EYHn6eWjpQF+KiPqh1lDs1M1vyzIwtRh8fkyckJJZQ06HCp92c9Xwa1DCYZ0AbPu+Vk5j5ZjaiBJwP9sv1B2vGajqdWbF8fBikP2YKGFNnNCwfHwbpTb/LEZZO2Fc+Rqgh2j5cXTpo+0hvPGfi8wNJaZLUk5eDDmr+ywlcsif5X/qkGasvvN7ku5wH3A2n0VVClWXNnBPJ4U2vKtHEkQicy3woE/GhUNfUEqXQMr3i9LfM+5YgsKRItm2eOCNm0nDftpyG8J8z8zdx/LtQTZjzlNMl2cuNutyot2ij5zVTcEX8BLGnPyi/oPnFRXpVra6Xj3PnU8qsURafiJQIPExtWFturwk1WbxQ+jw1GxV7S13H8Rj4uN7eEtjUYAMunx55vnHMysN1L/B7PlyzRmSC1keS2CCk/UJqYCmd0hy4qSh+REOXGTQTzoY4GNbAO9FgAaVZzDwvEIqV68zV+eaMt6taVPlv9H7T9zDxw2x7i59htym/p8+2KYNp6VQO/fOZlhgNUEqWbVhULqKsZlq0NeAPpR52mGhv/jO01+mEe+Xj+lih5Hu0ujmRmkwmscyRY5UFLNMbXygAIlB86rosSr8+qyCFOev+Heney+2b6eYzQW+9KB9TFqd219AedrUYQ6SAX1YIQsyJi2SKhdk9H1Jr8sFcCJqgYrlDM6Ns+fUWjPLxaEaJyyyr8/7ZGfXHSIE369x25WOcAFoJdo5LqbGmHpps7jPLWuoD2KbK2brRpwRoSPYzQ/7JfVy/TH0HUrlxM9F8VOn8eeXjwyD9MVIg1HqXRPmY0n/LIios1Rw4F0pskH8WNQ3RlqIlmqtzJBtBi58YjZZMS5GcH0fqvNk2UKeDEjr4/hgoeG29waB8fBikt9+FMjyoALjyMRmrVJAhScZpK85aai7LS4yyuz5XRz39hnR4T72kdhmuuX22xnpbQfk499Kn03nOfmnKXyzQQMvEyrNgp819pnvSeCN2v+Sq54kmih43kW7ccnTa5976Fgy5zsZXPh7tSVIUTKn2P7sn597MFkC6Tu1XPj4M0hs/Apd7r1P7lY8Pg/T2isDl3uvUfuXjwyC9icmAdK8LdpaP6fUndEWuhaee3FwLT/n3XIhPFDTpoF0pI0SSAFtWNod7c5hKb0TmbESCCuIsH988lbVOJXkrayJqGU2lN0WEdNc1CcqHDBQI5RwiSivSpMkiq9PWYAfo3AyrQAxYMIFyh2Y+GcE8qWoN5WNKW1K5gAiftpzmW0uWj4qPtD0TRCOjUUpNKlEZUOouJbAz71sScaTMXcosZN7m1LyXM3fpAMmZu8R0kjUtU7CQc3ghK7CmfPVWUngp959TeFv6lFJ4KymsULcrSfpMU1ZoD9lUp2Bhy08osQMc31hvRakngGy7mhFdqiAkaX4RaQJte8q3uJIRdQvLXtOzSo2hOc05O9a/zuJjpXieuFzKs0pRVs5yJphKyXKu9VmtPtNLpcLAUvOdfqn5zkQ0lfOdSZo9QC875ztTMSLLUhJyymWy86oi6vaKO/J7rInR/PtyYrQnUCvPo3l+bqB+UT4+Bpv0cBIICP2GjBoCVijm6DOdwrGcAVsDIPKT2lpY7trM0ud9YBy4+eOC8STaOSLmcHVKLjOIr1F3ljZXe5Jz2ZCwaUtW19rWw+T6kyGLBRjaH+VjisQSS1Eta+dALIHCGMLDirpcuc7xV8LqSH3S7NVQSOvAcV8CtGmeBa7nMPv+SCoyBbpeSPn4CMhiGBZ9dSPuNAuRVUZp7lrOMCNoyboHlESdKXWw1TrGvFBw6L7EvHlT8jDLD2bi1bQvY80m1OoPqctndbFU+aECm0/HB5GnJN7LwniSiz8pukxpBcpdbMTTNH9Z10wYl2oZc9nbiak+7+iUy02HT8IFOgpCPa2obBLz30hpMMb6IlM90E257EeFJbfwJeFPAu3+vUyW+t9pji7RW/rMzrWSpUxN8WX/79PBaC794V96fFYNl1M+rRFjdbxzAjOuAtC0bluJJjdSXEj1I5e6QlbqLHYbyRMQ9CTkbZWrX8XdXihiXOfjEu0dBOoN8l7vBSwfHwbpj3bqDvJe78ArH8+E5kinAJXB3M5wg0wKRcsive6pkAYtW5W52/cqv5qCehogMYZlycqUvaeS/hdqjyaBvFQVz9lJYv2ZskNBaA6y85RNcESISkKZnkgrZyqT0yGVFpSfsspuwuhMGblzfJ69V1HkIHTN0vLxYZD+4M19UV5v4CsfH8lpyPzSMuLcOBBcLORC7GzE/kYq1wVl6ikxQQ3q3pVe9X6ea3/A5dYrr7eQlI8DRQtLPtkTrszn++5fqKDuXMIOpjRzui1dHm7bn1i5W8vrnRrl48Mg/cmSu7WSNdH26TrXzv/UpU45pnQBqBo94TX1/RPBxka5iiJ7nfKoye1aK5cGnTBrrlJTnp2oD1Kc52nVf1kTjRNhFtLlYer9sbKWMr6GnSqfVk3JbL43r4hLkkGnZBpRVs2k05rLziuLSiYUCUk/erLFBM/YDqKSiczBF37AWEQfF7plTEwQWcv485YJsRI/YlpnX2jI7I6S4uRG/SFEFJH9NlJ69SQCmWj3vKfaW/q3PnMj0+WcwWsJJJJFyBMJZxLeqn8Ny4S/br5eZhlJakshJyVfeVwREvVw2q79aVs0OXQ5r/IxBzYa8FmDOxOkeP2SJHbz2HRpRzdrfwxRJ54hEFY+RdxH/4yc5HzYJBvCsSBHgDKtntxnhauzDN3MZDdlxsqHjO3KNYZ09ubN5GWhL6Egch2FHeIiIU8aSRmQXToe2BF2Rsll7U+x3Gjo9Wai8vFhkN7+F0ESleiofDr2+BJuj0yj6fCt/XGxTbb4WfkU75r+2Zc15Sf/+rve+gNhKweC4Qgo3Y3yj3WQYt6NbFBWSbn1MPnsPYk/hWMaqnRE/r+fP12efpxf3s73/8/T/fkfn/7tf/2vT58+/9enXy75P+f9M03t07/91//+XCfy6d/+69Oa/+J9/n+3xnwx73O+WKbyl8W7erHWiy1frK5e+KVerPUCH5Vx1nmqF/Ufz/Ufz3u9COViqf94qf94qf94r/94r/94r7cIrl7Ub4XyrW3a60X51lbvtS3lW9s614ulXtR/s5X57HsZcI9zvSgjpzbVcjHXi/J1N9UnlRz3euWnejXz1Vqvlrle1XHdtOO7oX7qXKxXddapHxFXdQa+PkjnV1evNvxtq/Pz9Yk5H/hv9R4+1u/O9b26ean/btnq/FbMBc/S7XVpuVDXlgt1cblQV44Ldem4RDVTr+rviPgdEb+Sn3PccVVnmsRO6pVb6lUs90jdhriq/86tfFW/4TZ8o/7KhK3A1Vw3VCgzSNxt9crVe8w7/rbj39Xl6+eAf1dXsp/Djqv6jcV5XM24qqNgw/rF49/5HVcYxeMbG76BGSx4QkvEd2P9xjrV57LOM65WXNXvrnVv+XWpc9nq9vBbXX9+2+rIe90ffnd1pjt+0T7zVb3HXleE31f8batz2fEkdzy/gDcT8CSTFFy5qsaDOM7rVfkuYQjLlcPf6hqiRGS5WvC3upMp4v63//rf//szTDn9Z7LtU2O1l7HVhukKwkjAIGBb8BaNMzZNNWQJ4oUNUh8HfpLYAjMe6urwUBe8mhDbh6X+uC/0P/kTKcmn/8gEzMADc+aY/5DDueisk47tZ10B+nDN9FKbqz4cTsxi9rTBXPMyt/HLnKsxnGN5qDhocS5udZlu1YJhCWAfuKnuMOdhh9le+3peiWWxww7v9d7CDgvri73BC2Riy1i/kfyuw/Lxy9G6CasFi7Lv2C91t9f9Qlfmm3OfE4v3mvrAxfJK3ODGesCZWHe1Omq7WhNnoLEeyiPRB+lHmf7cKN0wm7WkPhjm8bVZ4yn61ceBk5S0v/rTcd3Nje4m174F58y3ABMS9sGc2yn7lKz4Ez89YQvED9/NUSL8ILex11BnuuHkD9E0TC7BAsTNUu+ZfrMwVcM0O/uRLv3bjx89AjLVszng2kxvDbMxHDzc6snoo7Vryjbrw9AABg/+f3XgFSe/nmVDp1p3tYRbxc7U2HGCy/OBo4NDxnZg1Ae4tefYatqtqU5eePVYpc7XR+d8xE+L8G7ggQb2guAhRz5wV3shbr+1e3szD/DbLGyzTQigb/kD9aghtL413JMcLjVn6qPNsUaxjg8/hB74WxTHIMKR2b57uwv2ybp9wKoscaw2mm/8B2u7c4ynOHx8du91DbB10M7fgfvmP1OtoDldLaNx27tPnU87wZC3ZX/sLYjpMP2cBTlkEG7IFyhpAiU7cEgK3JAL+MBa6WGoEnwqIefNgeZfsH4cIt4e+o0Cvp+0kv5L51gsf834eN+uuc1yzOCCV/dVHW1pJhfMFdzE6/VRyKjavsXae2/edCZ56Qf7ga6NG+BTt+QNXoVtI9b2HEuVOsutQFJsY/8Ha6/uslGw5jtrNFtPgm3j0L7FbrjB2rpluH//26X12JxlLUdOq//FLfsvS5h/OdrI3Xy6cNjlQYPNOThyxN1a/zUhsfR7wWKIpGHg4C2nQrSbzc3jSZlw43nHaD7leeq8bGsNBKT/Zt5yE7tI1WIWu6bf67ENnBbrTN4cm3HTA5+n7m2a6yPsSL2x/bXDpbmxaqk+a/lAfaYhCRhiVx7dTJFQCP7wzjnJoKYRZiRdcU7dZAa7PBPbBQRhnJQTq25r19847Tb7x3avJjzgXzlY5s6rtYfzq6/zs8OrpV13q7XIt2pANwcvxVdDgJye52Cek9nr8U2snPoNh3dSvCd1tq47VxP9wkfRTI1N1AG9a3eKdUgtZU0sOFtQFalpJcQ4ddUgOlqQGlvgmS310HNYbw4J5KS6iSu43A4r3pnvs429E2mVlYCpfii8zupswiaEmk+Dsym9SOEx8l7j5D48N6wOOMPVX1Pn33shSS/1g5NolDBane+CysFRfsP2W/sMl2UCRYaLK0FsYs1zcuuzMeYGH53tW3cCzGa2cqsLOXFAmsO1ZmIxk9coxu21uhOUMqMsBs64OhYD48yRMf6GUTjyiTgpYkClASfwNB2Ty1xiQ3Zc1CGWlQs+OCmQcN7FqcBlGa4odGUZ/Xm23rFLbACGr404Zor2olnXaW+XTbQW5mjZ7OshFbz+mXxolyt39qbzK17ijSUkHNnEBWFMoDkko5kynHGYb9ita7V5SNSuMPUiGQabjTW6b/D5lPTHCjMgkrxc2xKpMtO2x8PL8daqGb2cOPVrxa5FydDMfNiROBmaAf9MPBJ/8X7+Zd79L9O8/RLW5Zd9X38JU2gTb8GKTASgBKaEkQgwLxIbAFeOa66L6Sv88svff3/+/eXydn65PD2/vzUbOIiYTqAsahW5mak2+EmOtlheCIrJSLvWVVOmX7E1nbdSS2R15UUkj6pt7r0ZRn0g0cdPlX31egGoRv067HWdCoNHsJ1gyYGuqCU6h0x0zZx6JIWq4+LxMOBXonzsODeFLQnbXi/qRyu7KnWHwlEBfABbFk++fgsnDvw/GJWlty5zzZUCBXX0GudqFDiIwsKuu3EAmQIQY6lrcKl5sqX+9qX+UuBplvrkl5r+W6ohXGoy8+jOLrFmPuu7WB3+UnOh9Yxc65zXunpvA3X9FJar3oJBXXXAnwF1aUnaqV7UOAh7qsZBIn+71Ys+kbvVpbXX82yv90LCEmAUHCh7fSlAOO3xmBmG51Xd9xpRIUGBeiCqNahHBA/vv2LL6u6OdbVo+DN8hLhouql6llpycaVA0gDCQoneTYCBTRyFwcBP9TW4CS7FtOIbOLkF2A3gtGnHv2PYG+6hgt0we4/Ze3gC7B2IolldQQ62yHkGVOCXCxgdfrnHL4fVkkcbfjk7U6hopcwzrtiSYzzOu2ww+DvG29nSc1aGPXbcQ4X08XcZ3Ie5KLARlBWdj3ye4ECpa9fNE4AmdXs62FwBFpzxXGY8lxlZqLnaN6p/16v6i7Q4HZY1yVTjCt/AOlgwl2Xmb2AUvMEF62rBmmSAIyyyW7A6F4APFzzTFU8DRtgBR+Vgfd3KSFyc6DDADuBXt674Bp4ffFe3BnyKt7/ina8R34BnseHpbpjpNuFTzHTDrDa4FRue5IadsmFfwgILCCgsrtvYzcA+3/BMt8C+B+6L37FxRoa9e6yrnd0V7BSGnmrZHGDYZP6S3VCssDFYNWD9Bay1gOcS8AYD1njAagrsWe24B3YAUhQucJ5dy0DhXR5yUXRV7yZhtfw3AGcFahDjzYjqOQzEr1TzALCnEfY04mlE2FMB58UTiniXEbsxYl1F7ICIdSWgwHi6IkzF6aJmJzYObBlQjBlsPB5mAFsc8d4iVliEVRZgZOxLhMwuYocq+REHSIaLgUfBfWGpAXN2Ebs7wmZHgHgn5G8FHLrueIkAhf+uZ2gwCip2Exz9CXG1AFrD6Ye/IUGEqD7DP/DwDzxqEikrX69QS54Abpki7oZ8tcPv1SvrM664xo6AZeNAhfPkyMMpFXiHXKfHL/K4r5/5Cv8O2Vac055jFZyhsraPNyOq/HjiXNua8cRnj0/r/vUzavY4a/2M3zvvGFnFD2jwdNyXge/ImyA00is+H2APkK9hFAKeJM54v2BtCBg73iUCJo/TuQG541Ol+oSz+09gHlasiA2zx+lnQOD5U4Bia+LjQ1h8l9CgRBwqZgyQX/hTjAKArppNxb7cuTIv8q+4L0Pvsa52/N4db0YA8wFMwunsdzy1HZXPHe0RXPljKD8iLR/wtgSoH+9cgfKT/nu5QroAVtnDKnvOWsMqe9hiD1vsueUEttjDFpP6Qb3CyLDPEZYr1pU4w2bPsNkyFVYtwwybPcNmz7DAM6I7mQ/nemm1EcTiVa5mfCqqqRhlxj3UZgcGb3PbA+bSA7oJcoh/xzi/Ff9uxQxWzADNatNmpgNPX09P99cmN7nEVSQB4QAUE9GhVHCew8+u9nlwt/N9WzYIMuvoeFHMy/GOiABw6zAhRoOPcpgN2XkG1iN9hr3HFnCtMdo8SPPil3x7OT2eX05P389trWpbOf3JCYp6xHycSf16Te2K3XOyEtIcFolUAo4mNiFl8xs37JLBq1lt47fOuY4b3//1x7ktwtm1XaQ9uKTJ7sWguHn6+pr+sy1MmSCw6m7tM7wtWBvP3T37YAe9Xl++3l/u3i7Xp9PLH/LGe+Bfx8nWGq3dsAhe315ONHD7ZmYTNYbT0dugttPd3fm5fUDzbo3IES2XA0QFEucoez1cLDDufPr60C6CzYQhMyB7toFCZdSnu2bUzQRk+QlpAhv/nwftduC6WRPd6zGIGettqOvRu2cgOnuiauvdYF/RZBsDtDm75FmzychKY6aiNoiIE9nwUTtHmsFrM4FgIrKRSlMmIJOnSIIEE0qTb3t9ae+8W3eecchzHgTx/m53qp3u7q6Pz6enS7se/GZuxFGJMI32cn95+t5CRMyxAlyi1Qb6pUHfO7Pno9llso4WfhqoW/nzZmL5OFzEea0M2nZFDDqLyttA7YxjfYT/iHcR0MIyIRC1q2lw6rjFoRak6jGNNCgyj3t1CriuUV09LmfUVQxjoBU4UNc4lDOAtTnUNZCkQY5m1EXPZUuR/kfCzHFivAZpznNJgD9FQkUklJFaQdFMpm6FXeUkLid28Y1xEheJNZnOxTfgFch2FCT5UO/l5KJoUUHVlNMevD5E0gEBHjuPSPpLc62lH0TSQUs1wKHQkg4Im9SEAPemrxy2c8+5FqJzVzmD1vjqxk5zHOyBvS8EjBHzi45DQoZsIsxx+BsHUIsJ1Trd/fblR9fLYDYL3dYkebr77W9PvR1ydv8rylo1YDUGfbr+/nC+/956NIlF0MB3oJoSZhOLIoa97x6Cl6ESFnQAdvDmM4jvQCHM6/nv7+fOhVqF0WeziyIrJ3jFzmdIGlJAG5znD9xdMSd1OgJRkpL8vRmvZg8m2oGdQVoLTr77bu//zAwfuxgjCtDxp13YjXh8MZiyeJTuMNGoZCNVTBZOtrKlb5h5G6uuZts2DjAmUBFmr5BBfHC/t19fru/ff+0iGJFj2HkdLRy+HOPkn8423P322i5nE2Z99C2qHV+rQ7oGPue0E6+eQes28NF+e/3y7397aLH0ixmo1BKUMdbb5fF8fX/roMarjDm15uSPlvjf3y8vZ33sWfiojC+ptYPbxn699PFsys9bT2AbLbGXaxtyRG86/tXf50KVBtjgxC+nmYfh7NulzWfMAoSYsu/HZy4waai81XuB+2mrSTzUf7lQyHAQUcqH78dl9pW9HZQr4PuJND+wQDWZrP7S+9Pz2/mlSRMaj7rumwk+cAXnOKSmYNkmZI9nxLkz+i/22V7+eULt8kzC3ka8wzW8MBizOWyjCf+8gdvkdH/fRVCT2ZWycKmbS3mDo/v+/vzj/PT2cHl9Oz+1L8UF3yA44TPuvo73wRa9PwSmwaRmURGi6pCHLb/tFt3DBz+dhjo9tHGuyR2x1gew1lOfsR/IwLiI8CeiYjdxcIlMzQzc5AL3nTtfd2ebKpp3aypSMvaG/tc4GvTvvz/fv7+kfNrp7rffz19fr3e/nd+eX65v17vrQ+vpNgsDoV911m9ZGC/tGxQP/ZOflCPgo1f5cr67/ji/9PtkEY4U+lxdQMbi43l2mSgX7fNlUvhLEL3WUppxn/bsMXu4FASsDXwVQbmKshlha8S7VKZ7PSZefTB7eP1iU1zQWF1g4s38kFu58syBK0LOZXToXJ8PhiOaBBi1MGYO1XLkBLNLzi+DNNv9jz7R7Hf3ZxoYykhdms1MjAFFtlWDE6rVCnjADkVqhxwGP/51UAbMk2nd5d1uOK7uSbX/SIaxS+w5Ki8JFePG55e3y+u5O3qtdwPI+V5TC/uEv/RgZAa0eU4IykRgB0IZTrAr75ndOAxYFn378MJ3fhkDP+TH5fXaVpL8bBPBHSCE6qDfOv/NeXP9V//GcVawXiAnDxQVPBZUNtBlwDRQ+QKRI8Cl69SvJODPRX61xvWosSB3ikyp7x+6SJmiogAYGlxMycoJE6yCYPFdGfNxiYQzlVy12HHFTHI4zhgMqEEKGagHP13yc+JvWE4THjZvO4ZliYwmqusij8mZSpGVVABQqCgLSBKygwLyI/KJnG1kcA2uBOckTly7PfD0/XRpm6g2y+3jjHXAlQ7dtDN76W6vTYpnt7sI6/zRhwqGA+RzkN5nb1N0GSAEBaa3drIySQJF8VwrZGQXn6pI6cLoF2yU/hPbpOVsdmzdxNdw+t6lxPyyz42LyNV0xrZx/1KHfdJTIT/xbX2CrRMQ7aN7NNCv51NzXq02rWa1G1sNQDZuxGB4PkNghzvf4VU7zk9gP4XF3jsPl1PrrtocAQJOc2xmDgyiYpiU3SJ8erh8P8B9dpNtmzGoNsXP6eHyW+t/TWbaR3S9/LyZFQ/WZrE5PXRhXQpUPgyXGaYjkYi77b0/NMHcbAbPDu1ycMgkHx6SuTBBfBIuC59NDHdXgO8fMEsrsG7BMa3Aq90x0OZzTYVnAkQh+fo65j7jMV7vTgdQx2QlZvBuGEgpeFon++zI9+kSKZvJAXEbIOXh4fr7IfYI9qC3JRHSqN0D8SZtErc4okCOrkV0JGK9TaKB9QiT1mDNGmx4t1u2Tw/Xp+Zx7GZbNU5oBnyhmMC7gevMwqfGgSyAYajvCO7I0bq7Pn1/vdyfO//bhPOJDYhTz+ZVOz28nE/3TbiQxKOMB1FdVfhIS3XNjiEm8tCgQD4GnbKID1eb3a6w3eCAGaErJ6494921CthNIe7D67WDHpo0QSvWCJy3o+nkTkmm8Rc9Q9z9wh0YosvjCGkUlPiiC4B/rT/8bsaQDxff76c/Wq9ntXkp/9kKAgtA3Af7rU728evl+/v1vZuvM2PfUYXssQdE+d3O6d9mLVscps2eWjE51RTyc8MK4DQJVkK5QKjEbfo1cVi9L9FMf8wp1h76uj6P/fGgY+F4pW5EzQigERwR+SE0j/1G4dD8YDFEczaCdcCauMcavpIi7KG5MirESfQmo89X9BxjL+MFqV3AKA97AApkT2/9dEaPoSjDic5WBjsxAErrXWW7wkVltrH4BvrwRE8qQgq1r1T0ix4c+qaXU8s3A5kHu6d1ZsquSbaK4/5J9Oap/ZPcK6kZJO5eZMs7dEZFZyFSMGMHVXT9cYef4rQydoAjdxg99XwT3XKcoDmmakTUz5lEeAYCLMbdDCK/zv1cbOEYLManCmJp7ufqz9WuY4vTPAwl466rcYcV/p3oocI3hCwJkF2MiO5dfQuGVn9lI0bCMDRcaf05K19hFNGBgyB4gLh5alMEH5TL60v/VExksYfVLlZDCZ+17hlu3UcGvn7EveMAGphcNUr6lnM+H/PHAAA5o3UJtDFgi6mT1yhhPq6MCUoY8L7Uf6MQwBw4XepqZb4WJmWpRWIAMXacjwcOlToOWviP5yOyb4IopfKaAFAMZZI6jsAR16qKgiMGfBio4aVe1I8YPlzT5PUZhvqTcQQDyQmQOYjcNcYUoGiQwhxrcjGJCdOUcD4Ch5VQ5xKEJXzEcwYDpQmVzoQJRv4CTYmq+6UQjKiOArYljlVNAQwAQOkyCAIP4BfxXEB/JAk3sMEF4YZAAo2oN9TaBWPY2EFRMdjcZocgUHVLFIIMdlA0qgw8q79EmnEjVQYKhm7HrxQEGUyLAaurE1/cVJxviC+Y2gL/TiW5UMJK1YFitwn/TjhQcIJA33I7AYVGHYFRVOdrTBPBrhkXEA/gG91J+4DqQYlCGcKjunBjkgbFwUNDN1OyM72CSqCA5C7r5GhOH+PyJEVCPW0ZrMMNiczuJnoUOEup9SiIzgQG3aG2x4IwnHICEG+u68XPIJyb4WzOCFglMQKXa44tgnqng5LiESQISu1RU+tj6gM03auUBky+IJxhfEOo+mmEB9wqzPlKXLGWn6D2xSi4x4bZ64QH+JQ7McaqfqpLPaYlUBxuQS1w7ADRK7Zwxzkbj1Ui9AIFyQA78A5XnEfVKAiYZOCvEArUlgGVKEDoFCpt/2oTP7fpc/u9jcB4ur792mIwNhPM5OseYAdWaZZ0R+cLBIXi6P5L/FRw4YYHrDCEuzss0/Fjef29fSq7ycjPdXbkSES9fBvk7ZrsuFR0++S4BawcXgdy37oe6yupb5vdEJmZggOGw5hdjp+vQjLfjuCLYUPA2x9bWEbKdlb46Y+3X7sClQ3JRQIOy2xmipQB8vfpj99Pf7TFtsV6tz/b3PHcdFFs9pqpOwnx58K+KjYL+3iyYIHXhl+7ePuRPl/aEvs44se8ZNO1SAzCMrJ1AwOHcu/nrq/NBCSUmMcY5dxmLTYxzqedMVCw6swgG4E+aB4+MkMIU2tQykTqM78PvoOS3Dx6/bpYydinwLkhT37lvMdZXMhu7Cd2fz7dP1yezp0K4yzqA4qYSo/iW5fj/Aedh3TnvpS9WqiOXRioQ6JZJB1HUAe6YwuDnBaTx3rFbkNyphYcQdkn32gH9O5iIpQTodJzW8Emz/mPx6/XB52iw60Ca8octcwgWZnHPkaePz8/XO6OGGsTXnDzT0jDHkhAvClLqnkK3FPjRy+43ul/tCt5sQEnowIcj9dSU9iND/DGqjnmwqsg94HlZKutHKycLB8S+aRJdttoN4l2EOiKoEdAG3v3eHDD5+vD5a5dibtoRv6Ew4eFgTa8xIKWvW1Jtshl+7fBlMNJRJKx8WBwxZyAzAJjS5+lubSQ5mm35RGZixLhqPBwhmbx4Y+7092v55fz67mp/gYnzTFoJbfbt/fL9fnlcnrrGIwWG0aAVPrOsQrTkY1OlZfrj67DIpro01qZUId6afsTTWRPNXblzdfUL3JgSPWgbo2AbVAMqIEUqM1A3o5KNhL91eAq5eqaNjpm2EWKvGI2apQnmMNrcbrGS7F6Vxr1t+CdQoZXEGUj28x5Ys76DnO9IsPLeVguD7Pvs90YuP2JbOlfyZHCV0ZWkPOmoozMuU9k8D8qFCvlYY1AV2Qjx6VgGI+bS8EY7+ZSMHdqDjOFig3gbJ/M0/GpBZi0oC1l2LdS9mU3YuP8lublci4LeSaUqlVizXHpVlBiMogV7ZAif3TMGgVBG8m8ISir1sxto2liHy0v51Prlq5mZwAqFgWOoo/3Pf+hASGZ/TJy2d6CKNZv2Wgnxg97c0a9xy+PpX2/Mf2TTHoIPvgbeQFeru9PXbOaKa3K0AA3yA68vLTJgWB3JNUc91yTv1xerskCKdKoVB1Rg5i2YyQEWjZhy5lIfWcJbK4OoRomJBw1i8aWCjtjEsKN2F+cd0UstnNKDdlMmR3ltk8cvKM98nL64+768P7Y9tAIIXUuzItC10/+lBvW0UsHR9xNcka4FuN3KyrA4u1p70f7KX7wo9iij9+UkNj84A38uJx//3J/efzl8fSPXx7ObW/r5AeqmvzeR3e4/OiaOKPdZ8/xlAmuVe/S3MDEQH6k8gR4ytGB1BqleywjjjDMnsEWR3ADN/0LfIECCFRq+reKcnANfogiF76V3tZ9BNdJlXr4OLAIKmE8K85xfZIri0yJizNa9PFxrYrPbUFRzetQOaP7Kom+fu7OTz3LhCnehoSzHyzIu0snT2tKyvFrrz9AH7ED6/uwmfnlZcAo8vpbe2JGa7dAmqmS7hvDtUFhsNvXFLJZbbyOQMXUi2dGP6Bs6trSR349v3T+U7BpjobLuiw+4zaX708HPtkQTaXGP8+PTLc6d9lx07i63qY1JbqpfTcfVFFeX98fu9YR06qPiD1f/3i6aw5eoa4pUFa1KmssKBhetGyLn8GGh9uQR9zJaUq/vlyfOsT/Znb2omrCSWSvlHOQJh6m/tLdkxDi6e360rrKkveOuzSROv3AxWkW/iJ5UhjutbMezU9HDw27xrFZgGGq5aKubwGGrO1bilQdWrwqGJKF6ZBXBk6yfusW9blDbzTL0LHoHDI9gFAC+ljhkTWhomnE4S/15EfKp458ZE79SONNgA7hPCDFwKpXomQ1PPahViEgZpzllHjyIbRI6Q6XKi0AHgkdFnYFkFgQuimMMWegEEOBGB6kUJiqKij4d4BxSGAPl3GObYBS3YSx7dzljn8nkhyc2vC4AvzmRjUS7prXKFE/0BbBM2XYyihP/fZ0/b0NxER4zplCrn9IwAAwccz/gJ+9L7daqevj5a5Nm5gdcegl4gYdtIHUzJF9k9NDm/l3zqyJoUiI9JHogmGtdO6NWAYI/Le3013LO+nNQhZ278oxwCBd8/Z2fmw59BeB5fkUsP8AUveFGrW339WCDoRFK6aNC3uYLARB66w31ogEzJlDk42Z97gDkfkUMNc4YI3IP/2Xb6fLQ89OG5oUE9KI0R0disHQfTuySa5wE7vbbaxtHzBH5Im1kbWsGzsB8KsPHXjVNYbbfv77W7taXRTJGaVvgTMWEL1vysA4tw9Lm8Pg0SJ/f/v1/PR2ObbMB5tJdUQGIcZr4w5vEzf+zNoXHQCjsjRPo6+pOxE4fFo5LcAy0pzFQLo87sq+5nYTLixx24FoVKi+KzcMcPlH9QpYQUKovQEjplD04PSrsMePH4pGUjtoGR4+6uvL5e3Ukx+6xZm5YyEOi1pjdQLngt8e3awtMruBDPl46V9fLv95WCLeLZL2cBZwlIDnrWzGj26m8u0mIbLmZubLvcW2NN3v0ay9ozLLRz08PVHmG7YkGKB5pFXZS9zZ4+IUE1yZffSyr798e3h/bSym3xYRufnJHx/OmJMPo/7y9Y/OSPlN5KnT2Eo0duPYl6e388uPlsTUy5g3DX/04m4d/uX6ezdzqUXlJ6Xi8+HQdy/n+0unGSRlu5AMqIH/TSvy8ALdvompwtH1pfB/+6CH1+f2VUwXzS5ocvObCAN+8hfU99mxZe+S/ioyyB+FxxuH79+n23f5U0TQcsQVWgM/nt5a538zj2B0hCLe5p4xESwWmcDhDftAYDGZZjgbxR27yBH0Yb/ohOPcGnPtaccoV+PnAeXOj9Pl4ZBdnIQ/+on7FlZF1IsLV0dyyp1dsMjZf+BwNIFUIdyJDoVBvenH9XLfCxaZehdDA/D7qdv7azS14dBHXpaGOWCSVHo49wfs7FoxwPLOucERbTMu3Ljc082YJrk5BaO0NjifSgzVvUqhMjN+Uu0zX23dEtGhOR6xL5YEb/OYLOOhXs8vP84vh+ewyufApI2KJ4PnwIAbCPCIJ6fdva322wJlN9Uu/tGi7dOx9peKp1//49e3txZFv5jtOSOn9+t/VALuf//b13b32VDgwe7j8X75cX55vVyfDuP+KQLir//x9/uvv9w9XM5Pb7/cXZ++9cOum414Wdi/GzyIt5fT0+vztasEDejrRo+1W7NuMkvPINQ/MgSA/ouhYVJp/tCOK0i/Nru/KM2tq8zZzNo1L7AzzI9bW4eVMA+/eVATS3P5roB1vJn5ApuzILk6NpFxr/dfaycbNZE55pwQlMlI8jJOAS8l2DKX/CBe364v59PT/bfry++nl65lQnqxO3oFSzj+4eGSbtILJjgTxsHk2NPAEJ3ufrt++9Z6fJNlLAOa+5FfkFT2Nrt6us1zosp/byHCqcXXZJrmHpVbkCLyFke8e5K7ltEtnr3W//LxW0hvtlOrMXMWTGdzU6/N1wSs6dizJ3PwhVX74NdxkUNZwwPZpnLn9qTzq+012+7g19Nr68dGO6UD1KqOqj3iZv1un9Tpxp0X+gHWoxb45lpHQzpdIKwZOQ0cqurpHxLwt6Lwv55eu/pIMJlrRUL1MAd97Le2MjHLxMWMwXYlmE4V7/IxAG2g0GJTilIJB7jVZvaVYgYEMVP7gcanzgksIQi1WAXgKIBZRwaRExPXgHAGi42h90zVrhK9MAUK0x8J0nZmYQPMnhsrGYbBPcSCP+1GopI/f8ipNWEGm0qyeIWURCwzJesGODkLXAoVBkXC0qNuOgNnMIvabGfkWwIDBoUx6BvRn9LGP0re0oZou8528xzy4gkOTOfb3a9/SymH3nOcTd8MpXS32MzwZeADlDaYoDMv3q4J86Fhu5SjCRdj/i/Gf6BQAjoqNMsfEyZMLKThF1BXdzCeh4QJZ2/NX6OJOO6zzNCiaF5TIAEdfRv6wTd0MKzxtl6tfPfLf56PaUAJd67G09/o67V+0getVAKMUesvdRuP8K3oeRpUf8FXNigDVziHok58JO0UmuXc/ASsC5pvPwDKemVNMRuFIuErxDK4lUmhdmL79wFkVm0uUhgXmPRI0BqhdIhAR5AZcdMQcAmQuWVqoqZVCJV2dvoF5ZBWH+GUp0LuM+aF7HmiW4wNvrEKmAg39ID8BbQtgjgGrvKO+QVWANUoWhw7VyYw+POwa/Hr+fTSC9uZou6ymN3Xfz/wws6nl0Pwtpv7WiCzBkPend5bR3sx+xsYAg+oEsB74JYB9y9SGGjSRHsus+YJFLpjx0RhS2M4GnOfMSksY88FoxgDxJD9Zx4nTaeanQZwIg0Emr+e764dznU385zMIbQOMgA0Ygdxnq1Tej3WNhtIvR1Jn9s+jjmYL5yrZPCL4bYCHgDTL/sDUadaAOgbNJl/PX+7tmF9MJ0TBnZXQw5vxaQL5Tbg2QwvWJgZTb+chetjiD8JdjpCSsFRDe2G+rwUjmrEIvWIO3aMcNgr2JbwqsY0lEJcCgHaAsTHBwSN3BgsUnBoEd6V2EVBnQrZa27VFY0ltyGPp97ytRGGhkRlPmNBFcPJNTYl3OKqRR2cLIEpAeJCa1RhJmLBQtXruIyZkb6ev1+envqKyzooBbA3wf4CewQ488uZat6z47w3O2Lqa9MH+vX049Ki2RNd1Af5dkkiqdPn9FQ5xs0vHX2Q3dqHl4ymLz654NqJXqmts3/6BLrXtpodqqxbx0dTrS9j1wqptzD1U/J8eo+BOco0Hy7nrk8vtXibWVdbA/vrOUmL9D7Maopx4ripR4s9aJdLNdf/BvA8UPyyzm63baXbNBDo9GzNLHcZmpNFMLgy1wd4nqApx78bbvqn87dLJw42m2oRwzrVuVWNW00fhmUKFlvc5ev57ffOv4gmyxMza/vDkctyisxljKvI6YRjekyw3nrlEGGmBs4Vc0MQMybgLXEow8EKEluSfXGQzD7/cX3qksqmXKlcIDeVLS7tdoqraYonJrBkIMwgFX75fmlpBVwwkRSi8YQlMDjcllwZHNhqvBgw8Zp6iyqCwFcM6ONwkflDuT+Ue+nQ0cahoehPt9c5PZrOVzdtIuJYZhqYmAjS7qXLd3m7vv1+fc34k/TxEesnBWjlG/0gQXR5eOjxopPZIygs2MgyXXrGshAk8Hxi8nEQRQVUjKNCbvQJzTxoXmZnk5ludkZSocdZugvKrud2JlEhQvJDcKccLTc3DjK/yIB3Lz8Vhc5AYjSZRz0A+PzRC0zDvv3x3PWTSuYoB1JYvysYUGPYjmBMLK5VU07HKV2P1rrcb1CB5rzUxJT3oK3XKIoWUTWqG34gIJ0OVX5dO/I5gzPx8nT/P7o8rOkZ3sBwksa769Wd3Cw6jPlJ4QGJH7feCMFM93k+/fFwPXVgCtmYIV6F8vBuxGSmOzUPaF7lHeo7xgtgfOSqgdWQnW3XUc/BgPHksriN70DcV/kxLfGa2TsP1iOku4LQjkBZkENwnIN64M2eDYxi4JMTNk5TbkDuyzMJCpLNnCOLnGHkU5fFsLeD3eMTVto9Znvik3PlQJEzPHyaIjXL7YUaUzaYcoQ+K9Mw1ydk8Flz57DteV3eHk8NTM6MsaCws/SHtRQgFbXN7gD/6GBME+noSM3G/0WoKgx8kM4BWUSf06eNq6ZKP1tq8EenDwcpTJYFCn1+qaNk6MPpsUNNzCap1Uj3/evDtcPN7WaXJ0rytcprDtinR3YbVzxo//96ve8gocLoaZNRQaK8lvhUGq2b6/W3387n5z5o3kyRQU4TQtNKpMBnO464XtsWDyeefDJXqJiE4w+0Bjy3GoRha1wTWIkA1VTN3PK9hZGLkPLhIDsiQJsmdtC2w7ytqWoempMeGliacPWT07j1obXU3Kb3MQslmNGPe3t9e2nNoPNmoM857Vp/We2WaQz+99+fv6bWj/PL6/n19dCHJpJ6yDnf3nP29fry0gv/+tnKK/R0oL4WCreaZd3AyavxXa44Ax1qG87b7l2eXAe4MwvuCyvreLtIQ2P+/f3cBlNetvNFeEM3duzmQTuuZOsh1tF7TTfHtGsHNajBTRP7d5fnFaaAKUnjja7utWs+3oJ13CAZJ0sdWvGMW1W5QRVlolVVGkGzz8D577HNS7BTpyh842SolHK1LLQpfK8q0Qez3+PNCZY5EIezVgA3wGue2oAcgn7h6aVjbk56WuYJdQQWDPqayvitYrSZM+ZUveN3Vx5ivRvcU6Hkytg7JBcZhQcdVe4dgaJqoyc5OF3fe/57bxY6DnzGwHgIxaJuhaBYrsj5HcmGURwUrMGsKbeNrKNQb+Pyn4K7F0U/hp6gbONQIdHUpFR+WeaSXfnqWCwTujm2Fju9jna9moRfgPXCkHB5e9jBXo2GOoHWGHpvYnUVWyW9Di3C+0AljZlZOP/KcCJmnRxGjB8op+G7XIMX3JUMSuIcPGfjDrHoh2pq+C63oQhAE/+Ns3vH2PYjhTWGRSkMhoJB+XiKcKi42yy+X19OTz2iMphdObdknV7OpyaU2m1yzVta2L6+XM7fOk58H8yeq7/WdgPgj41N1udIHmgzR2OC1ccttmKuexwWrb5GBrx1FheqD0KstfKT1fEAbxX8ZPUjAEVYxxW8MPXfAJm+4egCHBJMYwdeMUiq1oQZ11cEZRhroaIOA40wB40wyUE61D31AprDhCH49OeVTRcehTk2EBKy2iksAujBZH6QTzCGeTq+wqL6V3WJNfCWY4+3Z+IxWCxdBRF/E+DJIwWZIArjxljO2jEVGES5xpp3cUd9s9cnIb/XBonkrdjn0U2w2YqOjZq9XQcYthJpNpXrYMHP/UHO+IipEoubFyNTDbOopYYBCgPIw/v991bYYzdZBLj5pbpJIAZ0DlUtx6I/3BwCPlZBeCdcE/hL3NkVj+5KYHWsgTf+/u1bH+sKtF7yG+BzsCJsVPI7inJGXfhR2Jwjw/DNqgxeSRZpSg3Ch2KcwK3eFGbA1WzVw9Kg2+xrMbSNvS6ll+1PeGLcG4d7fOCdcXuvBiNnj4077LRKKoPLft6f47Zi3OPo47kY2Z/jjJsGaWcPEKe58AW54sHA+J/3DxlNxAobQ58Ru21jZQr2FFUtC4a+w6IzCF5VulCqNB+orOIeotbDQHucEAPHkyxEp8m12lmPP82nnG/Ukb1tJgzqiMpqWo87BNbohqfHQzU3eJks1wTMPkhoNUMfG4Em2Yi0wCEKioyhPXxfB4k2i86AzCqP9Xy9PqSepRY8Jh4CGrpqW9afoBP5+n55uO8CZROfVtw/c5x2QTozuHJ+g3/jbf/m/fLQLoHNmfkcLsnAv2Zt0iGQX5Zu2Hcb/NCn+55e3BQ95El8PGTnxwW76/4nBu3GtBvFbxyzeR9bsNWKKyC/mkzmiuJm3dUfvHXpW6jYNQWxpuHUFA0mVlwXPv/Ofhvbe7bU3Lhk79U2XjdtIxKccDqQleNjtM6VO6uOrdlASKARu/6lPmLWUqvOKCoirJJRT+e13hQqiiDzEl0ZNWwG4zdovaG24fAXQJLqIjjkSxHF7Qgc6nzAoAw6lL262ULbrSYMse0RkNc54yzivnJOReMvqNAzu7dHqC5MCT6FUWEs1YRwgbslWf954ro0EgMsL4R+WpESXiDEsmB+YLZ2q+Mr7ps8JoeZvOW/I/CWnesMkmEkB/4GMyAE4hAXBn8w1E3YwcGGFmKw4cA3uDteCw4091+465prrjjfIiGqOcaK66u5qggbAfL1E8PnOVcmlBXg+qKENPFc2HHnDh2QyTnmTANXACNTtHKBQ0e/d3wF/AuQpsxIBEMlm9bgzItDl5Mt8zGwllzxSMUIhnhc1R3qF7jXIAH0C5t5zG9hehk8q1WrMCBgYAdWcB6IyhT/DcEBs8Hj2e/AjHCCCL1pPxGeaKEI/oa5AI3pUZmS3bqccWV9EoQ7QbCAcOkHHbyD0s8frSSqhGE6rFYnKmxYSRF8CEouvv7SGnALXdFygbiDw3NmDgE2XxZ2WWqdwYIIfz1SmxL6CI4VKI5IUUwNDshWg60BB71KLwKLmAsdA1RDmTl047ARa4kZN+DmiHIzi8dzKoohgtx0sdoVgD/ezhqMR2SoFsDHWUDng+ipD8cE08UnpLtmBabLqELgGwFvBH6xWtK5HqhAbsHfxFkh6GfYFdCWDmMCcOjycuIFI1VZkadmLP3MS6c+NMbX7+zvzpxXOR4fM8CEYulwAyX3Rk98xRQAMHVYgJizyJwIehd/NEPqYhPIVGTAByiHtAaeiTj3vbUfm6BkY8zaPh1Xgzbu3anFBERbd8pGrN+dunTLZuJ6RgwDpETdIiVt/e0DN5g54i8HcetkayRvKl5ZAJT3o6d29+u5g9XYPHA9rOaIjtHvcd/Twfjd5HXwi+NDHk+GOXDh/Kw2h9fd6eHu/aGT7PZ2n+H4XeaxeiTetv+5lfHQgEMlc3kfXAMUVZv6lMoKl/QkBTLa9fANPZnPMAjFg1b9Zk4yH3zko2YVhdTmCaNyNJkP1Qnoal3jfbAMWqujyyDIkDjcQ2inEJBxuMdNNMzVwIgdLSTaWO7r6DI0lEqcieLGmiOp1s5InJHpyo+zreWZ2DGeBR6IgCHZZat0mw5+ZTJr1Emjqg/VC88P6JiqO3DPmPNoymfBTBsem82FVijjybnJpP5NSHoqLenM0sMxQxBS1+Nn2BZdg4lhw12QCMBaZv44wVfrbFRHuu8Bwm8SDtR41Bqp1YM1M+BOlO7qFAHq6CVtGvUigAuYE8MP1kNjnrdp8LPq++urxDjNwMxx1NAZEmsBSVLbmpg75ChA2YA/lLYmtvGsdAi4tVKybsCDQ9at/wa2Qy4tBy5qjtm5BBeJkp3R8i9KhuUj5ixkIRQOLVaOk8lhWKVeLrQDehzcYQnvsDmv7k5Pd+fGJZi97O1g0dCaeEWwwISgIEBwC2d1uEd91boEgOWHtfNcSRISPNxYNrAG6Tfcv5wuT6qgjZPWgW9YB7/BSU3jH32weaBCjXMXZAvMGWrTLpQ79cS1EpYBzS/HGf2IDFABbXRFAZwsjKbqpscYaQEQRk6U65Qfz71vcFpWy+vlvIL7aNSXTrVQNshxIjtMnLC9rfM6j94pi9uwfiCbmExpEDE93V/u+xggmFLHI0nBu9PT07Utiq0f4+ar2zzgfVwPvtFPEWEN4Vd8vIijZEjlKBh4bi0riKzHXzgsPqB3RLKND5BbiasQI3xAOaVIiopDgNXPjxi/n9VBvzs9XZ+SJk5HNmLXbHuyEX3UtjnXhAei1ghyPrjgI6a0+oZQeOfUmqDmYS8Gf0OGFlUkDxa8DxjBZoAxuWTPKbA5cAoMr1FhDpNEQHxGI3s6Srk8d8zENtXMLczEd6fn09fLw+Wtb/DZo9R1YjSTRuIhSuPwWwbdMrhnW742EZ7c4ALks2JOkDdg0w+AnvSxmCaSySFx5qzYrkwTuXJsj20db3iif/zt7fp8fbh+736mTSW92KqfPOovj5fXx56y3TvZruxYpylutyYqnw/iUospEbPBvWdXBvbcI1T10Q3cs+fTXbcENruHAYq0UD5ahZPOCSAugyIBhOLTgo29xJHNeu5FXydTruT/fO3ymyTLUX6oFz+pS/5PUwXnSEizxiMY9O1q31zBPQLsP9D4FhUx1GP/1XrexiLtBKdmm539FmanO9L2uG9Pa1s1yE6VMJRkY6Ytu1x7d1QzSeBd87dwzceGFeYx20SWLXYFpkUmdhE4G2Q2hD7SIF8gUAsDKFuaYGP39o86wfiA5QMPWWRR9B8+lU5yxZvvd0WxG+0/uvov72XsW/Z15oHpf+0JJ01G4HFdrDsFbdQnJ7VqobaaBpRuUE9ktxLBucf6ZuU9cN+4gMx6ZHksRvyxwwh4A1zCebK1HejnvT/fnZ6/n54fL0/n17tTTjf8fnm6v/7epTNW0SPPRl7YzwXFsI9cgbfz92u7QlOFWLiDAEBvNwKg707v339tldcGXJQDUtkDo7mTerJ15zJJJCIo2FxAGdgKl3dRMRVzBSqAH3mpawPViKUeMpBO2uotuJUFwZ9bUHJZsGxW+OcrFtCGkHmbOB+KvyGM3hCIbmBzBubRbcjkbKyjgSCbSQbY5rGm5c7IEpYCRagesJECUGiB2z2YOAWnLPCGfmVV5em4EmVams3uwmGXbQbOl4f/+Xh5+p+Pp38c2RN3s+R+GwFnGr3PXnlTRvP/ModQcJEjsP6/10X8847hz7uDkjocrPX/VBfx3Nb0991soETLc70Dk0BIPisAiPByueo4ci3PXVXOTyZ85UZn9fzydvl2uevTqHO0NUJvkeAQ4/Z4mz+jlSqH+/Lvf3u4dJO1W6YGtu7X09P39levdqvLn+69yrfp+Exst3xACp5H6unFPxrpAyBNGrOzybMzAUIsL2UzMt39emq7XuPWEtuivIKkH+soRrQyN8Ue/Mtotzqn+2qARtkOxsCZ6UZn69fTy/e+cc5kvxdEcjZ93N2v5465z5lEmpyi4fybptqgZeJK1s2cgpY18uvediib2aAbnty5F891ZmsjZ93B1yEwENzKy9Vis0XInMvztePo9t4Olf51WrgC/RYHtqlO+PL0RlDKx84V2yXXsDbmDW+HbvB8fro/YEZkQdTPCk/jeMxurnat4jZoZBq3a5I11ZyaFhEsl11bx8f85m4T69392jdYBvskW6pjOI8gNr9eXzvM5GqO+JNSFHcPp8tjm9TezIMCnXyj/ri7h9Njn8zdTYpYbhweNAnfPZxeW7C4yTYKBplKDWKO152PPpon+r9oi5szu3zrsoKLjd2rASb7h9wF4+fBfc6np/emULjNNia2/gbui1vZoxkkUx7O7QkfbCwWgyf/hd1rgxWRBOc6MKPJf/jfuyLOp07+ebX15P4JUkR3D5dz14nPJr6Ozo3hci8zFiNfsAgJ2lEh93XIYm8M0K2lR3SGspRXDZ9rBHkk4pONmswlju4MZj/h0rTkVAIWAgkbBkN5RgLjnGDlFOZKYlbbRTRq1r8JDRWt/XHugqZWaosZ5jfe5mjGE1JbHKczGxIK5swACDwDK+fIljlEv1yORQacS+dRwK4Z8oaTrSYuZzTYzkBcjzRe8krsKu8mOoI9QgVpIGLRUZ2fbni5787axsXZ2X9Ga818o6NLwz+e/vHj/HKg85032TQXb2yjykO2qCk7ZEQ2ks8I0Y1mM37fPfQOiHwmTIaKFlTupSz7v26Nta68tS4tgCkj8NcTLCkSShILh3+3sgYyftnKWGHRkMLdadytx123iJLgOk2IGlC78IBJeWCCPWBSfuMaFJJWuyL9AF7eBRq+yF4iV4mEZH1IIu8HK8d5P6CimD04zIpl+QBqe0RPOcGboBR1OWMnmK+4KbYDpbTZNJbkmwaH8vX1fHe970oPYp/UcwHdHvVRLCyBwrYYDeggGHCBuZLYt795711fe3ioqNc4QV5eXueEbHJ9nTiqFtQ6V273A67JMVANPbQLdyfjG6UcomNO6/EMQVkgTZHLltsMz41VYf/ECkIuV2LoBs7O9fX87eH99VcdPSx7xXhT1LV22xu7PH27No0xDY86tjaaS2HeFhRfVjyH/dbyXrpzT99khUS1B6EuCSFFigz/ejSMgbnK1BYvf3xjTI1wJD/Q6Q1gLKXkJjLjWuM6t/DsA5/z+nrWX7lrGoNtW8kGURormCg2TLsijGDNqUt3RJHO/7Qxsx6qKJjCgjzkthydA0HYUj3AIIQQkOk/EvAZKqkAmw6SCA/X1/dWEdh7G8DCpZxpAKx+eH9965gLXRTbCYSZq4KIEySvI97Uqnw8mMClSx5ODYoSZfMbRTburqeH8+tdn+rydiZp3ewzrD++mv4HJuiYw/H5oBGAhYclfcERk8KSt7Lt33561/vzXeM62hLrKGAeuWoqQ4h1ix518pEWrT5Ol1OT0IhDBsw+X64PD6fnflv72YZcD4R17q4PfSOws/lSBznnQykiSE0KlqPaFFEK2eBaURJKkwHi8Oof1ezAkTH0yIsguDUAzhF4LVY9AgJC6B8BRyFlugDxwSiCjQPjiRYFBM/ccI7gQop9saCpKvuFb6gCYPxdFJ5Am8lhPr8PNBk7KBc4UA47oJ+b1l/GyGiNDpwYgIOKNI5O1nojRaugWdXoU5nQlHu+2SFQyEsFZalSaVGpQzmtMSJt0+gnBOtJT1rX6mqBslfn0uEaLD5lQk5uIQdcQIqqLbgCMw5SLEiwyQYQbEvwQM2gQJXSbCx2q4q04RuqXBu+y8Jt3G+/YC6ctmeCuxX3WDHywDEnG9UzFtryyExqVVJ29qBdDXgytXaRtADBm2PBxYFeWb7NQS0ySHCd5ySG4tHfCpGgG+XhGzYTcSPAZtw+Ha25PSp9v/GznJTRimwHjjkHe9Q2tSa8wbRd6upGxzweEUioN86sbMpjg5YWR7dMq8DnAYsryhBmmLa4mXwa31CJpg89K40tVFgvVLJotpm476ZZygNPhkHkzN/F7KNiR28mWdaolRWreDPZMVvPA3GmZKMabZTHr5enrkboTMzgTR2RrPjQt0aK5D8n+jkfzCnw8ryNGT92VZF9Nz3Qm3rAro+PrUpqlEp+nKwq8aAB95CdNjchK+m2bTHVLM5qkzBGfOve5jSbZryeboKCA7QJcMHgdDBZAec0BfEGN/RzvWFQkKxzJcqp9jSbZWIRnKaVMPEGg/r4+P50xMdt05+iGsJohzqB2a41jp8en093bVVvMnv/btJKLUN2D3GzxtxEhYtNLBs4Nk0cE7PDNlp9z33l1s1mcHhE7YpWV8Q9qLspSFlJF4H8N7ydzVYjopm+XY49mItZFEfBBmBWrtxIC4aUHUI/v9i0a3UiXePhbE4Dqt+CII/vzuRwcRqt5+fLQ28jzKUMbT6QdsrQkwl4WHPPHUOEQnE5mE7HB+9N0Bkef2DXwmbrT6M/nPvzwkcz21a5Ge3BWqOy2b1L9WBHdWCpmGc8SiGp1APfYYkFmFxo9rEphgcY0LnAr0AYZVZ1Gwrr7ENLSL+/WTqzDc3AC+LaY72oZyaSrsfkB+y+QxuKoB9iVgsQmIokrR6ga84rVi0XIbnW74cWJD2KVjEs4Q7GG3c0Vis5722MeIfn1X7b4D59M4fJv3dDz9ht7WCjyXTcMZPUmahOFOh9HRcR3H4M2fjRsCYSe54ouvBjEwpIcN32AUDv+vj8cn597dujV/Ol1x3AYTJHr3xUMKXx2FGnm3dPLOXeRJIfW86J/g/gdDUanJWzfawSCj98VqY7B86YDM16me4ht52A3LIqgDq1QkD8wdgP5x8tT5OTxTz+cZwhwuz9psDW9ds93Z2OoiXezRIm4pH7iuG4NO1xz0+nzqJGsz1gZpraZbBKn+7eX17OT2+dnKHpiQE8hA03UpJeRfcSiuLA0C8IP5c4WMtP3y7f3196xgXvvV0FQwDETXEHOcrhzXpj44IZNoo4VWQ/jtz2N7PIz9shxp0BYR4JLNfZtw6iTYDLXYTCKR0FI2X4rqRjFsTrw8CvPfD1QZAY1pWZa1jVYWKDyLwlKKSzhdYY9Viv+EhC1HRacECKR8EyMxMb3fHjeWlA2QmNbp7MeCoDzbwy5nE5ribNKohfKo/LYNzuTUYLnQ2wpgDlALzoBhnccpfH0z9e/3j8en3oKr7LLtuwEQR5f0xKDsbvy4KT3TJ1GydCHrbrGDdbAm9+4A+Xu75xwuYyG1ZDn57ObVLAywfJUHoAHKq/jCy2Z1lQwVuHPQUadSA3HJowHUsxCtArIxOZ/hYtn1FzwBQo8VGjhnl9GRPM9JtcaIS55Z8zxubyNFW5DWDftL4MxtxyB+uOQGlnAlmmmQwo+QzolPN7/dvp/a1laojmMuGHMQTk5YE7yhIn3GdOqTOrMNrhfXRKkQAytvNBTM6tyJ4D+S1ewqhjJM/0kDyzfj/k4ZlBtVwg+APnEtdD4RLwEsDbxtOsF7WMUlPqijJT/Tq8Hc58c8yOFHgN3jkFXj/iPvbykdasjgvA7msSoP5jwEmEDhOyZrUWBx0m5lGufBAobIvOdN59ggYXYAFFA5nB3ELbGAkpBgjzfmWvcUapnmN4zm2yxNKCgE0QDDv2PbEokHxbYTv+le0qXeMKFTwPnpZE9mn2ieHNbFphUFlRXYCfYdFU8SE4ODqPAF8xPQ8CXs9XOPa5NVVoNGMfiSQnB1NIJQlLyu2BaGsVrAAAbDNoFuNtjFG1icc7kR22zDCbitJzABV3ZO6ZATsbjNbD5fXt/JTUJb9e/6G137pFcK1/grj7ztzfKJHMt6pm4O4dAHM2idjAhcGhW3/wGiRGDHHmvBfHdd05Opjt339/LsLVx7alBKqTsTKIOG96Djzy+XuK+9uRl6kZ+UaK237ky5M2tGuGvtmDbYd+PT/ddxRfTgIeqjX9+ZF/P399vd79du6etXAtQEv4E4M/pXzN8RXKRk9ZoP2ZYZX3F1vsR/zZlZGG1V6edLDSuD+7LtK4ypuLLR7wVsx5M+z7/XM35taM+bOroYypznZvRv4zS0FfZFFIpECa7NaR+7b4D5INCs3ewq10HwZVBphd0oUN6jDsMd1cOGnwEl0DpDHP1/Pd+9vlR5flma00DBMU1aAGZ55jriBRFWWCV8QC+IU+DoRFrk+vdAC29WrZ+dOjITiSYz+F+xRHiYXXa5cOXMylMS6wP72+vbz3JXaTHAfs/C4M2iLqoH0fwmIma29qf6/DXjvovthc5RgvTkvdCjVmqAsBFfPy/3Dk4Yvz3qkXzL1fLoRCRZ07LrjKhqcFv6JewOXhtE+9gGsJL5I7Q7BK6wV3tnyqjmG94GJB3XdwAJGaQH2iAitrKmGuPueMf1MrM2gTgZ7QUuez1PgIFBFYMku1SIhgFg55kFOZgSGegZZDZcXNommQ25Y5K8rFL35x+BteHYAPDil4h/m6hRVuA1/h3yHW5tlDrs6hV86tIi+LT0WVFxkmZM8Zr8C2e+VMFAd7WExotHQbclcbZgDyNwdH122oQaKJw22Y3wawwgY0+4aVzwyfG5Y8GOLcxt3LsBEbZr/hqe3czoik1Y66/M7/jtGymEtAKI12bhcQkAfMJQgrheI2B6OMWcRTi8xDxFgRDlo5i4NtK2sYCDyVhr4Pze/7Yy+0Z8qy3QiVozFbJg5TIwkZI6QQWJxp4SgbEfVInCnfuDHONjoHvaEOPAABKR0uP2MDch4icLA4PCHTXDoVF5N/hX80C8xzKnDEz5tv1PlL5uNmEctpWEl5fe/T+s6ZGLUDqtIY9O10aanDTMkrIKAryHkwYpdWtWXAWASKCZJhusebJN2nL3NsdvFA6haN0hZp2A5MZTpraD0SKhHc5aLJngrR0aErd/AYl83yZXcYLM9tMBpCcUjm5xlGveJBDZiR8hTPCZxw0OaR1HeYXb3DLTHO2/kf7a/fF2sFRXhI23i1XJ7eO96HzeaMXtiiDzfPSwdE9dFkdvX7CE/59PZybXAYqzNnxxqHtSJUoROcep1Qy2JVJqmEeOQSEbAt1N9ZOX2HRnkY6HLkn9FGp8E0UX4ZgdSffpxfukA3ziYV7xB1eP3t0vEumDHHIWKuW0ow1I8Mf7pVaz282ZB5ixaSm4RAyei+L/eXp553NBUSrHtzqMFUOqNj/Lnj8UrgPpNbDYYvhoGpfe4f1WSK9N6I4n5uEsuzzf7GUQQqYXV9H9VWq1OniXTXi7pljmrdDoGRWzhyZKVVTVUVCEVdaxtX8IlU1e0hIn2IQ3/+o4/STWs0Vx9MYqswrVHOpmvg30zSurERfnk5lHH96geNBXg+Q7aPESvi9eXl/blj1Rzoux011Ktu+WD0vtxrqxv9tzK4XV/b3z2Z7I239hm+dkZ+Mrn7REZs6Dy9t/31u4kpRmkbfTyyGLpyrMmxHJfrEHX1ImvGpFp/ThZdKtIDAepcUdXeKTwPn7gcWVNJSE8yNgQMVg5dj85zaoVjKCC9mWCMe5Im1A4n7BHGgfBP3xEVhnqPGSfXPK2DBfX+1NNuLKZ6OPQGqk7KYMjn00v7xE34Jp5nfRiDUVt6MptzpA4JdQWg7JnWkJPKyCR6fvXbgMk4zaXrX7bPumHi/Me5bzhazEMYHIaVps8cspnbZjY4QDJvYZSi511nb/GX02urXmZDyAXadeRuvpy7Zjc3m5I/8Ak9Mj/zNGAbp7H/dkNZ08Y03ZYL72+kl+CiuRF+4i5f3799O9TKZM91BDXhB9EeDdf1vNniroeiPGtOKMQyHN1ogDYp9gBQ2qDXjGb69/fzyx+vSh/B7EWpcAUSxLkbC6d59CEGYGkklJfj0XDTwMBGfDulskmLcXdrW7L/mZc4rtivbVH9xtaBOvD96e30cH19zSOfX16u/fBbMzzYLuJP3sgq3gs/B9SgPznq8MFLqdR0gxvRAfIGWv1aklsKnOVPjGoUxteGCGL6yUX+/HJ9u95dH35crlmRyn6vTY/IguBMUQAa3tG+QQOsqen9ebqVOZFu0IrFmckqsPFownfw01UKX9H3D1gv6mOboDVE9vHYbfET1YtjB4aoaAjwHbxgXCkEunU5M9T3s1wz1jM9rDo3e9mbBKZOp2BxR+MejLdvWaqWWzkYaby3l9PT6/P1pTcYS7NBbsx9phH7fKrcaqhY+VUT0h303r2c7xMhcKfQ7EzeG8FUcVirkozaDu1ezvctK8TcoLb4IA7r0UhLsftaqq9eIuc7WZsZsFwmtl5QuWQaaG52EFlOlMID6tyTH3if117hNTFImgkHTsOIBDzyryIVD7iHUNhB/nWAD3+5vnYpR7NaeFRmDKy6a4swEv2x/UDeH9+TFW/RN+tmywpx4qX+ZEwCEX7No9V/jBiBqdRZ4p2hzqj2c4575axIYAcX9Rrm2kH1OyJmEITkg+g+twu2oeGAYbE+XDaU5SeC244p7fCX6uZiOfEmZEI3Lkit4ZhhFKRsgoqN/8bNAFiy6NsAHZhMfTDjOkJZwZ/MpVLeVqNVpPRcLs4O2vuuBtDpzfXB8sGnYebXyGlKToGDsm3QgJZn+nx9vRzSdKtsOvrgQe63OsHvL6+d1+LNCoYbbtTXt2vbjGfTPDKLq2iEtPva7k+Pp05YLJhhXOXltwfqVGdWU6NeMPwHM8uUoofGQ3Mfyvki/Q8OW1QaOYXM5esZfpewMczQrpVjmb9JcHexp4aVw/VkwcSFCJdVARhOJhi2uALNpwtSegpnoWin4H51qAMs+MYCv3BhGmVwJTKiARlpvzGXPABrMAx+Z5I95t/a8C7sAkB6tb88dCegn6IMG1jFNd7YRZlG/doJHvt5oL+kdrCM6dxuJGcbUa19RJymSC1rPTQf0KWp/SOmo5ke3feXUyvE5M3WXAH8CPt2mPhqQ2vrjTqpxclKHo/KSBjrqLO4mBX9ET4FA17+s1tEm8yDBKUJ1BiuGUbC0t3EzK5gtgvMyqmI/n2qvhFIlrhyxEy1M1MFoUbsmNlzGpwFb2dFlFAoovGN69gfP4I2PTuZWUyYJhdW+/2cT/cPl6d2TJs8DrAKlFeAFkfPMMMsqt1EfFPtWN3BwJ8uB/2CAZJeiPLWZqWDFi+wjVJVF2Gb6FNEDzF3DqLPCdTKgkhgQTpB6ABxsYwPPZZ1ZipMdvjRDSdUesfavFqvHEuSM0mY2j/HpTkmz9c66QCTFmq5sImiQw5pYhsZVVdWjzK0oiG8zDAdn8hs05Hfn7++f+9VTP1shn5Da3W+u/Tk5pNZhROV3QNJ27jam+7z2GYg7OJQX9tsOLnBxM3wfEb/ciCjHcHacXs8ZNWjVbIyK0cmlm9Aq5v1CJwPbTv71lp0h9/HdhnLEHW4wFzJmogZf0d8PpiRZrNFOAPBTVdqLTfYbBo66Y+1PzY0P5ZfJkjN4V4G7ObAdNAajSh/R3w+mJH2Yzf5YwEhv7GCU4belu63xua3zvitSO3CEgYuQzHhtUKtLL4jPrcnpP3UXf5UFP5vTKSWkbVxpfAw1m5w7B5zNHNgEz7iZH9uJj1sNAbJQovFFZxmFdgWsAXgfX+rj0Kz6cRx7Fj9L9gnF+MoCDjYp9F07049f6ZE8G7o33Pzzdv+4dQxLgUTZi/0F/hgYU788XHy0BOm7uaxBbQMg2QAeamglsFdutPRfqk34Z7yoAfktElaiDl/MNNOoiV4WbYEqFSTj/nEohGbrbOSb9ESWNqPgsXv4LlWSism9BMNj3CqN87hwxUFPxyL8wniv6VbL+Nafv4Zf//9eYBj904KQquCwR9ug3yT3LX9eH597VNkrlGJ9yxpcPsBm2/x7eX02A/dFjaRgr39OMtDl+bwl/Prc6rTdjdpIAncOXD7QdLc5PX88iNxCbSyZskhbm6DaiKyAz95GyLeur9QNf708sf9+aFNECaiD3lHlra+sYkBd/yRdnmH49gb8oK61ufJHXelPXYnRvyBFw3yHhgSSamJ/smFLWP1dBnuJ2k2R95kmlwrr2GSI/vOe7dHbMZbnRnlsLgrfClUzlkGl/V7GPvHkGzWbw7dhuSl3aw+Y87vb99C9+YbEMzGI92Gs8nD/ricf2+NvISOhK2d/G2DdrZvtntjmCTtqH4h7TbSBXN3HH5smQtLbEcmYqcQvUgUD08ulQE2EQKZZ/mGY8WW2uWR//7783++vt0rxrgpC2nz/egd3b8/Pygc+m5bLLhm6OFt+sDfTu8PbbOVNyu3oIMVqahak6+bi5NT0LipXumRYIt5tYQbgHyVyLIxhxY2LGOYdV4euPEahpmzTyj+s6GTGSlmbzqCBUVu6kjuq3LjLTNnpODEcEYKjE6Cx2njK8XZQbIxiMZCmEAb8FreewuM+vX0dP/Q4/b2BoC1Ie5U2DoGN+oACqaQBKtiIg9aDQ7rZFafUPDGVbq4miNY6+OAVjkrETOlXKWmq0EVuujRJr+BF+pIO6cwRdV2aXA1ArKyIvhASzX4HOu/OWRzj4rwoTaooDwryOqWerHWi3rW16wwWE5Yh5WV8Vy9qHVO1spjgWZOJqM1SZCsCep3+A+C7lghWVOpshDrMPkk43awDdg4M0OY2M5aMlmTjUdNk/VI5cYG7wbSz6Bx93Mcp6TZFCAlzeAJrqUKHVQ2GUeqHGFGUEtdYDxkRZartMCacOeKkhRfGPADPNICXCDT0C0s0MMwD1H15fYmwIbwe0FC6FckFGQyns0h0vKoE2NbN6R3+AZrmGMlckqfaXqEzK/Q40P7sBD5RhaFpTi4HMDZ11FO9dv56bVDRPnJLiDDcxr7Rt8SfrsXW3KS5ufTzirv/tbo6Nv5pW8DcWa/OZgFAkspM/Ghrek7unWCjbeluFWS9wKOtd0ISL8/f+tLMMmYfNiw+k9T8cQo/2fredam9H+FLiTaZv9/pxBJq+eA7XLB7kyEoo+U9dwG2b+DDEwqyZosE+CrsfvTaMhD06jJXDGCid2fHy5fzy+nXp1lMbFiDMaDiWXCZ9ShsbUEGg/LeRNCc1icvEhsyo4028dL30Noo0Buyjg8XH50fvBkdpHeRqBexuwoeAZta+jxBLcDgzw5Ucshy/AB0Z25AeXp+nb5VqLJjjEgSE3vimXCKbnXx8c1SAfjDK4zDyvq5/nWfFmZJAUi9vwWWWDaqxvJRUJ0UfgZcyiZ49vnYN7eByd73JYbaVgx8PPLlfKPo98X5e8D+Hi+NU9Ad2r5dafJSubA34RzJsSguBsk8tsc+CZdCnWz0Z/wDOD0AHYBavHq0zFx946LQwaTSbS52RnE425F8mBljjKcikw3JKipYb0EuXPgq0NGdAaWch50RNAz6vwcs4UYqZGaDNBHfDw9tefIupqiDMz/AmYrRKHej/zOLu8fTfzsXE9pcMMf35v6QnaQ34EX/PjI9ck9n9tHsJnid2C3X3guqMMHW+D0/vz8crm+XN4u/3k+P90/Xy89n6fs52dVrOlGetv783Mnb7B4swUWZ61zx/g3jE61l8uPDlg920c6q5ePcJM0Zm8jTZaeEsHqI73evVy+tkXjuJoYpIk9DTdw5PKgHRObKVtSbIY91JGXYzGVhMaAqzxax1q6miHKLugcmLfxr/B+MIOjyQBC6kTwyUcOY/017UqYTf3zen9jtMv3g6iXd2aNS4RbqkYh87ygAATGFxf/P+a+tLmNHMv2v/jL9IuYKOe+9FTXL3kRijSVkrJNMllcLLt//YskiXMuLnDBtFzd8z7MjEZlAbkBuMtZUB6g9kuGxLZF4aFlgpEn9iJ36Ytm8uk87A5+BiGz2jwj45Ny/MyG8rVRy+m8SD8FlEZbT4cbVJ3ql5yHzVsAe7ArGOtgD+dBe6cWlSkBnF5Cy1D+5VXmufRgpFBCqDOP0STR5D7UoNWypavRJxDNgPopGtQ8m3JliWMatsrxaPGYsfaPNYZMaIhrYa7WVDfqI56HTQKhgpa7n3WIhjgCPhd7GQ3t0KhmTVjpYgsEALUbhw4QruTA0NNtm/CU7Vy+H41BwZNlPz1qwSIiVOzB6bgUgRMj1Azug8KAArVgEb/iqQhPW7SPgmqdFd0mMgC826fXwRfoz3qJRUGRYOkD3ediC6+vV8ZMk7LRNUsdgA2jmuUevNSBRr8ab7SmcBfrG4lTcFokUUYVGTYmM7gjBZ8+tGylsKze8gziuaQKePELep1U460vzA2S9jltYv+edktd2z9qus6UrUENkIBtfOpC5Y7Q5hVTK2SJVARAcwy7HcPEOuJg8QmuSqDeyjotIi2030ihlbXM1Ddx1K50lakrlDyjrgPNemcuEloTVaLAeR/NlyApPLxbg4+yISoIr5HayOygADJdVOjMVfRzRzJXRWw0PJ0mjsMeWayF3mT+iOxGGTftGw8t/nTmw2PHLgH8WEY8jpv5+KwcORrpyVKulEJ6nk6BoWtjYjGSadltJBVmmY5xIYAiMajq5JstLfbk3RKMtNAh5BBQm6jrBEZTzRM/0kimnEOEWUSpJ8j8i5aoaFeSCWQLLtwehEaLVp0tJ5xa16fNcPRPMjujdEGikGMvebOJL/86iao9Nytqz6WaD0VoehiyGl3XQQn/UUIWEd4UGAJkoXnLQhB3FiLc7VzS3XnoPt3Jk0PE9A/X6DKgbzVvKhxDxh7WsEKzHnyvvE8FVdf5zm/H+fLql4jqUpaK8T7wFtyzWnVPoX1q3php2Tpk2TJq0PEofER6VaGKs1JS63k6fVU1E1MY3WUk+AhZznB0dGOKw3DWuW+em+rTdaZ7NEW2qjMzLam7euydvfxpQ5AwH3ievgVcvs50XFjZpp/9KNIWN8kgrwHrGilLT/doYEr6FnFUglR5/0VY5rDFQpPb7v0X6uNsbKnY1MF4/8VJBf62QasC/MUH9d9hZUpgEBEJsCLZc65T7qasBKQS5IyI8Sh3dVqLUjAFtWFJ/MUO1AnflOQ5gMSMZGUiDrJM1Z8NY8+WnHeX/ybbxfNZd97tbkZOOYw2wYmZLyps6/06n6gRALhZIKMuwpMnlpdAiS3PmKFE0SWhLFAkf5FSFEJsgpwyrFQKQTARdV02A9uxQu7n9tCehuNx8GtBeV56zw6gVyhyeTsvyyB29+Y6VTBTkXc+x6P17+TxUXQdN0KC7KXQAftLa+kd12FVYTMlaL4mdl/GDMxSTEnx9FDvChZjU84jggMhnT46yVHZ0hQmHA2bkttNUNThd12hqsY6D+UJINlSwA1MoAH7BMH2GFjdLMUTL76hLnZYzvdOXyELpkCW9tRKFMrWgIbbc1Hx8MmwYBPb5TF02alt5wdImKdq5MuQ8/HwNmhwReuJMK60xLwO58fjCagOqzw4wNwVUxJd6AbaYdZRoTtbs5VKhGDd25vUMp73yTe9WZ1wWy3Q4KxVOjxzfI7Zq8tW7UNJ9AjqKBnRhtqIrd2HcidVCHMXILAAs52Ydx3CSbpNOwAy1nvrDkiS8XPQLXLsYnRfLNf2a26X+AjfJM+O1n2lnQAC4WlAXqZaaX98v4IEuskjklUrjY/vw67ANokP+lMLaP9aM+vrPJoxbTuLrcH5HeeDH2TbuRdrIrBacPyNKDCPhIQ1y0ZZU5WduTBTSc2dIqby1sbMkNbl8Y54pp58ZirarBNguhyHL9NWecHXrV84ZXsqLMd6T+X+D1saeVAIlGKeCGUFNcNWur9eoqrHml2mntCC+8jU3iNM5x6hoPno2jg1tkIX0OJOUMVAggUgFQBdrYvb0eZl+dQF8tCVYLJF8Sr2yOhli+ppzmMd7rOSQsv/Cs1R1ruigqw5W2z4SVjn4i/YZEDSKKB5efheWd9hoZBwPSRERUHCAlqQ0g6AVB98gdivRAWZdBOUL2HiWrAYJFSlyM0DvAqKrgXYWc5R+voTYfkU8yFlHL9zZ0WZJcSHbl/007DxamhFlntyicju+Q13NLuuV542nOvpMB7vLthPL8O0vSjrp0weesJ/u0cPtF9L9BeTXvbDt2HaBks4k8cQv+0Cxq/umf/MbPv5fTs+a93SLPMEr0nbbFfGDLcJhs3XcR80dPJKii9w40DvkwukXClmz/m+juNhWLDEPo6l8eDX2OrKiFwFtzu3ytMzHubtdlosdr4N252OS1oZl6wFCGDouIF9KwPBXrC/Vr/8IKE2DwfHQXVPDPzS1n3itC9Bslrk2JFIpyTKhTxkEgjrzF777+PW136vzcS9JeLbzn7HYeM1JGoT8A3Bb9BhhTohxX9wPuRCngFnASW+K54PbqMi+Ei0j5DMs41MsqLYkyk1xGydpUS7KD0Ox+2kcvDadFwMS6DRMTdvfq29bs32xhpI1zKe6vvZOErhdm6/9WVABQq0RbpXUWPGlxfdeypM/YmatDxy8zsWIc1g/zaLStolc9J6GGh5sofHogHO7sJGUmLm4XKeX7aX01vQjcxb6V9D+9lmpUT4+PKiDChq2917TZHmJlnkJyXiLKtdaY0i7yXwn2UTCdFdIAXWIkqDwFaJGtV9cLfmhRcFGPaOmgRpKfepsUed6Tf3U1x5Smtn1H9FlJrRHBxlxowGGYC40Rg6x18U4DoISRp8UyVd+lAOqYRFXdiiqdk0oSc76fTC4YG6Figo5PwJx7l4lSDH80WTWM/oGFQExsmMhH+etC04gJit5e8oJIPcirlshyZGh+vre+wQFPKxaTXjXYwq4vKVSbyZO8VqAk3wEZfNyqV7nQsmMvMhrMu0Jo0zmqDUtnPgOM1qTZsFjwRCf5zOb/65V5loaaxqsYZxzgt/hlBCIqotmzhFtsPhpI3kbNXdAIuEmAcZMxIzyPJHkUewYRJ5o0QZ8etG7GFjNsfteP3/vbtozbtgjdIGBNyHVKKUNvEnjUZNWPqO21GVsCszIl7luTlup9dJpW+1TcLG7lvZ7rDjbgr6v11l939JIiXcKPGod4ez5l6amuIovmToyUJqU7Av20RIsw+S2yoVf9pvLswuG7PShbwuNBMiTsy93og9Y1GF1R9h1IhETMK/EOlFLBsDtyL7Dv2Yq+5ttkSY2UaG1Gqbi/i5TCmh5tSsa2XdRvRfQ2YWuOHogRMtQFtXtM5yyEEXPneQHa+xyzndnzoMY2ImwtB2ySEJEgN1O8t2w+EB1aYCIl9SNQbnad1w+0SuTs4Rj/U1tsO3J/3n+2HYbMaDIf/Z+TKNGHalhwjm+DLtFT447zzZT3fOlNlKxRYMvRn2m3GrxvYEu1qGO+vqGhw78G8r8s6T+yRyK4LNSI7tl30ienleRRCZnsjvVk4UG9rTEnXhZZkVK+M1N/TrfJy2WyUb2nuQEhf3lhmIrysHvwuVbq5iP7Gb8PQEXVRdZqgs/Nw8wQyLL4Q3A+VaIqW+VQolek4twhq7S/9TplDMOoAOZrya9h4X715lX597xCRBdi1/co3HZF57f7FgkZc/s8h9grCpyXR//GWisrQPZFQb09qmoNEJ8teC0E50hkTvx33r/FYEEa6g9ADyTeRpbmviRuL3Mwq+lcz/Arw3ZdxxIMJaZN6XzdrRSqmS2GHRlqZBmYsCUI2goVch5ChSWpbM0aku2TR4UokK5X5z/HHQKNfSRGTI2etE2HkdVSNxy/5R6JnGqHHYmAnTRyjCi7KlIgmad06dcZtNMO6fp8GvB5j3jNjYbVquat3RO5WFI5bDReHIfSYl4rHSbfQ56OhFSb80lEVatDxlWYSNxNQTCxxlartenCgRRFQyKqkthL5w49KBxl1gBw3HDKWcnOQfxOZ1Ex52sm7rni7rSxoNjYtAb7p2yW/t9pratcZrd1k1tLRdoRK1R1EzRLUYFac8I/iauyXIdaKqjJ22ghiccKtsuUar4EHBTaXAkxB1P1m7I22PtTvKMbpnJipxNK4EQQ/hftFjlN5GLbqvQnHITDVv8Tag2Ypn3wVPlY6ozBh/5d7l3SW+9Jf5uPGDp8ak2VIzMeGleR9SoadMqBP9LESxmaVewgtYGLW1fhZShNaCbM1uDHJGl5SZQx6Ok68hlBfm3lnX6jRMj/pfKrmyeY5FonSzP08KllCnCJNrennXIX0Nvc7U4iqE6nzqpjUF2AMcd6I7HGnCkA8CMUW3+wK0VbmdFsJNQq9J0D3Qw4BGioN7XX8Cuq9LrJzrzbwclSdtJs3YK1Lv67Xx2dknNlfVw+J04/rrBPOxMQ39YImBhXItWympwuD+23Sc97q0W9R2gRTmxUWWWloYV9lgmrpiyRDsMJ10TasxdSkJXIoZQdc2H/U+jcJjNBL+LccOR3zwARxmhUyQVbmOJ1uYk8MYE4xBRyqAX2XMH5PyBiWXQIaEz3bKHP+8TN+Grf4selP9a+Gsm4MdX+f9vJs2HhmltSLnKkPSbvuljcfj07T/Nmyn56fDcT7Pm9kvN/U27L1t7PteUNBeZF6Kl98AzojEJwdgryAQD3FiRcXaCGj5E3s1FI0BYBJixgiyXT9H0OFo71yV2BWFpEuQvckuStQHmGRo/FeS4JA3SzocJC2E02+EIoedl/6+wtS54ZPAv6N3AUXRafks5MyxyOmmKZSyECcKD2Eg6npk85l9HiwfxbT/Mn/fDIdho6DBeS3rKa1QnGbTbWVhZZkn4saU19KNqYVySBHRqzDH1Zxhs2Ljnqv4AtGA5Avm66fKT0zDvku9OL4uhLur/OHGxRkuwJO3JrKEzhN1Ypc6bYaDspsziWhr+hbxDoLuG8Qv5TBupmHrh2hFY7vNp87O03lRhTi9aUJYQo1Sr9D0uNpW0C63IDhpV4yrgf15ZsUkEHPJkUrkvS24ghmCsKewO66lEPiyT6XTWVkWFqW50pJlitN52mmpwbwxAW103XDlSYRplCcRPhJg61BNMyEsotvnha0JLqyWRC6CSFycKiTfR33mqYOIn6Jmk9RGpFAHdanwE4pRqRTzm/4eutL0L6sSL28Zxzwviq7wtJrXZg/fdCxdmdTTkCUHJlvXRHIGZArktNWJfomSIG9tQWVXz+iIKUCoQY/LkjzXiNpbKnsJJaXNSwGLAwoBugyX07hUE2NKegs4qox7egI+hMKc+42rhQJJVrvtCQAZIVwDOo3LcxFtumCL9lTkzKAljgfLalNWhXW9sgo+gHhdj7jmKCuGP4GxCvwUKnJ5ixRVmF+Hkguy7Q7UsxTXQZBNEgEDb3wqCdCZ72IlGDAKPfPfyGRYOzQ/vXNwRpUm3qyhKHKiMvN90IDj3hR3cRsoYRFo2BOAIFr38dn8GMNM+8P1Q8hp5JOKr+Q2dSm7gzL7LUyQHFcY127yNpexVR3CFC5IxlL3of7+++cvfh/ILuUkr2wzBke8aZtHYy1ghOEpYLvbKHCrvatfr0VfjXVXBB67HdIdyXTOoLF1i/O6A0inR0WDpla0marL5EM7Keq0KTYIOKVDSBojvg37V5VOdKYad56Q0h+/b7YXLXPUm9jAlIqDG2o766DEY0PXKyEuy2iB85MZnGpYPCRbYijwEqY+UbFEJzOT0nPA5fn7UZvQbA9R5lVpx/zfx43aWM0MuLbLQ9/HzdPzvFdq8B6yCebSRVeHhTxr1MtZ4yUfvBj3IhIDKlaeaT0DHc2GzUwmsYly6W0aPyjNzd4EQgZGG+QMJPDT39+Gy0ndTWvCSWEoLXjCNS3jIsWH3rbLvc+tEQWtmf6EE8SHnRTep7QNkVJZ4verUJvivzcmshcADyZpHcCgAZX9QbK0zK224cb0hlgX/BxCufPG3IXT5/R1KOVA0osqGkEMzUpE1feD6sNVcryceVUbJnQIyu2RfTyIaUydg4OEiCyDEFrlQsKiS2BvrtP5wjRmKYhMfEomCcZ5ZDXdZZTMmX/4E5u1Ik6MdKYqEtHLIgbho0LtDQ8cL/oMuTyACZXwp4vp0CEOZm4LvSZR6Iopw1Vh+uGc4FL3tlWPztwx3AVBxZYVFr47kXGREwIIS5Ooz30/zPulwDH4rN3WLM/F0NXJSPQwq5Z8XlvroaYDLKQYqPBIXccMe1oLnea7wqN9Dcp50tQrASwcrRfRrgV3N4OFKcXjRJM2dc4uF+MjJM3IHJg8ltBoUo1Nw3kh0JbZmPhqeK54uiaKwY3onq9bNXY/Mj7rOQDIFY2p55w+B85BSc88HlP+GctAx73/xReVCXtNJ33now/OThTyHo0TY+X1ucwP2pWyAXK4//P7ZwVztIvYiSt8GTaD37QvTIU2hLWA1KOowIyDkp+tLZ70MkT06POusx2bPioGeJtJqUSa4sSA8kWoR7wEgUilG0aEXMQLXNXCXNRN/La2hzXm0R5DLvKASBfYEkZlL4G7Tl16onrIG/ssjMcEVDJjgcnNev8N0kzUR2Q1kz3xjpghFI/y8FSsWtYNeW38ydxzbrf6NAdGnR4Fgy7g/Ur5zWXcAANry2+ysZPIrZYx9YVWNpGRpV5GDO4huRMwKM01rBjye2dMh5yERegack01QaP43ltbbc/dzuW41UhOgbRJgDeJ2ZRYTBuBueqlKU128+nyvKS6yv361lyxRJmi7i/xIaj2wzaalj80khH4kKg0cgQzEmHjRgECAguCuj8xHnzezCqoJEOoQAQFKzEeCj6Q5mZHRJ8SVl3IGlxIh74z8luRF/yaCx5+Cr3v8o5S/brdnc6w77er4G02bAIqW6UtIvIyKPWe3GyBEOWR2d4ly3hflA5YbsvbhVzfnO5a5OwGXNyr4kLiu9iqHaQz+dKIs1P+Yi/D1k9pysI2rMMX5HD9md5Km0aHEKIjyMxDJc4UjvUDDWpCEp3ehSFHhaxF9s8SR753rHQmmJ5uHohDKLREmD88K1JmTC+DX1irbSPrXnU648Ndtn760JqaB0UFvQVZF6GeY+LYumwVTLawhTb/TftK/MK+zRef6Gdrc69yD3gZx2e9uovS7rSksovx7KNp80KSc+uIGpv4ZWS4dz9cs2FMqxwlX6Zxq5ppphEPHdeE6hj5jU3tP1hfG4xsRdv/82UKUEn290XyTmKDnHRDtTXvbp1n1XXEH6fz6GPubVmNFvWNf9tJWxQ2XPBl0kdEZrJRAEPPu8Zs1MYn2S8Hx5+Xca+YPK1Mn3r02u7yU4/j0mmv0YBmizLRtXuZ9tPpzU8sPRY7yqUxdvYqwa/bFKoaVNvtkr60Q5XbUCHE2+PG49BcSeZeRvWbdwnzapztiVr2i+b7FAk5dOEwHPJze1Qc+z7xDo8nZRpuAkNRm3GRsFszSN6guAHDUKw17FmdIBnyJ1KyQ6iSMGHHKqV6B30SMoCCciwvMs6YrcZEw8SCJPkuxFCUSHKEeELkoXqPtDWjR7IG3E106DvUOAzgWSeVeEQoF0vU8NNKD5syjzwJYnfqxE6ogpfObLyEipfxAb9pcWtzc6ps54KX6bu/bXSmDwVwj2BDJ+oYomyHTDqjTjXUQouaP0GkBnl2AUwMdUNbkHlIoxYaQ0XsU62CV0Ut0bZkhkx9Z6o1s3AIBQsXw5b3e4s+2O3glaHsXkSIEPtPRq/b4VU1qHNxaNYOqNS4pY2CYOP2TYhhA7cE2FJPU+OMWRMwiXgHBJPWJAGgGdXQG7qLlF6FizNau8L92G7yvmwH5d5m4gg9Ayd2o/BTn3rA5/O4X9SKAg+jIvPiAAepLO8B7uNTdTurO+hbWbJmP6+LEUpzQI9/3k+qzGzE8fWyykLdqhc/UA19pQHHfcyYX5N4hjiU8i7/iXGbyucgd/5rgcgQoibvITbYIYrEVzAP59jFF/LiqR/Xfuy9rLtdXSBP5f+cv+rDK2nXXVPsMvzwsjX9TPGpkChPUHyeKCYtU/xtN3wPzUNbEziyMuHYzl4aXOdmmYoSbohpIUWYJ/Ls7UW3ZE0hD1f0JVekQE2LASPRh0KfGHyPHpW/njhEhnCZHdYsgsg+Y7WSX7Q7i4SrYGwRgc2K6ichJuIecBiS7xkP6wJow2rb2gy6Gxn/HU8iIuHJmqH1OlWiEnHb8sT+9n8+b67iYH66aiLmUK/EYyno3N3Yet/XyYb98+t4jiXIvRTQoqSlBOtEWNb9qsLmMrNWojDLYn1EQfbRbWlGnRX9uvXB+i7XQif6OOUn9c0kSzvLFQQm0na9aJWG0sv2x/s4vb55X0Vv6liU2H0TcLKXebud31VX2W6IuiFZIK+EaNWDWYJzxd5nU0/hOpb3cmuTBg89IRCLnGdNfGi/Tmuz61273AHekMwgg3G/wVoBtRy7D0XS4aXBvpf7Ae8Qe1ZIsCJ1+/4DLWKRsQCKgWjFbUbuCC+hrQlAnYvlSxeTYyPG1o1tAWam6N5V7tSoXCqA7RtNU7Dr6yJIGkv8xv2Va1vSfh4tc7DD3LYsnOldRuJaI5SVDxjITaUrLk2NAMO1WGAO5l4cMN+ti8xC3lkLaIU7VkhGgSi1+2w6V4yEpWvnDpSQIw06IiyGepc04vjrA6JT2Oxi4JYREIivNUPXWrDkIrm7ZM7hL5CdZ0hiBa9O2BZj2WAFCH8qKutjlEJU+JHmoahNk1zKvEjdB3elQosfoTWDE9H5Y5iGYpJU76eHBP6iYWBHfiD3ohg/EL+LeaGEsI68EWgc/g5aPqyHIFhHhz9nA6AlegxzMI7qRKjG0xEVeQJ5aUbMiBLlCuiIPTSPxn+lkWsVSTVQzJCpBmBg3Coz1Y5RkRyBUWFMlwtQAH5CG1X4L0SECvI6LKDm6F4A7i59BAEppUJ2ASxLlK8JbEhJJUmS1Ol2Rk1tGE6WNLrEVQklNVKaSZLDE6JapVQRidTUWAgGQowctSqmqo/WYNUw3SITKqzRUXe0dlt7ATeRAgdJQWZVTHq6FmJE4IDiqcGlTuRFlKgOuvmezTCOhaKlegOuSrBmI7XGFtjnFtccySmKjtqr9OXh+S+YOpCKRF9d9jiU0h8hkSyWEfdBxWwagl9/sos/83Hxljr6KXInvDk/4dvOm5ivsuxoJKd5Pc4X1aHrbClX8j4qIvMAnMBOneLfvczH11GJYZhQh7+k7TQf/U5vaUqp4jMHS0PIkYodlZhdWxx/mXZQ5YfaltOLwd2ichWsG1EiKSJXIWpJSagcKk18qquUcZbbU3BOk5bBIL6yfT+WAf0iem/3XvFWFjTAqnfxPhx9WwFT4QQ5Q1si4nTBH0yzBdMhD9sr/GrRRSugmiaPFhxfFY4v0JqLBh27jhLNiTJSsJCrym5eJ+AuGonT2wiyjHtsAqCiZc1rU5ovx2pjBxEtV4QnYXLHWALP2D1ESDHgYbp8zaW9Il9zSZlbgwRgVkjcUGVz3Wba0zqFjTCvcS+1RcMHtodIcJjXuJzFxVKdO1aRvOCLQOMG3ybVtUlUEtlDzOdW5AfENqL+KVxlEKejXVTnXAjM2SMRO65Axu74WxHFI05H3N8gLyGSHtwGL/5GhI1NVEBYK0birFghXhYELsSPwksXCiHR6BKdU3ySbHLLOBO/w/dZItYpEcMIGFO0/xoBDTDKQ6yD3J6NPLGlQD1d0NRETBRx5JX4LyJb0c8t7Y1pWf9KojYzQVx5zs2TyGqbgn4dfTNf9goHIZpCBdYBvRMb9JkeNHuW4f1tNbclS+Fm51zWzCF9kp0tIYkPyoUAgNfTQ9stlJg/tiu1uM9CGGW7GkfoeiOWbdSUGqU49smBJcFLyzs8bFpW054vbk/NJK7AT8SN4IykTZ52wrEfeKR235YyonbffOu2vhZU6ybjnoDLblcyM5bZ3+ejApqbrFq4w9VuOeIl1J2N5TqO3q01vS1QFXpX1Fghgs0TgnNS7qLLBehughk3ROsZye5SlAFuGxW8HEe/p1Z0ptdvkcJla2lm04xWl7sjZe6at3q/A27qiE50DRrrpKQCTlhxhoZ15jYHt11E6svuswp1xABBgq4/qrcsgLpqKZX+kYDImAI/IXlhdBGtINLNkxU/qkExQuiwKrHVkFUUq+41+AuqhMUreVTaBgUG2h5/VdWO+SSiEDw1sQb4sQhdQmyj7LoyGhasJ/w7bI/CKYHQReGPwIoaqkSIW0jhFl4I7N3y2yUxW0QN+InVFWK/bFeBZeVt5v3LpPphjfQkwzN097xiN5534/6bGrP2xuz8p7dqzJeTB0qpK4khck+NMTrNVvBURGwWae8b8/pRT2dq4qzS1lf3sCS5JsGKX5P9Bk8/9p4U0lKI+zXo/jKi4q8kpO0rO2i8+FyylEgbqs46pUSjDpqXVDIOlNP6COVI6mdHsp5/G60vrpfKshP7BfgpqX7KPgBlPSnNHIjCXb911A1iyqmJWsJFaxX3JqvQ1Ybi4+w3gdpS1a7wb0IzaCUf/j7RsNXqrAlr2ER15nWY1EWXHzGGeh0OXu3OlD2hPhfIc5R6hVy3++zZyMNhLnh1Qv0VMT1bG1R0ROxfZ/yIzHTqdTgonqktacbP0xbpex3343EIpbhM4M06wNvrOL8NfkwqfUvyDAUNFhsArREg6QjquRLarIg+62A4AY6GRqrspgiMprn+7ncRojAXuyeBg8J+1q3Ms+8DH47jZgo9x8VS+dQIBdd1xBnVb2grWRug46GrsaKmwVIUNsIWeS7aVfla3OjreL7Cl5+n3bhf7jGoWnQSNAtJ+xLl85Yus/XqW7/O+W3yWYedqL9EbHNDF9s1M32ZFhfLcCoRXUGdnzYhLb6VdmW8tUw1z9vRd6LrpDgi9pWSYoA4gduVStjLPD98xpVUd/kElESJw7NFwtKulMt8XdilisEsTWZRNITNXd4iHmjhUfhwkudxM+2G7WW/WBoouoqks6I7QdO9FtoObb0uMr3Od2UbD5fzfAX6HRUerZDKkwJnEkWPtiu185Z554uyBO8kur2EvyZCpBYQjXaljubreB6vDq678Xyc/Ig0z0XXhYJdTpRrzdgBJaGTEPcSvqBIEVuUsdt6XVHqdTzfd9wvilTVicLRpxIHEFL3FkCftlm970mT3SjLNBdhfDS7WDtF9I3U0nYRaW3Whyt0nXTEdTr1hir51AASxJaDkJuGFA9vaTv7YNCu93ZSt2kL+CM+iPXrZZmkqJv3+aj2BFEaLWE7i64Qugb5vVy6Zq75ODz7cOZMYhqALsi79ZvnfNwcx+E8xkKSWg5OPmdEqGydgfPreD5c7hYniW9ZwKij39PDe9IbpQmJXrtrRid5m4/qG5YHKPyF8dxalK7WSr0ts5yPk/6K5RHqit3AVuUt1f2b1V/BzUrbn0Yeoq7LVqKkD5BRfi/zr5/mZT5O3mfcS0PlsuQDW/+YrgPrUeW55TqaJT5UgKPytll9LC9m0DpC62WzjFBnoh6JiWxWH5CXy/T8Nr36xJZMbmAlzhaCL3m2rD7HlokUmajPvM3L7cYogADZkbcrHfVeJ1+Gv+1+jf70Or0OOrZsW1OCXBS17SWtyMx5YzIxOwFfNCXx0/oqr9v5i9JlLTqr32N2shZTcDT/Eim5EkJfIDSmqggbWLbWw+t8nLZbTxxzQRzzo2nBvgWetSjYRQ+PcCEnkKLrvx6HzfhyUQ/OtEQVgH/3A1JR4M8F3pRIUeI5W1tS6/U47M+b4/jsk6hK2RbNCxYQbz80rPJgq65Q5Mu7laHHMveokYe2CL+NHHtVu3GR2VzMVYo6CybSK4/1dtdvjYXk63F+H1RSUpjqb9SFbs369dvgh1FlbUrurxFEfxu2L/5O9JBJSqQ+O26dXaRbCHTa8qOxtgvAnRwmxhoxUKQvreuuBAwoOaSyhqlMcaaG4m+2wvRtRCVsZTLcaHtY2izo25B+hGguG5hroARIidss/RwCBVDzxEvVmZehTm/DV1/5UEoKsR0i0Ez3vU7YDgNyggUHWYUi6yLE/AYZK5vS1HKlKipblb0tQLDchqrem1tC+nEcDsrhLiGJn3AUf1Nw1rwyZatb11EqCttl6m3wxUNNiHSOrhSPQ5SrHW4GYpGVEDkimk+1Ih/3zEVXPNKb6iK9qQiXRQCJ4D5SQUJcqPAKi1D0pqi1YANw3watE1f25ib/b7X1fBv8UDChe4cwAQ50rkkAXFgcy4HOYQUuG13bWvKQIh5sBG0F6IDo3YzDszYCNKNvvKigpt2CgEqEIVlwPMWC0ve1YYWAmXqVlKiOoTTpXRFDaVJUmiIrdvx7ewKqyyUcCJeLwSUAXV5TOTvWPaL8E/m3eKueSFMVXD/kaoreRma+jUN4ilRmaJawn1lGOr/5lvbmfhd6UspuZM1TOzXdQQWUtgXGmoDybRyO5y+jooOUtm1IgGyKj7o96K+iMmGFlP4Q1Ls13gxv41HFRGa4AYpvTCJakPVIyKIFYkI8+W387hMSbNm7VYQEXZaQlg9LXkVGWqRQCMxe6QB1vYOxE3lP3BoA/5LARPYb9gGBx27tOH16fVNi7wkuxV8N8wigGuYlKmlcU7YLygNgeSA+JTvDbU6oFKCRR52/gCjhFAw8hgIAC5I9QJ0OtIGirACBrgMXACiWAlxXIf2nkf3xx7VXNpy2qDX0yMvEYp23Ohe2HZdWbV3zVh2+C7Tnwb5lD3RQqXrpSVrdYacPawfLWDr3a/qHorepetbbvJsX5Md8USDmlPUKAJwRYfrW9uF6m/fzRW/c5jwNN1DwZ6WYpL0U51ljzk1foYeYc8GCyzP0fjLyWEhqIwuZhUTaMXETAQu5tT04l3tQwlO2xWVpW1u9zUp6tMiklSJxaxl9q5DX1BGtW1Gac7sFQPRClMM9TWhxuNunBIc7C8HXqR1gh6IcDi8Fl9HGbWo4QYTyhvvHLgPGGYQNkM4wbmRkVmCYUs5TKF0A9JIBtcFMQHo7APRFPQDUJqHWW+T8dwzMyPhvw3RdMKwIIhO2NVwhMTY+/ivyjijLHtdXIWcRzHuswhpZZpRHD8Z6DWYXpD0F752FJMGAJxkXQJYEyHD5upXwdtvYUOAVzYRlxL2ibRa2ZbD0W8uTg6rFbNuoJ9SN3nyfWts/F1AuKX1ql8Pf5stp/DqOh2n/Ou3P4/HbsFWc5FIoSXFZum97xcH17u9CZigdcZ4WlbJCJdDGXKO2Bmqzj5ibvZ3PXj5k48LdMohcPaVs6JoHWY4ciznqgShEaIpgi5EeiJEgjcF2hiUX80oUsia0ikl2x1q03FtsCQmnv+Up/k25BfVmsMc4naRR4GcpEkIpDzbLozP/NryOSg2xtynwDwb7vPwvBVKw9dBKITS4QsGNE3w+bw7L/2jXOVPiurWbRMuAf//78Px8/MeyDf39oMAPRWXyw5IF3fP58HQc/xn6yea510Qr+IWs6zgvI897H+yeF2ZjBhtcjeKrWHG2zmzsTZoRb2y9RldfZM09+KRO0Q/UhvY/GO3vnz//eRlP5+cvv03z5+d5c/p8HF/G4wLW+Twcps/T9vB5uJzfFn/RzaA9sU0LmUffwvk47E/Bt1WIdjWeYvBszRWhLBJNIHrq4qY/Pp/G84KSO2nPxYTFdULHZfpjeXx6rDqzJU5SF7fARJ+uONGnq9ZscI22rn1iK5n+GPeXnR/DfOgEnP6QrpWBaWVrOnklb/rq1RQM1n3sCXKT//3z9Mfn32+/OeFX/iQmO/jxJPdddDtvhu11K+2zLNMTNIXZQU4+5tgE4dim6v/DsU8rr/5RoJuYIRgs+4ix+PTHEoG+qvjN7pmvGiu4NLOunR7un+9fw4X/kfbw9McSbg/b6VtkHXzsE90N35+eh/Pwehx2T6fpX8HAjemek77p+eUlfH4f25XmfTBS/7EXa+xIbYLPmNrSD8PptCCBw7e7ghmXvNDDcT7Pm3m7bE5///vvy4v/sfz8j9+nP74N28vymv74H+P3v/32W3BF/cc2mD/fD7+9j19O8+breP5tOcLm4/SvK90rmCJ/dNPxKY7jNfR42k37p/Pbcb68vh0u4S5mo/2SN+BGP0+7cY4Max4f6WFPixP28TeDdV19CPwRGfVv//eTeYb830+LHfQfv3/eqp2gTuhIfGDy+BnwP5fTYry9G/8xPO+m/f+4pfCP07g5jmf74j62TcUu7ryJPpjenvuveytLmhWdnM9l+eF/zvPXcf+Pw3H6NpzHp6/jD/viPkJvjV/c5Tn6YNr/CTb7f+RV4kMyHdl//pLe41+R/TQ+FrSHU9/+TwirL+y27Oopxv23vz2wZ//gbZyft9OXp2X1/SPcaCvTuOLRqMtDCHZA2/8zuQNaqy8MDj8Wzy0rLLzWjwUQ5+3paTOEp/TH3s4y2rfxOL38CEf8CMpNjXhNRowrzj+2g113ofBif8064D7s0/dw4I99n7fhIg/1YwvV2gWDj6r82Ed12T9Pm8lKGD+2dV72p+FlfIrFziZW98FV3o+j8Kk+ihIevX0x8vWTNYNhs26afhbvYeHA7Fk/GikYqrbdxNfdvoaTiuplD+RkVGuYwIwW6AtACwRGwjbQm57H3WE+q/pfXlXWKwXQyIGKjFH35+llUjl0ZutuCLGLzqwkc1glaWirh7Bxn4A5Tgp7biNBnD5G2A1eop9PutYea7dWNmxvuY7P2+llXDIM1fyydutYJyw68D1r0V01qZaEu3IX/rBUPj37aoomxhAaPqXrWZfUdYVyGqDmFCZAi7sVIqKQuLDbqJNHqyjML6TnG/qkC+xsefHl8tIkcjrt5wTdMfoGxESnQcETxp4x+BibkUKmGiMTXAayUE/9IUpXhyhuT84aOCx4VMBlK6f4t5S4jiDAo7LXwHuQa05iODm7sYYi9p4M20WGBS6bjNSpRxNEqKahww/EWAuJaGohtZitxZ7KdiOkKteJEU2v+1mBOTu7m5BBd4T90pbS57Zo4m0axfYxo+Yui7Q6EwfVdXBvwbeN2ch0WIdIQ5oOeALJTch0Ze9jWx8dXNv62I8UAM223LTbjc+T6kvlnRnZ5RlWdd3wpxCPQ06yPaffdCxtU2j3UIn7pdR7XrN7Dxw2gDD8oogKjkl8dsQHJ3bZ3e5y1gS7yowvhYMUhKbuj6ciLcNhTN1OS7sgwH0pgImNVJjaYLujCU0HSBAtUQr0T4WNBmHBFFws7RN7t+DA530oWpXbDyHRE552h+24/CYYMK9NJzWa5ET6/fJwih06whcz4nkgbGt4NGAUYWAT2eixkbInXRAGFoMqii2a27barB8/tb///vnLH79/8UPPymw9JON9b2A/cqrNDkTrGLktITjYg8RuAcweZJ2Lgu7CEGSmSngLrHMCboFrVsdAZ/YFiSp1yNDkuP5jaE0gDSIRp2JqjTqNakjT2A7fqDO0MYacT6dJs35L+/4T2OlpdzjO3xTApLKHSn1Min1owUncRwH7PZCiqJOCleU2NXxAblkFnvPChsH9BuLSjjNGNWMYM7iTAdurAN2639ASzyFrXQArfO+AtXXwWWh4un0eGhTUTg/sHOjZAOc5F+bSc1VgZSHbRn0+PlDiZwW8BitVOqfRhwH8SuHDQO4Jf6LuPV4oPRco446IQTgtUH0U9/FX65AKrWYoKpM5KNSYBcke4vJN7JAhKInZDlWWcbQwn6HysvBLi5FlYlY8+HeCSsMch0Y9zHEixxd0qGWOw8yGNBzkOCJjieUp+FsiqoFiZrABkrUnus99nzqucK+gDxpyEhrYSGx1xMdCIKpRgqDlDbhPQgSUmhY44Ol8IbDVYMXULbdlHNfEUQPAKf3DQg1rcj5lDkaiDHiPtozytP8yf/dDUbOK7lY3dOJouwkDTeqtaplh7glOXs5326NjnpBeDRV6K3wzVQIcsN9sL0rDoTd72Kt0Me5DqojGbAkwCitEAmxHxdfRtfiUiSoJCcM4h+CJyn2fGk8hW1jsXBKkDC4D4iextvD9rVIPut7aSev9tJUZsbjT0omMG4POu8NwDmKWqv8QIm2/Od6i1q0K1axvZl2otn8eD0vH0q8VN7ZyTI7CHszd3FHfMcxxK6prw92warhTJe4XF+bnzymkClaq+xDc/lLxwKatEo9fGDF1IodKrIRnn0Fre4+43Q0xGUyAWY5E9iwObXzctR0RL3Orxd401s4IK98iIeM+LR2r4aw74YXZNxCcAnHMxw738Kh2XAHrQk7LdVym01tQibDhoQmqeoqgvkz3bXq+qKXVmI1Fcv3hBUyGv3OsjM/0ouRrKjPj5E1kVJXAwdMm6g37V0UZLsqHUuz2QAEw4mP9uttYqv6RmZB0WHsLQ+WuCEqbzgDUmHKRMFUJIzsjqOfVsJjHuVFy86xiYg8gQjGAxkJw3zd2I/eD+xZBdaf5FAIX16dA2iG4jve/EsxGF+Ug3HFzCSvxIO6Bv1WhN2746tFOz+3kYP0KLwaXrLniY+dSvNBXL1Lug08WTcHdJkHvbmppxJ32oLmB3CIXwgz4Czp7Q6sESykvkGkVyK8K5pPCww9/gaaWEIBiPsksUnht89jBT3Rmi+WJf3F2SOUEYSRGV5yIHWyGulWOgCdHCUK6S4dxsSheMEeiYhAd/ujrh4gOqrgFxFJlZkTuqlCMQexN52cqxjAz6nkK0goBvxPOGsiHWuZDoGRGPAGjxWaaqQmnZmogoT5Hkyo69EUdA6EXAzvaDmUj5lJ0BoIaTgE/pYKiFMiLywyN3IynmHAl7NxPpY0OuG22n8dgz8072484Q3migPk0bcH7BGrgPt1xPGwHLz7sTS4GvbG6RD/sNvDzuD0PNxXZ5+nmOHL8Me6XWMSvwOalFMNmoRzWcg967bfp9uPrfJ6uBel4S7+Qlg08Erp1PNn7LKfxFHpBZFIp3D36mous4XtZpyHrJlMPTz21Sj41teOsmGI6P325vFwxqoqNINSQCyqHrsVD7afz5IeBtgQQTxqad7tjXL2hJeKHVgC6BhT1ycMTjQLbovUFb7XYfk1poFK4P6FArB3aE/f/Zdh8nV9e1DfYSKXpTm+bq17aNGw3834/bs67+VnJ60rpklYUzNStaJGKBGDpPmEgyJqXUo29cYFF42KIjkcbylc5AsJ6pRj8ffrpX7rRYKdTor4RutmlHOns+c9+ipgAHkL3vko90oWaG4iv9iafpajzxB6+nXwh4hTNTfuGRe2+6lT96nDxv4LOtnpCxpXjUecoBQszoIw5Gh5fRsNogHBK6tig1Ap72aJlVsf+NIIbGCoWkNwrYG5dZrZIy/WO/fQnt8nI0FzKi5JRMPQJEWcwgUetvYRrYplViW/ntPj0nHWdrTDJMHWFlUmJNRxMAHlVCQzG/jQq8nBtO9z1EOKJQ7koY0UoF8EnqIQIeBcWcbThgb8QQC+2SDAb2yEdRom2PvC3TEZ5YKDGJVXJ2BiJgbqw3Qh4Fxso2IKEohmlPmNwLKwBAczC9472SkIN7fY61X7a2OqVyZP+dBg3/obQJ1y00e9AjF6mqH+30XWw1ZqKL53OLoxRz4Oyx+hNaiIawCV6Z0RBsi/YsrNGMRBEIbIDh0+OGnw9O2b4iXg+ihWg47MOV3e/T2/v6ivr2aGc4nJca8xRyXxntg45GuMp5ZUIok+0nyMtVXGEsyG3DgOosNyZtGTI6UHbxSLeihbV2CM6/E7sZtyHiEbIuH4hnVQmPtFzWfjVYymsygsQg3inEHPSKrF2z2UR9cwTQti86W6lmtC0PzeVn6bkrXft+HZxysnTyhU1WLkpWGPC9luwG428P4dJSAavI2QHD57EsFGlXlN+IgmJ2Z+jD7STDxQNOVb9f+7bWfMKNEk/t2vXTRSqUIXXFtXrTMKsoyCDAD7tAaTDu+bJmDPqi0GWNVA58WiUFZfZ3cXX6D4za8zjy+CfKEVnd9hoJZYCqy2j7oft03g8zoosIl2E8hyAlQK22ziEin6lraCbThnZZraqLRV7k6nwTbFMUTasR0PKhkjIE+SN/Xn2upq2LiYqn4GFPeC1rBCwDo4DJurcDugsO7Q56vgevPSvCYmZ18a4D+ydYF5Wpn8pdGYAzqUdYUuAaSVD7CRMdnWwjfHEphHjV2C5iqA8CcVdHZ4z+CDSCWFIwUAdSJ0ovwJ6yiLIR4r6S+E+RhaO1SwBJ0Kib4Oy+OpMPjWRAMJJOQZ+C84R+fAJf6pwTKfC2OsFDiphSVALsRQrW72bo/o+kzaNmmFLuA+0qZDz2xQgbvPaxCixOlEmB503AQ6+MyUpAJ3ImxR+59v8VdXl+0RxBzqod+RXdMzDNz8W7GWhPM9wXQUKNVDLLrMqDHdksahg/xjNjkDy87/lcUubTRaGRP8mwa45fKuikV0vIzu0BtHAf3DmHo/j62U7KPH0lM7bB8WdJ5+LaEYmaC/fp0HfOGCn5DTiw96MzZy56/0HPHdsgPRnQd6Gg5k2Du7NaBuQCAjbvXiIYiJ1qQp90sNNBRAr9JOJGHBndpi8CglklNYcRcedva1bHihQYmULnWPgA9wP7tBIAgUCWICbVIAACO6m8iIrr8i4RV0WcsoEEODVMjNnNTYHBFtCCQggwO9QGhFgAYQ8zPRlmRSoFWyxXOxI/Tw6KoozKMlUGUrxWDYxJhS5tQz2BORASPYTwk6iCoHrISABmtnSXuhXoAnCgAN/C8TYali7CGQjqDmAKCToPQJ1F21g/E4UC8IQeT0p+FeowGth8r9CCo4Fsr9CCv5PUIFJACY4G6P0zLUojM6eHajvhKGifcGWhrAjovQ5gSmk0SJAlXAU/g49SwJTyMEUBkD4HSEqNM4ih44NDmF5BF6dYNithbJEYCsozEqICqH9DPVjKcGvUK5DredWWLYgFRE9MowScbsBcK1o2fDGs8IhVXRIWSSshmAalKnx7UrgDEvXqojJkiCDMRbuHrQKTs/KjrUsvarjfS5uiCRX5t3KcO20v2y9SkafeebU7i7c0Z+D1ZG3bRjLxueYtzrVKTpbPq/GNlLbnhvT6c/3w/PluHSch81XKA06+UNVaa69ai0rqSsb9qfTRZmKlmYtNcX3PZ3nw7ydX6fNsD3O2/EmaO13gkRRHK1+t1lg/8AWkEOiPEf8n3fgrfT5SgjG6SqoPI37s3Fd0rSXsZH7tN0jrRDIEFOFNnXe4Uju8WYfXJdvQGDKD7ggH2FZENtj9dMTT0fpsZjcDrzRCGLgDc4kxBBMVQT6irg/FwYjOvAmQpecSRdLh/E2w2wEzAyTIy2qdKgrQliiXCPBrAxSsR8VYWgqgs9YeIk3+P9TUBkPIJMhYpo1KQLDtVXUWIhInmWksiqqqD8PNiBlI1Y7ZVD5KwAEXFW0Osqq56+AEsjljNU/wwqLCDlFKEmEEc5XMD2ln04YVArcM3mgDC9joWTM7TIWDtInBwFQBRywDBHxXxksRgPDGFvz52EbZHXGKroM1bD5psItGVAJrLEKreIHx3gMqomlLXWNlVZVdkDmxvThB2Z9lVtimxCguQ7qd8Pa3hRed6sL8T7go9yvigw/5YkO8Vl3DB8cru6zcHkIKmrYHWFcFtbYEuQXQSy+/5AqpOkjGizS0m03JSr60DeA+Jjbliv3b3AcobaKmkikkJaon7nNWPBrHIvYrSyyWoGYkXDCEDKCvSXqDAzXLnH2loiwRKkIRR4kmNHy0QNOSsVzGyUlvN6aYm49TmYWiHgeR0s24elKjm+LU6RlW4aKBZSJaxj94rTBfawv1PA85pnKn9YC+HhqRrqLD85K/EW0L5g8A8Uph3MMu2rGM7XnKYcyCfZryd+BngH+VnCpSQWgfVO0rFHhJ/w7ljrQc5EFDpY13J2LsoamOqoyRPrM4qlEuK2CWV1PIGxB2jn7mvojY7Bdyqfzady++Fus2YWsKe3JOuxfEgqngt0iQ3XkvrHGbuSfw7dBcTNNdJyrSYQSCii4kvBHiDQuPM95lqAUj8gzQviM6iyUKPlVKCxJnQscOLD3EiwtGhsTX4FvSpSJEB/2GSITm3K6PMT/0jqmJvtplY7pMuRvl/O0/e1yUaqyvS3AnlHoLTejp2Xo0+Y4Hfz0u7CtDvG6gTfBJ1iSwxgprCbsqP85nc8K8tWY+lOiqcS6JmudJhb+n/NlwQh5vUQTOyW6f5Vbr1r9S4odsLsSO0bxX0kXWisGRG2A1Ylwah+ICZEJWYbopo72JxcW0w/sK/FN3cSd3d+GWiltZ4pOrJLxuI+qGXqNqbexysn4n++e629RSZ5ScdeAeyQRTem82BSLaY9/gtSmLx3KUGFs6sI01IgIf2qY8PKCsLWhzykS1Lvoj3W5V48h/7l0H9G2v9uD+voOJnIDLHkQfoS+Q2buc8skShXH/CbY4o5F71UQ64qWURCxxK/loJDcpt0qY/Z71Bsfz2dWdpVNti3DSoiIrTrzCPo6/tDu2tY1NxG22k/6bH+dvihK50cMIr5OXz7720vTfcQT6uu0na8Wev6hbtvUrLKB/zrt/U1K2Mp/QhHQRcVli3zW1QXc/t24YxBFFwhpA9iJGAYBLStwyDTyDNNWZIlQnZA1O6ASc5zuOQNMys8iq6hr1qHwE6KzhvIYVMfMuJIifAa3DqNPdj+/+5qMrWm6kXrv22HzVX30piMCqgIuvYoPuFdyX3llRiAfNqnfDoeT6sGVtj9GghCwHY6vilpt8vTSz/GoAf2FCYD83zGB/znLdwCWkN9gBSV93UW+HfNw/3m/dkIV/mpv9l9xZP9ZH/ZU6nP9dpSSUWaL/+VCNpt7MDI5ezfeDv4kue1X6Yqk7mim4CkKOizTifYQqp9sKZR2UWG5oM3buPl6mK80BE2jkG70CxM23COtUYOxcmma8qlF46GIQFjjgy5X6u04jd3AFZTtxEbpy7SXJvEPsjSh3EKeIAUvE3xZLjtUBigr8TAwvBjs4cPw97rGtDoC44WlIHgs5JCvZHlI9JPazKw/LBfgf8t1YtfmdGamth1+KL+XwjbZ+TdVsMzrUgdda4qpC4nVytaU2Q4/Zl8ioKvF51C6FmXeZuHaoPWJMzWJT/Gvyecp2eI4JQ6RAggRbKVlZqc72+FfPhUqNzXmcsKaexsLvwx4l+3wH7hQspBKHA8WyTicFOHMFNrEl4CI1G3A7GywA0I4LGrvnS3Qeb0OvwTRmiVP4EkcdsEc0Q/xWnGUfGK5+e4qv+5Z+amHqR7SIbBxjwbiZC7ksKZQ6ijmEcuYKag1dASf0DADS0K6JzGoCasORFgGFR+i/Iy7UPWIzvYCZKuiTqyiZUSVAZiFfQGedzdPsLco8VMVO9aVIpYDcRxxERLCiodEDTE4MCXYwsstqWJL3plFN/YqXe8kPuaXvOj8E8LsMecFmnYFGoglm/8udS0zcs2bxNQv3ofbmnT+sMOMAK4TnZhU+7KjlHbPerMdY4yvw8bfheuE726JDqYNIdiO+9fzm6odCRkjd/UlquCRwBXxKoE+mQibQ2AYo9mo50iEzBPjyzHqbfAco34gRABomEj8kfhSc7UZmyDYQQInBCULlDlIvWJ6BSm+MrONNLbjWR25ZhETp3nyDB+/jb4MmVkmzNGapmuWRl9AIgN5HITeUWuhMieVx3DuopoTRQ1QW5IbfYGsr2TDAO0E0tOFXqIAgNsbvfYt/0hxcDv98fuXPxb73N8/+8XG0txDUlVsjncKBvyQ0+dtwPMmvD7zflcNF1xelX1EjPw23uU5uLzqQwa3t+HeT5+vRpx6xI/Ysmyn69vwR7Kj4McjqRis/oic8nb64893fU0ffF7njR7og+9x+SjUSB974F+OSuRxqTw9FLqT/ajEST+9jJsfG5+KXNqSCa7Q1eGQE9jKmsEf6lx2fyXm3NmalqcINHBsNrSFQTTM+IIwltzW6N9Or2/n93H5337PwFTLI5WmsPvu2+mrT+22RfyA20CAUFaqb8Qj25rrfVJpX22zK/oicdk7b4dYwuZfQkFsp52Sh2xtY1HGSjxs8QWTTZUqai7TPY3fN+Oo+gFLC9NTR0EqgYiqByDmniw8ziCX6VTzynQJWOfYu510wphbz6uGambyND5pX7Oisi4xIshV2Fje69B71X+oTY9O4Jkc3sgaU4nzVub9/+TVns9KbqG3cgZII7pg0u0uMhGnJKX7HbGmKInlZasqV14iLuQnqTDdJe5B5eGlLXfBJroQJAnz/hR7bplOWeLZpoCJtuEyjr9KCvPR/0frnLPSrKuFG/MnCIfmNRCPRUR5OoY3TGEBl1nVY63NSKUl9xxV1iKx/83D83F8GY+jVvjLa7HqCbkihMoBmB5vevPwrIY2G/YtMc1QoikSm98ydEraupY14/Tgj25iowFrZn07AKxRZgLqEoUuUQnbBy3rANAmkc2PYG4hy0uQ70m5RxzGKpb0BQjp18L1jH5lQhfF/Y6IzoTd0Xbe+Giuwg7ARbz2F5HUVlHTkrvdQn5VDNtCwtEqhGU9NHgefWV+PbAVxfhPRLijHJLDtyPvsUJ7vEG6jmaIQRt0tNsm5IN6bsqJvH9+VTiComplF7Rtwr3BG5sudulZAr+b9rFed1jZMEafNgpTYfcHVyVGN5Kxt0uY8DlycbAI4YDjJmuJUNdAV9h1IiIA00VuCXTaIt5VaIhQwwGdZkAQHlgnIl0rczvRmF+VaL3ZFMT25IDk8fFUvTzLZYc4pxEUg6MSK7kK1yDB8+AYc1MRDF6KiBMXLyRlULqMmCORn7pWnlPIU7LmTzSWY4V4IgfgRiS6nfP+tagbFdDW3vODAiS1zUtOF7bd42GtMFYOw1UxjnWJMYWsXFLhIY3cFSuhAPP+9Wk4HgdlfCHO8OX2kZ+WkZZyqCgbasZacwdTF4UnGYwPR7zAx3d0HTX6sHL5sPglrh86NmrhvQLAaop1qgLLqP6RUZslDto7ZGE3hI1leg4wd0mVPebZK9PZZpy5UPAk84+dbaYPZCyRp5T4vE96O7SeQMjckSBnQbXBkUfSDQr81KdpErXC+XT6/OdlOA77szKAyFtTnR8d06IpEue3Kk00JhwanWvxogXXntx4IMjIM2fDWnRgkVglP4h3P1nNPRlvquuuFPTYzu8qKGpMDftkCebkV91z26MUmtZlZhfpdsPmbdqPKjWqTPn7D+Ndd4OykbFzpPvraSN82lqw9s21tBsWte1prxLjsjFBvC436SJ90NLuJV4nGvda6b8oTAD7f7IisRu+KuKHWf2KC9+vofIskyjshcm/R4VdEFmFvAJi3doWydwNXwNcRGUi/MmjSPA8dsP2ZT7u/I+ltb9OZtKpL3A/vF5NgP0X0HzEkPM22AnWYPvn8XhFhyq9AKF4Tf6qo5Q+3KB2w/550T3wQ5GmMLE5iU1qN+yVRWvR2MKx6YH862nt1kdyGMUqKs1dE36/KUff3XD8qrYWU/keZY/cPgyX8VTp2y79B2SjZe1gVybpQ9Bgba7DMrP6jEzYGiEXmY2s211Rxv6Qvd26FpAW1h6ESmti1Z6Xg0ulfLXN0HKsAheWhYzoPrTxldoP4Ax0wMvTTzPqLh9hOAs2MzI5wXK3MUW7BbC8mJSp1lxmm94hWkrFORw3eJi2PaMQok+cPveBfd+/rhKZAtxF8xa1GK9HS5xXYu1gHr/eZtqtUxYFkhIo+AlFDmTklV3VEZP7Gt9maYdYYSK3SLtIIKg4lXpRXWGC+FEHCiv0gvtdpCb9/reX7Twf/7Ybvofkutb2n1gZPHyPm0PWEoxbZLGU+wPATKkKnzi6vz89D+fh9TjsIq6V0o+wyMrYVyumsZmayzTLOE/bca9mqL0ZIoWp9FH3fTifx91BdT5bae7TadHRFdHB98Vq8vU4X/bPz8cluPbDjyXLleXtlUyX+7ihhWUrayCddvldN+5583ac333ceCWfrivR1IHUH5EfXqwaqXJhkMTfpq5w+cSClZVL0Ul8x/fFDFdwVxhiMwgbc4nFAc/WvMYJS8/nEgBE9nGalTqisS3BXx9EiyMfR2uKey9MDGvmPDlzI/fvyN2M7S3e3hPTR9C6B8Ydbeb95nI86shdOlAuKcDqVeO2kmAnkdnocpCCg5vHVnx6J1l0V5cOp15DsjDaaX/sNVf/chx2d/FRLbOWyxQp6oonSzisOyVvZNpddj5gQwJtiDSuu/AFSE5qQEUNiachzZQKoG43cF9PU2ONl27JubXntlJBMyW5FD+RXApQrsRwI8ikUFXMNljQUcnSQDBK63c09BhUl0LejdTTSKpPcShBPcV6IuuDaiQxcSiMJ0iooJ5S6VqSUEk9xU+knlaqZOcbqveJ8Pa7wwWqxVHKkwDv3j3ZNYtj+eMI1L8VnUJ+DO4G1wx8Gl+XX4XxlkwzlyJQF7w00mQ+Eox9G4/adnxx/ZHUMTx+9A6KOuIPGJ/Ay+UrM24lxZrweAeG59LG2e2WtlvRlPWDJCwJm1yJGaLGDG4AMVm/Cl0sCajnqcTED5As9ElLmuDG1hrXlZACRYKITJ7roMVB2pZsL6zAMvpIzCJrzALlKlWM3Tjsdfe9tsU8hdkBbQoQg9zF5q15fFdsW6NLkILU11NW6M65Ld7tNq3b69E878SLp1oy20oEBFPLMEhEilwov6Nija1aSDnxYExkmeNwuhwVac58g27MxEh+opzZtO2VH8Pui7Y7bM3iAXBKKfTPbtypSqTUhvpU9FUYwixhrXu+xAu4y9dBettjt0AU7bYNMCULntBsQSFaxf4hkBRoS0Uw5DKTIKKB57LYP7BroBpJHwsBs8JuQMAVI630G5uPP47jYTv8GA6Hcf/8PA7Pi8e7OiQbaSvaCVjHuta6nCeWLeSV+Ew+te6B8k3gjCmwLYrHFFOciV1k8roup/E5dmHic8OuC7xGUVR8RStPv/F0Gl6VoboQTPrUUXynjpQVIsoJBeLGwm1QZUa/+TKxDVyvRRV+JT6tplJ3H4koKE0r4lTbANDNN/55GVWvbCFWiHDJrVzKcDTsJkfed3y287CkXXKavrT2o9KVzltk0SB9MAgg8bEQoXJIfG5E7do+jMfz26wMrk1DtgCj4eveUs+W6rQR98iEXe3talSg2T5iYNGH0hjzOG0UXUmmi1qPunDLtkRZ3q1zeNH07AeDGirVkjEmRBhqvj9skAWFU6h0y80VlbGmjS1CxKHu6ujGkzG0IZvf5h3vfPG0vDG/gI6Oo3if3AWjqZtOyeIXsDnOp3Ez+wJnSwT6gOzz35ZRM/5rG/kqs/D7FMr2ie+T16m17cy6t/tOavsL1SSthd76kdbitF16MsHVJYQ8br9CkUo4epT0+hWeCWjj2Woyu2k/7VTHtTMBOkVFOU0oTSX8W6+j+4WZopUnFzLxOkZpoCKXC7Eh+lFFavNw3BOmCamq0bS/nBXO4UPU29tAusZlgrBcOa2LeDzUrIalLvx0bWL654BJaONOR515NoD7PHFfp7C3ZwIRKpICaHjqmrQpD93d0mS/FS5+O8/HBYCzDSsYXW0rx9oEyN2ssEM2x54JHSIIkXfV9m44P2vlSBP6sM6WfDc/Ty8+eqHqPkJs3s3Pl63mPJmM0rykqkzGxFRVE+Pz7OfzvPeB73ljztShQFGmBj0qRu4D1Bf0MhHcSjcFRVJ80GLRGMPORI/EYj4+tHVR3Ukdo2ZWLY7Rf/vheb4o/MwjGkN0lIu/TRWZebasLBlctufJ32lN9QVoI6eUjq8DbpQ+UpFAcUkTZ1KU7APWjf90Pm/VHCKFLbKI/tzajrCb4iok+DIoTGHn9YXrtRm4G1RfdicsbeSdr206LeMetqql1X4I3nbRwpEW/ggr3n1goFCBP+DSYLdlRFS43bkgrJZdBgi+XSAiH/NKdphRRDPCfI21IfARBPEupjQfs0jDeGnv3FgBMqoezgKZBn94nB4pAxNJLph6RH1PiTBnOIQVph0ApMdpyj5qdzkP2uDelnauUAvuavt0uA15JUr8dhrPz9NOYzGyMlEmXwOuupyVRObCvDXprUhb0WUr+uQT0SaetoTkL5Tgl3l0rT8vbNEkNFNqKhZ2Zh7mPfDaRGjT+J3EBSHvlZm7y35QPNLcLm0UNVItW2fz+qce1EsC2lzZDMq8DRROoOeVIdIhAAyAOmoPo3ZdUpKLpI0srDpK3KLwHQRTTToG0vsI0Cksf+nIF0GFo34iFOmFo5y5GJZnpFW1TRTuR1kGy2gqhTNl8/g8hOMmppPOfuTHAqhHlzw7ItwPO43Vy8ycXNhvJT7mfbxik+C9/i9UbHiZqmBjRmNQxMPZ97904cfj/K43u9aUOJFGWyik1KX9/ka1YSe04pI+palgfR/I1ZS20wTcc93lg1/spJSvogDEV+JSOj5tZV5mXZSPkDUZRlwJBdkwAraaeLqvw1mJmjStOY0LY2i4WgtPldQs83kadMmp+Ig8GMZS+6J5DKJHIXydKI6I5VFAsJXdCjo8JSg3vogiXK6zwl4yuIXNvDssBBUFIKlaSZyDm7yreULUUEgY1mSX5+tAM7yKf53Oz6EkY+fhZtBnA2uTmonYzVdOqPSFzDeHtCO9dG+jhtKvNsUptKkMDfSSc6nXZeoc4LnBTUD4Ori2CF0cUPQNDcgq0QdHYcWu/u3H6fym6DG2BBqxGjEf7Y76strnNj51IHjVmZj3PMPpFRMFyIhwo/1QSN0v7hKd8cu5nI9+mT836yZadyrUkYpP8c1/1CaNguRjbDYh7AIPBJGp8CWnB3kEQCEM17rESfgA8i+S1ZrZQsjBSRAC9uO7H22Z8SSyYbe3sWGJUJ9m7KCy5jUqCFJ2GjeNf9fTvRcqUSxc9jTIRmFWmpph/wEmregYHZmyivvxu19ENR2lhNiQev0w/iV8SnwGOH//KvUekyXr60Tj5Ikbz6IMnOaUcN2mPqHv56MilEsIXth1eXwAvaiOfWl7B9kyRfvXaf9dBTKPNHSi48zq3h5+IiFYD/J42rklVbqj+XJEBzsO4MNWg2fOb4egPuEIkwrE877kOl3HPaIFfbTOxrSTNbVcbVOURlLm7HYqOn+ZnxWV1u4P/2xao9tzjQlm4bHonguSB1R1naiM253oDQ4XGTpLud+4x4F3CRUpyiI51EjrnmwE8gduoHSGIlAY4GHowBM8nGEbJ1ywoC43VdkII+bvhD4bYlF+oJShhS910lXb649RRhDlX+q4USlDCKpHgIjooZZoC0vnKgR0pNnQr4owxRL/FfhYYhFoUlqLrw7QAn76whORcGhCpIFPAkSaKrvEVbBvjxpYwRoYiwk9NngWTnv4dfeoQVJZrWc7Ar6A2AjKrLBLi/OzsjkpGhNHm8wj5ufxt3+q4osZ2LeAxNMZON1ELtJ7gTI/7iSVj4+4WZtqzbtpMYvV7pm2lvAa1Ye9n/bkJtAjOLIKNpmcPhg8xtwTimws2Bxi5xM3Agi7ep5kkbY3FkZ0uQLQlgCg7Oe94pKbD4G5lLiEVMo27/eX7XYzX3weXScU+j6BKZ/fQRsrPoXrsLfBZI4iYcolUogW/aT1w36b/HC/FxXbT2WFK15purafdd5qk+qRt8ay1USOOh93If09z+0+KpLuBGT3NqpywDKl65HHw74iB01Vek6UiS/GbwKbmr50o9EYUqpwsbvJ5gEOFPdE8YPuGaPRIBRZ3Up341RY+zW6yC4CAY+QVkMIPFC+c1A4t7tyo7A7zay+ZshnIJwuImDoNMqSYB/moiVYTGAs5RXrcYDRijiayD04fgkeBBX0GW/3f3V2h79dp9IqMj7209k7p96ylL7FAoTVbsd9uY5lBvxdLEdApskGXRns7lIEUvQ8Yt0Pip8hS6VspOiNYA52SVhMQSgJoUmvh0KXIP6OFQa6CbElEcLOZdUBo6D+wIplBjRAjrBRcFxpqEWMAsvZwIuWXO6UfYPYm6BaJfEIcEzzfI9YKUHwCeafkOKkGDsq3S3uHAlI0dGzCPgLwNsLVHJkCd59fynV4f18fno/TgFUosiFI/LiV+DePLLuoge1pV9Jbt/Pugdiayauwh/u57NW9DFlmsKoDCkSpVljkZbsJCUIfHmPloBETrDWxvthrQ1Js5AaRM3XRljs5/P0Mm3CUrxd0nF3DT5C4/If3B9OH9RIeJt4HIK0kOMTp6oRFx6LFlJMEihyISZp4m3kbSqWmdk8A8RUSAATKA46fJ0qfHjhXMKVCY0UooeCwyY6g8Z9JjC+/xs97cvWV502RadhiIMfwJ91wY7bjqANAK1XCGzh20J5n6xbnJciVsFjLzrEKkI+GWkoT2zEB7h/mTWBVtEhuqHMMqS7RHbVcX3zrI2esHgrsb0hdq4i5orvHDwvwz1EEIgFzIY/qX1F1QFxVpQ8PygIbS+Wy3b7ZTrvhkOA3O+lbnApXkHIkrJGVuMJ2GxDYYuY3pEoCTvWVZH7F+DxFXLbUXp/WbjK/u5jUsppSpUBxZmhaVxGim0ZTv2MFBD2/UBnbSkD19op2PVaf1uUok7Dy/i04IK1sn5ru+qtEn24zeFLJJmAKeRMody1bNKxh4U+9Cox7PnLP5Vvsc0WgRVp5VZH5U4oUPiYomS4OIgq5B25VvBm6eiTkEeCfAJukRr1kbpIhuolPpYCreEiQ3eMVtedDTecv5zG47cwoGtsSE+N1W9bI92H1SFHYZtcO7SvPZoPvMlsN3OUum3S0n1E5aBhkqNWXJy3bhJKuDj8K9tqbv6yyAv7gapVrxAVEbuxfxvQDyR6U1M0lQLML0q3SuzaqI+0MW4rVgvKcoitsZOgoesWCuDtoX8W4k4gLQC45FEqNlZqbtJbgeAWYSUQACo8lU7KKzHEYDkE0DIc9YVwbcDvhGsD/gL9Fmz80tE8V59NXCQmXr5gS5r7jygtsE0dKTKgI9VjP5OlBRYU8O9Qw4xihGOBKWEH1FqPBkOxcgPmQCgXCYuMcgPDImKTY0ETyw3sJoYHschhYrQGodZKgkOE1oDGayOISSgF8IgX2JJYGYEBHEKBZHgnQwb8RAsNDR9SurKsIzNIZJGB9E781wLhYonfCScR/M5mVM4v3lbU9l4JQmjwR5Vfg7hCQtB7e2d+efn9s2883Nh97kQxYn55UXFiUVoNNL33meNp4R3bcI/9lkSXZX55Oflu1r2JVEZOF+KwWtsX5jaDQpqYyF23z0VHmp59Xmlh8iMjVoziSEBNuEhEkh7loxYY4KXkhYJbHSGr56jRUXsMtWwRuRAzbB/F2+fRp7ZVNifU7bGs37jjMxSqFvUbWatBXKm1qKMXt5vOgZdnYbtjuhTenSMsyOQIbRPuTNfpNKy1Kq3PFcUrV4KKjrn3KzuSz1hENhVoCd2fIo5s1nt4aLjVp5GM0G9Gvy7JLMRja9zrdT/g9bp9uHWTCmcv1xxyTQoe/BLcyg4Qgx9WWqhhxZWDQAfHPRmLomqKgEN0gITNIEGbBK+gzvqg24MezwPHi7U9HvwtUz2kcJ2o9KahpAihcMhnEfGVHOGDCJERAnAhFkgECxQ4pIca4TNkXgKaT5UvgQ3DfwVkhcpfUkMQCHdcSwPqCK1jYz0KCYvG70QbGiGF0OHEhgo8qexg2Pvjfvg2TNuA19l4qli42hri+OlS06wVpjLTBJzADfcepdcQ4awhUFDCA38Wk4w+tWhTMTLsbK7kvF+EfhfOqs9pXESSpUwb9uN87RPz7drNU+C+CTmdrCBhBGa25LPTeyyTBMqLuAeDRRIAyatwQ7bJ327hYydDRR9FIlB94HvNKjWOYmzR6N+7t0m1yBDo4/JJrKR4QitsxALyYV6gJxzReJN7NUOCWCpKCwOkf0Rby65+QK7N0VnKyQhL6xyK7j9OgRpdaYIZa7LaBcSf+3eS846/YAe/I9m7Zaoc2ed/odMiqvFYvGKfF26YMYhliM+qaBISS0XRIUfBu0AxM56UIgxkehp0h/zUkf+OXWmtJHvd05EcamXBayJox+D7q0eR2qcKuU8hYIXic71+x/Jr1g9JKmXySr+NPk4tb3MpfIlnBbRPUUP459GV+hgq06LWXSlKy2hkMSPREGlGpcQkOpwp0EzuBRLE5GoFWNmRELbWOVgE3+Q+Z6rpuj+PAZ3cRhkintyWFG6dQE0C+iRKhwSTYw+SUTH31wgGijEudhSZ3VGfIwLG/iUHt1+IZ4XyB7tf+B3KawK9hNOhxzU/iICTKhFSUwSxcAyvg9KXED+GZFYUuSP2yBDDU6IIRmJCLGYW4HPhAIGfGD0TfE50EP62xn8VcTT2Upxo0T0X/EeBIhLFQRbzuli8TUwQOjhrUD/zfj4e3ob9zZZFb2VLQCkzY0AlHu1bh+N8NZxTO3gtd/BQAOzRqMdxM38bjz8WgVbteVp0uechE3HqXjt83LR0ebLeswibzdawi1TwcVTltoUjL7rYkaLF44FPh3l/UglQKU0vsOuXeaj5ER9VeASqgb08gVE2CBp1+B6XFokDgqQKpofhz4uSN5bdJ6JSHdJNJRfgq2KnyKmeT26l3dufD758T233xl3oAYxKL6D4ybyPG+SDUkIqA6RzQ4I0uNyOboDarfmEBM4ykC692SmxZmglaVgIG1wg4aIFbImSR0WhLBySBUHGpECkOE7eEcAgmps8RKe4jbMTQ+4CgZWao2M9Qn8jrM2uAs3WItz8HOTgHJLmOcTERT0OAZhQ6Ap4/b9CWTJu8xiKPbW2aE1yPxiPIaTRht9hSbiECDm2ZG8WKr9Kzuw7U5mSp5gxz+pwIiT/RWcLymPK84+DUioVEJZPDWHOEVV1e2B/G18aFzYyILENHObTpDC7pQ2ESEAe54Pf1jA/ENSme/TCKwZGNhNuPugvJ6/N3hYS2Cj/kQzHNlFZu86nlBUK04KVwheuzo7AD0EATdmYsZA+ip2hhpmoZAiTlIkTkGehaGMzb0Z8WvKQQdxJcmT74BEoORNT/w67K+pnOPEIEqAUXOzFrIVJkUNA/+gGdRFRxxCETtftTFWfb/f7998/+9Y4palQmyLAq0DLlMfTKresoaIHBdAIIXPufaPkHub/7jhzG37pjk6SmNwUBMi5Zwc8X13gB5zx7jfhYQ/ytctvIXEZxgG1y9JYNWDA56qq7qAW5ixuNYEV5d5y5/5Nj2cKoDvBQoLEHYEXIS8nqlNouKCKmdEYWMCQECjFuFiomfLFiv4bTnmGPwX/KyBHkqmFPl0ohixrv6Jjh9ovZVawCYuqrajLog7xv1bhQMVXgOZQzSA/K2c4TqokQsUsFqKz/oEe3wc4W4RY/QpTC93IGGcrhi1fzePCvCGjK45BX83yYhIT43uF+HUJysLvyAYTZGqywfA7jRb2ZAwgf18U9F6L5LLkQMeECiq6DGRh8iBUOChZAEhOhZhbVI1yJh6QLCDPDFdQo+2FtSVMwemHKEQOwMxaz0cj/yjCTIuByyDCILSp0OtFbdEDnFG5KsJqI3wJVyX6xPSoF33iiFQCDNwgSepBz+yz/fiscPJmJHdfEngXPZJcd4KVOMGwz+fcl9lrw7mN/kzZ8XtiMopnucZ643onqgrQmjTsooT5anwkJaLQmoCfVYat8/F52g++T1udCJ9cI8JmET2gA7FEn6T5pAgw8fuYXn0495Kmr0enFYkizrUy6ycyZhEnwgrHbXLXi/Nd8aWRnkdhFdYDEoj7Ww0ZAANnT2LbCzeCn8hLdlf1OLW9TnjaLE6S54WMsFUOCl3nSdQjlF817Hk+jsP++WU+vg9HH+bWVF55tfef4eMJlBOHqUIuBLAFmqe3+5CBymH2kP5apkTg8x44DIn/joUpEVy3CDUC5LbXJI9hs1V908I5J/aW5WH8l/rgOpMnSkMj23HrOuT75Bfba9tQFGWFOqKn95MSWfPFq5i0pogkUjo0VXuh0sDYOkEjkLEXYqpc2BQxArGrAZezNitszGsWkhW1/xpo9mxP4vu72grwq4g5l/Nm9vXZS1scG0lBlXxxr3NQETWZ7smK6OX8qlQAi0RVMj3SVnmd5E1vXdO6xXE5b5V2cmEujR7RGNroSLrubWp7Dt2K6Ctb3BaLLCFkO1/Op8kXoCsKuyKJ9NqFktaY52H/rK61NtsmgT9BdFTFQutq6yojRibuLKk7FjIUFP4vhCmkUve4BQk2Hwr2M9GgxUeix/JtPL5s/fVR1ebiDQDzISremmU7HA7qzVa22RcKkWgTCEfwInk7R/Vd5kVhvfF7nS01kvKvN4V5GxQnYhAZURSJFSfCskJBro4AYjSVfrfJ+vrtFgICgEkSbQC9yBNp3uJX/zbPiqBiW0mt40Qvwy4qKqpTYn8hKdrLu8+vbaz3jxDd5YxhnkEIFTSLBGlSsABYF0TlT+itBlh4ib4RUQ1xicSaR4hxpTpcfOobO5a2Gdj8rvrcTWnbdhGh6HYUorawpYG+Cbq3FKG0LUqWK1GICXPH77C2JLuTEE6UgxLsqmU6JfhYFuZpGLBIzTFPb9NBhRkPPjvCx/jRxO6rFPZOKM4kVui7Rh4UpbWM3BWQtU9fVJyuFbW7E62sd9X6NX3JCpeyMI9CC8SdbrEZ/KdbJnIIu2V0GDZfdYxtK+xJbx+yBmwK3DK6v6o6s53J7hFOCbY8RFGexJHOPF8Pw3Owzdv4gRXo3ENgmm4iL8ItM+I+IPCHQVaeplsehsnfHPratgIgwC83607LgMqsyMyxkJi7vm58wOOwG8/+HtaaVyk0syJIFZwUMp1f4yyBq9ABi7UKGyrgEUNam5HVYTiOPsaxN/vUcHd3Du7GgNPZr4xmpso9YNToTfaUW+xZiySgVYHrZOnfATyNq1IreBHsNw+Hf0+4b12YOrRMhyR5JLLPYltmHYbjaXwKkIuF9PtYBOxQG8agaOcVfQTEaM6lnHdMhRH41DhPmrWh73WWP98PizDyZjuN+/Nm3r9M/qHY1wKXKlgVK27AfxO5WU9YpwuzDKlP7NrWmokL4Zi4DmNG5cNuOhCkSiLLMJNyQK9Tpkw/i9lMIDUPg0JJZ5l1C/TZKsw4X+ADujzxpk4n7SaWP/Ju8OvE/zkRuuvFqi/V3jMS/ZRloPf5qLZFiZfOIStdUAj8LhrzM5+TKq+VjRW3Ni7vaDBdDrJtnjp1zpu3y7Q/543/YMROh5pL2a7d0+6DloU/qEBi05UG3cKVg3bqDYoxEcmt5EUdhrNnKZ3nZujLxG6VJx4tb615r7N455dZiMvJ40gU9pZBfXc70+i9JIMxTwTRF71c2tYsOa88WH9s58FbN55zdeNqCo1r07co8Qg9bWwABaROvEtxR4xDKkAFPLRUprqB6P6S9goFJqyBAh9ugb0pZqUs6KeAxhA6QfvomPWxIOWXeKoEVxKkQEBCjliuQEZc4Ki1y3r3NxIoLbai67eU3Ny9ALbGBODRErtOsB33r2qtlblwZKjdLTfuqaJ+0rhcvHWl1c4d6Z3rjvXu6fCYyCmdQj4sEneKaxQEGQD3WYNZhoi2aCDu9uCGR5X5mApqhUCf2S9o3CkhIZN9kTpJxqCNUNlHH4jq7iEhYEAgndKDyZGUSNNO2EdQLWaVRsz90oMvNG8lqJ2RH+ugj97Tddw71uCqVq28SqTXPdHLjAtWjb9wwY7PahttJAGs7H/qgm8ssPBxVCJr/9S6nnuHhITA3XKlI4U34csxMDWuRPH/ExxvOqDWClfOKsqVRhWY8cZHi91kJ6dENlSF58CK8fXYvRwbQj3VyqDnPvb8rj/TTn6m4B3UP/USTuPr8mv9HYlXXtxrpitG9FUobSUtWugFUO9AnlnYz0BuCGwEJ5gL3SGArV0fVLQVgOAH8hnHj1SpQNO3Ubuoj+aN6DRLT5sQrSBUFth0Iy9IKOwQC0VyJCr9RHaK+h7RD0Rnkk2A+hY6F1ILwQ4mx+PL4pOiFGcWqvHDRKy4Y8kfjPvb75+3vp5d2T3yjE4MqbTKa1urPBG4jMdpfp42fg4mhvpU9JGTwEedk8OShW+LJux9Gb43m9NxGJeHNu7PSnPBrAMUrHdB+STBe1rGn/xqRWYDVnItzW0MeZpOirFti0QkdG7vI6mKVm2mVS1ZdbBGvbfVUsOrb70x+1WI82rEJDWB4jGhq+RCu03uPagmNyvb2BcQu8NNEuETDAJd6iOcAsE/gWqFFoiiU6B0+0M2QgkJWlWAZNJkQUZbQO9D+vQx8aKcjHBCYI05VJSSjn1YRGiCAt+bonTfn7oivpquFLS7laJAyKw6e1m9Dfvz7AXbeWfHyKv83Q5vg2bVWwOuoDznGQ4zsph/nrEcQAWvLRW8k0RZ9u3Hadr45c3aLDLizIRYEXhBWIHgDVDKyp3DHagvJN7S+IlhbQY4QIENW3ynCNtL21xYw3BqCfmtQwfOIgPZ4O79aBD78bckh9LGk1wNDidooqXd+Zj2CqrQ1db2D2AClXhoMwvQghBwsUEkh+kwbiclebQUIz4SB2wHfwPvzVhFKsSq/coc+W0RPfW7pKUJTGyYmCa6fRzWu38TRwCBW9uK5rBV8u2L0dfj7YZMJoFwgV9zbBZvksasMhJalgCULcNpNIUNT1k75OU0aW+BzCybrAxp7qP6dsOFWRL9j/Yut6M6F5by3ofW0UVzpW3x3PtNAYQflR2nmltjO7Qc5kkplVVmT5i+rkzjiNgVZEYadpCaiII+SIWCBFgIj13SyuyHvly02jdtUW7qOeKr6NXGaU7iW8wUVngorB4V2MczR4jNcVKyBK0Zg1LZqbZZWbcRd8vmvhm2V5bN+7R/nt8V16bNpSZqhJz1oPAwb6eNyonMHAPGYa4YSb9soY4KaCESM6FrmofxqOhSCKV9JnoUIUx8R76VVZ0wR0axFE1VvOpaOF0jCi7sSHLebuO6q7WnrJVVwfhVpEliTaFBU7V5bLY6aLGG9D+h3sQW5fBSLboEuGie/fa62NA/1a4oRBRoSSB4TO8JmT0IkbbGa5Phk3SrNEdTsMqQdjCjpYpoqCxa5LSbQk2JbGFCN7sEKm2et/6OlgjHgnAcIkCIy0N1xU5gt3GrkXi8jkTmMVE++rYLcjMieKA5U3jV5aYDKowZhyULXPO8VRAim73iFjCtC7TpenyKw0HVQjITBisaKDZ1YBkxgDaa0M+1Q162gw91qrpHKA57JHXKFrWdRa+VPU+4QxxmBd2RejELEANpFqKEjKKJebg3ymJwnWiPLzpGWh9IWIV+okcbKQ5gzPVYRH2k/SNhz4I0GbPACa1topY1gdVL6paUBJHpOHLfLFwC1eE+yUgn+xQqTEXdJCJLdwWKJJ6ZElEVnmmXwHddx/WZZXnZWXcmQDRE7Cbi+fkUJjCpuCAmbiHYqkpMwZjSV78yA/8c+SI+KVI4K9YK0WrIEoHiUXHzTKAwFZTcgwz1acSZGep8JyHLx3EzPusi8JIGWE+8rO11fB1Mbamd+TgLcajbB/Nx3EynUSWfpd2QWeXxehtVbTlmHwZSzqKPRqUhnGcoGrLQErUV+GtgegjxorrgFJIq7RPVPYQvk59oSV++T9j1kbX1aK3wMbQ4Gwr81GTqYh/HzcfxeVA8rdbk46fUMQ7HUfk9deYKWwfhug4YLJS8M9tFRcP9DimwzdDmBKqXnpswe+xuuQjNSYZIramX8XjUbkG5KaoSaqe4DRDRKlRec9H/pcYdUgCh/MpUEuiDQE3Fuvzpu5f8Ply5MPdxFwddP3aL3L9BkygveAyTT0QfESxfGqoIIW2a3LPrA7ki0d7WFMZrDye1c71M3/9LMyRtI801DMnboOp76M3vgbJpTkDIGHRhdgyHBXfxZYGcqkamxAQBKw3YnwPxrdk0lnle5uOShRzHoCLogWuQvAlpNQSQ94xr7ZQ3/MspvLdcopJqrbK+cvggNTG503AxyLvk4Xwada2xNTU4XTcUDh08ooTaL8C0BbqTBYmZgHVAutKhK80LVK6ztYnSpt0MmG00O2myVMATOtEuZCKTUMnKNApeUObAlM6PKTWl3+4obWIHeOlsudGxIsJxS+hNLXOfLirWLM3k/EHMFNhqlCaVpKHzefLJLEPqpqHZg8NLFx42eANZonZwm0cL/dgqt4kc+Th+m2a/V5AgqMNgF4GgcIdN1BHus4z750iHIJMSxC4r7LDa2NSpI77Aqen8KLs3YStAs7YCuB1AVgX4+i4SbMz9PmggU17aeh9ouvQJcMtx2g3HSd2PmYmsYxVex/Rz6c7zQGVtGh8/hCWLHo1F+SABwnOFa5c7AimVw5coh/RrDt2+vEMvpcekNfKFPhUEXm/n81UXZdgqz7C8MGMqyMSisCLEHIUgY2mXJm5TP22uPBSfe53nmfdIoTG4Fml7H/sSN6Mrsl56GNDzqUey0q/0LDocJ5/U2Nml03WZ7vRNJz+NnTyncD7HeaOMPorCPkmFL8IvNW4jElY/2cy9Xfeor9xG1aa2lfn5oowD+8asxJLf3aKuniybXEf3goje1MKng1uK/3cbUslV9NYVUzNEaIEAZYuuTUrMwc34OewEmcFJSm3DjadU/8wY07UrEmP5Q/WVucCSIdAylEJ5miOthETcxlQFpKIxDXAfLNfX47DbDWeFwW3t1Z+swoU+P3VvK7BQl/1+8rjfIIRjPzHWdZUlRwggwwwu7xHEkkVZ0YOBmUGiY3ucd1rmzxaSAmKvjAjtiXBRSBajvAZkH4X2YqaqbZP62naz4loUNn0w5X2+DHVQSGIb+VwlmhHXgfwPonvYao/2vWNjH8bjedJgtsQHl1wJy2AqxjIX1Urk6HE+z5tZIQ1klAF6X5Gx/lSEUYDwGXJ/EfomAAvY18icgSymISit6yAKzxXVCXnzJM+bra3VYuUsNBMbRGXQiAi5EBwncigsSEuBcG4p6MmgFFjg3zXUz2A9KVLMFuaV2ob4geLG/c1/Po2noNhvfFOpI/862NMiUqY3/koy1gvW3Nc2ezH2NG8Dk50iz7yYlU65xdp60m14BXCTEKTafV21C+1qiskA5Vxiaig8F/BOKdoiDNGX7zvl5iIqiclYTvUba1MWA/4heY3Pq0iQLJah/R57aYbx6erI/E2pA7aZCeYsw+IzEfasL2MnZosbz1BWlVMb6nJVSlbCFK2T2w263LKxGiqBpBqrt8n9iDY3UUs1Dum7o0diTIU1WXVD3O+4j4l9J/WJfPe7jwlxSaHllQASX75s/VAvryub1oNCADF6ePz8ClI4u+t8wb4io1UKxjlJOA0/BsQKBBcHyXOAUuHXwiMNP9GrBGAmkgukY4L9PS23cXrzw5iHcW1VBgVscdDivH88r4KHdV6dgli3qI4C0DeItmHBCBV9d1ZCHoNKbZK2SXnELLgdkt6Ik+xq7r/EClPcR2lsXGv5WBWCPpn+mpfHs1iALonMafzzEjRKOxlxFXcK2eOTy41940xHBq5bKSoPepdLNXqRr+B5sTFb4bNry/C11XQ/SVDZ3CXGrq4XaQpfNR5rLq3O8PjXsu7vE/ttBTsvIs+H25/7AeIErvooPOf5wRFZwhQh5eaT4pzeLv76Wr09KfMCKTX32meiW2etmX/12qolMWoobNBk3sfXuG8uwhpkL6wN68APJ30et+fBp2l6z8ltcYwiKLbRxhIZ9y7Fpliobl38ok5vsQZaKdnCOTur5dp75bDfpvHdH9oznYVERrmySntRzRMzg6YbXZ56AH4e3Zp40VWSJH8+f3mKJCe2dhIc+BKaWn8+f1ke5bQZh81mvij76Nxu/hV2Ev3nZdDoALuWyjqJrSsaN3TOG1Pdn9YpbMSWNpyG4yv+tOk5AbcW4ciSoGeLCabjuDnPRwVRa+SSoBFU1a37cMX4gbZWW0m9FsC/2YN+NPR41AUb0QD/ROBWHgP1QoO1tDuuyxQqaPYeB3izEAImAqQPVWEoJnxfVOyOoTKJlYH6X4PrxCRuDjB9IYLPWpe7NPfGAsmOxoEjYrocYDYAaOTINlT5pmMh+Q8sDYW4eCHiTKSnALDAq6rC/lChSFTRkplPG8QwkHc8CgLATr3axDxfkhygj6i+BwBQ1PcQlCLh5gbCCEKUGnLxQoWcRWNREEp/gT5OqjLtsXJhOpBY8eOtX3oer7/3WhO2agTejd37uY4cqqTmvaRP56yfd/X6hf7j6WU7vCpMoa++ini/Qw3Zgxk6Bgst+yjvZUdNt8mPS1TsA6zL3OuaU8OgidWPEFcWDZsQ+GZpEUYJXjvqvF5S+DgKycWj0HsTSQnWKFxfZ1l6arvBQynmpSBJchNxy2jd27yOq8jOMuj/1KBqf98Jg9KTWSe4TnCeduN8OSu+YlVJbcGaa3wdX/E68hLZ+U0IqYzH7QJ7Ivemuo/digA5ux9AzXcYBfadhS0pfwoY8UVu9zquX/LzFz/BMyM1V9yI2eO5VhtdeZ3OgduiqR5LWxgm/wUkHSgoKGB5rqqRFwBoC49aWvKh1IjDLi+wExbQhYLWSs6gFg9f4N5jFn8F+V4Q34A8o2iDoBaUgzCclwDi4g0LwjObehTOi9sIIkcVXrGRUrTA2AWQXFeepm08iyJXKBLQI+J3xOdBytqd6NLSEB8tKq0lqNll5riNZebuqAT9qkS/qgQUP7RIvP6Ev62wVirVQrmiBfgT5qgxXpPaOpal4Z+3fWcyjWzLSC6FSi+FmFUSODkPrCaTBpNF1/Ed1NZzTNz3b3++H367k4p9oEFmNi/Jh0p4FNzH//xlEcPzS+kino73XVIH1HXQRcL8nwpsU3iMv2xtrjJeVB6Xm06kqIXeMfDmgH6FoZUFjyqiUricyffvxAVKtfvEIRwrrMSppkAOF+qBwOEVFaKuulK1omvPC7lukb4bVaYzNSoiFY5wwHcPNNfKUhB5QU3kGQU29YhOw9QIDQHE52AXIxLHBoOD1y0fGPq4VA3RPZ5y5f5x5TobFfRSXcogPO1dp93t3RCZBVitdWkSmvAosHbuP6E/LtoV+DjI70Ivio5Mwme+wU/ggSF7Eg7xkZOb+xUNEEXuxzMcXNWiUjUfL0eUjvP4HfdElCILUs3pLs8qbywzxC4qPOUFIx+lTdc4yBs8AxlYQRqJLk7I3kFxzztACjv8RYeGV4dnBZjzhxziAXQQlqqAN9Bclf4ltFlDgCgiBmbCaJSwP0agA7WoSvxX0vcltj8Qpi4gfFXU6L6yUin7Zij4CvVLBY/x4Y0Q8BCe3pDyYGzTiRYj/h0zcPyupysxOKt9j7hIc/xNj3BSRRj5MLZhRJPaHX+7n5e/Ddvt/D4+/3azhFZpn2lU+XOe0Mt8O7/F3tit/wT86c/3Q+5HD7Z5mFCUtYX4/nw/PG3m7WW3fzr/OGgwrOAo5RlfN07lB2f+dezdlWAyzfunzeKH4s/QerAVfm4r2aDLDM/jZtoN26fd8P1pUdRR99DKBDJH5ttVYR3DnuFluGzPT+MVNPn05fLyMh6fljT76TT9S89Xe/NhYaw0eInMN+2nxefkaXMcn30p0kXYwJsNh+5KiebIbNcWy/Fp2r/MT/dE/0ll+n3r1ZxIIl8p3nyd9RYJPw2br0/v45fTvPk6np9iQLy89/voudqTVk13v7nNcBi+TFtt/dR33kcCrZhupWy0mGE3nk7avqzvvG8CJdGuXlnV4fBBnb/3YIqIb4uu+Ymx95t54eQ/vc7Habsd1AR+KQ6bQISs8nCCy97tB5pJ2nvlRoIKIi4u1ixL1W75msfjsuvs9FLxWR2IWLtIDPxghu15eDr92H2Zt0/P0xXirUk/fe99UMBSdM36FXKbTCwTrYW1oJS8WUJFp5WzxN+7pMTmgPB17fo1cR38X6ezftfe9oE6fre2Uvh+eHobh+fxGNl+pax8niMd61bS3Jax75zdYK0VWeYDetD9iSBDHg5+h+A/fZ32z2oWb8EB7dq161e0m0Vu5vG9r8i8Cmus4rBmuvsJNe/34+b8tJuVOXeWe68cCsHdSuugZZLd8KrID5lXiYiFO2tG/f40HI/Dj6fnaTfur3FKaJ9SZIW31GpGvut3wchUfmUlK/1JVOlp9SRXtvnTEt4+XQ6H8fj0Zb7oj6z0Vjez9W79brhMtRm329PTdQ5NcW8b/52HnJmfhkK4SW/x6jJ29F01XlDEqmy3flvkNLe7O4dlu8bbaUAB6VZqErhZpueF3vwyLY9QO3AUWevtOEBNdP36rXKZ5PotGPfhB3NUwlvpwOOmCA7EYHNeyufeVNg/+/X75zLV9Sbs1++Hi7Ad6CKggYez3J5agEErMp/Wy4w50oVKTbIcjksGg6go8tT84LTBrtCv3xXm4yK4/vR8HKb905XoHp47vUdQ6Pr1G8F99Jdh2i43cKXrj1s1uNTN7LP1Zwsb1E8L/utshFyLvYD3mNBPydav+sU+6HaCGc8o87vtKKP0+fpFf7uL3XD6at6KH9ehytrn629l0QUYjzfAwMKiHl81+ijrvW0SZZ0+wtFYNUuoOFvkmfdSWBIq16/4ewxznNXGJT2ml7HJp1//cZ1enr4Mm69OAiN2C30pvdn66icu/OUWvocxVy8P+qL/idLAAi25KCEE6R6Z066v/4nk9TwcX0cFAsw9UCXqjn0E82ANezm8Hofnu7lvuJpyaSeZsxja/0RK5qZwpYrABGKRfpWz0DM4gnq1ZokRunIv+qSmTb/SYnMZ97r932INlsm24ze1e+aF94pLVlbXv+LbVNP+4VTeay9RsF0pO/3n++Ea434btqrf532nrF5n6+/hGmKe53m7fK0hFEq+5nswWcbwLejzuFq7Nd207Mz3E0HDb3OPGkfKcLd6dXyZ9s+n8ays2xcyhiy6Ijtu1yf1y8hBMbeTzmg0N3FmJGvHvb5XBfwRDwLPff3F3srww+X8tpn35/G7X7bJZXhKX4OfGTZOMvOixCyyrX8C3F3X+tNT3hy/b/W6+XDWWV7eeYlDttLgUI9/z/CjE7S5N8HqiNSbID5y4Y28egPFyJfTeTzGhs49G5hi/Sq6jWw/bs8pul4fd9wHfhm1clvnVfiz9ZX2+4h3MP/yZS7vMSTd5Z1X1c/WV9X9Gb7M8/l0Pg6H0H0+79Tn/7PLVU8R7sYSLf7TT10PH32xndyB1wc7xhTH8XTZKukyWYmr65/92k+H7XS2F1MpEbZ1BNiaHv2yX4oGz4nx5YFYry8838dHUyY+togS6vWBlDH2b8tiUBxgCy1dF6le5lJCOV5rw2rP5eVSmLlev3R/nMf346TO6kJmIACGlCvZW3++HzbD5m285oOxtlHpnaxAG+XZ6kPw9nH46C2xLIG7LKPYWeJ9bEUqTLLZzqfxOdgGCumXAUjRHV+y/hZehoU9owgpeSkj+xrogXx9deE2+m48H6eNHlu+WyRVeb76uL6NvXSJoytIHksNvQvXp/i38uT/q+7dltzIlWXBf9HLmodt3Qnk/djMl4wda0uxWCquZpG1eVEtLbPz72NJEu4BIAKFUqv33vPGVktAJhIIxMXD/V6MTrDeYrdTUttVUkFg6NyFjJJeDbL4Y33hht70bcOshYn42eXlOrB5pK0+qpzhvmkSppgp8mDAkj8q9aEvjmQ/U1OKFB4QhN0hbSWc5njF6HRX34iPsfN4qpWeMSjYvKtUf74Nfav835M4t6Or5D98lMLxAcHTfsLxeTpeVyWdNSzUlihyp9A2MtaXuyjVIyj9FFMkjsVMqFv1NHcfU4TPyXtEbj2KUWP9dXCfQEUQRJVHQLD9WH/1hsEVUyd9wYFcXPWRyX3svKEvroLnXU6fGXj5uhyejgfljmmjMw14ZPdTz79ZFZj3j2ySMpX0zNk0WH8WxFT56JG1AKaz66tPtBhdvXQm2aIDrIj7qcc31ygCWqSdhfWTnLZv++XH2hy2O2lfPcInANjf1fa9pdOct5ecvLhr5FWKnIn79Lscr2vErn2TTqbFMr7++imUHvEu6qJT+hc/N/RveouWraPJdp7B5uFNZzEcyV76S4Lvdvq5d1G/hHQnB7gGrh5JdZ/icloO51UoSTO2XSd3FAq6rv62u0+yfobNst+v5Ys1b3ZKQXNN7HkA3FupTxdNlFn21SbJ14Al+cToKyZs+3TLgiZDSxeQfcH1oI7tv7ab9arQbtIuco7ROezqcQ/bf11Oi7J/1sKZqOqM9fiZtXB6/L49LZfLNqFzXO2ZeF6iyeuLv2F05UjJexMw5q4e0pLVxV0nKQ2E/J4iu1Ua8yUP4btB7jgAyX1T/bTftseXZWV+SV3QuYmDAhA81ifzH2PnXno3SPMOGUdfXzB+gPMyXICXzDLOB0B9+4l84ctyeDq/LH9uX7eXZeVmSh5duG/omwntCzXjP5LUy+ZP23vrIyQS5arqwTqcxXJJetmaDHJE19UjQh5z3I2WenmM0WKBV7C+YhGmWB9e8URk7D2yg0ThIC2Pr15K0i+EhnDQ/P3E4Idl86ey+vILo523q7cJj9EDZjJfnV5WLUkL6utrZskUaa3azU0cpqKBpv5aekwRHM7N8ZTwzni5hQDE8vUBZDKDokbleglkZKePr7+toknOl+MpmUA6aiMQMr6+fowJzm/HwzkZXbakjBBF9vUIssfoa9JDSfn3gkmetIWBhvBT46+olSy/1cva3Eitp/qEKMbP3P1eckeQ47pvlNomSL1KVF7ZbL8pxqMzaSnZvdjZMibZHIb/P8hqjxeckZ+1f4UAoI9sLFyMtt7FCHPcsJBEd2XcbG6Q/vMktLM/O9UNpahs5EFyok1IArf1SeAwQSmaGaSvPrGbsf3EYb9Bxx9Z2xQ47uYmKoUCyzvWO6m7w2XokkEjiAXZ2+tx1ru3753mSEYYC4Xk7MOB98fDN98PytgRWEqTV6sdO3dSh0FuFna416c5HkO/H09JNDdH0CVyfI/1/t06tpE8niO0UoM4dKwHYb9uX4+nH/fb7C5EZ3mRQ8RPKshqq99EzlUGMw0ymwzMmusr2RKTuW4xlTnXKLnDgfhyfaWczn++vx22346X3SpFXc6Rzz7ew0hj18PZD9vzZfuELZEMH/loQEqP9VD2+/CH6+vX7UmbIDYcCBTr3Y+VUONRMb2hMrREwig1tf0nytQcXB1W8uuF7vLaYU2AzaoWLoetr2ytwz7v1ttL9SS9l6kyIbj2MwMrl9cq2yEf/HPfMBlfXRjZ3Oy7Sj7j4vi/vS7/yrtEpsYUN834AgpT2pAyP7noVSrlrx7j3tsDbr0HCX7Cy3tHSDV9fljt+06y6czXEs1qo6tL4gc5en2NJh09DWbXVnE5cn36WRs5b/OQRtKP9SmQZHQlAFkbwOWTf84U3Hf7moXaH2/h5fGUrIv0mX1XH7Fy9DXq/r6W3vJFl4FlkO+sHfx2RJfD0/Px9L6cntTtMkRLU+/9rONfn97UDR7FRH19mPIYU31OWb3zvfvUtr4+vWnbwkew0f5zF8865g0rtt/9Gd8PUYkjcJ9UD3vvGzht/5mDu32U7PGfiDHXkUvAOR/FM75vq12sFUe0bG61UMs/HZv4Ig5+XD1G4K6OfD5eTxvNTZyjOyAMX4/fX4c/74+XO493jnsdZOPmhMbnT9z8gT8if3gX2Q7kRuqzd3d0wPH1bb/NHnz2cdyH5GB9NyARAVrVapBpowlF4r4et3sbP9O9Hl101eSAv7pxFQZXN8hDD4UJ/5DcqRka3Xh5vneQrtWEOKKvZ4uIB8/TvT5C84CMeqyvu3GGf70sK+49T2qNUcUQKhz9T0yi5bOGUYQr4JYOfMl1w9/uZCSylDeQ3XEgKRsUgZjKKd7WVqvzZU1c51GxzHB68rZqGU5P8UFf8nyDY7DeA9onauV9SInmWtrDMMHdRSjmF7yP+qOH+hKhmKKcVvA+QtsNCnf7x1NsXrabP2+a09r4MmYbammL4/GPp9P1tp218cdo/Gr7J8bXRo0Wvr7sJUZ9vu7za2dVSopG/pn13q/ehAKtjtoT3FDfmZqMvT+elS/ZRopyg3LTFMXO8mmuh7URS4dmRmhrMexnXkWoISgTRN1vQ32kKSY4b7+t/9c+XO0QfZB6Pzf4XDfmbiXNPspYc4IOcV8PfrpXCIzOzDFqCkBRqq9Pot6HzylAZG3fg5ZxUPDi1WAxMdXKm5DAREZZ6Qf3aKCd/OSraJ7YGDHBo0bU12ePxASpkM3USndMWRCxXuAvD8TkddP99rzeQ5uX0/E9dnhaS3TPNcBgjQUthWymNVGwT0A8EceEa8DnPtazTdxnuXcoxF9GwplmdGwM9aVVOfR587J9XZIJWjkBZOHq203kBNm3lxaKFObjZxyNdfTt4Undt5LGYAbb6FAf4N+HPx3f0yePsvratvzc0AHVmGycqHKg7MjKSXLrN0cApAbyI2M9PmXlpnjdnV/XrZ9dCxHZQwuFl0+0gKxYBaMsPrfCHLWkz63PL927P6IxZZ0A3MxOK3JU4wjus/yW99C5ZrbozzsI85G9zR77tkCWa+0aaRyg9xjEHevXyQaARXfdTCLeejYV0YcTjyy/xwwllqG+SVqMrFHBrGzG0REAmzS4eSfy8NbnHIqNRS7auq4ZOVW1SRITBLSQxiEw9vJmCPpH/tEAUT/R/vjtW3qhdfGFRubk6lvnPrbq9kkMxwwGxqG+w+s+trpdZb4bhOeBN7p+7PygiXE7wdj9yfXQJO9G2R+jWZ7Pja31B85dBJtX+v+q5ijYoVEuD2jM61OcBJZp1/wkY8IZsmRDfT3j/CwZkTRCpKjwNdX3z52fLTokWVb3U30dI8VZJUst7EsneOLrDfJt+NxjkPXWLzMw3UO9L3JDbeWtu7Os/HUktFfCVV7Mg4PHBVJ150uX8W129SoWTlZHFv369t6cR2rlx49OFHUhqi3NeprOl+X17XpISX0jiEBDavr6Yvv16S2oEpci+whAXl9RuR4eJcc7TO+DbKpz8vh2UFKY6gP9R11LG1rurRF7SwHSFeXVkzmetpdlt09oYqK+M1D4+7H+ZpdT5Mn5LvbYQfBZH4k9xn/Y6Yw0zM1d5BEBaDzVswler7snBbEWgXQb5HKm+mzvOrBilFx0zgApHevbNb4vp93hkjeaRMxanvpU9ZZU4U9znazhQI0laGJ8YlQz8vJtxAQ71xclUMMtVFcmF+1CQGzHenSMMc1vj/9Udfa8VHZNUmgt/BXotnhSHhWfIK2uuwg94xoKvteHHfcrRknVTFHnGZR0ghpJaoxSjZKK6RSegc4CSf3UBLlRGqJ3oiJsfYblPn6WmYvuHgrKPFDjnxpYuxaklwSGlrm+MnQfXMmXzUOUs4H+3VRpkU5L0rvivLXzQcC34t4f0zTUfrTLFKdlkyjB9701idZSoQy4S7QNRlPnTMMhKAPG2BQpdl5fjjkthyRSaEyV6y6kZSmL5CnHhJxtB8KdIeCTRe+h/gT5/vPm6vRBnqmH7h9E28KB7YOyQh+iY+q5BWewhzxYuGwhTDWEJO4QGvaEXHNwr6HSHPoE4GZDOQyScXPAt7sGXnkTVFmEntwM6gj+C4pBQuDIU4rEQUVOCilTkZSN5JCPAqmQEJfCBdHCV27hgwhFO8pb4iKBDqPvcBlQ+a5DswMFMXuIhPdIuuDT+R4iH5pqHnvKR6jajGgwEZp6AF7qOy7tV7EO94T3bG1x4NNyiNLSvrGrJhp9vzpgSgdhjZhxQ/wH0Nb/ITG5yiSXl6RKNpsmCUYTmnwB8wAAidTAg2YddOwG8EwIOV2aD/xbTV+14L9EOt9SvwyrbCtknpboRu1iQnUcjklpePiCtW7DJoV+ITZwH/LJU7g/Z4r+AdWDapfrIFM9IkEGETwh9tYi7CC52QAhthGeAKtn+atHRl/ic5PvHg5tC3HTUMhpQxp+gGIy3kl8bEjywpWnYrIbUVWhHIOzVaZvFcroUu5M8XSlm1sfL1c+ELm+7PBClpF5aVjHuXDW1pkSWdLW1Hf1SBc/lmdCxbpr4dHAlewn29bd5o0FRM2blYLpnS+/SeIbucHsNJhQcBXH2ZW+SOw+m2Yv3DUAJ0L9L9AXdqEKPwbRaFQrHMuRHa5hUOI5qII68Ke5AQ1QA6ikwPzjBmHn8ItANBzxEdyKE5SnZ3Zhgi+aao8dhVILbtx2efr9e6wAOPZm9weWyENZ1fddaRM9pafE+dHavj3sAWwS5UNQi/RdW5zw66q6mHVoitAauqNtJfP8Y9SrMqzkGIZIeGWDxW3YtPfGSeQYzGJtb5XCVDpb3n1YY3AGBf7SiD1IneJ5f1wurY+Nn6TOnPDcdakLDBqvr4/4ckGzWsnmvw6a2JtuMmN2bDTI0iNscf2M41o+SrvDxQ3xG0i2FhiRSvLcx5DpSkvONXy7yprVY8gpubjEiOFV20oe93XEt+XH/pgY4F5214whOnA9NplXmjS/jCNCWIQlfrI9se3yhERjkmSMdAcCP2PbVDZWRSPf+zeT8SOtiRkRa1+XRVnHj2nPLOcBwVHwz7iYHlsKLyhuqL6vvaF+/l4ig5QPRCxtE3oExWKr739Vzovk6gqP2lYWjMKY6YGJOPcwZv13uuYnRtwnUKqubVW9DXl5TkaU5Kv4lpXI+nXEqFjZ+ajVFVEQCTQgpa2pp7kZEQUllkVGui/EB8vTj1VUJkn+xn31IQHjR19ty89Jur+VpPYDRqRqZacwxMAt0ifZbHffowfvnUlGwuirECjeR4wNo2RRTCNyXMDDR08ZW6Pxp8SfH0OlTYCWx+B7+OQUKOlLscs6fObyO8v/m4JKvMid0MUtZFG2m23SzzM11ktoGAZtxNu/eEo+XWt+un6AV57mIawJbiWZ6NBKrMgQ/J0J+QSHoLdVaiaCHoe+zGM/5eLi8PrGcHFMweogLzOBwq8BdyykNp2jo4QcjHSZcKcwvYjQt0VCsgPaoQf7AfMyyLl6UjNN4lfxA97W97dj3hDd2cF/WMJBkJvyTBas3mO63+8l+dgRaiwbMkLH15cuytD2ldSHYvFDIMW0Sosuqm1PlZzZMaKpcEiqzUpplW1UfQhFsddA6BM6rP5O18Q3RK9w45ViR0OZaegsW8KjyQNpj5uq9phZHJ4232GpAR7WJzhfTtdNonTUWNtcA4KUhk12Xj+YGxowkB6Edn4uTpFw1g1m8mFC8Qi092R3l2lRRDANNwUcHx7s2cPFQeg+I1XaNLC1dCjAfdExkUowChKuI5LoIzaeSK4i7UdSIWNl0o5/u+5Xl+u5AYeSoryZ02tQbGFhbgSUzho93iq9naoMRaIufEJsyr5BNhH48wkfesL93ZTCwtvDJGbM+8FM0Pb4emV37sb2EPsE3jIPuAOxIVwPxQakHb1Hna5zyUMkW610kH5s9qmn1ZrAjoE+RclwaXyPk3lAqQH3N8abM6ir5hZ/1uJMo340Yw5RGu3wL8A2MOMJZljducN4tBbIGs6wNDOi7xl5GFRuZSEW7zEjVpwR47H6NdOHhOc1I9afkcqfUQebJ4w8YWQUMGbkjOeJozCww3iQUSW0rmH6nVqEKAA3aFZqwEzLInOD3dU4JvEZRtI/hnXsYB07/hmCRBQqRxarKBZDzRXKoVD1g7oZFLkQ5OUFC/zY/Qk3vXWneiz2MBX8xOfT9pwoU00mCMUXDvxtoORilgRXyVAVioNhzJiN08wf12RMC9OkxmoS5Fn14NG1TTqRZx1Nd7sckK0DJcA4M9orj/RtpRu49w+9HI9RgX+INLFx0fWVEL8wdnLL9uYlniKMPopK78Of40e2VyF/fm3M635Jc6cmyqFlX1ApyfTPJHQebN8omJsuFEcdMpUOipxu8rw5MhxBS81L41kShJY3i49AoQSrj7oWcREoNnqP65HxEjs56R3lIIiVQga/5vSFPIlPWTCcx0JspLAaud7aGGEFgbSZwn2BbjP1+ah53AKnNJQclMdTJZgc0yGbgks7hVuV9XF+mdYxEQHQyMTkduH4/DMN83xv7QSUlJgeCbAIhCMOTkeHPdHBweiJ/tIckdxJEN/fgYCGeH3jfdLu3D6SqUZTR1epUn3aZqRBk2xLQyl7ItiDycZKYaHHJDFswiywOHiNXemmuQ35uly2p92y3/17+5TRE8SkEIgvu8qm0McUMejCdrcxPk4NoStoSO1aeNMMM/pCLuH+CPtjwmbXxuSEn/rWOStBxKmQ+03Vo+ZfIIIII0J4rELN0IkmpPf25SpiRni33Vy4CV+XXWRBJXtBYkHD5idEFTjUECUAdQojxtCEyFBIErL50HnYFbyCwFZpllkgORWEJvGWsJN+oKIBsZVIYE/hSLdNU9iM64KljqIkHILn2SrqVqJEw4xaMbpfp4tPn3mVOJQomvRGh6PRIQalx9GRetnxckc6Dl7IBBxiO8IjKnkhr8fvS6zYZGPctHyEL4BK18G3aZ7OrOLwWtI2kt09cp/mlq3f3wi70lxVzMYMqzdWksPfx08Y+jvrBBbW6OacFl7j+LZNWBpbb949JEJSRnrbLmnydTSHYmGkiOt72ydtEN6ZiCx6RWW/5zbma1qE60xwH5GfrHgSx1mqfd5mSr6hmdX7dDr6PnqpCbiXHM/l8T/ajWmhqGvMCBgpDuRdcOEghwIrC2Remwbo4NNjjSYMiKRrHwaEewl0LkqSSMhA7wXKJmNALAO/Kaq6AU3p8aMPP0KxE6m8TIHxZjJxb8HI9J7+MP5ey/sNf4+9MRyPuC741yLSwt9TYylAIRvcjQ3oLRwSabiERPmW38GP3DdAueIjt44xCQU3APVs+Qv/lloLOFktO2xgM7uBvwgYZVEWPRVwvSdGQKUSw031IIV82mWAEfFDj4SeL/Qu3cff/Hk4vu+3T9+2TzclgvNKF5oJE0nw4BgcYu8rm0zvUyVxfWumlhC8O24kZLl5+5WC2XW+1NlxpvfJs/DXku3c7eVaasH1WB/87fp1v1sTkqUPIvtzldJ3zQfJ9aGGXljkCQnntpIqch12e9iludTemZ5fHfAnjJoK5lo+2YA+Jlcq0L/td5uERSyCAaBrwiOLgWKHnxU4bg0OPgdmC/R7GZn+aQD3ytIef4rOblDEhQRnjVgUuG0CgcJS2ziUNvTxlFTr+9F6Bmbh0LIU1LeMil6P/1tqMdqujCnbwyUzptNsQtJYGHeUQkExeiqe4cdsGXV5M5pgGcdkEzYvK0Os1UyoL80lxM7jEeKP7xtvvi5TZ1PxyriPm5rW3uzW+XR4lJFVj6bZRmcOKzJ9XJqJ+qKQCXQ417DnDwsnO3pk/jdPY3syW0hvG5+pFIncXvGP193hj8vL6Xj99pK0w/thlHoEjdb6Vi493Gd4UBQkQ7fR0Bqs8+Ohb1xB+21KBOilzmYf8gQ94BrllpeP7pZk5v/nckpYNvrZqv6hGTi02xZmSGGK5u5DW3Ew2QxoH5Y0N2fOIa3k2YTBPqiQAHHs9if7Rpsau9tpBVjeFezB7c12cQ43YigO3rFDjrNjzIBnCkeZFWHci+lxCzX5IZwTwE6m4CXjjsMV59C9vGpx4xcuSlZHsYwdec3R7jAwdhAdjfhFYlgYvR4Vix4d0kN1IfG2uq+7g3GcfcSowSJRU926cpsgvkV9b90lbH0NnzA/iq4nokLp9aWCnWx4BYZpKPgct0fVLI+XmWrHcKyp7ra5CWwkJ94qCeHEuxZ1yZYFM4TzZJEj+9UHNmJ3SiuUJo4BsWmwBISleLY6eCVyJrREu3vQ98OHHnD3zCQBcsVbaH2RrGlukO193jNoDj/QEUMxOqCCkFh3AwzKwNf7hKnfnW45sDj115lgybCLC8MlQzmbSUQ5EF0J6nHeLKnUkgn7F4n+puBnqRosrQ3ryOpXUGjR6lceaSCh31J6igTLMZmhu+CmKIFsbzyJ8ZKZANtPjRnf3Y0ZaTC0mUpI9NuYH5QpY9uOpdYo+T2/xAernoS6zWBlf/EizOJNRNkjcybgtoQa2aJzj4fQy4K9BLC3vK81ggakTjqbvGmdLO4pkHo6wZQ9nr8LI3bBn+/Y4YWHGeFHTXiCqaejhvIcUYzEFTIZCezdqDQifmGyNMBvW4T2Sos7GSNRjnKlysd5ezHy5q1slcZcYrSPzOt5e3leWXnTrHk7RJ8Wzla13T5vL6/LOQ4KWknFhiyxd5VMordBb0JGOYvVFImjApc5aG146Ph0xV6l8za+czoTDAXXErEMu7+FeSHGtnKvscGCu0570N3TNTGhJj6mjMNeOQUToM1o37NIbc4oTzfFm+y4j039YN68Hlledkb19BPZdVNqO7zNt1wvx/jKkkAb31RqmDxGe1rTHpu0eugj4Q/fVOoxP8aMFrwfTAwfqgdhbbAgKBMRp0TKHzq9ZF/Dv9RqMPQzV879MCfiI+EmI7ZilWWg4HXLpCBL7SXTf9ynXY3e26r1yNMI1B2lvJmTGSnvPZRO+03ZJXLmZe+wZ7sKWnzZfK/QNqvSe+a88aEznTsU1rrihX1jWI+z2dKagxctcJ+NLN0Bn+4JH1RaupHeJoESEhzhYyMdEawxEt8dOJFDFD9OPO8IiwjTQ1a8Q6sb8+Po/BGZ8gkJeyYUZlC9aW49SdrAsUQqoTKc5r7eX49PSU07knyotQi3sRKYgxlDlIkzEqU/b6Z8+xAqoJrL7CkaIBp8al904K5fX2P255VLzg6wEvNjDbqPhzTFKJxDiE9O+PARg5sYsr4A1iNP4pzLNyL+vusY1ALhOhJmhL9H9kUmTQC8DNvKftU/Mk/beZmsdYgu/KQhtJDtQfVLgl/H7AV50jzK1k7Q2OV5H+Qa8zNySzaUAqn1BbcpK+sUlduQk5mGWtjHOmwMMhttYCrQEHTTUOEXzsVcSG6dr6/pZdXarAZFONIlwS/6wTovdJlDklWjrUPqqC/BwkXmi2AKtsUVyerWJ06qiY3tHGOvgpkvLcRMASaDbLYIkliGYe+S2JOku0yTA4Sa22+Rlq+kBnJ6qIKxmFifK2yQS4p6XJk0/6IdvKwFtzgTNHV2TYwrWBozyaS2UgGbR6WrVAa5D5iUF2RiRCT4NbYF/G9SrocaAc0wynGdeEfCdgqx0iVN/7XmB8/eXdtjxiynXVZgHqTiioMT5meNTBudHSzvsHejvKnvU/9xTMlEvZP+rHNw3ue2trhxOe1S2KQJrptGhBjs8cTLsA+yR+GIPYozyC2LgND1ceKEtenhAOEnyrsC9oYEPDENWXnXeobI6RtNZDNlg9EBHvF/IDSb6aUq8DiEVx27N1EVnEil3ZQs0+mHXhCeZL6/UQ78BwXhyykHqQ2RSFl48QB6CxuiQ8ctV6dDSPGrmCCrQFmOPGATe3nRozsqySrex+KT8vL9a0iyruqhtc3SoYm4E8Qw5AUvb5HkZozwYGL3zfp6gA0Ipw1J6UEjgf9gW/3n+9thFXQ7vb0sh6yNZhbpLmkzPrZnP/TyZNTtAqxRU03dd7meoku692a8AvE8gcxlSzrKNFMJe75Ol2SkzLrMzAgm2IoAVgjeFZPX4F0feCiRgkDfCyMgdrtMJAog5xl3KxIZ88wtgHV2cPPIq47q5tjzV2nTXE+p+2UuSVh4NJ9MiGTAshx+hO/FIDKkdUn+Jplm8AvLAGUW1870aNiuNWNZ2USEX9RaZLDpWcBiWk/jc6DfWmZ2gCn5+zgeCAL/+9getI33AQME5v27uCD0rf8BPwRRgH8XU4R2+D5ijyAi8W/jkUiP+g3S4PELTTQefk+PZE8pM3Y9p35Ka+fdRSkxmAdkcjI7QWMKPvrwlCBqD6tE6TZI67gGiRoR0OPwAe3KtlPdYAiL7PALMDKh/cuMFT4TVXZoc0vJgIQpojc5AnHleKruoCY68n18/I7WrImDMpmqM16sVWHE78t+97Rc0uSrTeVUTOp83y6x3FpnC9bAGHYlBMIqoxWX+TpndjEXQTDvx2ucf/O9L4ykpI6KId1jp6lzP2/iRgyzyaynHAuri8BuTgVc1u7bS+zPtSbVRjF/nsoQmP4DM6nF1O4xHjDSs6ZVGzT5ZuiH8GAD7uUIRfd0YBp7ox/32z80eg3vIqU0jyLJXMvpe7wrgqfKWI3sHtfgNrJfQ/h+9uk67jNWrs40OxosQh0yAdqYIhxEnE4FMpXj8TWuEZsNBpGMD9nhkMMs1PqOSSQ0mM3JxRDreLw87U7bTGfXT1KcNbS3VWyE67eXfZwYMfsdcBmIggS1NIoH6poyyXqpq/tT2LHjNeto8GZ7GjRvVM0fGIU69Z/40IxSfxLuRYekGu96JtoIhtCWV5GOCeZCaOaYzkobvDdGQABihdABEVAXXHScdpTa8AqAtbNaFc7+wB5ZFAjAOUAto56/8ppWy1QLHQpN/AZxlBT5KblK8GNlNEaUGeIoRmMTIhZSCqFEKD8gnKAZt59euWEkR0wR/q2It8jAiVEEFydjjbz41aCVlXK9wJZ6IMJkJQYHjHVCAQIRMQQczIHHnDnMpLJoHJZ/JNZ6tLyrOnzn8X1zvMaN9qPUjPdk58XpCQxYiFEHOrEz9xcoNhVdFMYJYuvCZ/9gCe7PKV3gKA+GMGPmwGy9VsrGrYgfbFDq8T3OuYv6yRoohFOOlCcljMdS5hRlHtgp2pcQ7AL9oSRfaF9CyTsUBmlEoIwWTrAQBKQF6bMPQlsikroEEcKqCCuAegPJmdWMjbACOLUfnHh2LuCslk8tdFt5VoVGG1kMhKgfInr1hJY25Xl5fs5ZtTtJ4QTshHeKs6uOe02qCq0J50aK3bsCTOW6T3GObaEJAN+jU3Jagl0UvwTzJ/MvtH/MeRSeME4gm0IEyEoIyCk/fUFw6HpIi982E3KeI86TvsYkcQxs9seg6ZTBMBMgzJ2Spo1mXX6LJv8WU5t9i+wLMMXBbJLxPmvBIGkcti6ex0MDg08ukADUD3MOinvTUqaK4j2IjhgKUxjR4QIu6CPH16Yz+YYwlda224QiZcSyXOFfn5fnGAFszB6gFsFwhydIixck0gnJVLSBwxCMwZscw7+awj7h1mHezaNzn8Wrlk01uNjFVuS1//fz71Ok01O8mmA3D8fMI21CBpKeTDWCrJdto6ZhX7/bJQ4Nm8nWVAWWcrJ5285LfJAms0bms3baXPQSPgKWG+tJnQQk+pFSEn3fAtiLcosoLZPqfqIJzFneZEigsYcW3XqRVcvKFHqRgPBVdpLgGwt9BqoNw/3vYEvILqem/IVEupmIOC+X3fk5QYcMkwUO8YJxyDS29zF/xDkza4/gDYUFFYIBBXu4XK6nHNBvAkxr7VzSgOa7sQD+stdgsyQsv7b8BFxTEsa3LNfYlNzrHPFJlFEEkIZhm86Er6A8OMK5cdSIRtlqVFkLwsEVKsW4+Um4ATY/3/MXaqq4D+iXCNJeVjnpFwhvYIgfL65kkd4DuRH8ixbVt/ZRfTOWNUZ1+tEmIkMIKbrPwzqXSlnrJH88L7t9stvmVja5zMgGl93sdbR1sGvaIjsJYNUK/qhr016H2x0ua+fo/jUZsPNRXrGuq2wd8JAKBtqNwIKRTKyqiaO4jR5n4bwfJC651yL4Ug/8OmQGXYlXYu7jRF9dO9I6cPqJermilXRceSOda8xSEPN8LFwKFoGMY1MUFQWo2pnozPvD/PG6O7+m+HfvmkgMHB6hh/dL3NNcyaN7my8u8symilqJ2ui8Ob4lkFczHUVWZPZzZeyD1OIKOaZQ10YxYwyV/Rn9XZSt7IhCEz1fOcsfuxiYzphQuie5B5v/0cIf5Cj19TilH7Cgfhz8C/YoMP3vBvuKXYWUYqvXmm2PObDTHjKhFmvNTANczrBOQ/gA8NFB14hMk/TZiG6Cw+zoqeGCIkGGQPRh30tEX/i3Pdlz7Z63s8I9386miCJAYSHlPIUwZYKdRaDuHbWmsZ96Ug0gTTWS/7DgBW031xik7n2Epm4ZFyuaplHDl51yuc8S76jhp7QqbiPtLj/+2J5OxxSEHaHAARryAOoAsOXnynLbeRtnJJxZaezDOR5K0T3T/AV6rvP22+2/425NG+IgSL2VYqeiy1RVAH08xfMuKdZPQ+SwQI7to4XcJwIYfvgp2ZP7QGkOdDA5qYKVAFkBQ8uG+hqTku8lB59grAUpJ/7e6OG7dvb9e3vqxCTMpn/ViWx3uZ3Y9o9uMyZsRubVqQjZy/7NTzEinrf75+h+MjnjmQViaUA0DAgwMxchby8t6EGs6geHy26TEOTbHgRmL8H8z9vX3ea4T2gHezuuLW7nQ6KMI8ndUNZoUKQQvdlKR3bDk+0ZoQMcqDnZwlkKUREEXtCzGq5Thdw/FCSHEGMO4VuiQkmaKLL8O5RhpR+F8i+VYpAxEgXZv4J7Js8xrTJyntCbDvRUhpIA9QOEVoACqZw6sy66fvnfl81m+3b5/ca3t9vv4jygG0zc3US6uvLeSkI6qXAP+dpe1MfgIgluMryqIpgChHdY9DZ86xy60AcULRpxwJ8EEDQSdQAlswpE7LcQhhB4cFhzpJkFCjzcA46bUcMTyISigvhWbbCGAifi+y/gvPEeMxLYmrPbUNmBZQT2f8BmU8AR/D6SONtxc4c/G7o8qT2AqJVkaMB3UCZDQxP7OdTL24aqWSVDu27gBI4wmtZbUHQQ7SHoRTOOGEGp8Xhu+ym+Xp+fk8M0N7Kpa1SbuuZCll6M+93FxzRqFJ2VpNBqtguumxjZJ7dUI0fW+CfcPFatxfc2GVkyXc6g7o1G/mg1Mq++7+KVeFwo4vIA3y2p4keWZ3IcpD35LgG8ucjR9TnPhPxTY8zjW87s1kXoFzoHtYnr28Bvx+P+dflXHGJK52FAMOB8ZY6SA++S2FXQYH4ZmJH2n1nehIhFPipuM6ctRt6aD+CP0pAfXpfGrfBI++PFoAF0UgGFN1YwopXvfDkth/NKzp0YDkl/M9bm1LaHO1d9VAiSwbpHW2evSKoXx3zfXV5ujPibbCWGSEkLagG98qmsKVI6h87k+5UuSJHHWJ0nhk+ZdNnIBgIugPIE5TxIyiL6mqkUJG4TOqO4fVXXHLEjgayUvCA7RCmtdHi60asncpcSSIzcJa5ARhE9HnAY8/1BTyvc7OVneNruL0u84NKuhTVmwbWnROKoGdNwqunxQe3yE09U2smSRpLTjcp0ldqAnLs4rTyjwYjNlOKB6RpUmDGsXe+Lu//RcPuaBP1efJVC/MbYrC7iqVqbdVU2y713IYb2eHmvNwxR2zxENQY/7y67hN/U5ib/IAaP7HNr8h07cHNBhSh44cj/Ie0ngNWKKemY8UD5VeIa2ChKQ/MrIHIS0KgZKUTCE3PktMgs5yowr6LhuuwO20jtbZ5M2thwjXXhPHYe8R5auf3E7B3+L5U9cBVOQjEXjsGI1DjbC0Ok1jYdYpPSdfO2rOCGuEpiVWLCc/F7Ae1UNm33SdLM+c9lmu5jxc0jg1k5J/GCQOYWyuWKgE4vUI9fQFUI1AvY5bxnnxWWpW1yMyOTVaFYhnxDuOZyPTDkaJiRClMLZa8AwsBek4kpFPPYq8A8Ai5Y/lsVQayIbXkgiEXqCcdWCGYR/OELKaX7N4gjqN7ERqRa26UxE0yvCW4Mb14a6+YVL3mJbJDxy4Rce9vWFmtWAukEGmTlCsAdPBce905InUvMdLbEi0g4sNUeAG/RUs4CQqls8KDEjo6s2U9d6SkEmu14l9hdqlW75DFogoE1H7UXp+KDDxAbrL6x+T6SXm5jyO8pLsH0GUq4hJwH3ZvKnFTOsQnubwPGcDT3ERwNfEZU2IFPCXQrwK2ktwgrz0pCsEtpx0jeFsKWMsAlWGILhj2rtQHSPgYXBykc+EtUZJxQN3iMA1eK0owQRgedF8Qaw6PCtue9KCKpjCIg236lkAyTymFFPfHMhNEDtgN9RBYVdekZSgcgzSsh+OHfkrGGhGysk/TKJS11I/OWGq1pRia9iZjVWGZIv4FQVzS4sdqSF1EF4kWUU3v8ygurbLn2ntclfsE/JUMy6WWlIiWuUCpS8mphzCNUKlH6aHPPVwi0IKBn74DW6CPS5HBARaMeq0ZEbqS8ymw7T2SJkmrlDTsE5zXEGi32eItAq1ysXk3RPxLybLPRHy5Z2GNjk0ZAYKdhil4oerPOSwip2AV5HEKlbiTwSzTC9/f5Y3d4jujKuygEJRG/wIph9WdVrZuoKlDHIVxGz0T4kXFcQkmY2KZwwicYAofjSqNE+msv6C1gTmCUehggCgIAVehxM0TAqPD3em48IHe58cC+U9LDui97tuqtLEBQJqNNFkW+BxPACmyHn8F3+Wr0dkcdn09PnHSdTHqnq1XjjX7fnl635/PyLWEMl3xvxFYO9W7u97VOkrIBinQ1So2IktA9OqU3skMI7IB8c9SJnkiv1NBGw6LVwp9vz5z0FZuCpR2BOTODd1jvkYF62T87nS/L5Xpe1ZeSDyDWiqCwoVKW/T72OnwaF8QErzMQ7DXjvS/7/WE5HDWk5NREhCawg3MlpPk2wb+Ph2THiOgcJiXYK9x43ZS6bg5wfdeBE3yEnzIRidHkN/hjlLpnTqKJyWS0KYY733eJrq+frZ3X2zQmj4GWTdbNvu5SkWKF6e+VHHuJ4f0xQwKS9WYIlbU45g2L+jTndON2Luo017LQSoMgYlkhGfvYM6Fgw+svS8rAYWV0RIr88CO45ODKHwLGgnCjsHVLWZ7gdov2dAVVQsUFZBmJJKBaigdqw9OxV1oW4Ra6nl3ugLf1pM7C0qJ7XdzTqkR7R7cadyPxiuWcEp1fFtgAkWWpTUqvA1ZKuhU8VS8wInR+cUGg5DQJYXbAcKmzW2j4uu/X2B/tzGBbiFFi6gwGL0SXBWK/Chp/e5jf1cJubxoopCtDKrEw9tfj8XK+nJa3BHksrhZFVQIgSA2TnCYgYs0Jm1Ps8URJ5d56yZnv+LhD5tQLRtJUBPLB54XzwaI+meplay4DOgRlDO1QS2NA19kKT4km2mzWj5AIwR4awrMxORGeRwCREO8LPWRE/ozFRQROqFeRCU7G2ETg53QUyPvISJixLrhXkOAR4DCQMEntIdF7iBoQFYHY0Woz+J23l6/H434bN/HJtjW0hFdXAy+pk9dJUQ8ke9tah+myeYmbQ7uoSQrj5afOGO8pqRXJ4ALpnLaSL34db7vZvS77VfsvSuPK1g2MWutyhVHXFFcU/ItR0RdaKbzDUYcuGlQy4oGZQVF0LA+atdi6Zoo48ZDuqtQBXoc+XhMOU8mxglu9VZpvjRGf98clvipk8yPgqpUSgOft5dv2+LKcoz4wSQfvmHqs7c8IQ64qbLvUQXTN1MtFRXRYKSt83l52sdM8RGhBPG31ed8fExJ16cHivHfV530dL9n2g9Q9xJHvqo/863V/2W2W8+XWqfu8bJLCQ6Sr+LirPzXu5bJPRuyiEauf9HDdRyNFLT5Jx3vteLqBcpIAHpde21VbKDF08rlcBIVj+3r1sRdDx6bKRQg42KraXu37yMqJdZKnFKXjtrbBOBHRHE1tIzrA4B8nc1+1YmbKNm0900viFbs2QjviLatt3SWpizUmZoFuvRcmqoJ96D5LHHlbBVF8f5tFdR1u97o9X5bXt9fd5nRMYnoJ2IOlVtRvPxr7li+Kk5bSDMKsVso23IZOoZol+uIkXW+NmQAWVxVMa0wwU5WIsc/by/W6S2nQZK8/XrzaqH5fTqnL57qIrQNjVprVqAnODTY2qEGKn746kIhzoRf8+Y+nXdySMJqz+LYAz3qOcJx+MinRfp5P9/yyvKXsXmYlHyHNSnCMX0hYK4yCokcH1Oqk9RHkO9T9nbnTENzMzFHYqeWXJelldjZTGTI/fai89aDKynl1RFTXkleDj1zIHb7s4nyBzRCEecPI+nipFZ9H6bEhT+xYfp1CuNhqMr3ib8quKKpQoKBLtQUoHIgR9UfdHPfX18RllcwqALK6yVde2y/H6z6xMabKHMQCNfQnIfOox6syqTB9GvYSpBR5nVh/+uvl6fieSOWYuNZgeEC8QNxB4FIozfJ8PG32u+3hstkfE8kCLwXqgEHplBSzOsHua0pH7iezAUx0s3UFVNHuKdanMHv6AfcVibRwikPWk8eZ2R84IXzfXjnhotOBnBJokPP2Wd89bZOmOKkv9jOnffe03cSX32De+yRVYZWVlHwFjNjuKfEDhtHGyyZPXVa4Pu++xYW42e79mG1h+nWYGEDo3CT2L0sWil8hUOxa/SAg27WcuPUs6S3jzFJQxszofMtdCOSSCplGXnLOTHq1oRbZSIU5kUI1M/kGPXa6CrzGVdLh7xWugNti/X49KKs22yojRMCPk+1s7r4dds+7zZIU/QYz3JpYUULlpCVM3lYMPe/224T3YzKf3ndIej8+vz1kDKF0NiFD2EYEEJA0lQqx1BgqOCS7FAxuAohwGsImCf8dQIgUQGfRomcOloEzUhXUIyTwDZsVOJaA/jee/1uSWHSmAiUhTEL5GQcG3PPRMaGniaextZ3PuzjWn0zshJ+yV/clPOwuD/lKWODKZEEpRbCLmla7Askc4TyFhYnB0aPIDXzpephFwEhYL1VqATJTgjotKUth2oTTBnRUVWR0AwsWbH6Cyh7NWlte00RFLS9kRhUyPl0pWkuh3N4sbeLWIMVCqXl59+90uw0meU8xr/Dn7m13+Hbans9311NrQHFOaruz/9A1le7nn7u3t5TK29ZBSY+eNWRCaGAvLapuJa6xfQJvmQbLvLckFrdFjG7jxVdoY1KXdYJk395M64ipuIGTJMfqOB98mn0GlZntruK6tFIqftqbYvG4fEjLg+MV7DpRpLh3HkeW7HYpD4pkLIHrRZE6QbtJesG/RIeNf0FibKrDKxTZmYTc7RdZFkm7p3CNIAjqAOCV2BJgUJDB6XCF4YYV7CRzQ9ewcDyOl38kpszueetm+95K+UV7WyIuLBcVpykvSKo+wcdCCCuC+yyW/YCudn98T/hJRtPlUuv+fWsv4uuy3ydZ+MFkS0bqQ6Qv6qidD8vb+SU+hJ0pEZXjfgG4opuSIYEjiv2h0N8ZoZbNhDUaGMIs7NENXxmOHgwC/NrHX86lnIibQ8iZIH00FRbSsQOSonB36+C2XJrFEatP88SaggJ9Ew2TcLj+knkiM7wwVDBKRS5/aagYAgB5o4hFyS4YheZJk8KgrG4uikF5Wx21QyC+IiIj+OWJ2uGZpeHQnE7h6uHvAWinuqSE/SNJkWWdE8SPButLZGxuIgVM4NrW5bj5M8ZhuWky1UywfUUDOxtwyGLFRwQRqid0WijcFvinbg/2vOTifXMjqS6qqVCOmz8TimozpVNsPjw+x8s1mi40Om9C04w+XsLV3NmlmZJvf0xAI6OpSUMIaG+rr5+P11Ps2tpKlELinfrXhUd9W7JIwezeDGeWTRF9TwNRNBUacE+0q8FpbPKDWpB6Pb8tKWevqagZ4ld9nO2SbMjG3JBMvoQEijHkZs2WxTgaM4cF3Z6Q91Z0ewijVqsmmkZP4ejcny9hVOi7Qj83PvAv5t/QODTmGfnRpvD5U6qjtV/nL8WQb0ne0U12WqbpCuPsd5fkWNmEyejpTcJy3nrqHP+ZgJ4EZQBrpoNSgEQLAdlYcN/2thW6pILmvbnYgHkDew56CjZAhE88hucQDcvhB3gxSUbBKiLgbaSgwN+L2gXQfYMrU/S2glBC0D0WqCUuy7f40MzmnQO/dlb6qIuExp70w6UC/GX5lirJNt6yMdQxxMUgRAJ7Oxi5LIenZZ80TXnnZBncY8fOKv2j8M8Uys1SKHSb/RQrH9i38idvv8uSFPcjqIswvThQ7CeKbkYkRAtx8zpZol4U4QtnpSOskspiHTrBAUUcXxPMbltLVXgbMk2I24TRM9eb2WFA5KWxLx2tU5xZaJ3Z3MJ7j71Aj+0dDhY+H+gTRMdSJwwKac98+r3reMc/9HV4JbMhn9fe46I01+SadMCYKmZMDonmkEI+8rKk5B3emwX0v0tvzniyOAPZmniuIhfTJWk2GE1Bubqc9Tre8zW6d0fTZYLECmkq2CdHgdJG8AOXzOAldia9DcL5wORdrvEhmyUyhWpe4eHDlxvDCk3IPHSCXQV3LJJKfS1A8PZIm+NT0pUrKhbYUaRmD4xoYDprCNkR9Omod6E8M8Ni9LiKxtoO5dujar3s0pKz7B3oJoJJ7MBEAAIkh6vRoWnITbBYM+BOoCz0Yy316mWJpe1MFqJMZ8EaLqFUnExLBGVSdIsK8YIWeXLiAhgDtoUneNrvvv7xcrlEFtEPc0QkrDRPlEtol+1bYm3MAop8i8Ih28V9BBI9k6w8PMOwTtRQYm/r40c4geClhBwPNVbKWU2077kONlzkLdmeS8YcoUrJjYpmIpRpZqSepF5rnotTs21gYCrk0/SFPr6lbeJmnJXK2RoDnpKjPbZmOwGSp0OhjHg5xjmKwUaygNomJPREaBQy2qHtghERG7IFCxK5j4SOCEtlePAucZPjKAkaGy1o/FpUEIVSFFukKYwCWPGAVmpku4rJxnXBkkrVPFj5rmIpaB1pOTw9H0/vSQjhx6jlpGX1rZZ8JB77t6fdaZunRyebuqzEmL6OHceYk62Q87McoUVm0BIfqPnI8UnsTeDkGLakAAnDBAGXAgKxCAZcMAWnZfftJUWNmf5ecf1P2+U12YBmIBLWLgRAXVAREWrpaOzrRL0FhbECHvVySkC6k3mHt/ieY4EC6nJKgrqhMxFUcKMENxzuCnCMuVZUu5QaEsUIhdyHJuiBv8cCZUNElVI5Ksp9QNtcZBwk7xih9ciWUqN4YskEJWfoQUPHu22GwoFYF3ptxo5OxSy1FFo4imNtv+dtVBXjL9tS0fczUZOFi68tNEH1tS1StydJCBFs3eCi93VKkECrbpBZsP8kGf7ldN2s6sv7JMo1M0j/pVFueLgElzrZVLUsX3/woMhR/AUh+CKu9fo1zg2Z9KF1PUnGHP9M1PLcOJoosaoS3/Xr2+l4OW6OsYPuTS9P0PIELALZeIL7DRpdmkoSXQi0Lk4cjKYwShOTvkTmFugJr1/vWL+UhMlExxdKz+tYyULPlp9ap49w3Wy220zxojUbEoqJnPtgCfeyCd/+mWokrpUMTv5BDXJ9tHPMyWN6q3AShG8wICwp+AH3SZLUU2c37JByGS8TtmrOQBvcPwA6kMKV5IO85cFv8zfZSpPzlN1BoFpCnrPUA4bVi+2s952Jrmh9Oe8LOwYUmyYjUJICuMbqxc7ZBGdYeuFWlXczl6W0c5+fd5tdYj98P5q7d2a5n+TJhYTROkGszORGy6gIAQlmRpnkty/R6y4rTK6dGWaTRccac8F4vW1Pu0RXtzWDsGLC9fr2tt+lHUym6epD3NWH6BrFzRGIpYY86rxQBAkUzNZYesP1sZKQzcx7jTlNnPcFxMo6euzT2GetihX8NuDvx5XwM4mI/Nja3mLp/K0jZhUuU4z5o2+ctgl3Jo4G9OCuaZWDjV7JGbabGcCxkBy9P0QKWTczECAXVRQmRfdOTjwq/bmW2VD8X2ZINYCgCgtkIx0DPli1nmY/kQqJO9oBy2Fwx7qn6C4q4IDuS5hy95sZRRIWCcEalOAAZmmoVVkA3V/f3tYmjtRSjOaxUbo4lFETgFRnhvuVNBbXnMDHDlcEUeIDkFgYM3rxqflrlbr7kLE+mJmE98y5kywvhaLZ06QYDCmYmIZv7AxzpVFPx2umFjeZTVDoZyEYmbTGY6Fd+Hr6vvuedPrKYsrPtFDfxoxzVvb+QBJpKF3GtxGT7WFz/NRtj++77+l3c6YQO7hMNejjhGyRL6A/riviLomwvLnSVbDQ921ct+rtFgFErME3GIJ7MQU6kQnt0R3dCzKOg4gFcsn+oZdsPlsCzTNXl6nQfrT36vvusnlJ2gLt3nzGFE2NVbsPnqSzzAC4ONSP169xbmGQ1A8dECOoZYtU6kQ8CRWRwfcyo7jS0MXD7QjFxpCgTJ+ZzUnhFuU/DeYjDBHKR12oLeEECLmTOZyJ0G1CJxHeAN+tF0aWfVxamSrvWQZWxkEwYk2SpQdQj9W4kgKuijUVDQtYXZEVIKsw3F4wq3oWu0RXDyUQAOajt6K1EPT5dzN21dPuphW1xFUmJx3gLzO1G30lkVYydtpKPMneUfTPuhG1mJrhd0/fd9v3OBUuKnCt+MCVVFW3YeML3pSJzzd/vh31SQ6b+NqJpDKwJyZcNR91oBccwB+HzcvpeDjG8Jyh/1DlCmcMpSfZd0TjUjDXP86XbVzxGk3sXcn65RhhSQnfgRhkwi8h+I7aGGQ1fEMsu0alROkmBw8oNNrAhKG7LBw+YEPzfjM0X3YhDBNMzQGnPSNeguEDCImyufj6FKOSPWUwkJSF5d6k0C7+3ogCjjCBhO0g1zYR3av0dk3QZ5rGotEUFxG+D5xLaUiZ2ifuH19PGNK8Y0FmLOBYCjVIZPORbh7BDybNJ9AxQq+G6Gl2YLGgbbpUt+2b6xq0TnKOB8zNAAGb8MJDmGMKDwV8DOAxs8Clg0gEf+bhrVBVoEcgSYEDIDj8oAjMm692e4cIvChOJ3YiIHyI3nCXYV/MZNDEBh7Q5ct2ywkIvJnqvi1/1SHZFLFnYZ6+jEgleNhXFVeTXwNs7hTgmdxTCQ18+sPt9kk8bKM+7I6hy/Jnmtcyh2l78xpZh4lqw6MdfU2/JpH/qUZU65mPieqfb+1epEKlaB0qASmaYXMPaihHJXKhP97XfPvTt7huNozCVrThEug7uM9AaQgFKjSj0KNUNHiYp2gV4Aw+3EgZK9EBq/TH1tBV3l8wDoy82WPiWhsI9xhJk8eVVshBhzusBWkf4Fy7jqKzleTjl02M8exM+pIIvJJfW8xHigxfz3oQ/x4rQ7gQ7SLVZfP2+2WTACEGM5NUdMLWofbJKTCJkvpQf+6DSe+R5GiokYKma0CvI6kEpXGasU7xUVNBXTs/qX4M2xBu3lRxEj96Cf0zguXCuNuEHXey60Ls0X4AW60BU4pKb6McgG3HWaBMyGSf4+1++7q9JJFjZ7aXj6LsaqbRLtvXt+NpOe2SWo9kXzY6pWi42OLPbBMN18Nv0mc/ve4SnsK2k24BNQNZSgkOjJ8VNYgVM/mw0z0sbBd+hECASqSo38hLEL2UA46MorPZoVzRsy2foEsbqvF47bixpZ1kYNqQYlEj93KCUaewzR/TJP1BJv5QkPJgNUKPX2mCVGFhak3DrL2XMu45AcTYhXWymAbTF5CEPXBmLSkjaNtggHq7vr4+SGLczPYjN5N+gwo/gNSPNqDpsv1X0rEsPeMZd/yoUH2tBopUnYhhqdojnHcNz0lOTIILEVWK8l5e1BP4S3grdIhGLP5kQ/UvL7FuzmiK2TG/GZYWgT+Zp8JjyFgeUC7N2WVyEq1FjLjVDn2S0NmsQxHjiIx8SZ5lb4WXuGvOBHKE2xpJNxSLgBi3xcOQbWLVKawd+Hu7sJlEhiXElMGtA50BKAZz8ugxJLRQd4E4tiKF7ZGOycAKsi1GbHkwqbNVhska0bTNtA0Q9UiBtJREEToeIAVCVNmlNI5JJpwIeMShjKfKBECM45DsE/U/xOIjXWscdpEkEt1nOOKOSSJCFQrpIuma0esl7yexSmgTJJ2GRvxNxCRZQsi0ropat/kxg1SqQRmEP0P014mUrUIZJATBiPVi5IjqDGJIwcJDg4eEi2h2YupKyFsziUVXIfwZEBUl6efLS8JGbsKjwhqHGcMsj6MVrCRSoDgj4Qd9LhwVnIrwA0y1LA6FH8x8JpYIOs0EN+Kc4/KEU4w2F3h+SBXb2SBm1BEkU5mdLhy2Q9gDqLigoJZSnAnyw/CvaEbx/eD95clsmNpgupHVDm/BTqDwCbCvSf0QTC1z4R3ugvC/wlt0A/4kT5OHmBH8bE1q1oGOyZF9qE6Q1S1sEkajkE4Ne49ijwCMhddBJocxbNha1BsPtx0Z5HKvL2w/RXk1HEdEx6CehAPfBwMLbro+57oMBxct00PIgw+4EYOx5dUY3gIqrwMzSmHk8Dq4I3BFCLHG8HfCaQKWdgRdQrhQx7DHoHVIRVnlhsb/Crc4JLahnBw2P/Dy8J3GcE5H0MIQ9wgkZKCFye9+BGfANYRVBW6NrDLBxsLpA/ZhGtMgj9UewKTDt6CIbtgtaEEAUhauMTxjEMgL3F34V8GgEYBN4UxEA8zKONy2roEnIZq1yMNP0kPk7dHX5xrRXl/2lxgi4M9geulDMWwQRTA8vbghhIcFVARmQ3XVIGXEn6GWj8q88wjMPe4aMNIKGkcINcteSczmcfV43D1kM/cs4eEeotoW+BOcR8lNCBCgWAYyXPaGRAIEuDvhz7VgDhD+Jm9UeJ4aCzypqTvkX9j7L1rC0UOKq0MkOzqyqGAlO6yk9HPx91APoO9LRUo2GVAzmjyxHdMtYEUQzQiioF+o34iCuGB5Ybu7YDnHv2ALteqb8//CU8k5VmXTNXEtH1Rb4N78l5KCSh7jBJV387AQRYTLIMIYsjjNuAO+mGCXQLTB7mPYA/B/SWIqfBlR4sZqTCyFk7Fn4J9pBXCMIlBDjG0YwGtRDnI0LI8TyEAwt4aKxtOjd8SxhirkRSgsINplFbAESfhYltfaagURLxHadI7xL9jaQSYnDb/NBA+FUCiBwN5SIqyYFCFJIOykyHuhjiygBKhEzLACM5NS/II5qtzN6HmfGQzA2qL3lbgvAhdIXehm5NtFXg5leAFwQK9YQ8AhQw4yYWlYd8RyUkiGEJgcjSbhFJgDoQrzhrXN0rKmVVG/ijHt4E4Q0T3inoaoOkT8DZg4sg6fmDsdUDaHeNQhseZIWojkmMgl4N0kjwpT85gDb8R0vWNLniAixt9D/M7KBQNHETAi6e/xFRgzqhkOrJUHhMYLllTkNbDX2EUK/8DDP/BgBIigNqh0YzepWRR8BUowCqEu0oGAPpEN96QIaVmKJpGzyMpgFORnWH9nnRH0SaL7u2XjE/MzIreDIF1keZh0RQ+5qGBiFOy1js0AiP4FfSH2n6A/QV4IkiuS7R97DaG1Z/snWyUE7z9WSGamksaEBHWKt8Qpk4X+8BUQnQum6B5ZPFnFZQMpiL3Q/Qj1N98LGk3MgX3AlHYvsN55AUzAv4gWwhzwc/xASBTsFQtvQ0r1evuldRElfcxxQyls9oi1GlnAIL82do6glxCFKv4Ze5bY+84OY/wLQttASDqSlq3Dsyj9TmOPkVOV4pjqAjaR8DmS7444ySNWd8TqZrKLScYTc4jcJ/6FmgXFyCoBB4tCeBbsbJE3hYUTMECs2pRSNt+yqg6/8C+EGhXQPzmE0E84ZSjZ+hk3BBkw4Zd4giLZ1idJjkmMBDQ404HBrrW491vc+y2yAS3u+LYJpydoPd9+4V94jCzE5/AvkHREXiASn8OTFkBYL9tUj9fCoBHOQB/jMQESkkhjhr8jwANoAmBqQOAhKDaC4FCgZxlu0AkVuGS6Yiw3wGxzK8AwPzaKsSARurozCU7gozDEZcgsyOcUzuDG7nda5z9v998TMhqTLB2F0lDcNAZNSGjMXkW8wqjocDC8RsAm3KMCBcnlZRt3Nxb0msNBRI5VdpwwehBlbkYtSqyiRQVF/5veamZdzVd7TpjjnN0BKDJ3LiebjqyeDch42Z4TNn2zpP43Uj+Mdsfb5WUbEziYFe7wfUROHJmlhod9yr+TiAdYR0x8SP3ZdjEJiCsoEYQtiOwKthMiI4ZXON7hweBL4bJKy01tMF6oF+FEg4idhSOlXpSVicKHIj9BuGZZ8MnrM8GRZWWDhYjwv2Aa2E+W1RbCFSzqBllXRlgxspgQx+LyW4KN7UytyoQl0pRIPODVJQe9SDrCsDDBqCUOfw17ikj+/XzKbyQYGTtwFKafyTr8UpN1SoqOKaG/lFyrTan9kkRadarsf3qC7H96Wuy/PRmmNDgLQAoTSyL9g4QR/D3ZCJonc1qsgUjSKB1PIuUiEigI4j+vcMUEBdMSIlFADzZB/xv6V4JriUEe6QL/p4eteOYqApDLyzF2gbr+Q1VeKjRIXBcx8l28zMa0128RG5RvbKkFuiilxpSX0zZ2Hm25VtRykVkXYRUMG3WvRazN4Kf8KOeX4z4mNhkHyz8ij58gZcM5LXD7rRO9JxGJKdjK2pAtqnx5OaUfpjeJJwhCIuQo/EDYHowlkmkkFUSEghXn2otAVlQ+8Qu1zVFEI0TVwVzQNDD3RnLx4hdc1+F4TUQZbBhZqUPrPthbMtgw/VS/8cvp+J7weIyzyQpRww1yGzKBpNugd9JhffSUaT+O2ZWmQKGAgALeKYCRcnSTglNK4UkKGAmwImKHUqSQwOoAr5JiWnSUCrEpcLuAcdDrPazZsCqjVGBE1YNXq1ZfELUEnAEN/6lWAfB/mb/XMurlnDkyvVpOWs0wh2cJ2Td1Z+3iht7Olq2Dd0tnBSg87LhsoxX2l7KtUkQbuogA75qCW0SgFtBY4TIR4ClcTdxWymYScRshIsyLiSRMXkYEVEgWzoRcEjaOuq24mbQthD9jMYjlnjn3tcTGYTmFRRRsYlnqgG/ELWQLRa3bJb6GbQeHDfiu0Fa2e92m14KT3fLOQ0NgHoPNLbKOsRxdmPA1kbARLS8OQR6cGFZT4f0GIGuwex0ESxAtgvvGdcwtz7iIEZuyXZLJxQmjkNTX4a0+6FS9v+Lby3JONGYkx3fausHeCwRuCKBEF4LoAchR/ivpR/Ujxk2QvjGlYP5b7rMcXPu5Gw5o1BRXmhunyssvskOVEIfPX4PChikF/OqrsfJCFHYNJdzPX4iKNau6Gq2dGdmGcbC9QQAkwbcyULyOLSM2q9tttsvyGgu0yR5UBxEo1yLOBqitZZ9x9GCPfYnUmcCaIj2H4QTSU+e/Kqa1NOFWJpU0CVemdNglofFadXmIPomqJWqVorZoR2Jhof84LIdj7ErPo4/WG5OhcvSxMXuMHQ9sK2PMWHkljcgV5eq5Ll6L4nOo+g5Cl5JI3Kn9+fkrF+U1WRNBovkFIAggAcAq5Nkn4xmA4v9CCG2lm/7cA8Uttc4uURFu/au1ixXF4lBKLz769RCrAvtZSDnidHy8FDG3w4qAquZ01QgsjDn+2CxxhC7Ow9pOpXSWF4Pg/fmP0/GYtESPLiJjQGruwxW4j/XH23I+vx9TcSfpgfqmq9zy+/Mf37en3XNcYxza+LVVgqHiayfr6IVw4xdHboAGFBEfPqfymF4KWq2MVRi18nwdYx4FM81F4VS4veHU5G14efdd3mKX01CGK1OpTKJdLUQnog4ZPEYUJEvdZXBB814y1DOzprLP9ZKFzF5VL9mvaiELXi6IXsOCD2F9Sm1m4U3ZbxZeR2sqQ982irrhefLuMjaD5bVceN1o/Qq5AVZ3kTYIHV/s7xrCD7R1oZsrZB2C48v+rvAJSo1e6OZSmriG8CNs/trMl+ydwr9AaU9TjVH7n9hLxA4n+IGABjiPtI+Hz6f3JoWR6Qx3KLqKcnixQ0fty1E6b0QvjNbFwgI1nGe18Mw+kJx44RPl5r/SwfFL+jbUwjOLwv/tRWZRWv7vLyjz//43FY8/6JXAHAggZZEZ/1aUm2v7HXCFIo2Fy9g7INQ/6otgjh0jA6mr90AQG8VyOJ5P64YgP4NWBBfJCvYnsCuBhXEkYUVXAjsQ8G/ZgQBPQk90aJ0F+L+iiwBpEFF8Ryld7SwoF+S1FArm+KCLgL8wB6JpUY9gd8DMX1p3AMYTQACtY4CF1yJMQPQTINlD/Sz2GFSmgmTvAPsE8PfQFyF6B3DKPugiYJ+A2h0w4hdACaWajAF8YBbkvxbkoCHyFRw+kezEzTNdkqvPqSh4Cj1L/DpR6/wz4NLDiWphi3U0emsn2o5fr8/P29MhLvD7fpK5NnGh0eRSO0fJtZXmSgnLfS9zH9WMXR9N9nyOUj19JycJ6w8nhR4Hz/JAsE4tGebx23aFGMc5JlPvAMB7enCTLWt5OSYMtM5NccSLixHHpIGgSFQ5CKFUBiiV/jTVFdvcq9QTINjBBU7a9S3++FeSV5ijVMBcudjrSAlw2UeK9X3tZ/tze0jyX62d/yog54/HuHpjcgTXiHNdjgm16mwmD7TPUVApuxzfjvvjt0RJzHzlvkBVeTzFe3I2OSoZlwmczMNi6kNfEgmdUYA7vkzoWeyn3CYwIg2XmjnFsvkzkWsTWKQvbC97hIEVu2kd9O1te3h6lByT1NwgU3MdFNsrRv26bP68qVldT2vmc79PR56ikT/xvJmispcFnnWw2nRXGOzt+nW/OyfKMq4X+lNf2LDnK+WROfxp+7ZffmSjj3L0kNtoOQ082UplaE543ibs9b0UrUDHIaRmPAhPfEv3q6m9vi7LfvOy3fz5dtwdLs/Lbn89pR9obKIPVJnkjkdOh3TRkJVZ43XIp+WyfDstr9k6rQA4MWjf1Fr3ddDraWWoV07oLJcemJPaIsw69vZ0Op6SYSPye3w0X+3gXJb9+qlWzvV0ZCdHDukz1nLgdLa1qfrbZPvrOZFXcmMv1maGczz0n7Azt3G1TefGQbKgwuEePmMbn0/Lq2kfnKyDwfF/UAZ9ZnzdQAi67i8AT6Pc50FI5Nva6gZnzC2EVKVH7AJBKU+Gu1Ypf5izvW5fj6cf9/ez75m1c0bOHpK4CBQ96fG7T1glOXv5PnJSu/wL4jR0s3iQPvm22ue7LPtDbg9kYYph4KMEUjfqabs5Hg7bzWW5rPzb2WJKi9PD2KOxEtFgW+10ykk1ayR9WcSxE5rrPHmwP3O2MeX5of6dHhEvTVW4MCe6QYjp288c+gypO8py3UzdFfeJvbgOqtuRUbR0klAuUB3Uj36+LN+yoVs5NGLEWhjaOvR5e3jKP7mfRKi45nk+sZPO29P37Sk/GsMghpzgcLWfWYgb3/9y0zE7r399d0nlcEch5voFeXc/KOJS+izXTCawNwFGH4h0F6S5b/OksHaTq78O1n687g6XaTmdlkQDQMqwPfYfurRbFI3aqfLsnpbNn/Gq92YXBvpdQ3OlOWKyGIPJpA4lMLYvQk4rgOKMWVY59GSbm/3kvbM/3mnZ7VNtUW9qVAOE1iW1BmPssMNjlTVz+EwhTTTKYoFy5TGV9QCEKW2DaLD0iHFYHOG0ZpFxVaLiThDF2XkHcdzjq8EExIjWBbw8q2WsLiDfz6fTp39OVYsa0xoMnZ3nWIfapQFJAYQhFBZYpOiYtC9/nX2uuuBGUyShRmf6Nuzr7nxOxvWD3Yzz0TZPhVta6RM7YrlnLXcIllHASwAdIVVx+N4TAX3Yd5LWnThRdBwABSNK2eywYOFXEEpkXc0fiQoJ2jWiUvF/kTeStGulopik8CFdD0lmSgbt/jX+kRwzEyBJmg/AYUKTbHGC3/95vJ4Ss+F6kzyGOhHtB1szk3XvJ1srFJ8iAIFCbQulLWoX5PgWIMaBWNA4Sj/i0ycmgdBFfHrWG4ivYj1Zq8MSDN6yQpRUjYzF+76NP4etAENesLbQMXIbMWmGM0WflMy/S7mc9Fm2S5LdGUw0b0k2aR0n9SGdZZantCxpDJnkKlqTtqYfCk+2+/YtqeDYWHfCSVqtICKkGvAGDZ1jFhrtcsn9cRK1oN6+wbJtXxg1cbjtkkftoK+xgWmsUsDIuLkvfYnX19Q/tbXDw70CSBtb1cg5LNAPKgVAqkmhP9c17h8abXn7xxUJLBtAaKFeGywtEBMAFaAOiXt1CB4DcIUKJwvprgXgDMA5ID8dbLxD+dpNM3/BZIJNBQXqCNCF27IM1cEN6nBL0+CoXAh5yT0Qpxkf5bBJxLtcI2Owjtostfncx5jR2bOtlKfSA3xgdoUVuuEf08TGqxk+JP0SbXFEFZXOZxygTqZ0YUTsk5NTTIXq7ulHGqFNg8m40HR2WH36cdj+67I9PN3KFMlFIb9qOFo4SOErAA3Ht+mosg50HTgH3UxRbFcblP84bW+ZlzjnIiszEyg6+to0K0Y974/JbdtGFb4hT8Ct29DeApdEUdeOInpnJw6uh+Q+mkZznIIy++V6SDeLVHlNfQBAnUbbo74eDtt9miTws31mH466Oth7VMzvRrOwDXg2Uvzw0wV9Yk43KFjRMi60iN21RIH4fozDBz+3ZtJiLuSxfrxFm1iWklsi20OOIwCIZ1xpI57bocQwAAU1KLlMwZBCSTiX5W0k4pjBGVBzggmW2DFgK6fClfHjLU19W+7iY7A00AWsnzIpABW3jH0ZYPAWRI1CKFcCvNjz7iuY2vXxf99vvy2b2K4PjRnXicDFDk1u456WCKM1mbQ56LNxD2CfNWbcPWq7cWFLdGYCLyb4LQCm1lk3p91bfH3MBQoglCGmgoLnj7fsjrMZW7C1S4yb16cY6eMF46dkboyMDvUYRp4UOmZ5ONLTsigs1RpfMBF4c0BYl1KU16e3//v3XZynMmOAUp7q+vS2iuruNolAttQAd/1QVzNc8/NuiFmgJtP1cUKe3Lwa1iFbHyVhTe1u8O06UoWw84TdvNNEa1+ceOjiRXG26ByoCDycHKGGJiiHQYliR6LX2HVo7VOUgdHU4Q4rsiP+KrNJCsbkS0G4+LpWvw7H9/32KanZ+XmwbGKJb/l6WL4vu336oM4GB/bIc86e6W/afxy7wiE6fD1eD2lVtvPW5YR2sYkEV7DJoqFg4O0C7ja4prNddrkeNi/LIV1QO3n489W59a2fd4lv2ZkRv+N7PH4gO4szR+7OTmHsxC0i2KtF05DaIMS2G6VlR2kMJ69EoUV9ffMo5dSZwFGnyJ2S6UEwuzG9gafqbbDl7Qn2WfDmzOwer5DG9vCvh6fdJr4QWjNBrGOK05S6Pc1vy7e00tN9OJk9nCVyH0GV1QDsodyiD32DCsVnyU0mpXGxpfCzYP/rYfe8S+zKZJ/jhlw4TJ/ZVBLr6MdTnAGcTYlw16CFrkHyYkR3QYEe/XrY/WeSgJtaszhY534l/AFu6iWwvhG6EponJtSLUVUgi8h/AUmC1K9FQrHA+rG+bxIzepvNpXQ17CIgv1luoHREeMywTBTYS2X19AnX+z2qhHYCvrFWJ4PVe9QF0ysjfClGnNQl7NCjxL4vRJclFeDrYb89xxIApiuDDCyvF/ZcTLR7LkmOGvPu/kwEiE2DB+6AQllmHfB1lxVmTG7OKe0m0wc9fl2zWZkb1XXWpmNC2NnJnuvhtF2eci/SrPrUlbjWYW/IynRgm61SqFoXr9jz8rz94/j8nAVJrbVbyh70ebPsk2/VikzclwHAd6fA3aUEqWjMptdDsbGGKRZ2l5RedBvbUxtWVJXWux7Ou2+JX7iWI+y7BQ37pQiIjXufjoUO5+N+9RGSZ3Kml96zv9rOwV0P57ftJrukZ1PyAI0FruhWn6+7Sx7EmCiDnl3cNkXXOurb6h4lS2DGwWzSBXEXMnyok4TeR33Gyy6KQVtztcn2gOufDjkuzccPiHfjG41sh4N8rRBshbmWkqfgxwSyTygIoIGf6GtK+VGUjgJvVcVJCj/py3U9Zx+9H8ySLMjJetSlfeHzvyUOk3XdgVgDXBZIGKMGitJnWH/k0alDDfg6OEhKxB8fUHbg+7IeKqk4WCPV6qF5NlLg+EVLPdH1Cjcp8hlK8/BHzb6t7RC8fTstT9EnH00iUoTNHdhywi4mPAQ8PODYASCHuuYBGUqxcLo2aCKliDRlouH8MiafSHshXGicFSEICUA6JRVJcqDIImryhJo0Hxu7hfTYjPjKF87EbfUTYrfGJIIFtQlWRJBHPGgL9Hn2xyWpXJh0bQKZCayABsdkBd6+SN7e4izF2JkekVBFsdfrlLR3ChwrrgZse5jrYAbx7fpwwMgIBbUvWF6QlLgGCESU2txICw1480yiDJI/oGOrZ7GJNK9eSQcI+Z4hekx1SRJIjrnAMqz8lcGk/lDZPdK0pgAAtWoKAXeiBmFGn46oTaAHAXXIGM+gzgSrBTsG0jBIJwXrQloqEcbTVwQtE0XIBewwrLwqg47bQ2QXRYGGREllUiRSIWkESBrt0ecpjjRio79CU6SRE/0VqiGNYChH1DuXWM+YqoSpxJ8gFNFoREr7O7bPjbfsM/xKGC/cP2O4uvgtRGbf0V9DIVBQc+FLFek0NKQ08otCOJn3aYdvIe5TghdAxNRToEW5bQUdDCu5xEOiFMkKxWSj/NfVzvrXh1kiZUiu2NZ1aV3P2+ek4jW0NrS5EKWfk04GZ+dEyZlfINBYB7z986gIKHFBjpgCxC++GfNWrA8ffB3xd5UKtLOrjqXM+jn5SL0pngP6SbbVAPcN9r+ekmEa7putAb8k8yqFrsj8RPPCLV1nIs4rE05MuC/5Cxy8k87XbtoULmuScXB9cyS4aNYIxliASbn68jJTrrDy5UM+vNKlEnHVFS8L0cpBo8W8fWLm1dW7PEdZl8Yy2Uhat2EL8dpkeKtVBZBNdqPQyIaJg7nN8vnG80777eHbJVa48i4irG2QzqpkTrpmVO++7cwiUUGQ6HrdJRm7PiZw5y5DeaBl9SIHd0glLfFvyH1lAx/XZ/ntbTklyg9zbxeOKGNtNzeuw6qs4hJ3jLMxVd493118Ycz2hYGEh+y20+pNmv2jI/gLalBtYwes393v330c2Jg4T91upDZCnSWZwoRBfqIkp5F29soSaYSa08fLpr5Gm6yU3Qb90yu17OOjOXWifdsjAh5Q2Y8AM+GLQ9CcwTqZqhE4gYbHjQxRmAaFLRcOuA0ouD15Csn3XWcChzRMAQUhC/DKMFOCyjcB013wkAEChsyuUKkFhbKA/gptyxwE3JJl3XrEDLNhSsYg0adn2f7SdlJaX511a1BNCrwPOsGw5lb0ioOhntMy3W3uTOjUk1p8WPoiMTRhMksUKD/k3kQbYLqoAoDrlArSIaJBXoLM7f//EbpDovjzinfYEEKhXXBysx0KBUCkJ1iOUfwxN7IJCtj2CekdIcqMmJKizJIvW2HJ/tUpH3Gr/+KUj/DOf3Xyh4fxb0sD/WrlQ1FW0PiPc9ZjyVxcKfkkhJ7IB4wUyt+lgah3T/zK9JhENrcNwcdhj7dNZ/uNqzn9/XU5/ZlSqpr47Sr92du4cR/zioWQXWWwAZVR023IpyQQs7U+UE5sWfSjJ213J9+miVMo0nVDsgQSFIgkZx4yJC9IZN4zjdEoPh+yBXjwNmt2BMA218FwDYqwzUAbzeQ5oLlYF6bMaVOnUck8FHuDpE3I2duFH8i9LwqzBCMiwrQxYPcvk6UhZ8kbxlaAsZLl7/ty2rwsyeaPo2giDsE9HS53sZMUIEbueHAMgc3Q7khxL/EemRjwZHahvKdv7/j7191hiVtUbYhPi0t/tHtIvy+nXVq5MhlssCpNusPlWjT5/pxJtmwDF2+PEoOTB7swDwVqSm31VK21BbHWWeJJZlP8OemusoeLt7NZx9D2dj7i9vS02yQkiaNlJnHuBHBP7HIbwveYJmkeMtfCDajj0WQNcNsGHIABThiCPMcOA1y5a/9v4dFyISwzRiik51eK0TTiaqWx6UOQBWzFEO6CIWDhpnDnIAqcAU8FBYpjxRV/xnKsh3vWw5wOiLMGuD8DgF3yC0OHRlh0coxT7op8LFrBCn9WQI891uuP1935dbls4pypkwvnUC3ys1I0KQweb7jOPCsyK2HnT7/vYn2z1lRyL5VcUrb9treziUz2hzNGgDlWOJgh+i0w8cFwhg/IdBBRAR1QL4MIyCBWRAcAVxE3iUwqKRI7tlzAB0mlrAxjZyehMNrxhXgV2btvd96lGArfm/Q0QIqEsXsEX6j7liqi63Sx+Zs6s3g5J4uvDfi+xB0SbcSzPyvejMBgsgft8RJA3TH7EIIoZhaQRwj+n0J24gjfIzyTqlmM2hVcvYgSGRFS70Vpn9JoSiZbQ35dszhu6Xs7JQ0DB69YaH6Zp3ud4/l4svoeB8E+t8bAj+UHfYxYKkwGXOXE1AT6fwatFRkxrtBzQ/zEC2BIKqWF93nwfsd8BDJFHQ74jIKQQODChSf2TFI2icrbR8+xWoan07I7xNZBPAkMQrADH94V69BpmTbWNUCj5qTUwMCehlWHlOAYbnxgY5n5YfsHudL4bdj0jNqvgKgyq1BoE3281p2POmWVl6y2XZM7AoUBc7LrlCVZEoajFzYEKB4YU99WEvSuE8fXgR3IE2dOVsPwA/4TfqSAc5g2AM5JXuURYgnTRpEa3KISjc5fORpdO800dwKDjtTVQ05OX6IYGtO0JhoEre6ltvb3Zf9n3PRrMttiR3e2k70Ol6JubIYGj3TXXLoAk9bSQvhW8Nrfl6RDsjWfSyiNInUpBOpMb+Z9SRRZhtZsvsFhFywkdli1jpxS63R2cbrglL4vSfuh5dmiaadDEgg5YKZYg52CwQKiIjipwcEECdhAH4IQdWSkBHVag1/sE4S7KqCguEoFcWnDwBE+FptChM4vPEiMPDGjT4o10RWdU6yRIkGo1qEIRt2yie3DdjbrfTlv9tslCS8F5cOXgcKIleJY78tle1qTuZFLZJduWVHATMH5nlNPRsgWh2aEsGxjyIaN2a1IN4UVyZ4OGO0puklG9JPRnsqiT25jSSDqkTj3VChAhCVT94XP8ljChHPVhOFj9z52qj5oQlxuhgo8NAOJVCmkaTfwvW8T22lyhpZs5/ZrHD+ZAI8aca337dfzcfNn3KgoFckFwa/mRiLqxIdGISrEwTA6ENdG0jzvuGHRFrXaEPvlUtoICwt62bko9oRgMvyrTAtbNPWYtVq0YMkSLQuzOAMNurwbFD4bMEdqQnN0p2S3ED0ipYMI9wIUdHSxZDi9wsRS5pjFhuruo2KZEKhlrQ9Jlg5ZMMx7k2TBsNSvJEqCxFKz6MdSH9JaI9DxI2mLoUpDwUrZ/9Tgl9ITFdaqbQpmJhy452VzOSZclF7gJL70wbhwM5OQmk2QXICu0rEPTxBHEJPZsupAsMGWED96243d7mO/2O6cLxu6U9weYythKGQws90e+P6ypLl3sx104uHFgUawTVZDRWfcE5vJ6jJQmiUuw/X5tt9T5n+7z7vA/L8O9Z6QtHkzqMB3Ln7dl1h+sx3M8QTvffgqWdcSib+QUg33RTABiPwA8oF3QrL9YIlAyEN5T7SWsAUNkJ6sWNvB8rv0CsgaPMcu9anG4ObgvgCOhhcH+kMdMnn4ETYUnFx5Q/SKs46MsrgNcBzIguxDVth1LeNo3hVKB1dPp54d3MxL4/7AbcW+G0KBZIk6YwIzyOlxhH8xB5Wqh0CIPZL79FUb7lcWznvefiy9wLtV+nH9kPu5UpycNyf7p2FE2NVL+RAA+sVtylYMrWde3Kb4M4qE437rAB6gNKnWb08aB3n/ou4lEsSAy5BgkWLTQiIAXBTIkksiRqSZGbSFd2vBkNk2hST0y/aQmdTG2UR7NRQp7y/JDTVONn1QSOOzYspdq4BzC5S4xqOkgsut2bjhUOcNR3JskDuFi9rQvUWSjQIl1EL+e4rGt6PEbCzid5KW2NSt7y+7uLA5mgpRaNDO+38oMsKrnzaRnfpFqQ3JjsCzj53NUyYAaDbB2/vLLiWyMOk2iQYN3xo9ErB9aepI1C5DjhYxW0jEMGZD0WqAexqqV2HHMGriYiIVy7IoeUDlDkPGaWD4ouSZlJySLJAi8cswhwz4pTCHfXPeKcpNnRDjgNcE84kXL6Z7X45pP/lk9pMzswPHoOUvdFsxiGQ7LPKADYmPBR0EzYuC1hQmH3hMUkRADZESxhQpKb/5ObGcH9HlBGsJEcPIMQIyGvuClWkYWvmuuHpElhDvSh9+xL+dClnCXcw14luTyKrUKLYOc46z643JO8nYoxhJ7J7itriCbkgwARnuS+Mi56lTsGAeZ63EtP6+S6LEzpTDi2wsQeHMPbHnH/+XHii6PWbabATSDYI0gHI9LjzVY+RrQjjXQwnVz7bQ4HtcP/U2V7Kgni605rzvEl26xqyrI3AiJQ1cdOFsjras0PvulMA2zNwlaq24efDxsEFCTQclQN4KIrrGDuxp1RDaIKARGBRxeyCMYR0iv7KF+IqDqypjdBbteNqI2C6cu/jY2T1ApMlAvILgA7EHcfx42LDdwsOgVwadMQN+4OYOvg5i5RBciFgZSVbEylluNdjOnAypnxFGh8g4/C9JhpSnPMmG5omMRi6H+E8fghHBLCr6tLkTsE+Y8hQ0JdROYw89i8V4lh59ImrliiAt9sqwL2bI7l83jZrT+Gs6ZPAv1F4ZogqLvbA/0T/DEF3rpOF45WbSz3fXsDNH67MhGK7cnPr53hteDVoXDgM5LemAOdilT109PB/ksWRzpJCs0NIA/DMG//Tm0N5AtRC1ye/z/S4kLdE6X3BR9rRXPX4xlMevFN19s7JIr4eRS5y+q+V9Oe5jgWBbZ7eqMPgYMkHz2BB6yVVYuFAvLwmgysweOPr36CDpOqbJcD5sovnbzVXwxS4vx2sih2rmm5nwwxGA64REN/xmhJTBwwxbT8nvhrdjE004AcQIZXVsNBgj/CICDI+qN0oyi4pWAyyrhFLyMmFNjdgiXOE9/ywLPmS7peDbB8pQy6LiY8uWHxg5er3Ul4M3SxiEQDcp9XZ2XQvsE/EwgEDLBrncKYJnLWtgtrbDut1uevWbvF16nK1aUR1iMWHocaa6W3B5JrojZNAcMufSt8xb4r3HqfggiaCtM81QRRfKOl4qaS8AmHiL8JwJxKn4ksJ74H3OEIkJai4BLX/dYlz3iZCHqR0iQoE2DwAQmhtZU1xXLLkVwuPT7pJE7s1HVTajxY6xYCkCXOf7/XssXDOanQgespgexsj3nX2s1uH/2J5OxwT010gafwfniEU4CAL7WZFyMOf6umwiFJP3JhpQaI928Jc6u0/lPv7uWy70I1CoXxAXtAo2pTSsIiAk7rsvoKxocWfWjJt2PUYcROCoaUEhUTHm8/64JBpLXvBgfyFbFbJttaOm7y96f+CZt1NuTMxRc4Ep2R6BNEwLLqe6MZO39xIkjhgQh7xuzCkeUmCnSa2kwM7NIf/z/e2maPKyXRIJGx99Ltc2cGIhaFA3ft7V6KNvJiWtPnOIE1shRUVTDtP/AL9mYrKD/xb+GiqKBBQ2hEvBJWpxzjjBBIEXQYrCyAQgn6ngsN9e6x/pUTS9a0+VemdfYbdBUxoc60ZHriXE/OaQSXemN5vbWtboNR5VLY0gauq/hnJDSyP8GsoNJVHwiyg3tFTA58P+umBf1NRFCM1Q+9cQSmRhdUmj4bbJblx2l+U1llfsJ2k+Zh68mcmLT5hqRWBQJIm/IPvaoqGictD0ApBuL0zJ/Alres1vgF660hjzE2Z0pSGMhxT+BDZrO3/Cn/j39nRM7YNwKLDv27neoUgbF3rb4KiGRBRdmDXkMWbRhfk+ll94xHgUeZzoSpOgWCm69MWtfonBaasgj91rmBWGZBGI4rO2Bup7CqG0Nb6FBc7jlgKcM0anCpyMfVOdfztvD0//19NyWZLHK+iDMdC3s0Tn39/PSXO33aH0EeUcPjdzB4XoN553FbaoBL0bK161kpGq13oNmRkxZG8EMk/g8VgYRZGppv3kR6If1JkUCQOuYSSwPJVFqpIyP47X+NMOZrtflbLpar3io2h9sWDG4MwjoYaiC7gT034DQlZQuA7fAtA5Mrx0+BH+TshjtKBoCQ5IF+5jrTs79JwGozUEx0kQwKG0GRKWAMOE15mCAwQBsQkdkOF8wMESTaxwjKmuTSyn6ImklsuAvwfD3AtmAYXYRbSth/EEBQ6pYAgEYHcQcjSkypng3ThAOgircUgnSYIyZHWATxTwG/wLUoZJKEf4v4I8DEWXHoCYHjCYnnAeZLXx5URXUkEQW7muJ7s7stBg+O/jIam1TyJA7cOKD2FJnVhIippgCTq2NPS596GMN7LyjOGEukw6sPUKCe3xJPg4v8yoe2nkquqI50ssiCus8XokQFOsalOGPUJKiYBWnRChinIAfBuPsIWqiKyxtdhw/ZwlxVuED21jSML/7//48rZ72+53h+2X//X//u//83/+Pya+FM4="; \ No newline at end of file diff --git a/docs/classes/_questdb_browser-client.QwpBatchTooLargeError.html b/docs/classes/_questdb_browser-client.QwpBatchTooLargeError.html index c204bc78..1a1bd41b 100644 --- a/docs/classes/_questdb_browser-client.QwpBatchTooLargeError.html +++ b/docs/classes/_questdb_browser-client.QwpBatchTooLargeError.html @@ -1,7 +1,7 @@ -QwpBatchTooLargeError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • RangeError
    • QwpBatchTooLargeError
Index

Constructors

constructor +QwpBatchTooLargeError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • RangeError
    • QwpBatchTooLargeError
Index

Constructors

Properties

batchSizeBytes: number
maxBatchSizeBytes: number
message: string
name: string
stack?: string
+

Constructors

Properties

batchSizeBytes: number
maxBatchSizeBytes: number
message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpBindValues.html b/docs/classes/_questdb_browser-client.QwpBindValues.html index 1ef291b5..fa136f54 100644 --- a/docs/classes/_questdb_browser-client.QwpBindValues.html +++ b/docs/classes/_questdb_browser-client.QwpBindValues.html @@ -1,7 +1,7 @@ QwpBindValues | QuestDB JavaScript Client - v5.0.0

Browser-safe typed positional bind encoder.

Setters must be called in ascending zero-based index order. SQL placeholders are one-based, so index 0 binds $1, index 1 binds $2, and so on.

-
Index

Constructors

Index

Constructors

Accessors

Methods

Constructors

Accessors

Methods

  • Binds a typed NULL.

    +

Constructors

Accessors

Methods

  • Binds a typed NULL.

    A null bind is exactly type + flag + bitmap. The only types that carry anything more are the ones whose prefix the decoder reads before it branches on the null flag: the DECIMAL scale byte and the GEOHASH @@ -40,6 +40,6 @@ the server read that word's first byte as the next bind's type code ("unsupported wire type 0x0"), or, after the last bind, as the trailing queryFlags varint -- silently dropping a requested dictionary reset.

    -

    Parameters

    Returns this

+

Parameters

Returns this

diff --git a/docs/classes/_questdb_browser-client.QwpBrowserSessionBootstrapError.html b/docs/classes/_questdb_browser-client.QwpBrowserSessionBootstrapError.html index d5da1968..0aea204a 100644 --- a/docs/classes/_questdb_browser-client.QwpBrowserSessionBootstrapError.html +++ b/docs/classes/_questdb_browser-client.QwpBrowserSessionBootstrapError.html @@ -1,5 +1,5 @@ QwpBrowserSessionBootstrapError | QuestDB JavaScript Client - v5.0.0

Class QwpBrowserSessionBootstrapError

An HTTP rejection while creating a browser qdb_session cookie.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

cause? closeCode? kind @@ -17,7 +17,7 @@ url?

Accessors

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
responseBody: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

-
tryNextEndpoint?: boolean
url?: string | URL

Accessors

+

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
responseBody: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

+
tryNextEndpoint?: boolean
url?: string | URL

Accessors

diff --git a/docs/classes/_questdb_browser-client.QwpByteReader.html b/docs/classes/_questdb_browser-client.QwpByteReader.html index 915be8d9..120ccb66 100644 --- a/docs/classes/_questdb_browser-client.QwpByteReader.html +++ b/docs/classes/_questdb_browser-client.QwpByteReader.html @@ -1,5 +1,5 @@ QwpByteReader | QuestDB JavaScript Client - v5.0.0

A bounds-checked, runtime-neutral little-endian byte reader.

-
Index

Constructors

Index

Constructors

Properties

Accessors

Constructors

Properties

bytes: Uint8Array

Accessors

Methods

+

Constructors

Properties

bytes: Uint8Array

Accessors

Methods

diff --git a/docs/classes/_questdb_browser-client.QwpByteWriter.html b/docs/classes/_questdb_browser-client.QwpByteWriter.html index b59f90d7..7e650c77 100644 --- a/docs/classes/_questdb_browser-client.QwpByteWriter.html +++ b/docs/classes/_questdb_browser-client.QwpByteWriter.html @@ -1,5 +1,5 @@ QwpByteWriter | QuestDB JavaScript Client - v5.0.0

A growable, runtime-neutral little-endian byte writer.

-
Index

Constructors

Index

Constructors

Accessors

Methods

Constructors

Accessors

Methods

+

Constructors

Accessors

Methods

diff --git a/docs/classes/_questdb_browser-client.QwpClient.html b/docs/classes/_questdb_browser-client.QwpClient.html index f110736c..ad126b83 100644 --- a/docs/classes/_questdb_browser-client.QwpClient.html +++ b/docs/classes/_questdb_browser-client.QwpClient.html @@ -1,15 +1,15 @@ QwpClient | QuestDB JavaScript Client - v5.0.0

Browser-safe facade owning bounded ingress and egress connection pools. Borrowed handles are exclusive; separate query leases execute concurrently.

-
Index

Constructors

Index

Constructors

Accessors

Methods

  • Rejects new borrows and closes idle resources. Borrowed query sessions are +

Constructors

Accessors

Methods

  • Rejects new borrows and closes idle resources. Borrowed query sessions are cancelled and closed; borrowed senders retain ownership during a bounded drain and own their teardown if they outlive it.

    -

    Returns Promise<void>

+

Returns Promise<void>

diff --git a/docs/classes/_questdb_browser-client.QwpClientClosedError.html b/docs/classes/_questdb_browser-client.QwpClientClosedError.html index 95f3cb3f..8fbe4283 100644 --- a/docs/classes/_questdb_browser-client.QwpClientClosedError.html +++ b/docs/classes/_questdb_browser-client.QwpClientClosedError.html @@ -1,6 +1,6 @@ QwpClientClosedError | QuestDB JavaScript Client - v5.0.0

The owning QWP client, or one of its returned lease handles, is closed.

-

Hierarchy

  • Error
    • QwpClientClosedError
Index

Constructors

Hierarchy

  • Error
    • QwpClientClosedError
Index

Constructors

Properties

Constructors

Properties

message: string
name: string
stack?: string
+

Constructors

Properties

message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpDurableAckUnavailableError.html b/docs/classes/_questdb_browser-client.QwpDurableAckUnavailableError.html index ca5269a5..2170c6c3 100644 --- a/docs/classes/_questdb_browser-client.QwpDurableAckUnavailableError.html +++ b/docs/classes/_questdb_browser-client.QwpDurableAckUnavailableError.html @@ -1,5 +1,5 @@ QwpDurableAckUnavailableError | QuestDB JavaScript Client - v5.0.0

Class QwpDurableAckUnavailableError

A requested durable-ACK capability was not confirmed by the server.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

cause? closeCode? kind @@ -16,7 +16,7 @@ url?

Accessors

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

-
tryNextEndpoint?: boolean
url?: string | URL

Accessors

+

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

+
tryNextEndpoint?: boolean
url?: string | URL

Accessors

diff --git a/docs/classes/_questdb_browser-client.QwpEgressQuery.html b/docs/classes/_questdb_browser-client.QwpEgressQuery.html index 6003f9a1..75f8e08a 100644 --- a/docs/classes/_questdb_browser-client.QwpEgressQuery.html +++ b/docs/classes/_questdb_browser-client.QwpEgressQuery.html @@ -1,5 +1,5 @@ QwpEgressQuery | QuestDB JavaScript Client - v5.0.0

One QWP query/statement and its stream of materialized result batches.

-

Implements

Index

Constructors

Implements

Index

Constructors

Properties

Accessors

Constructors

Properties

completion: Promise<QwpQueryCompletion>
requestId: bigint

Accessors

Methods

  • Waits for completion without changing the query lifecycle. A finite wait +

Constructors

Properties

completion: Promise<QwpQueryCompletion>
requestId: bigint

Accessors

Methods

  • Waits for completion without changing the query lifecycle. A finite wait returns false on expiry; the query remains active until it completes, is cancelled explicitly, or its configured query deadline expires.

    -

    Parameters

    • timeoutMs: number

    Returns Promise<boolean>

+

Parameters

  • timeoutMs: number

Returns Promise<boolean>

diff --git a/docs/classes/_questdb_browser-client.QwpEgressQueryAbandonedError.html b/docs/classes/_questdb_browser-client.QwpEgressQueryAbandonedError.html index 4dfb34e0..b6670a37 100644 --- a/docs/classes/_questdb_browser-client.QwpEgressQueryAbandonedError.html +++ b/docs/classes/_questdb_browser-client.QwpEgressQueryAbandonedError.html @@ -1,7 +1,7 @@ QwpEgressQueryAbandonedError | QuestDB JavaScript Client - v5.0.0

Class QwpEgressQueryAbandonedError

Result iteration ended before the server completed the query.

-

Hierarchy

  • Error
    • QwpEgressQueryAbandonedError
Index

Constructors

Hierarchy

  • Error
    • QwpEgressQueryAbandonedError
Index

Constructors

Properties

Constructors

Properties

message: string
name: string
requestId: bigint
stack?: string
+

Constructors

Properties

message: string
name: string
requestId: bigint
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpEgressQueryCancelTimeoutError.html b/docs/classes/_questdb_browser-client.QwpEgressQueryCancelTimeoutError.html index 631fb724..09a838a7 100644 --- a/docs/classes/_questdb_browser-client.QwpEgressQueryCancelTimeoutError.html +++ b/docs/classes/_questdb_browser-client.QwpEgressQueryCancelTimeoutError.html @@ -1,8 +1,8 @@ QwpEgressQueryCancelTimeoutError | QuestDB JavaScript Client - v5.0.0

Class QwpEgressQueryCancelTimeoutError

The server did not terminate a cancelled query within the drain deadline.

-

Hierarchy

  • Error
    • QwpEgressQueryCancelTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpEgressQueryCancelTimeoutError
Index

Constructors

Properties

message: string
name: string
requestId: bigint
stack?: string
timeoutMs: number
+

Constructors

Properties

message: string
name: string
requestId: bigint
stack?: string
timeoutMs: number
diff --git a/docs/classes/_questdb_browser-client.QwpEgressQueryError.html b/docs/classes/_questdb_browser-client.QwpEgressQueryError.html index 3246cb25..e33862ed 100644 --- a/docs/classes/_questdb_browser-client.QwpEgressQueryError.html +++ b/docs/classes/_questdb_browser-client.QwpEgressQueryError.html @@ -1,7 +1,7 @@ -QwpEgressQueryError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • Error
    • QwpEgressQueryError
Index

Constructors

constructor +QwpEgressQueryError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • Error
    • QwpEgressQueryError
Index

Constructors

Properties

Constructors

Properties

message: string
name: string
requestId: bigint
stack?: string
status: number
+

Constructors

Properties

message: string
name: string
requestId: bigint
stack?: string
status: number
diff --git a/docs/classes/_questdb_browser-client.QwpEgressQueryTimeoutError.html b/docs/classes/_questdb_browser-client.QwpEgressQueryTimeoutError.html index 8c9986ee..78ed4370 100644 --- a/docs/classes/_questdb_browser-client.QwpEgressQueryTimeoutError.html +++ b/docs/classes/_questdb_browser-client.QwpEgressQueryTimeoutError.html @@ -1,8 +1,8 @@ QwpEgressQueryTimeoutError | QuestDB JavaScript Client - v5.0.0

A client-side query deadline expired and a QWP CANCEL was sent.

-

Hierarchy

  • Error
    • QwpEgressQueryTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpEgressQueryTimeoutError
Index

Constructors

Properties

message: string
name: string
requestId: bigint
stack?: string
timeoutMs: number
+

Constructors

Properties

message: string
name: string
requestId: bigint
stack?: string
timeoutMs: number
diff --git a/docs/classes/_questdb_browser-client.QwpEgressReplayRequiredError.html b/docs/classes/_questdb_browser-client.QwpEgressReplayRequiredError.html index 4431862d..1d8cb3e7 100644 --- a/docs/classes/_questdb_browser-client.QwpEgressReplayRequiredError.html +++ b/docs/classes/_questdb_browser-client.QwpEgressReplayRequiredError.html @@ -1,9 +1,9 @@ QwpEgressReplayRequiredError | QuestDB JavaScript Client - v5.0.0

Class QwpEgressReplayRequiredError

Standard egress sessions now reset and replay automatically. Retained for source compatibility with clients that classified the former explicit-replay opt-in failure.

-

Hierarchy

  • Error
    • QwpEgressReplayRequiredError
Index

Constructors

Hierarchy

  • Error
    • QwpEgressReplayRequiredError
Index

Constructors

Properties

Constructors

Properties

message: string
name: string
requestId?: bigint
stack?: string
+

Constructors

Properties

message: string
name: string
requestId?: bigint
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpEgressSession.html b/docs/classes/_questdb_browser-client.QwpEgressSession.html index 46429b61..d21fe71e 100644 --- a/docs/classes/_questdb_browser-client.QwpEgressSession.html +++ b/docs/classes/_questdb_browser-client.QwpEgressSession.html @@ -2,7 +2,7 @@

The server currently executes one query at a time per connection, so this session deliberately rejects overlapping query calls. A completed query's materialized batches may still be consumed while the next query runs.

-

Implements

  • QwpEgressQueryControl
Index

Constructors

Implements

  • QwpEgressQueryControl
Index

Constructors

Properties

Accessors

Constructors

Properties

ready: Promise<QwpServerInfoMessage>

Initial SERVER_INFO; use serverInfo for the current post-failover snapshot.

-

Accessors

  • get metrics(): QwpEgressMetrics

    Immutable notification-inbox counters for this session's reconnect +

Constructors

Properties

ready: Promise<QwpServerInfoMessage>

Initial SERVER_INFO; use serverInfo for the current post-failover snapshot.

+

Accessors

  • get metrics(): QwpEgressMetrics

    Immutable notification-inbox counters for this session's reconnect observer, the egress counterpart of QwpIngressSession.metrics.

    A reconnect.onEvent observer runs on a bounded inbox that drops its oldest pending entry under overflow, exactly as ingress does. Nothing @@ -30,19 +30,19 @@ either, because attempt resets to one on every success: six outages that discarded eleven events were indistinguishable from a healthy two. A non-zero drop count means the observer is not keeping up.

    -

    Returns QwpEgressMetrics

Methods

  • Parameters

    • requestId: bigint
    • additionalBytes: number | bigint
    • replayOnReconnect: boolean = true

    Returns Promise<void>

Methods

  • Parameters

    • requestId: bigint
    • additionalBytes: number | bigint
    • replayOnReconnect: boolean = true
    • acceptWhenReconnectStarts: boolean = false

    Returns Promise<void>

  • Internal

    Cancels and drains an active operation before a pooled lease is returned. False means the physical session is no longer safe to reuse.

    -

    Returns Promise<boolean>

  • Internal

    Best-effort cancellation followed by physical connection teardown for facade shutdown. Unlike pooled lease return, this does not wait for the server to finish draining the cancelled query.

    -

    Returns Promise<void>

+

Returns Promise<void>

diff --git a/docs/classes/_questdb_browser-client.QwpEgressSessionClosedError.html b/docs/classes/_questdb_browser-client.QwpEgressSessionClosedError.html index ec317960..bb896e90 100644 --- a/docs/classes/_questdb_browser-client.QwpEgressSessionClosedError.html +++ b/docs/classes/_questdb_browser-client.QwpEgressSessionClosedError.html @@ -1,6 +1,6 @@ -QwpEgressSessionClosedError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • Error
    • QwpEgressSessionClosedError
Index

Constructors

constructor +QwpEgressSessionClosedError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • Error
    • QwpEgressSessionClosedError
Index

Constructors

Properties

Constructors

Properties

message: string
name: string
stack?: string
+

Constructors

Properties

message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpFailoverError.html b/docs/classes/_questdb_browser-client.QwpFailoverError.html index 82f6e53f..30a79182 100644 --- a/docs/classes/_questdb_browser-client.QwpFailoverError.html +++ b/docs/classes/_questdb_browser-client.QwpFailoverError.html @@ -1,8 +1,8 @@ QwpFailoverError | QuestDB JavaScript Client - v5.0.0

Every eligible QWP endpoint in one connection sweep failed.

-

Hierarchy

  • Error
    • QwpFailoverError
Index

Constructors

Hierarchy

  • Error
    • QwpFailoverError
Index

Constructors

Properties

Constructors

Properties

attempts: readonly QwpFailoverAttempt[]
cause?: unknown
message: string
name: string
stack?: string
+

Constructors

Properties

attempts: readonly QwpFailoverAttempt[]
cause?: unknown
message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpIngressAckAbandonedError.html b/docs/classes/_questdb_browser-client.QwpIngressAckAbandonedError.html index 9d316b6b..b7ab7d3d 100644 --- a/docs/classes/_questdb_browser-client.QwpIngressAckAbandonedError.html +++ b/docs/classes/_questdb_browser-client.QwpIngressAckAbandonedError.html @@ -1,9 +1,9 @@ QwpIngressAckAbandonedError | QuestDB JavaScript Client - v5.0.0

A recovered frame was deliberately retired without a server ACK.

-

Hierarchy

  • Error
    • QwpIngressAckAbandonedError
Index

Constructors

Hierarchy

  • Error
    • QwpIngressAckAbandonedError
Index

Constructors

Properties

fromFsn: bigint
message: string
name: string
stack?: string
targetSequence: bigint
toFsn: bigint
+

Constructors

Properties

fromFsn: bigint
message: string
name: string
stack?: string
targetSequence: bigint
toFsn: bigint
diff --git a/docs/classes/_questdb_browser-client.QwpIngressAckTimeoutError.html b/docs/classes/_questdb_browser-client.QwpIngressAckTimeoutError.html index 7eb447ec..43bd9e10 100644 --- a/docs/classes/_questdb_browser-client.QwpIngressAckTimeoutError.html +++ b/docs/classes/_questdb_browser-client.QwpIngressAckTimeoutError.html @@ -1,9 +1,9 @@ QwpIngressAckTimeoutError | QuestDB JavaScript Client - v5.0.0

The ingress ACK watermark did not reach the requested frame in time.

-

Hierarchy

  • Error
    • QwpIngressAckTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpIngressAckTimeoutError
Index

Constructors

Properties

acknowledgedSequence: bigint
message: string
name: string
stack?: string
targetSequence: bigint
timeoutMs: number
+

Constructors

Properties

acknowledgedSequence: bigint
message: string
name: string
stack?: string
targetSequence: bigint
timeoutMs: number
diff --git a/docs/classes/_questdb_browser-client.QwpIngressNackError.html b/docs/classes/_questdb_browser-client.QwpIngressNackError.html index c5884402..6fb12b34 100644 --- a/docs/classes/_questdb_browser-client.QwpIngressNackError.html +++ b/docs/classes/_questdb_browser-client.QwpIngressNackError.html @@ -1,7 +1,7 @@ -QwpIngressNackError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • Error
    • QwpIngressNackError
Index

Constructors

constructor +QwpIngressNackError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • Error
    • QwpIngressNackError
Index

Constructors

Properties

message: string
name: string
senderError: QwpSenderError = ...
stack?: string
+

Constructors

Properties

message: string
name: string
senderError: QwpSenderError = ...
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpIngressSession.html b/docs/classes/_questdb_browser-client.QwpIngressSession.html index 4110c5e9..baf6a047 100644 --- a/docs/classes/_questdb_browser-client.QwpIngressSession.html +++ b/docs/classes/_questdb_browser-client.QwpIngressSession.html @@ -3,7 +3,7 @@ from racing its waiter. Calls are serialized to preserve the server's zero-based wire sequence. Successful ACKs are cumulative, so an ACK for sequence N resolves every outstanding send through N.

-
Index

Constructors

Index

Constructors

Accessors

  • get acknowledgedFrameSequence(): bigint

    Highest cumulative ACK watermark. When durable ACK is being tracked this +

Constructors

Accessors

  • get acknowledgedFrameSequence(): bigint

    Highest cumulative ACK watermark. When durable ACK is being tracked this advances only after durability; otherwise it follows ordinary OK ACKs.

    -

    Returns bigint

Methods

Methods

  • Prompts the server to publish its latest durable-ingress watermarks. Node transports use a WebSocket PING; browsers send the protocol-level table-less durable-ACK poll frame. Browser completion means the control frame was published; durable progress arrives independently because the server may withhold its cumulative OK while a transaction remains open.

    -

    Returns Promise<void>

  • Publishes one pre-encoded frame without allocating an ACK waiter. Applications can observe later acceptance through progress callbacks.

    -

    Parameters

    • frame: Uint8Array

    Returns Promise<void>

  • Waits independently for the cumulative frame ACK watermark. A negative target is already satisfied, but still surfaces a latched session error.

    -

    Parameters

    • targetSequence: bigint
    • timeoutMs: number = ...

    Returns Promise<void>

+

Returns Promise<QwpIngressSession>

diff --git a/docs/classes/_questdb_browser-client.QwpIngressSessionClosedError.html b/docs/classes/_questdb_browser-client.QwpIngressSessionClosedError.html index ad96a215..855d69ad 100644 --- a/docs/classes/_questdb_browser-client.QwpIngressSessionClosedError.html +++ b/docs/classes/_questdb_browser-client.QwpIngressSessionClosedError.html @@ -1,6 +1,6 @@ -QwpIngressSessionClosedError | QuestDB JavaScript Client - v5.0.0

Class QwpIngressSessionClosedError

Hierarchy

  • Error
    • QwpIngressSessionClosedError
Index

Constructors

constructor +QwpIngressSessionClosedError | QuestDB JavaScript Client - v5.0.0

Class QwpIngressSessionClosedError

Hierarchy

  • Error
    • QwpIngressSessionClosedError
Index

Constructors

Properties

Constructors

Properties

message: string
name: string
stack?: string
+

Constructors

Properties

message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpMemoryReplayAppendTimeoutError.html b/docs/classes/_questdb_browser-client.QwpMemoryReplayAppendTimeoutError.html index 551b9f89..d895b3e9 100644 --- a/docs/classes/_questdb_browser-client.QwpMemoryReplayAppendTimeoutError.html +++ b/docs/classes/_questdb_browser-client.QwpMemoryReplayAppendTimeoutError.html @@ -1,5 +1,5 @@ QwpMemoryReplayAppendTimeoutError | QuestDB JavaScript Client - v5.0.0

Class QwpMemoryReplayAppendTimeoutError

ACK-driven trimming did not free in-memory replay capacity in time.

-

Hierarchy

  • Error
    • QwpMemoryReplayAppendTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpMemoryReplayAppendTimeoutError
Index

Constructors

Properties

Constructors

Properties

maxBytes: number
message: string
name: string
requiredBytes: number
stack?: string
timeoutMs: number
usedBytes: number
+

Constructors

Properties

maxBytes: number
message: string
name: string
requiredBytes: number
stack?: string
timeoutMs: number
usedBytes: number
diff --git a/docs/classes/_questdb_browser-client.QwpMemoryReplayBatchTooLargeError.html b/docs/classes/_questdb_browser-client.QwpMemoryReplayBatchTooLargeError.html index dd8bedb4..19a49a99 100644 --- a/docs/classes/_questdb_browser-client.QwpMemoryReplayBatchTooLargeError.html +++ b/docs/classes/_questdb_browser-client.QwpMemoryReplayBatchTooLargeError.html @@ -1,9 +1,9 @@ QwpMemoryReplayBatchTooLargeError | QuestDB JavaScript Client - v5.0.0

Class QwpMemoryReplayBatchTooLargeError

One logical batch can never fit in the configured in-memory replay budget.

-

Hierarchy

  • RangeError
    • QwpMemoryReplayBatchTooLargeError
Index

Constructors

Hierarchy

  • RangeError
    • QwpMemoryReplayBatchTooLargeError
Index

Constructors

Properties

frameCount: number
maxBytes: number
message: string
name: string
requiredBytes: number
stack?: string
+

Constructors

Properties

frameCount: number
maxBytes: number
message: string
name: string
requiredBytes: number
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpMemoryReplayFrameTooLargeError.html b/docs/classes/_questdb_browser-client.QwpMemoryReplayFrameTooLargeError.html index f8c29ddf..0adbd376 100644 --- a/docs/classes/_questdb_browser-client.QwpMemoryReplayFrameTooLargeError.html +++ b/docs/classes/_questdb_browser-client.QwpMemoryReplayFrameTooLargeError.html @@ -1,9 +1,9 @@ QwpMemoryReplayFrameTooLargeError | QuestDB JavaScript Client - v5.0.0

Class QwpMemoryReplayFrameTooLargeError

One frame can never fit in the configured in-memory replay budget.

-

Hierarchy

  • RangeError
    • QwpMemoryReplayFrameTooLargeError
Index

Constructors

Hierarchy

  • RangeError
    • QwpMemoryReplayFrameTooLargeError
Index

Constructors

Properties

maxBytes: number
message: string
name: string
payloadBytes: number
requiredBytes: number
stack?: string
+

Constructors

Properties

maxBytes: number
message: string
name: string
payloadBytes: number
requiredBytes: number
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpPoolAcquireTimeoutError.html b/docs/classes/_questdb_browser-client.QwpPoolAcquireTimeoutError.html index 32fe171a..e4ff96a4 100644 --- a/docs/classes/_questdb_browser-client.QwpPoolAcquireTimeoutError.html +++ b/docs/classes/_questdb_browser-client.QwpPoolAcquireTimeoutError.html @@ -1,8 +1,8 @@ QwpPoolAcquireTimeoutError | QuestDB JavaScript Client - v5.0.0

A bounded QWP pool could not provide a connection before its deadline.

-

Hierarchy

  • Error
    • QwpPoolAcquireTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpPoolAcquireTimeoutError
Index

Constructors

Properties

message: string
name: string
resource: "sender" | "query"
stack?: string
timeoutMs: number
+

Constructors

Properties

message: string
name: string
resource: "sender" | "query"
stack?: string
timeoutMs: number
diff --git a/docs/classes/_questdb_browser-client.QwpPoolResourceError.html b/docs/classes/_questdb_browser-client.QwpPoolResourceError.html index 29aa9be5..eb4a18b2 100644 --- a/docs/classes/_questdb_browser-client.QwpPoolResourceError.html +++ b/docs/classes/_questdb_browser-client.QwpPoolResourceError.html @@ -1,8 +1,8 @@ QwpPoolResourceError | QuestDB JavaScript Client - v5.0.0

A pooled resource failed while a new slot was being connected.

-

Hierarchy

  • Error
    • QwpPoolResourceError
Index

Constructors

Hierarchy

  • Error
    • QwpPoolResourceError
Index

Constructors

Properties

Constructors

Properties

cause: unknown
message: string
name: string
resource: "sender" | "query"
stack?: string
+

Constructors

Properties

cause: unknown
message: string
name: string
resource: "sender" | "query"
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpProtocolError.html b/docs/classes/_questdb_browser-client.QwpProtocolError.html index a789544d..8760d227 100644 --- a/docs/classes/_questdb_browser-client.QwpProtocolError.html +++ b/docs/classes/_questdb_browser-client.QwpProtocolError.html @@ -1,6 +1,6 @@ QwpProtocolError | QuestDB JavaScript Client - v5.0.0

Raised when a QWP payload is malformed, truncated, or unsupported.

-

Hierarchy

  • Error
    • QwpProtocolError
Index

Constructors

Hierarchy

  • Error
    • QwpProtocolError
Index

Constructors

Properties

Constructors

Properties

message: string
name: string
stack?: string
+

Constructors

Properties

message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpQueryLease.html b/docs/classes/_questdb_browser-client.QwpQueryLease.html index ef876ac2..9cdc99cb 100644 --- a/docs/classes/_questdb_browser-client.QwpQueryLease.html +++ b/docs/classes/_questdb_browser-client.QwpQueryLease.html @@ -1,5 +1,5 @@ QwpQueryLease | QuestDB JavaScript Client - v5.0.0

One exclusively borrowed egress session from a QwpClient query pool.

-
Index

Constructors

Index

Constructors

Properties

Accessors

Methods

Constructors

Properties

ready: Promise<QwpServerInfoMessage>

Initial SERVER_INFO; use serverInfo for the current post-failover snapshot.

-

Accessors

  • get serverInfo(): undefined | QwpServerInfoMessage

    Cached immutable SERVER_INFO for this lease's currently bound endpoint. +

Constructors

Properties

ready: Promise<QwpServerInfoMessage>

Initial SERVER_INFO; use serverInfo for the current post-failover snapshot.

+

Accessors

Methods

+

Returns undefined | QwpServerInfoMessage

Methods

diff --git a/docs/classes/_questdb_browser-client.QwpReconnectExhaustedError.html b/docs/classes/_questdb_browser-client.QwpReconnectExhaustedError.html index 095e9f07..1870ded5 100644 --- a/docs/classes/_questdb_browser-client.QwpReconnectExhaustedError.html +++ b/docs/classes/_questdb_browser-client.QwpReconnectExhaustedError.html @@ -1,8 +1,8 @@ QwpReconnectExhaustedError | QuestDB JavaScript Client - v5.0.0

A configured QWP reconnect policy exhausted its retry boundary.

-

Hierarchy

  • Error
    • QwpReconnectExhaustedError
Index

Constructors

Hierarchy

  • Error
    • QwpReconnectExhaustedError
Index

Constructors

Properties

Constructors

Properties

attempts: number
cause: unknown
message: string
name: string
stack?: string
+

Constructors

Properties

attempts: number
cause: unknown
message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpReplayDictionaryError.html b/docs/classes/_questdb_browser-client.QwpReplayDictionaryError.html index 0b2f7986..fefbec1e 100644 --- a/docs/classes/_questdb_browser-client.QwpReplayDictionaryError.html +++ b/docs/classes/_questdb_browser-client.QwpReplayDictionaryError.html @@ -1,7 +1,7 @@ QwpReplayDictionaryError | QuestDB JavaScript Client - v5.0.0

A replay store cannot preserve the dictionary required by delta frames.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
+

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpReplayDictionaryPersistenceError.html b/docs/classes/_questdb_browser-client.QwpReplayDictionaryPersistenceError.html index 5112fc12..fc4aa78d 100644 --- a/docs/classes/_questdb_browser-client.QwpReplayDictionaryPersistenceError.html +++ b/docs/classes/_questdb_browser-client.QwpReplayDictionaryPersistenceError.html @@ -1,9 +1,9 @@ QwpReplayDictionaryPersistenceError | QuestDB JavaScript Client - v5.0.0

Class QwpReplayDictionaryPersistenceError

A replay dictionary sidecar rejected an append before its delta frame was published. The reconnecting transport has permanently switched to full, self-contained symbol encoding; retrying the logical batch is safe.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
+

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpReplayRejectedError.html b/docs/classes/_questdb_browser-client.QwpReplayRejectedError.html index cf50a45a..10397dfb 100644 --- a/docs/classes/_questdb_browser-client.QwpReplayRejectedError.html +++ b/docs/classes/_questdb_browser-client.QwpReplayRejectedError.html @@ -1,8 +1,8 @@ QwpReplayRejectedError | QuestDB JavaScript Client - v5.0.0

A replayed ingress frame was rejected and remains in persistent storage.

-

Hierarchy

  • Error
    • QwpReplayRejectedError
Index

Constructors

Hierarchy

  • Error
    • QwpReplayRejectedError
Index

Constructors

Properties

frameSequence: bigint
message: string
name: string
stack?: string
status: number
+

Constructors

Properties

frameSequence: bigint
message: string
name: string
stack?: string
status: number
diff --git a/docs/classes/_questdb_browser-client.QwpResultBatch.html b/docs/classes/_questdb_browser-client.QwpResultBatch.html index 0825d407..f8c7f1eb 100644 --- a/docs/classes/_questdb_browser-client.QwpResultBatch.html +++ b/docs/classes/_questdb_browser-client.QwpResultBatch.html @@ -1,4 +1,4 @@ -QwpResultBatch | QuestDB JavaScript Client - v5.0.0
Index

Constructors

constructor +QwpResultBatch | QuestDB JavaScript Client - v5.0.0
Index

Constructors

Properties

Methods

Constructors

Properties

batchSequence: bigint
columns: readonly QwpResultColumn[]
requestId: bigint
rowCount: number
tableName: string

Methods

+

Constructors

Properties

batchSequence: bigint
columns: readonly QwpResultColumn[]
requestId: bigint
rowCount: number
tableName: string

Methods

diff --git a/docs/classes/_questdb_browser-client.QwpResultBatchDecoder.html b/docs/classes/_questdb_browser-client.QwpResultBatchDecoder.html index 6c3cc9cc..6d5051ea 100644 --- a/docs/classes/_questdb_browser-client.QwpResultBatchDecoder.html +++ b/docs/classes/_questdb_browser-client.QwpResultBatchDecoder.html @@ -1,5 +1,5 @@ QwpResultBatchDecoder | QuestDB JavaScript Client - v5.0.0

Stateful decoder for connection-scoped QWP result batches.

-
Index

Constructors

Index

Constructors

Properties

Methods

absorbDictionary applyCacheReset @@ -17,7 +17,7 @@ only by QWP_MAX_CELLS_PER_BATCH times the pool size, which the cap's own comment puts at roughly half a gigabyte per slot.

Left undefined the batch is bounded by the cell cap alone, as before.

-

Methods

Methods

  • Applies the delta symbol dictionary carried by a batch whose rows are being discarded, without touching any per-query state.

    The dictionary is connection-scoped and cumulative: the server numbers entries from where the previous batch left off, on the connection rather @@ -31,9 +31,9 @@ asked for.

    The dictionary sits at the front of the body, so this reads only as far as it needs to and never decodes the rows it is throwing away.

    -

    Parameters

    Returns void

+

Parameters

Returns QwpResultBatchView

diff --git a/docs/classes/_questdb_browser-client.QwpResultBatchView.html b/docs/classes/_questdb_browser-client.QwpResultBatchView.html index 543f7e43..10af101f 100644 --- a/docs/classes/_questdb_browser-client.QwpResultBatchView.html +++ b/docs/classes/_questdb_browser-client.QwpResultBatchView.html @@ -1,7 +1,7 @@ QwpResultBatchView | QuestDB JavaScript Client - v5.0.0

Batch-owned reusable view delivered by QwpEgressSession.queryViews(). Access is invalid after the callback returns. materialize() creates an independently owned QwpResultBatch when retention is required.

-
Index

Constructors

Index

Constructors

Accessors

Constructors

Accessors

Methods

  • Visits rows in index order with one re-pointed row view. The callback is +

Constructors

Accessors

Methods

  • Internal

    Parameters

    • requestId: bigint
    • batchSequence: bigint
    • tableName: string
    • rowCount: number
    • layouts: QwpResultColumnViewLayout[]

    Returns this

  • Internal

    Parameters

    • requestId: bigint
    • batchSequence: bigint
    • tableName: string
    • rowCount: number
    • layouts: QwpResultColumnViewLayout[]

    Returns this

+

Parameters

  • rowIndex: number

Returns QwpResultRowView

diff --git a/docs/classes/_questdb_browser-client.QwpResultColumnView.html b/docs/classes/_questdb_browser-client.QwpResultColumnView.html index d88f2f02..da9575c1 100644 --- a/docs/classes/_questdb_browser-client.QwpResultColumnView.html +++ b/docs/classes/_questdb_browser-client.QwpResultColumnView.html @@ -2,7 +2,7 @@

The view and every byte slice returned from it are valid only while the surrounding queryViews() callback is running. Copy data that must outlive the callback.

-
Index

Constructors

Index

Constructors

Properties

Accessors

Constructors

Properties

columnIndex: number

Accessors

Methods

  • Raw packed non-null values. Fixed-width values use QWP little-endian +

Constructors

Properties

columnIndex: number

Accessors

Methods

  • Raw packed non-null values. Fixed-width values use QWP little-endian layout; booleans are bit-packed and variable-width columns contain their uint32 offset table. SYMBOL returns undefined because IDs are varints.

    -

    Returns undefined | Uint8Array<ArrayBufferLike>

+

Returns undefined | Uint8Array<ArrayBufferLike>

diff --git a/docs/classes/_questdb_browser-client.QwpResultRowView.html b/docs/classes/_questdb_browser-client.QwpResultRowView.html index 673582e2..a031e4ef 100644 --- a/docs/classes/_questdb_browser-client.QwpResultRowView.html +++ b/docs/classes/_questdb_browser-client.QwpResultRowView.html @@ -3,7 +3,7 @@ while the surrounding queryViews() callback is running, and must not be retained across forEachRow() iterations. Byte and array views returned by its accessors remain zero-copy and have the same lifetime.

-
Index

Constructors

Index

Constructors

Accessors

Methods

get @@ -29,10 +29,10 @@ getUuidLow isNull of -

Constructors

Accessors

Methods

+

Constructors

Accessors

Methods

diff --git a/docs/classes/_questdb_browser-client.QwpRoleMismatchError.html b/docs/classes/_questdb_browser-client.QwpRoleMismatchError.html index a99325f4..6cdf4c47 100644 --- a/docs/classes/_questdb_browser-client.QwpRoleMismatchError.html +++ b/docs/classes/_questdb_browser-client.QwpRoleMismatchError.html @@ -1,5 +1,5 @@ QwpRoleMismatchError | QuestDB JavaScript Client - v5.0.0

A connected endpoint advertised a role that does not satisfy target.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

cause? closeCode? kind @@ -17,7 +17,7 @@ url?

Accessors

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
target: QwpTarget
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

-
tryNextEndpoint?: boolean
url?: string | URL

Accessors

+

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
target: QwpTarget
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

+
tryNextEndpoint?: boolean
url?: string | URL

Accessors

diff --git a/docs/classes/_questdb_browser-client.QwpSendClosedError.html b/docs/classes/_questdb_browser-client.QwpSendClosedError.html index 12555b68..ba4c16a5 100644 --- a/docs/classes/_questdb_browser-client.QwpSendClosedError.html +++ b/docs/classes/_questdb_browser-client.QwpSendClosedError.html @@ -1,8 +1,8 @@ QwpSendClosedError | QuestDB JavaScript Client - v5.0.0

A QWP send was rejected because its WebSocket closed.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
+

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpSendError.html b/docs/classes/_questdb_browser-client.QwpSendError.html index 3dd8ddac..086ebe20 100644 --- a/docs/classes/_questdb_browser-client.QwpSendError.html +++ b/docs/classes/_questdb_browser-client.QwpSendError.html @@ -1,7 +1,7 @@ QwpSendError | QuestDB JavaScript Client - v5.0.0

A failure while handing a QWP frame to the WebSocket transport.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
+

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpSendTimeoutError.html b/docs/classes/_questdb_browser-client.QwpSendTimeoutError.html index 831a774e..c927e473 100644 --- a/docs/classes/_questdb_browser-client.QwpSendTimeoutError.html +++ b/docs/classes/_questdb_browser-client.QwpSendTimeoutError.html @@ -1,9 +1,9 @@ QwpSendTimeoutError | QuestDB JavaScript Client - v5.0.0

The WebSocket did not drain a QWP frame before its send deadline.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

bufferedAmountBytes?: number
cause?: unknown
message: string
name: string
stack?: string
timeoutMs: number
+

Constructors

Properties

bufferedAmountBytes?: number
cause?: unknown
message: string
name: string
stack?: string
timeoutMs: number
diff --git a/docs/classes/_questdb_browser-client.QwpSender.html b/docs/classes/_questdb_browser-client.QwpSender.html index 5ff7640f..3d328c0a 100644 --- a/docs/classes/_questdb_browser-client.QwpSender.html +++ b/docs/classes/_questdb_browser-client.QwpSender.html @@ -2,7 +2,7 @@

Applications normally obtain this class through create/connectQwpNodeSender or create/connectQwpBrowserSender, rather than constructing sessions and QwpTableBuffer instances themselves.

-
Index

Constructors

Index

Constructors

Accessors

Methods

  • Discards the row in progress, including its table selection, so the next +

Constructors

Accessors

Methods

  • Commits rows previously sent by transactional auto-flush. This is an ergonomic alias for flush(); pending local rows are included in the same group-closing frame.

    -

    Returns Promise<boolean>

  • Adds a QuestDB DATE column value in milliseconds since the epoch. -9_223_372_036_854_775_808n is QuestDB's DATE NULL sentinel: it is stored as NULL and cannot be stored as an ordinary value.

    -

    Parameters

    • name: string
    • millisecondsSinceEpoch: undefined | null | number | bigint

    Returns QwpSender

  • Parameters

    • name: string
    • unscaled: undefined | null | bigint | Int8Array<ArrayBufferLike>
    • scale: number

    Returns QwpSender

  • Parameters

    • name: string
    • unscaled: undefined | null | bigint | Int8Array<ArrayBufferLike>
    • scale: number

    Returns QwpSender

  • Publishes completed rows to the local ingress/replay boundary. This does not wait for a server ACK unless awaitServerAck or awaitDurableAck is set.

    -

    Returns Promise<boolean>

  • Publishes pending rows without waiting for their server ACK and returns the highest frame sequence produced by this call, or -1n when empty. Pass the result to waitForAcknowledged() when an explicit delivery barrier is needed.

    -

    Returns Promise<bigint>

  • Adds a QuestDB INT column value. -2_147_483_648 is QuestDB's INT NULL sentinel: it is stored as NULL and cannot be stored as an ordinary value.

    -

    Parameters

    • name: string
    • value: undefined | null | number

    Returns QwpSender

  • Parameters

    • name: string
    • word0: undefined | null | bigint
    • word1: undefined | null | bigint
    • word2: undefined | null | bigint
    • word3: undefined | null | bigint

    Returns QwpSender

  • Parameters

    • name: string
    • word0: undefined | null | bigint
    • word1: undefined | null | bigint
    • word2: undefined | null | bigint
    • word3: undefined | null | bigint

    Returns QwpSender

  • Adds a protocol LONG[] column value with between 1 and 32 dimensions.

    Current QuestDB servers reject LONG-array ingestion with long arrays are not supported, only double arrays. This method remains available for Java-client and protocol parity.

    -

    Parameters

    • name: string
    • value: undefined | null | unknown[]

    Returns QwpSender

  • Adds a QuestDB LONG column value. -9_223_372_036_854_775_808n is QuestDB's LONG NULL sentinel: it is stored as NULL and cannot be stored as an ordinary value.

    -

    Parameters

    • name: string
    • value: undefined | null | number | bigint

    Returns QwpSender

  • Internal

    Flushes completed rows and resets borrower-local staging without closing the physical session. Used by the pooled QWP client when a lease returns.

    -

    Returns Promise<void>

  • Independently waits until the cumulative ACK watermark covers a frame.

    -

    Parameters

    • targetSequence: bigint
    • OptionaltimeoutMs: number

    Returns Promise<void>

  • Independently waits until the cumulative ACK watermark covers a frame.

    +

    Parameters

    • targetSequence: bigint
    • OptionaltimeoutMs: number

    Returns Promise<void>

+

Type Parameters

Parameters

  • tableName: string
  • schema: Schema

Returns QwpTableWriter<Schema>

diff --git a/docs/classes/_questdb_browser-client.QwpSenderCloseTimeoutError.html b/docs/classes/_questdb_browser-client.QwpSenderCloseTimeoutError.html index 40a3a7f3..4ab26d75 100644 --- a/docs/classes/_questdb_browser-client.QwpSenderCloseTimeoutError.html +++ b/docs/classes/_questdb_browser-client.QwpSenderCloseTimeoutError.html @@ -1,9 +1,9 @@ QwpSenderCloseTimeoutError | QuestDB JavaScript Client - v5.0.0

close() could not publish and acknowledge all committed ingress frames.

-

Hierarchy

  • Error
    • QwpSenderCloseTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpSenderCloseTimeoutError
Index

Constructors

Properties

acknowledgedSequence: bigint
message: string
name: string
stack?: string
targetSequence: bigint
timeoutMs: number
+

Constructors

Properties

acknowledgedSequence: bigint
message: string
name: string
stack?: string
targetSequence: bigint
timeoutMs: number
diff --git a/docs/classes/_questdb_browser-client.QwpSymbolDictionary.html b/docs/classes/_questdb_browser-client.QwpSymbolDictionary.html index a5781d34..9ff578a3 100644 --- a/docs/classes/_questdb_browser-client.QwpSymbolDictionary.html +++ b/docs/classes/_questdb_browser-client.QwpSymbolDictionary.html @@ -1,5 +1,5 @@ QwpSymbolDictionary | QuestDB JavaScript Client - v5.0.0

Connection-scoped QWP symbol dictionary. IDs are dense from zero.

-
Index

Constructors

Index

Constructors

Accessors

Methods

Constructors

Accessors

Methods

+

Constructors

Accessors

Methods

diff --git a/docs/classes/_questdb_browser-client.QwpTableBuffer.html b/docs/classes/_questdb_browser-client.QwpTableBuffer.html index 6b33e862..3c81d396 100644 --- a/docs/classes/_questdb_browser-client.QwpTableBuffer.html +++ b/docs/classes/_questdb_browser-client.QwpTableBuffer.html @@ -1,5 +1,5 @@ QwpTableBuffer | QuestDB JavaScript Client - v5.0.0

Mutable columnar staging area for one QWP ingress table.

-
Index

Constructors

Index

Constructors

Properties

Accessors

Constructors

Properties

name: string

Accessors

Methods

  • Returns null when the current row already contains this column. The first +

Constructors

Properties

name: string

Accessors

Methods

  • Truncates every column back to the last completed row.

    Values are truncated to the committed watermark rather than popped once per non-null marker, because getOrCreateColumn() reserves the current cell as non-null before the caller appends its value. A setter that threw @@ -22,7 +22,7 @@ then deleted the previous completed row's value instead. The table kept that row's non-null marker, so encodeQwpIngressFrame() rejected the whole buffer with a value/marker count mismatch.

    -

    Returns void

+

Parameters

  • start: number
  • end: number

Returns QwpTableBuffer

diff --git a/docs/classes/_questdb_browser-client.QwpTableWriter.html b/docs/classes/_questdb_browser-client.QwpTableWriter.html index 4fcde8c4..2648dd09 100644 --- a/docs/classes/_questdb_browser-client.QwpTableWriter.html +++ b/docs/classes/_questdb_browser-client.QwpTableWriter.html @@ -1,9 +1,9 @@ QwpTableWriter | QuestDB JavaScript Client - v5.0.0

Class QwpTableWriter<Schema>

A reusable table-bound writer compiled from a QWP schema.

-

Type Parameters

Index

Constructors

Type Parameters

Index

Constructors

Properties

Methods

Constructors

  • Internal

    Construct table writers with QwpSender.writer().

    -

    Type Parameters

    Parameters

    • token: typeof QWP_TABLE_WRITER_CONSTRUCTOR
    • tableName: string
    • appendRow: (row: unknown, rowIndex?: number) => Promise<void>

    Returns QwpTableWriter<Schema>

Properties

tableName: string

Methods

+

Constructors

  • Internal

    Construct table writers with QwpSender.writer().

    +

    Type Parameters

    Parameters

    • token: typeof QWP_TABLE_WRITER_CONSTRUCTOR
    • tableName: string
    • appendRow: (row: unknown, rowIndex?: number) => undefined | Promise<void>

    Returns QwpTableWriter<Schema>

Properties

tableName: string

Methods

diff --git a/docs/classes/_questdb_browser-client.QwpUnrecoverableReplayDictionaryError.html b/docs/classes/_questdb_browser-client.QwpUnrecoverableReplayDictionaryError.html index 14bff34c..19e964fc 100644 --- a/docs/classes/_questdb_browser-client.QwpUnrecoverableReplayDictionaryError.html +++ b/docs/classes/_questdb_browser-client.QwpUnrecoverableReplayDictionaryError.html @@ -1,8 +1,8 @@ QwpUnrecoverableReplayDictionaryError | QuestDB JavaScript Client - v5.0.0

Class QwpUnrecoverableReplayDictionaryError

Recovered delta frames depend on symbol IDs that neither the durable dictionary prefix nor the surviving frames can reconstruct.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
+

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
diff --git a/docs/classes/_questdb_browser-client.QwpUpgradeError.html b/docs/classes/_questdb_browser-client.QwpUpgradeError.html index f4e305f1..72c6da49 100644 --- a/docs/classes/_questdb_browser-client.QwpUpgradeError.html +++ b/docs/classes/_questdb_browser-client.QwpUpgradeError.html @@ -1,5 +1,5 @@ QwpUpgradeError | QuestDB JavaScript Client - v5.0.0

A failure while establishing or validating a QWP WebSocket upgrade.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

cause? closeCode? kind @@ -16,7 +16,7 @@ url?

Accessors

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

-
tryNextEndpoint?: boolean
url?: string | URL

Accessors

+

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

+
tryNextEndpoint?: boolean
url?: string | URL

Accessors

diff --git a/docs/classes/_questdb_browser-client.QwpWriterRowError.html b/docs/classes/_questdb_browser-client.QwpWriterRowError.html index 80b49e6d..9b90b065 100644 --- a/docs/classes/_questdb_browser-client.QwpWriterRowError.html +++ b/docs/classes/_questdb_browser-client.QwpWriterRowError.html @@ -1,5 +1,5 @@ QwpWriterRowError | QuestDB JavaScript Client - v5.0.0

A complete object row failed compiled-writer validation.

-

Hierarchy

  • Error
    • QwpWriterRowError
Index

Constructors

Hierarchy

  • Error
    • QwpWriterRowError
Index

Constructors

Properties

Constructors

Properties

cause: unknown
columnName: undefined | string
message: string
name: string
rowIndex: undefined | number
stack?: string
tableName: string
+

Constructors

Properties

cause: unknown
columnName: undefined | string
message: string
name: string
rowIndex: undefined | number
stack?: string
tableName: string
diff --git a/docs/classes/_questdb_nodejs-client.HttpTransport.html b/docs/classes/_questdb_nodejs-client.HttpTransport.html index 65c82c0a..6e705021 100644 --- a/docs/classes/_questdb_nodejs-client.HttpTransport.html +++ b/docs/classes/_questdb_nodejs-client.HttpTransport.html @@ -1,6 +1,6 @@ HttpTransport | QuestDB JavaScript Client - v5.0.0

HTTP transport implementation using Node.js built-in http/https modules.
Supports both HTTP and HTTPS protocols with configurable authentication.

-

Hierarchy

  • HttpTransportBase
    • HttpTransport
Index

Constructors

Hierarchy

  • HttpTransportBase
    • HttpTransport
Index

Constructors

Properties

host log password @@ -20,16 +20,16 @@

Constructors

Properties

host: string
log: Logger
password: string
port: number
requestMinThroughput: number
requestTimeout: number
retryTimeout: number
secure: boolean
tlsCA: Buffer
tlsVerify: boolean
token: string
username: string

Methods

Properties

host: string
log: Logger
password: string
port: number
requestMinThroughput: number
requestTimeout: number
retryTimeout: number
secure: boolean
tlsCA: Buffer
tlsVerify: boolean
token: string
username: string

Methods

  • HTTP transport does not require explicit connection establishment.

    Returns Promise<boolean>

    Error indicating connect is not required for HTTP transport

    -
  • Gets the default auto-flush row count for HTTP transport.

    Returns number

    Default number of rows that trigger auto-flush

    -
  • Sends data to QuestDB using HTTP POST.

    Parameters

    • data: Buffer

      Buffer containing the data to send

    • retryBegin: number = -1

      Internal parameter for tracking retry start time

    • retryInterval: number = -1

      Internal parameter for tracking retry intervals

    Returns Promise<boolean>

    Promise resolving to true if data was sent successfully

    Error if request fails after all retries or times out

    -
+
diff --git a/docs/classes/_questdb_nodejs-client.QwpBatchTooLargeError.html b/docs/classes/_questdb_nodejs-client.QwpBatchTooLargeError.html index 531853df..bd136b95 100644 --- a/docs/classes/_questdb_nodejs-client.QwpBatchTooLargeError.html +++ b/docs/classes/_questdb_nodejs-client.QwpBatchTooLargeError.html @@ -1,4 +1,4 @@ -QwpBatchTooLargeError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • RangeError
    • QwpBatchTooLargeError
Index

Constructors

constructor +QwpBatchTooLargeError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • RangeError
    • QwpBatchTooLargeError
Index

Constructors

Properties

batchSizeBytes: number
cause?: unknown
maxBatchSizeBytes: number
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

batchSizeBytes: number
cause?: unknown
maxBatchSizeBytes: number
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpBindValues.html b/docs/classes/_questdb_nodejs-client.QwpBindValues.html index b9491ae7..736adb83 100644 --- a/docs/classes/_questdb_nodejs-client.QwpBindValues.html +++ b/docs/classes/_questdb_nodejs-client.QwpBindValues.html @@ -1,7 +1,7 @@ QwpBindValues | QuestDB JavaScript Client - v5.0.0

Browser-safe typed positional bind encoder.

Setters must be called in ascending zero-based index order. SQL placeholders are one-based, so index 0 binds $1, index 1 binds $2, and so on.

-
Index

Constructors

Index

Constructors

Accessors

Methods

Constructors

Accessors

Methods

  • Binds a typed NULL.

    +

Constructors

Accessors

Methods

  • Binds a typed NULL.

    A null bind is exactly type + flag + bitmap. The only types that carry anything more are the ones whose prefix the decoder reads before it branches on the null flag: the DECIMAL scale byte and the GEOHASH @@ -40,6 +40,6 @@ the server read that word's first byte as the next bind's type code ("unsupported wire type 0x0"), or, after the last bind, as the trailing queryFlags varint -- silently dropping a requested dictionary reset.

    -

    Parameters

    Returns this

+

Parameters

Returns this

diff --git a/docs/classes/_questdb_nodejs-client.QwpByteReader.html b/docs/classes/_questdb_nodejs-client.QwpByteReader.html index 6a52cec7..54f72758 100644 --- a/docs/classes/_questdb_nodejs-client.QwpByteReader.html +++ b/docs/classes/_questdb_nodejs-client.QwpByteReader.html @@ -1,5 +1,5 @@ QwpByteReader | QuestDB JavaScript Client - v5.0.0

A bounds-checked, runtime-neutral little-endian byte reader.

-
Index

Constructors

Index

Constructors

Properties

Accessors

Constructors

Properties

bytes: Uint8Array

Accessors

Methods

+

Constructors

Properties

bytes: Uint8Array

Accessors

Methods

diff --git a/docs/classes/_questdb_nodejs-client.QwpByteWriter.html b/docs/classes/_questdb_nodejs-client.QwpByteWriter.html index 247adca4..b88bca45 100644 --- a/docs/classes/_questdb_nodejs-client.QwpByteWriter.html +++ b/docs/classes/_questdb_nodejs-client.QwpByteWriter.html @@ -1,5 +1,5 @@ QwpByteWriter | QuestDB JavaScript Client - v5.0.0

A growable, runtime-neutral little-endian byte writer.

-
Index

Constructors

Index

Constructors

Accessors

Methods

Constructors

Accessors

Methods

+

Constructors

Accessors

Methods

diff --git a/docs/classes/_questdb_nodejs-client.QwpClient.html b/docs/classes/_questdb_nodejs-client.QwpClient.html index 26e6affa..1d8bf500 100644 --- a/docs/classes/_questdb_nodejs-client.QwpClient.html +++ b/docs/classes/_questdb_nodejs-client.QwpClient.html @@ -1,15 +1,15 @@ QwpClient | QuestDB JavaScript Client - v5.0.0

Browser-safe facade owning bounded ingress and egress connection pools. Borrowed handles are exclusive; separate query leases execute concurrently.

-
Index

Constructors

Index

Constructors

Accessors

Methods

  • Rejects new borrows and closes idle resources. Borrowed query sessions are +

Constructors

Accessors

Methods

  • Rejects new borrows and closes idle resources. Borrowed query sessions are cancelled and closed; borrowed senders retain ownership during a bounded drain and own their teardown if they outlive it.

    -

    Returns Promise<void>

+

Returns Promise<void>

diff --git a/docs/classes/_questdb_nodejs-client.QwpClientClosedError.html b/docs/classes/_questdb_nodejs-client.QwpClientClosedError.html index 2c061510..0b2d7226 100644 --- a/docs/classes/_questdb_nodejs-client.QwpClientClosedError.html +++ b/docs/classes/_questdb_nodejs-client.QwpClientClosedError.html @@ -1,5 +1,5 @@ QwpClientClosedError | QuestDB JavaScript Client - v5.0.0

The owning QWP client, or one of its returned lease handles, is closed.

-

Hierarchy

  • Error
    • QwpClientClosedError
Index

Constructors

Hierarchy

  • Error
    • QwpClientClosedError
Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpDurableAckUnavailableError.html b/docs/classes/_questdb_nodejs-client.QwpDurableAckUnavailableError.html index 1abe87d1..52e0edb8 100644 --- a/docs/classes/_questdb_nodejs-client.QwpDurableAckUnavailableError.html +++ b/docs/classes/_questdb_nodejs-client.QwpDurableAckUnavailableError.html @@ -1,5 +1,5 @@ QwpDurableAckUnavailableError | QuestDB JavaScript Client - v5.0.0

Class QwpDurableAckUnavailableError

A requested durable-ACK capability was not confirmed by the server.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

-
tryNextEndpoint?: boolean
url?: string | URL
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

+
tryNextEndpoint?: boolean
url?: string | URL
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes @@ -28,8 +28,8 @@

If set to a non-number value, or set to a negative number, stack traces will not capture any frames.

Accessors

Methods

  • Creates a .stack property on targetObject, which when accessed returns +

    Returns boolean

Methods

diff --git a/docs/classes/_questdb_nodejs-client.QwpEgressQueryAbandonedError.html b/docs/classes/_questdb_nodejs-client.QwpEgressQueryAbandonedError.html index 39da336e..75f2d50c 100644 --- a/docs/classes/_questdb_nodejs-client.QwpEgressQueryAbandonedError.html +++ b/docs/classes/_questdb_nodejs-client.QwpEgressQueryAbandonedError.html @@ -1,5 +1,5 @@ QwpEgressQueryAbandonedError | QuestDB JavaScript Client - v5.0.0

Class QwpEgressQueryAbandonedError

Result iteration ended before the server completed the query.

-

Hierarchy

  • Error
    • QwpEgressQueryAbandonedError
Index

Constructors

Hierarchy

  • Error
    • QwpEgressQueryAbandonedError
Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
requestId: bigint
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
requestId: bigint
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpEgressQueryCancelTimeoutError.html b/docs/classes/_questdb_nodejs-client.QwpEgressQueryCancelTimeoutError.html index 8d80dc14..58639b40 100644 --- a/docs/classes/_questdb_nodejs-client.QwpEgressQueryCancelTimeoutError.html +++ b/docs/classes/_questdb_nodejs-client.QwpEgressQueryCancelTimeoutError.html @@ -1,5 +1,5 @@ QwpEgressQueryCancelTimeoutError | QuestDB JavaScript Client - v5.0.0

Class QwpEgressQueryCancelTimeoutError

The server did not terminate a cancelled query within the drain deadline.

-

Hierarchy

  • Error
    • QwpEgressQueryCancelTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpEgressQueryCancelTimeoutError
Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
requestId: bigint
stack?: string
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
requestId: bigint
stack?: string
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpEgressQueryError.html b/docs/classes/_questdb_nodejs-client.QwpEgressQueryError.html index 2ee7adae..74d56834 100644 --- a/docs/classes/_questdb_nodejs-client.QwpEgressQueryError.html +++ b/docs/classes/_questdb_nodejs-client.QwpEgressQueryError.html @@ -1,4 +1,4 @@ -QwpEgressQueryError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • Error
    • QwpEgressQueryError
Index

Constructors

constructor +QwpEgressQueryError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • Error
    • QwpEgressQueryError
Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
requestId: bigint
stack?: string
status: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
requestId: bigint
stack?: string
status: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpEgressQueryTimeoutError.html b/docs/classes/_questdb_nodejs-client.QwpEgressQueryTimeoutError.html index d3ff702a..37609f66 100644 --- a/docs/classes/_questdb_nodejs-client.QwpEgressQueryTimeoutError.html +++ b/docs/classes/_questdb_nodejs-client.QwpEgressQueryTimeoutError.html @@ -1,5 +1,5 @@ QwpEgressQueryTimeoutError | QuestDB JavaScript Client - v5.0.0

Class QwpEgressQueryTimeoutError

A client-side query deadline expired and a QWP CANCEL was sent.

-

Hierarchy

  • Error
    • QwpEgressQueryTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpEgressQueryTimeoutError
Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
requestId: bigint
stack?: string
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
requestId: bigint
stack?: string
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpEgressReplayRequiredError.html b/docs/classes/_questdb_nodejs-client.QwpEgressReplayRequiredError.html index 86c1b9c4..4023727a 100644 --- a/docs/classes/_questdb_nodejs-client.QwpEgressReplayRequiredError.html +++ b/docs/classes/_questdb_nodejs-client.QwpEgressReplayRequiredError.html @@ -1,7 +1,7 @@ QwpEgressReplayRequiredError | QuestDB JavaScript Client - v5.0.0

Class QwpEgressReplayRequiredError

Standard egress sessions now reset and replay automatically. Retained for source compatibility with clients that classified the former explicit-replay opt-in failure.

-

Hierarchy

  • Error
    • QwpEgressReplayRequiredError
Index

Constructors

Hierarchy

  • Error
    • QwpEgressReplayRequiredError
Index

Constructors

Properties

cause? message name @@ -10,7 +10,7 @@ stackTraceLimit

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
requestId?: bigint
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
requestId?: bigint
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpEgressSession.html b/docs/classes/_questdb_nodejs-client.QwpEgressSession.html index 1a9a58b6..7f1d2ec7 100644 --- a/docs/classes/_questdb_nodejs-client.QwpEgressSession.html +++ b/docs/classes/_questdb_nodejs-client.QwpEgressSession.html @@ -2,7 +2,7 @@

The server currently executes one query at a time per connection, so this session deliberately rejects overlapping query calls. A completed query's materialized batches may still be consumed while the next query runs.

-

Implements

  • QwpEgressQueryControl
Index

Constructors

Implements

  • QwpEgressQueryControl
Index

Constructors

Properties

Accessors

Constructors

Properties

ready: Promise<QwpServerInfoMessage>

Initial SERVER_INFO; use serverInfo for the current post-failover snapshot.

-

Accessors

  • get metrics(): QwpEgressMetrics

    Immutable notification-inbox counters for this session's reconnect +

Constructors

Properties

ready: Promise<QwpServerInfoMessage>

Initial SERVER_INFO; use serverInfo for the current post-failover snapshot.

+

Accessors

  • get metrics(): QwpEgressMetrics

    Immutable notification-inbox counters for this session's reconnect observer, the egress counterpart of QwpIngressSession.metrics.

    A reconnect.onEvent observer runs on a bounded inbox that drops its oldest pending entry under overflow, exactly as ingress does. Nothing @@ -30,19 +30,19 @@ either, because attempt resets to one on every success: six outages that discarded eleven events were indistinguishable from a healthy two. A non-zero drop count means the observer is not keeping up.

    -

    Returns QwpEgressMetrics

Methods

  • Parameters

    • requestId: bigint
    • additionalBytes: number | bigint
    • replayOnReconnect: boolean = true

    Returns Promise<void>

Methods

  • Parameters

    • requestId: bigint
    • additionalBytes: number | bigint
    • replayOnReconnect: boolean = true
    • acceptWhenReconnectStarts: boolean = false

    Returns Promise<void>

  • Internal

    Cancels and drains an active operation before a pooled lease is returned. False means the physical session is no longer safe to reuse.

    -

    Returns Promise<boolean>

  • Internal

    Best-effort cancellation followed by physical connection teardown for facade shutdown. Unlike pooled lease return, this does not wait for the server to finish draining the cancelled query.

    -

    Returns Promise<void>

+

Returns Promise<void>

diff --git a/docs/classes/_questdb_nodejs-client.QwpEgressSessionClosedError.html b/docs/classes/_questdb_nodejs-client.QwpEgressSessionClosedError.html index ab194c75..97aa0611 100644 --- a/docs/classes/_questdb_nodejs-client.QwpEgressSessionClosedError.html +++ b/docs/classes/_questdb_nodejs-client.QwpEgressSessionClosedError.html @@ -1,4 +1,4 @@ -QwpEgressSessionClosedError | QuestDB JavaScript Client - v5.0.0

Class QwpEgressSessionClosedError

Hierarchy

  • Error
    • QwpEgressSessionClosedError
Index

Constructors

constructor +QwpEgressSessionClosedError | QuestDB JavaScript Client - v5.0.0

Class QwpEgressSessionClosedError

Hierarchy

  • Error
    • QwpEgressSessionClosedError
Index

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpFailoverError.html b/docs/classes/_questdb_nodejs-client.QwpFailoverError.html index a0ab3896..db4a0e69 100644 --- a/docs/classes/_questdb_nodejs-client.QwpFailoverError.html +++ b/docs/classes/_questdb_nodejs-client.QwpFailoverError.html @@ -1,5 +1,5 @@ QwpFailoverError | QuestDB JavaScript Client - v5.0.0

Every eligible QWP endpoint in one connection sweep failed.

-

Hierarchy

  • Error
    • QwpFailoverError
Index

Constructors

Hierarchy

  • Error
    • QwpFailoverError
Index

Constructors

Properties

attempts: readonly QwpFailoverAttempt[]
cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

attempts: readonly QwpFailoverAttempt[]
cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpIngressAckAbandonedError.html b/docs/classes/_questdb_nodejs-client.QwpIngressAckAbandonedError.html index a8e0ada2..52d5dc5a 100644 --- a/docs/classes/_questdb_nodejs-client.QwpIngressAckAbandonedError.html +++ b/docs/classes/_questdb_nodejs-client.QwpIngressAckAbandonedError.html @@ -1,5 +1,5 @@ QwpIngressAckAbandonedError | QuestDB JavaScript Client - v5.0.0

Class QwpIngressAckAbandonedError

A recovered frame was deliberately retired without a server ACK.

-

Hierarchy

  • Error
    • QwpIngressAckAbandonedError
Index

Constructors

Hierarchy

  • Error
    • QwpIngressAckAbandonedError
Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
fromFsn: bigint
message: string
name: string
stack?: string
targetSequence: bigint
toFsn: bigint
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
fromFsn: bigint
message: string
name: string
stack?: string
targetSequence: bigint
toFsn: bigint
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpIngressAckTimeoutError.html b/docs/classes/_questdb_nodejs-client.QwpIngressAckTimeoutError.html index 70d1d702..4fb46b3e 100644 --- a/docs/classes/_questdb_nodejs-client.QwpIngressAckTimeoutError.html +++ b/docs/classes/_questdb_nodejs-client.QwpIngressAckTimeoutError.html @@ -1,5 +1,5 @@ QwpIngressAckTimeoutError | QuestDB JavaScript Client - v5.0.0

The ingress ACK watermark did not reach the requested frame in time.

-

Hierarchy

  • Error
    • QwpIngressAckTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpIngressAckTimeoutError
Index

Constructors

Properties

acknowledgedSequence: bigint
cause?: unknown
message: string
name: string
stack?: string
targetSequence: bigint
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

acknowledgedSequence: bigint
cause?: unknown
message: string
name: string
stack?: string
targetSequence: bigint
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpIngressNackError.html b/docs/classes/_questdb_nodejs-client.QwpIngressNackError.html index ca7b708b..bb6ca392 100644 --- a/docs/classes/_questdb_nodejs-client.QwpIngressNackError.html +++ b/docs/classes/_questdb_nodejs-client.QwpIngressNackError.html @@ -1,4 +1,4 @@ -QwpIngressNackError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • Error
    • QwpIngressNackError
Index

Constructors

constructor +QwpIngressNackError | QuestDB JavaScript Client - v5.0.0

Hierarchy

  • Error
    • QwpIngressNackError
Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
senderError: QwpSenderError = ...
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
senderError: QwpSenderError = ...
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpIngressSession.html b/docs/classes/_questdb_nodejs-client.QwpIngressSession.html index b4dc2c54..ca641fa9 100644 --- a/docs/classes/_questdb_nodejs-client.QwpIngressSession.html +++ b/docs/classes/_questdb_nodejs-client.QwpIngressSession.html @@ -3,7 +3,7 @@ from racing its waiter. Calls are serialized to preserve the server's zero-based wire sequence. Successful ACKs are cumulative, so an ACK for sequence N resolves every outstanding send through N.

-
Index

Constructors

Index

Constructors

Accessors

  • get acknowledgedFrameSequence(): bigint

    Highest cumulative ACK watermark. When durable ACK is being tracked this +

Constructors

Accessors

  • get acknowledgedFrameSequence(): bigint

    Highest cumulative ACK watermark. When durable ACK is being tracked this advances only after durability; otherwise it follows ordinary OK ACKs.

    -

    Returns bigint

Methods

Methods

  • Prompts the server to publish its latest durable-ingress watermarks. Node transports use a WebSocket PING; browsers send the protocol-level table-less durable-ACK poll frame. Browser completion means the control frame was published; durable progress arrives independently because the server may withhold its cumulative OK while a transaction remains open.

    -

    Returns Promise<void>

  • Publishes one pre-encoded frame without allocating an ACK waiter. Applications can observe later acceptance through progress callbacks.

    -

    Parameters

    • frame: Uint8Array

    Returns Promise<void>

  • Waits independently for the cumulative frame ACK watermark. A negative target is already satisfied, but still surfaces a latched session error.

    -

    Parameters

    • targetSequence: bigint
    • timeoutMs: number = ...

    Returns Promise<void>

+

Returns Promise<QwpIngressSession>

diff --git a/docs/classes/_questdb_nodejs-client.QwpIngressSessionClosedError.html b/docs/classes/_questdb_nodejs-client.QwpIngressSessionClosedError.html index 4cfe41ad..18694efa 100644 --- a/docs/classes/_questdb_nodejs-client.QwpIngressSessionClosedError.html +++ b/docs/classes/_questdb_nodejs-client.QwpIngressSessionClosedError.html @@ -1,4 +1,4 @@ -QwpIngressSessionClosedError | QuestDB JavaScript Client - v5.0.0

Class QwpIngressSessionClosedError

Hierarchy

  • Error
    • QwpIngressSessionClosedError
Index

Constructors

constructor +QwpIngressSessionClosedError | QuestDB JavaScript Client - v5.0.0

Class QwpIngressSessionClosedError

Hierarchy

  • Error
    • QwpIngressSessionClosedError
Index

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpMemoryReplayAppendTimeoutError.html b/docs/classes/_questdb_nodejs-client.QwpMemoryReplayAppendTimeoutError.html index a5f478f9..a9356f24 100644 --- a/docs/classes/_questdb_nodejs-client.QwpMemoryReplayAppendTimeoutError.html +++ b/docs/classes/_questdb_nodejs-client.QwpMemoryReplayAppendTimeoutError.html @@ -1,5 +1,5 @@ QwpMemoryReplayAppendTimeoutError | QuestDB JavaScript Client - v5.0.0

Class QwpMemoryReplayAppendTimeoutError

ACK-driven trimming did not free in-memory replay capacity in time.

-

Hierarchy

  • Error
    • QwpMemoryReplayAppendTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpMemoryReplayAppendTimeoutError
Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
maxBytes: number
message: string
name: string
requiredBytes: number
stack?: string
timeoutMs: number
usedBytes: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
maxBytes: number
message: string
name: string
requiredBytes: number
stack?: string
timeoutMs: number
usedBytes: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpMemoryReplayBatchTooLargeError.html b/docs/classes/_questdb_nodejs-client.QwpMemoryReplayBatchTooLargeError.html index fe3ac32e..abb390ed 100644 --- a/docs/classes/_questdb_nodejs-client.QwpMemoryReplayBatchTooLargeError.html +++ b/docs/classes/_questdb_nodejs-client.QwpMemoryReplayBatchTooLargeError.html @@ -1,5 +1,5 @@ QwpMemoryReplayBatchTooLargeError | QuestDB JavaScript Client - v5.0.0

Class QwpMemoryReplayBatchTooLargeError

One logical batch can never fit in the configured in-memory replay budget.

-

Hierarchy

  • RangeError
    • QwpMemoryReplayBatchTooLargeError
Index

Constructors

Hierarchy

  • RangeError
    • QwpMemoryReplayBatchTooLargeError
Index

Constructors

Properties

cause?: unknown
frameCount: number
maxBytes: number
message: string
name: string
requiredBytes: number
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
frameCount: number
maxBytes: number
message: string
name: string
requiredBytes: number
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpMemoryReplayFrameTooLargeError.html b/docs/classes/_questdb_nodejs-client.QwpMemoryReplayFrameTooLargeError.html index bd5b26e5..ddde17c6 100644 --- a/docs/classes/_questdb_nodejs-client.QwpMemoryReplayFrameTooLargeError.html +++ b/docs/classes/_questdb_nodejs-client.QwpMemoryReplayFrameTooLargeError.html @@ -1,5 +1,5 @@ QwpMemoryReplayFrameTooLargeError | QuestDB JavaScript Client - v5.0.0

Class QwpMemoryReplayFrameTooLargeError

One frame can never fit in the configured in-memory replay budget.

-

Hierarchy

  • RangeError
    • QwpMemoryReplayFrameTooLargeError
Index

Constructors

Hierarchy

  • RangeError
    • QwpMemoryReplayFrameTooLargeError
Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
maxBytes: number
message: string
name: string
payloadBytes: number
requiredBytes: number
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
maxBytes: number
message: string
name: string
payloadBytes: number
requiredBytes: number
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpNodeFileReplayStore.html b/docs/classes/_questdb_nodejs-client.QwpNodeFileReplayStore.html index db8295b8..ce59b222 100644 --- a/docs/classes/_questdb_nodejs-client.QwpNodeFileReplayStore.html +++ b/docs/classes/_questdb_nodejs-client.QwpNodeFileReplayStore.html @@ -5,7 +5,7 @@ trimming. A crash between the server ACK and local deletion can cause at-least-once replay. An exclusive, lifetime lock prevents another process from recovering or mutating the same directory.

-

Implements

Index

Constructors

Implements

Index

Constructors

Accessors

Methods

  • Internal

    Removes a local prefix without representing it as a server ACK. +

Constructors

Accessors

Methods

  • Internal

    Removes a local prefix without representing it as a server ACK. Persistent stores should provide this when recovery can abandon frames.

    "Without representing it as a server ACK" is about the transport's public watermark, which the caller leaves alone. The removal itself must be as durable as acknowledgeThrough's: a discarded prefix that a later load() can still see is a prefix this client reported abandoned and then sent anyway.

    -

    Parameters

    • frameSequence: bigint

    Returns Promise<void>

+

Parameters

  • entries: readonly string[]

Returns Promise<void>

diff --git a/docs/classes/_questdb_nodejs-client.QwpNodeOrphanDrainer.html b/docs/classes/_questdb_nodejs-client.QwpNodeOrphanDrainer.html index 4eb70d55..96117efc 100644 --- a/docs/classes/_questdb_nodejs-client.QwpNodeOrphanDrainer.html +++ b/docs/classes/_questdb_nodejs-client.QwpNodeOrphanDrainer.html @@ -1,10 +1,10 @@ QwpNodeOrphanDrainer | QuestDB JavaScript Client - v5.0.0

Bounded Node-only scanner and background drainer for replay slots left by terminated producer processes. Each adopted slot uses its own connection.

-
Index

Constructors

Index

Constructors

Accessors

Methods

Constructors

Accessors

Methods

+

Constructors

Accessors

Methods

diff --git a/docs/classes/_questdb_nodejs-client.QwpNodeUdpSession.html b/docs/classes/_questdb_nodejs-client.QwpNodeUdpSession.html index 33e7a0f6..50d7ec54 100644 --- a/docs/classes/_questdb_nodejs-client.QwpNodeUdpSession.html +++ b/docs/classes/_questdb_nodejs-client.QwpNodeUdpSession.html @@ -2,7 +2,7 @@

Each datagram is self-contained: it carries one table, an inline schema and local symbol dictionaries. There are no ACKs, retries, transactions, authentication, compression, or store-and-forward semantics.

-

Implements

Index

Properties

Implements

Index

Properties

maxBatchSizeBytes: number

Accessors

Methods

+

Properties

maxBatchSizeBytes: number

Accessors

Methods

diff --git a/docs/classes/_questdb_nodejs-client.QwpPoolAcquireTimeoutError.html b/docs/classes/_questdb_nodejs-client.QwpPoolAcquireTimeoutError.html index 280011e2..c8212974 100644 --- a/docs/classes/_questdb_nodejs-client.QwpPoolAcquireTimeoutError.html +++ b/docs/classes/_questdb_nodejs-client.QwpPoolAcquireTimeoutError.html @@ -1,5 +1,5 @@ QwpPoolAcquireTimeoutError | QuestDB JavaScript Client - v5.0.0

Class QwpPoolAcquireTimeoutError

A bounded QWP pool could not provide a connection before its deadline.

-

Hierarchy

  • Error
    • QwpPoolAcquireTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpPoolAcquireTimeoutError
Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
resource: "query" | "sender"
stack?: string
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
resource: "query" | "sender"
stack?: string
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpPoolResourceError.html b/docs/classes/_questdb_nodejs-client.QwpPoolResourceError.html index 99f2876c..fcd23965 100644 --- a/docs/classes/_questdb_nodejs-client.QwpPoolResourceError.html +++ b/docs/classes/_questdb_nodejs-client.QwpPoolResourceError.html @@ -1,5 +1,5 @@ QwpPoolResourceError | QuestDB JavaScript Client - v5.0.0

A pooled resource failed while a new slot was being connected.

-

Hierarchy

  • Error
    • QwpPoolResourceError
Index

Constructors

Hierarchy

  • Error
    • QwpPoolResourceError
Index

Constructors

Properties

Methods

Constructors

Properties

cause: unknown
message: string
name: string
resource: "query" | "sender"
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause: unknown
message: string
name: string
resource: "query" | "sender"
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpProtocolError.html b/docs/classes/_questdb_nodejs-client.QwpProtocolError.html index 364d1339..9b08e949 100644 --- a/docs/classes/_questdb_nodejs-client.QwpProtocolError.html +++ b/docs/classes/_questdb_nodejs-client.QwpProtocolError.html @@ -1,5 +1,5 @@ QwpProtocolError | QuestDB JavaScript Client - v5.0.0

Raised when a QWP payload is malformed, truncated, or unsupported.

-

Hierarchy

  • Error
    • QwpProtocolError
Index

Constructors

Hierarchy

  • Error
    • QwpProtocolError
Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpQueryLease.html b/docs/classes/_questdb_nodejs-client.QwpQueryLease.html index d523a43e..83f576f0 100644 --- a/docs/classes/_questdb_nodejs-client.QwpQueryLease.html +++ b/docs/classes/_questdb_nodejs-client.QwpQueryLease.html @@ -1,5 +1,5 @@ QwpQueryLease | QuestDB JavaScript Client - v5.0.0

One exclusively borrowed egress session from a QwpClient query pool.

-
Index

Constructors

Index

Constructors

Properties

Accessors

Methods

Constructors

Properties

ready: Promise<QwpServerInfoMessage>

Initial SERVER_INFO; use serverInfo for the current post-failover snapshot.

-

Accessors

  • get serverInfo(): QwpServerInfoMessage

    Cached immutable SERVER_INFO for this lease's currently bound endpoint. +

Constructors

Properties

ready: Promise<QwpServerInfoMessage>

Initial SERVER_INFO; use serverInfo for the current post-failover snapshot.

+

Accessors

Methods

+

Returns QwpServerInfoMessage

Methods

diff --git a/docs/classes/_questdb_nodejs-client.QwpReconnectExhaustedError.html b/docs/classes/_questdb_nodejs-client.QwpReconnectExhaustedError.html index 73e5f764..f76a5c3d 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReconnectExhaustedError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReconnectExhaustedError.html @@ -1,5 +1,5 @@ QwpReconnectExhaustedError | QuestDB JavaScript Client - v5.0.0

Class QwpReconnectExhaustedError

A configured QWP reconnect policy exhausted its retry boundary.

-

Hierarchy

  • Error
    • QwpReconnectExhaustedError
Index

Constructors

Hierarchy

  • Error
    • QwpReconnectExhaustedError
Index

Constructors

Properties

attempts: number
cause: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

attempts: number
cause: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayDictionaryError.html b/docs/classes/_questdb_nodejs-client.QwpReplayDictionaryError.html index c9a65be9..b57b0d8a 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayDictionaryError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayDictionaryError.html @@ -1,5 +1,5 @@ QwpReplayDictionaryError | QuestDB JavaScript Client - v5.0.0

A replay store cannot preserve the dictionary required by delta frames.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayDictionaryPersistenceError.html b/docs/classes/_questdb_nodejs-client.QwpReplayDictionaryPersistenceError.html index a09de90d..df7766fd 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayDictionaryPersistenceError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayDictionaryPersistenceError.html @@ -1,7 +1,7 @@ QwpReplayDictionaryPersistenceError | QuestDB JavaScript Client - v5.0.0

Class QwpReplayDictionaryPersistenceError

A replay dictionary sidecar rejected an append before its delta frame was published. The reconnecting transport has permanently switched to full, self-contained symbol encoding; retrying the logical batch is safe.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayRejectedError.html b/docs/classes/_questdb_nodejs-client.QwpReplayRejectedError.html index 58d4a011..57ad3980 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayRejectedError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayRejectedError.html @@ -1,5 +1,5 @@ QwpReplayRejectedError | QuestDB JavaScript Client - v5.0.0

A replayed ingress frame was rejected and remains in persistent storage.

-

Hierarchy

  • Error
    • QwpReplayRejectedError
Index

Constructors

Hierarchy

  • Error
    • QwpReplayRejectedError
Index

Constructors

Properties

cause?: unknown
frameSequence: bigint
message: string
name: string
stack?: string
status: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
frameSequence: bigint
message: string
name: string
stack?: string
status: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayStoreAppendTimeoutError.html b/docs/classes/_questdb_nodejs-client.QwpReplayStoreAppendTimeoutError.html index f75a24bd..c493d9a6 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayStoreAppendTimeoutError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayStoreAppendTimeoutError.html @@ -1,4 +1,4 @@ -QwpReplayStoreAppendTimeoutError | QuestDB JavaScript Client - v5.0.0

Class QwpReplayStoreAppendTimeoutError

Hierarchy (View Summary)

Index

Constructors

constructor +QwpReplayStoreAppendTimeoutError | QuestDB JavaScript Client - v5.0.0

Class QwpReplayStoreAppendTimeoutError

Hierarchy (View Summary)

Index

Constructors

Properties

cause? maxBytes message @@ -10,14 +10,14 @@ stackTraceLimit

Methods

Constructors

Properties

cause?: unknown
maxBytes: number
message: string
name: string
requiredBytes: number
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

+

Constructors

Properties

cause?: unknown
maxBytes: number
message: string
name: string
requiredBytes: number
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

Background maintenance and checkpoint faults are parked and cleared on the next successful batch, so a briefly full, read-only or descriptor-starved filesystem is retryable. Structural corruption and a slot lock taken over by another process are verdicts on the journal itself and are not. The ingress connection lives in the browser-safe layer and cannot reference these classes, so it reads this flag structurally.

-
stack?: string
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

stack?: string
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayStoreBatchTooLargeError.html b/docs/classes/_questdb_nodejs-client.QwpReplayStoreBatchTooLargeError.html index 3a42e9a9..9a866758 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayStoreBatchTooLargeError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayStoreBatchTooLargeError.html @@ -1,5 +1,5 @@ QwpReplayStoreBatchTooLargeError | QuestDB JavaScript Client - v5.0.0

Class QwpReplayStoreBatchTooLargeError

One logical batch can never fit in an empty store-and-forward journal.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
frameCount: number
maxBytes: number
message: string
name: string
requiredBytes: number
retryable: false

Whether reconnecting and replaying can plausibly clear this failure.

+

Constructors

Properties

cause?: unknown
frameCount: number
maxBytes: number
message: string
name: string
requiredBytes: number
retryable: false

Whether reconnecting and replaying can plausibly clear this failure.

Background maintenance and checkpoint faults are parked and cleared on the next successful batch, so a briefly full, read-only or descriptor-starved filesystem is retryable. Structural corruption and a slot lock taken over by another process are verdicts on the journal itself and are not. The ingress connection lives in the browser-safe layer and cannot reference these classes, so it reads this flag structurally.

-
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayStoreCheckpointError.html b/docs/classes/_questdb_nodejs-client.QwpReplayStoreCheckpointError.html index 5140576b..56fc2e05 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayStoreCheckpointError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayStoreCheckpointError.html @@ -1,4 +1,4 @@ -QwpReplayStoreCheckpointError | QuestDB JavaScript Client - v5.0.0

Class QwpReplayStoreCheckpointError

Hierarchy (View Summary)

Index

Constructors

constructor +QwpReplayStoreCheckpointError | QuestDB JavaScript Client - v5.0.0

Class QwpReplayStoreCheckpointError

Hierarchy (View Summary)

Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
directory: string
message: string
name: string
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

+

Constructors

Properties

cause?: unknown
directory: string
message: string
name: string
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

Background maintenance and checkpoint faults are parked and cleared on the next successful batch, so a briefly full, read-only or descriptor-starved filesystem is retryable. Structural corruption and a slot lock taken over by another process are verdicts on the journal itself and are not. The ingress connection lives in the browser-safe layer and cannot reference these classes, so it reads this flag structurally.

-
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayStoreCorruptionError.html b/docs/classes/_questdb_nodejs-client.QwpReplayStoreCorruptionError.html index 9a8d2385..b917d72a 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayStoreCorruptionError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayStoreCorruptionError.html @@ -1,5 +1,5 @@ QwpReplayStoreCorruptionError | QuestDB JavaScript Client - v5.0.0

Class QwpReplayStoreCorruptionError

Durable journal bytes are structurally corrupt and cannot be replayed.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
retryable: false

Corrupt bytes read the same way on every attempt.

-
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
retryable: false

Corrupt bytes read the same way on every attempt.

+
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayStoreError.html b/docs/classes/_questdb_nodejs-client.QwpReplayStoreError.html index 9087e3f1..09b078d9 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayStoreError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayStoreError.html @@ -1,4 +1,4 @@ -QwpReplayStoreError | QuestDB JavaScript Client - v5.0.0

Hierarchy (View Summary)

Index

Constructors

constructor +QwpReplayStoreError | QuestDB JavaScript Client - v5.0.0

Hierarchy (View Summary)

Index

Constructors

Properties

cause? message name @@ -7,14 +7,14 @@ stackTraceLimit

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

+

Constructors

Properties

cause?: unknown
message: string
name: string
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

Background maintenance and checkpoint faults are parked and cleared on the next successful batch, so a briefly full, read-only or descriptor-starved filesystem is retryable. Structural corruption and a slot lock taken over by another process are verdicts on the journal itself and are not. The ingress connection lives in the browser-safe layer and cannot reference these classes, so it reads this flag structurally.

-
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayStoreFullError.html b/docs/classes/_questdb_nodejs-client.QwpReplayStoreFullError.html index 7717550f..96b4a78e 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayStoreFullError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayStoreFullError.html @@ -1,4 +1,4 @@ -QwpReplayStoreFullError | QuestDB JavaScript Client - v5.0.0

Hierarchy (View Summary)

Index

Constructors

constructor +QwpReplayStoreFullError | QuestDB JavaScript Client - v5.0.0

Hierarchy (View Summary)

Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
maxBytes: number
message: string
name: string
requiredBytes: number
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

+

Constructors

Properties

cause?: unknown
maxBytes: number
message: string
name: string
requiredBytes: number
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

Background maintenance and checkpoint faults are parked and cleared on the next successful batch, so a briefly full, read-only or descriptor-starved filesystem is retryable. Structural corruption and a slot lock taken over by another process are verdicts on the journal itself and are not. The ingress connection lives in the browser-safe layer and cannot reference these classes, so it reads this flag structurally.

-
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockLostError.html b/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockLostError.html index c38070ac..ca0b3729 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockLostError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockLostError.html @@ -6,7 +6,7 @@ because a frame's sequence is derived from its position, an overwrite of the same width leaves a journal that reopens as intact with the new owner's frames gone. Failing the append is what keeps that loss impossible.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
directory: string
message: string
name: string
retryable: false

Retrying is precisely what must not happen: the slot belongs to another +

Constructors

Properties

cause?: unknown
directory: string
message: string
name: string
retryable: false

Retrying is precisely what must not happen: the slot belongs to another process now, so replaying out of it would race that owner's appends.

-
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockUnprovableError.html b/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockUnprovableError.html index 3a332471..9b789b59 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockUnprovableError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockUnprovableError.html @@ -9,7 +9,7 @@ ending the session. Collapsing them terminated a producer -- permanently, with the transport healthy throughout -- because the host process briefly ran out of descriptors, and blamed a second process that did not exist.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
directory: string
message: string
name: string
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

+

Constructors

Properties

cause?: unknown
directory: string
message: string
name: string
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

Background maintenance and checkpoint faults are parked and cleared on the next successful batch, so a briefly full, read-only or descriptor-starved filesystem is retryable. Structural corruption and a slot lock taken over by another process are verdicts on the journal itself and are not. The ingress connection lives in the browser-safe layer and cannot reference these classes, so it reads this flag structurally.

-
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockedError.html b/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockedError.html index c7615463..0a3f09ee 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockedError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayStoreLockedError.html @@ -1,4 +1,4 @@ -QwpReplayStoreLockedError | QuestDB JavaScript Client - v5.0.0

Hierarchy (View Summary)

Index

Constructors

constructor +QwpReplayStoreLockedError | QuestDB JavaScript Client - v5.0.0

Hierarchy (View Summary)

Index

Constructors

Properties

cause?: unknown
directory: string
holderPid?: number
message: string
name: string
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

+

Constructors

Properties

cause?: unknown
directory: string
holderPid?: number
message: string
name: string
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

Background maintenance and checkpoint faults are parked and cleared on the next successful batch, so a briefly full, read-only or descriptor-starved filesystem is retryable. Structural corruption and a slot lock taken over by another process are verdicts on the journal itself and are not. The ingress connection lives in the browser-safe layer and cannot reference these classes, so it reads this flag structurally.

-
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayStoreQuarantinedError.html b/docs/classes/_questdb_nodejs-client.QwpReplayStoreQuarantinedError.html index e686ee49..458fd775 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayStoreQuarantinedError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayStoreQuarantinedError.html @@ -1,5 +1,5 @@ QwpReplayStoreQuarantinedError | QuestDB JavaScript Client - v5.0.0

Class QwpReplayStoreQuarantinedError

A terminal replay slot was preserved under a quarantine pathname.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
directory: string
message: string
name: string
quarantineDirectory: string
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

+

Constructors

Properties

cause?: unknown
directory: string
message: string
name: string
quarantineDirectory: string
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

Background maintenance and checkpoint faults are parked and cleared on the next successful batch, so a briefly full, read-only or descriptor-starved filesystem is retryable. Structural corruption and a slot lock taken over by another process are verdicts on the journal itself and are not. The ingress connection lives in the browser-safe layer and cannot reference these classes, so it reads this flag structurally.

-
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpReplayStoreSegmentTooLargeError.html b/docs/classes/_questdb_nodejs-client.QwpReplayStoreSegmentTooLargeError.html index 32015e2c..aeeeae14 100644 --- a/docs/classes/_questdb_nodejs-client.QwpReplayStoreSegmentTooLargeError.html +++ b/docs/classes/_questdb_nodejs-client.QwpReplayStoreSegmentTooLargeError.html @@ -1,4 +1,4 @@ -QwpReplayStoreSegmentTooLargeError | QuestDB JavaScript Client - v5.0.0

Class QwpReplayStoreSegmentTooLargeError

Hierarchy (View Summary)

Index

Constructors

constructor +QwpReplayStoreSegmentTooLargeError | QuestDB JavaScript Client - v5.0.0

Class QwpReplayStoreSegmentTooLargeError

Hierarchy (View Summary)

Index

Constructors

Properties

cause?: unknown
maxSegmentBytes: number
message: string
name: string
payloadBytes: number
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

+

Constructors

Properties

cause?: unknown
maxSegmentBytes: number
message: string
name: string
payloadBytes: number
retryable: boolean = true

Whether reconnecting and replaying can plausibly clear this failure.

Background maintenance and checkpoint faults are parked and cleared on the next successful batch, so a briefly full, read-only or descriptor-starved filesystem is retryable. Structural corruption and a slot lock taken over by another process are verdicts on the journal itself and are not. The ingress connection lives in the browser-safe layer and cannot reference these classes, so it reads this flag structurally.

-
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpResultBatch.html b/docs/classes/_questdb_nodejs-client.QwpResultBatch.html index 04e546a9..7ddc1894 100644 --- a/docs/classes/_questdb_nodejs-client.QwpResultBatch.html +++ b/docs/classes/_questdb_nodejs-client.QwpResultBatch.html @@ -1,4 +1,4 @@ -QwpResultBatch | QuestDB JavaScript Client - v5.0.0

Index

Constructors

constructor +QwpResultBatch | QuestDB JavaScript Client - v5.0.0
Index

Constructors

Properties

Methods

Constructors

Properties

batchSequence: bigint
columns: readonly QwpResultColumn[]
requestId: bigint
rowCount: number
tableName: string

Methods

+

Constructors

Properties

batchSequence: bigint
columns: readonly QwpResultColumn[]
requestId: bigint
rowCount: number
tableName: string

Methods

diff --git a/docs/classes/_questdb_nodejs-client.QwpResultBatchDecoder.html b/docs/classes/_questdb_nodejs-client.QwpResultBatchDecoder.html index 3950d97a..362ae509 100644 --- a/docs/classes/_questdb_nodejs-client.QwpResultBatchDecoder.html +++ b/docs/classes/_questdb_nodejs-client.QwpResultBatchDecoder.html @@ -1,5 +1,5 @@ QwpResultBatchDecoder | QuestDB JavaScript Client - v5.0.0

Stateful decoder for connection-scoped QWP result batches.

-
Index

Constructors

Index

Constructors

Properties

Methods

absorbDictionary applyCacheReset @@ -17,7 +17,7 @@ only by QWP_MAX_CELLS_PER_BATCH times the pool size, which the cap's own comment puts at roughly half a gigabyte per slot.

Left undefined the batch is bounded by the cell cap alone, as before.

-

Methods

Methods

  • Applies the delta symbol dictionary carried by a batch whose rows are being discarded, without touching any per-query state.

    The dictionary is connection-scoped and cumulative: the server numbers entries from where the previous batch left off, on the connection rather @@ -31,9 +31,9 @@ asked for.

    The dictionary sits at the front of the body, so this reads only as far as it needs to and never decodes the rows it is throwing away.

    -

    Parameters

    Returns void

+

Parameters

Returns QwpResultBatchView

diff --git a/docs/classes/_questdb_nodejs-client.QwpResultBatchView.html b/docs/classes/_questdb_nodejs-client.QwpResultBatchView.html index ba46d06f..25d8d085 100644 --- a/docs/classes/_questdb_nodejs-client.QwpResultBatchView.html +++ b/docs/classes/_questdb_nodejs-client.QwpResultBatchView.html @@ -1,7 +1,7 @@ QwpResultBatchView | QuestDB JavaScript Client - v5.0.0

Batch-owned reusable view delivered by QwpEgressSession.queryViews(). Access is invalid after the callback returns. materialize() creates an independently owned QwpResultBatch when retention is required.

-
Index

Constructors

Index

Constructors

Accessors

Constructors

Accessors

Methods

  • Visits rows in index order with one re-pointed row view. The callback is +

Constructors

Accessors

Methods

  • Internal

    Parameters

    • requestId: bigint
    • batchSequence: bigint
    • tableName: string
    • rowCount: number
    • layouts: QwpResultColumnViewLayout[]

    Returns this

  • Internal

    Parameters

    • requestId: bigint
    • batchSequence: bigint
    • tableName: string
    • rowCount: number
    • layouts: QwpResultColumnViewLayout[]

    Returns this

+

Parameters

  • rowIndex: number

Returns QwpResultRowView

diff --git a/docs/classes/_questdb_nodejs-client.QwpResultColumnView.html b/docs/classes/_questdb_nodejs-client.QwpResultColumnView.html index d7872313..15ae21a7 100644 --- a/docs/classes/_questdb_nodejs-client.QwpResultColumnView.html +++ b/docs/classes/_questdb_nodejs-client.QwpResultColumnView.html @@ -2,7 +2,7 @@

The view and every byte slice returned from it are valid only while the surrounding queryViews() callback is running. Copy data that must outlive the callback.

-
Index

Constructors

Index

Constructors

Properties

Accessors

Constructors

Properties

columnIndex: number

Accessors

Methods

  • Raw packed non-null values. Fixed-width values use QWP little-endian +

Constructors

Properties

columnIndex: number

Accessors

Methods

  • Raw packed non-null values. Fixed-width values use QWP little-endian layout; booleans are bit-packed and variable-width columns contain their uint32 offset table. SYMBOL returns undefined because IDs are varints.

    -

    Returns Uint8Array<ArrayBufferLike>

+

Returns Uint8Array<ArrayBufferLike>

diff --git a/docs/classes/_questdb_nodejs-client.QwpResultRowView.html b/docs/classes/_questdb_nodejs-client.QwpResultRowView.html index 732a77aa..15317ead 100644 --- a/docs/classes/_questdb_nodejs-client.QwpResultRowView.html +++ b/docs/classes/_questdb_nodejs-client.QwpResultRowView.html @@ -3,7 +3,7 @@ while the surrounding queryViews() callback is running, and must not be retained across forEachRow() iterations. Byte and array views returned by its accessors remain zero-copy and have the same lifetime.

-
Index

Constructors

Index

Constructors

Accessors

Methods

get @@ -29,10 +29,10 @@ getUuidLow isNull of -

Constructors

Accessors

Methods

+

Constructors

Accessors

Methods

diff --git a/docs/classes/_questdb_nodejs-client.QwpRoleMismatchError.html b/docs/classes/_questdb_nodejs-client.QwpRoleMismatchError.html index 249f0be0..98e964fc 100644 --- a/docs/classes/_questdb_nodejs-client.QwpRoleMismatchError.html +++ b/docs/classes/_questdb_nodejs-client.QwpRoleMismatchError.html @@ -1,5 +1,5 @@ QwpRoleMismatchError | QuestDB JavaScript Client - v5.0.0

A connected endpoint advertised a role that does not satisfy target.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
target: QwpTarget
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

-
tryNextEndpoint?: boolean
url?: string | URL
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
target: QwpTarget
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

+
tryNextEndpoint?: boolean
url?: string | URL
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes @@ -29,8 +29,8 @@

If set to a non-number value, or set to a negative number, stack traces will not capture any frames.

Accessors

Methods

  • Creates a .stack property on targetObject, which when accessed returns +

    Returns boolean

Methods

diff --git a/docs/classes/_questdb_nodejs-client.QwpSenderCloseTimeoutError.html b/docs/classes/_questdb_nodejs-client.QwpSenderCloseTimeoutError.html index 2fd3c10d..aa025066 100644 --- a/docs/classes/_questdb_nodejs-client.QwpSenderCloseTimeoutError.html +++ b/docs/classes/_questdb_nodejs-client.QwpSenderCloseTimeoutError.html @@ -1,5 +1,5 @@ QwpSenderCloseTimeoutError | QuestDB JavaScript Client - v5.0.0

Class QwpSenderCloseTimeoutError

close() could not publish and acknowledge all committed ingress frames.

-

Hierarchy

  • Error
    • QwpSenderCloseTimeoutError
Index

Constructors

Hierarchy

  • Error
    • QwpSenderCloseTimeoutError
Index

Constructors

Properties

acknowledgedSequence: bigint
cause?: unknown
message: string
name: string
stack?: string
targetSequence: bigint
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

acknowledgedSequence: bigint
cause?: unknown
message: string
name: string
stack?: string
targetSequence: bigint
timeoutMs: number
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpSymbolDictionary.html b/docs/classes/_questdb_nodejs-client.QwpSymbolDictionary.html index af781df5..f50955e4 100644 --- a/docs/classes/_questdb_nodejs-client.QwpSymbolDictionary.html +++ b/docs/classes/_questdb_nodejs-client.QwpSymbolDictionary.html @@ -1,5 +1,5 @@ QwpSymbolDictionary | QuestDB JavaScript Client - v5.0.0

Connection-scoped QWP symbol dictionary. IDs are dense from zero.

-
Index

Constructors

Index

Constructors

Accessors

Methods

Constructors

Accessors

Methods

+

Constructors

Accessors

Methods

diff --git a/docs/classes/_questdb_nodejs-client.QwpTableBuffer.html b/docs/classes/_questdb_nodejs-client.QwpTableBuffer.html index a3d533c8..47465795 100644 --- a/docs/classes/_questdb_nodejs-client.QwpTableBuffer.html +++ b/docs/classes/_questdb_nodejs-client.QwpTableBuffer.html @@ -1,5 +1,5 @@ QwpTableBuffer | QuestDB JavaScript Client - v5.0.0

Mutable columnar staging area for one QWP ingress table.

-
Index

Constructors

Index

Constructors

Properties

Accessors

Constructors

Properties

name: string

Accessors

Methods

  • Returns null when the current row already contains this column. The first +

Constructors

Properties

name: string

Accessors

Methods

  • Truncates every column back to the last completed row.

    Values are truncated to the committed watermark rather than popped once per non-null marker, because getOrCreateColumn() reserves the current cell as non-null before the caller appends its value. A setter that threw @@ -22,7 +22,7 @@ then deleted the previous completed row's value instead. The table kept that row's non-null marker, so encodeQwpIngressFrame() rejected the whole buffer with a value/marker count mismatch.

    -

    Returns void

+

Parameters

  • start: number
  • end: number

Returns QwpTableBuffer

diff --git a/docs/classes/_questdb_nodejs-client.QwpTableWriter.html b/docs/classes/_questdb_nodejs-client.QwpTableWriter.html index 509ee7bf..ef88cd56 100644 --- a/docs/classes/_questdb_nodejs-client.QwpTableWriter.html +++ b/docs/classes/_questdb_nodejs-client.QwpTableWriter.html @@ -1,9 +1,9 @@ QwpTableWriter | QuestDB JavaScript Client - v5.0.0

Class QwpTableWriter<Schema>

A reusable table-bound writer compiled from a QWP schema.

-

Type Parameters

Index

Constructors

Type Parameters

Index

Constructors

Properties

Methods

Constructors

  • Internal

    Construct table writers with QwpSender.writer().

    -

    Type Parameters

    Parameters

    • token: typeof QWP_TABLE_WRITER_CONSTRUCTOR
    • tableName: string
    • appendRow: (row: unknown, rowIndex?: number) => Promise<void>

    Returns QwpTableWriter<Schema>

Properties

tableName: string

Methods

+

Type Parameters

Parameters

  • token: typeof QWP_TABLE_WRITER_CONSTRUCTOR
  • tableName: string
  • appendRow: (row: unknown, rowIndex?: number) => Promise<void>

Returns QwpTableWriter<Schema>

Properties

tableName: string

Methods

diff --git a/docs/classes/_questdb_nodejs-client.QwpUdpDatagramTooLargeError.html b/docs/classes/_questdb_nodejs-client.QwpUdpDatagramTooLargeError.html index 43faa107..a5298cb4 100644 --- a/docs/classes/_questdb_nodejs-client.QwpUdpDatagramTooLargeError.html +++ b/docs/classes/_questdb_nodejs-client.QwpUdpDatagramTooLargeError.html @@ -1,5 +1,5 @@ QwpUdpDatagramTooLargeError | QuestDB JavaScript Client - v5.0.0

Class QwpUdpDatagramTooLargeError

A single encoded row cannot fit into the configured UDP datagram.

-

Hierarchy

  • Error
    • QwpUdpDatagramTooLargeError
Index

Constructors

Hierarchy

  • Error
    • QwpUdpDatagramTooLargeError
Index

Constructors

Properties

cause?: unknown
datagramSize: number
maxDatagramSize: number
message: string
name: string
row: number
stack?: string
tableName: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
datagramSize: number
maxDatagramSize: number
message: string
name: string
row: number
stack?: string
tableName: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpUnrecoverableReplayDictionaryError.html b/docs/classes/_questdb_nodejs-client.QwpUnrecoverableReplayDictionaryError.html index 2801dfee..f4d2b545 100644 --- a/docs/classes/_questdb_nodejs-client.QwpUnrecoverableReplayDictionaryError.html +++ b/docs/classes/_questdb_nodejs-client.QwpUnrecoverableReplayDictionaryError.html @@ -1,6 +1,6 @@ QwpUnrecoverableReplayDictionaryError | QuestDB JavaScript Client - v5.0.0

Class QwpUnrecoverableReplayDictionaryError

Recovered delta frames depend on symbol IDs that neither the durable dictionary prefix nor the surviving frames can reconstruct.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

Methods

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes diff --git a/docs/classes/_questdb_nodejs-client.QwpUpgradeError.html b/docs/classes/_questdb_nodejs-client.QwpUpgradeError.html index 7c2e62a3..13cd769d 100644 --- a/docs/classes/_questdb_nodejs-client.QwpUpgradeError.html +++ b/docs/classes/_questdb_nodejs-client.QwpUpgradeError.html @@ -1,5 +1,5 @@ QwpUpgradeError | QuestDB JavaScript Client - v5.0.0

A failure while establishing or validating a QWP WebSocket upgrade.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

-
tryNextEndpoint?: boolean
url?: string | URL
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames +

Constructors

Properties

cause?: unknown
closeCode?: number
message: string
name: string
retryable?: boolean
serverRole?: string
serverZone?: string
stack?: string
statusCode?: number
statusMessage?: string
timeoutPhase?: QwpUpgradeTimeoutPhase

Node opening phase that exceeded its deadline.

+
tryNextEndpoint?: boolean
url?: string | URL
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes @@ -28,8 +28,8 @@

If set to a non-number value, or set to a negative number, stack traces will not capture any frames.

Accessors

Methods

Methods

  • Closes the row after writing the designated timestamp. On ILP, a row is discarded -- its columns and its table selection alike -- only when it can never be closed, which means it carries no symbol and no column; rows completed earlier remain staged, and the next row starts from @@ -158,7 +158,7 @@

    If timestamp is not an integer or BigInt.

    If unit is 'ns' but timestamp is not a BigInt.

    If unit is not one of 'ns', 'us', or 'ms'.

    -
  • Closes the row without writing a designated timestamp. Designated timestamp will be populated by the server on this record. On ILP, a row is discarded -- its columns and its table selection alike -- only when it can never be closed, which means it carries no symbol and no @@ -172,24 +172,24 @@ rows must retain and resubmit them. QWP retains successfully closed rows for its retry and replay path.

    Returns Promise<void>

    Resolves after the row is closed and any triggered auto-flush completes.

    -
  • Writes a boolean column with its value into the buffer of the sender.
    Use it to insert into BOOLEAN columns.

    Parameters

    • name: string

      Column name.

    • value: boolean

      Column value, accepts only boolean values. A null or undefined value omits the column entirely (stored as NULL).

    Returns Sender

    Returns with a reference to this sender.

    -
  • Discards the QWP row in progress, including its table selection, while retaining rows that were already completed. The next row starts from table again.

    Returns Sender

    Returns this sender.

    If this sender uses an ILP transport.

    -
  • Closes the connection to the database. QWP publishes completed rows and performs a bounded acknowledgement drain first. Other transports retain their legacy behavior and require an explicit flush().

    -

    Returns Promise<void>

  • Establishes the transport connection for TCP, TCPS, WS, WSS, and UDP. HTTP and HTTPS connect per request and reject this call because no explicit connection step is required.

    Returns Promise<boolean>

    Resolves to true if the client is connected.

    -
  • Writes a decimal value into the buffer using the binary format.

    +
  • Writes a decimal value into the buffer using the binary format.

    Use it to insert into DECIMAL database columns.

    Parameters

    • name: string

      Column name.

    • unscaled: bigint | Int8Array<ArrayBufferLike>

      The unscaled value of the decimal in two's @@ -208,7 +208,7 @@

    • scale is not an integer between 0 and 76
    • unscaled value contains invalid bytes
    -
  • Writes a decimal value into the buffer using the text format.

    Use it to insert into DECIMAL database columns.

    Parameters

    • name: string

      Column name.

    • value: string | number

      Column value, accepts only number/string values. A null or undefined value omits the column entirely when decimals are supported; ILP protocol v1/v2 reject the call for every value.

      @@ -217,40 +217,41 @@
      • string value is not a valid decimal representation
      -
  • Writes a 64-bit floating point value into the buffer of the sender.
    Use it to insert into DOUBLE or FLOAT database columns.

    Parameters

    • name: string

      Column name.

    • value: number

      Column value, accepts only number values. A null or undefined value omits the column entirely (stored as NULL).

    Returns Sender

    Returns with a reference to this sender.

    -
  • Sends the content of the sender's buffer to the database and compacts the buffer. If the last row is not finished it stays in the sender's buffer.

    Returns Promise<boolean>

    Resolves to true when there was data in the buffer to send, and it was sent successfully.

    -
  • Flushes pending rows and returns the highest QWP frame sequence published by this call. Non-QWP transports flush normally and return -1n because they do not expose frame sequences.

    -

    Returns Promise<bigint>

  • Writes a 64-bit signed integer into the buffer of the sender.
    Use it to insert into LONG, INT, SHORT and BYTE columns.

    Parameters

    • name: string

      Column name.

      -
    • value: number

      Column value, accepts only number values. A null or undefined value omits the column entirely (stored as NULL).

      +
    • value: number | bigint

      Column value, accepts integer or BigInt values. LONG is a 64-bit signed integer, which is wider than the safe integer range of number, so pass a BigInt beyond Number.MAX_SAFE_INTEGER to avoid losing precision. A null or undefined value omits the column entirely (stored as NULL).

    Returns Sender

    Returns with a reference to this sender.

    -

    Error if the value is not an integer

    -
  • Resets the sender's buffer, data sitting in the buffer will be lost.
    +

    Error if the value is not an integer or a BigInt

    +

    RangeError if the value does not fit into a 64-bit signed integer

    +
  • Resets the sender's buffer, data sitting in the buffer will be lost.
    In other words it clears the buffer, and sets the writing position to the beginning of the buffer.

    Returns Sender

    Returns with a reference to this sender.

    -
  • Writes a string column with its value into the buffer of the sender.
    Use it to insert into VARCHAR and STRING columns.

    Parameters

    • name: string

      Column name.

    • value: string

      Column value, accepts only string values. A null or undefined value omits the column entirely (stored as NULL).

    Returns Sender

    Returns with a reference to this sender.

    -
  • Writes a symbol name and value into the buffer of the sender.
    Use it to insert into SYMBOL columns.

    Parameters

    • name: string

      Symbol name.

    • value: unknown

      Symbol value, toString() is called to extract the actual symbol value from the parameter. A null or undefined value omits the symbol entirely (stored as NULL).

    Returns Sender

    Returns with a reference to this sender.

    -
  • Writes a timestamp column and its value into the buffer of the sender.

    Use this method to insert data into TIMESTAMP or TIMESTAMP_NS columns.

    Precision rules:

      @@ -270,12 +271,12 @@
    • 'ms' — milliseconds

Returns Sender

Returns with a reference to this buffer.

-

If value is not an integer or BigInt.

-

If unit is 'ns' but value is not a BigInt.

-
  • Waits independently for a cumulative QWP ACK watermark.

    -

    Parameters

    • targetSequence: bigint
    • OptionaltimeoutMs: number

    Returns Promise<void>

  • Waits independently for a cumulative QWP ACK watermark.

    +

    Parameters

    • targetSequence: bigint
    • OptionaltimeoutMs: number

    Returns Promise<void>

  • Creates a Sender object by parsing the provided configuration string.

    Parameters

    • configurationString: string

      Configuration string.

    • OptionalextraOptions: ExtraOptions

      Optional extra configuration.

        @@ -285,7 +286,7 @@ Depends on which transport implementation and protocol used, one of the followings expected: undici.Agent, http.Agent or https.Agent.

    Returns Promise<Sender>

    A Sender object initialized from the provided configuration string.

    -
  • Creates a Sender object by parsing the configuration string set in the QDB_CLIENT_CONF environment variable.

    Parameters

    • OptionalextraOptions: ExtraOptions

      Optional extra configuration.

      • 'log' is a logging function used by the Sender. @@ -294,4 +295,4 @@ Depends on which transport implementation and protocol used, one of the followings expected: undici.Agent, http.Agent or https.Agent.

    Returns Promise<Sender>

    A Sender object initialized from the QDB_CLIENT_CONF environment variable.

    -
+
diff --git a/docs/classes/_questdb_nodejs-client.SenderBufferV1.html b/docs/classes/_questdb_nodejs-client.SenderBufferV1.html index 30c5641e..4a2aa05d 100644 --- a/docs/classes/_questdb_nodejs-client.SenderBufferV1.html +++ b/docs/classes/_questdb_nodejs-client.SenderBufferV1.html @@ -1,6 +1,6 @@ SenderBufferV1 | QuestDB JavaScript Client - v5.0.0

Buffer implementation for protocol version 1.
Sends floating point numbers in their text form.

-

Hierarchy

  • SenderBufferBase
    • SenderBufferV1
Index

Constructors

Hierarchy

  • SenderBufferBase
    • SenderBufferV1
Index

Constructors

Properties

buffer log position @@ -25,13 +25,13 @@

Constructors

Properties

buffer: Buffer
log: Logger
position: number

Methods

  • Array columns are not supported in protocol v1.
    +

Returns SenderBufferV1

Properties

buffer: Buffer
log: Logger
position: number

Methods

  • Array columns are not supported in protocol v1.
    The capability check applies even when the value is null or undefined.

    Parameters

    • name: string

      Column name.

    • value: unknown[]

      Array values.

    Returns SenderBuffer

    Returns with a reference to this buffer.

    Error indicating arrays are not supported in v1

    -
  • Closes the row after writing the designated timestamp into the buffer.

    Precision rules:

    • Protocol v2 and higher: @@ -61,19 +61,19 @@

    If the row cannot be closed within max_buf_size. The partial close is rewound, so the same call succeeds once a flush() frees space.

    -
  • Closes the row without writing designated timestamp into the buffer.
    Designated timestamp will be populated by the server on this record.

    -

    Returns void

  • Writes a boolean column with its value into the buffer.
    Use it to insert into BOOLEAN columns.

    Parameters

    • name: string

      Column name.

    • value: boolean

      Column value, accepts only boolean values. A null or undefined value omits the column entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -
  • Checks if the buffer has sufficient capacity for additional data and resizes if needed.

    +
  • Checks if the buffer has sufficient capacity for additional data and resizes if needed.

    Parameters

    • data: string[]

      Array of strings to calculate the required capacity for

    • base: number = 0

      Base number of bytes to add to the calculation

      -

    Returns void

  • Returns the current position of the buffer.
    +

Returns void

  • Returns the current position of the buffer.
    New data will be written into the buffer starting from this position.

    -

    Returns number

  • Writes a decimal value into the buffer using its binary format.

    +

    Returns number

  • Writes a decimal value into the buffer using its binary format.

    Use it to insert into DECIMAL database columns.

    Decimals are not supported by protocol v1/v2, so this base implementation rejects the call even when the value is null or undefined. Protocol v3 @@ -86,7 +86,7 @@

    If scale is not an integer between 0 and 76. Scale validation runs even when unscaled is null or undefined.

    Indicating decimals are not supported in protocol v1/v2.

    -
  • Writes a decimal value into the buffer using its text format.

    Use it to insert into DECIMAL database columns.

    Decimals are not supported by protocol v1/v2, so this base implementation rejects the call even when the value is null or undefined. Protocol v3 @@ -96,34 +96,35 @@ write.

Returns SenderBuffer

Returns with a reference to this buffer.

Indicating decimals are not supported in protocol v1/v2.

-
  • Writes a 64-bit floating point value into the buffer using v1 serialization (text format).
    Use it to insert into DOUBLE or FLOAT database columns.

    Parameters

    • name: string

      Column name.

    • value: number

      Column value, accepts only number values. A null or undefined value omits the column entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this sender.

    -
  • Writes a 64-bit signed integer into the buffer.
    Use it to insert into LONG, INT, SHORT and BYTE columns.

    Parameters

    • name: string

      Column name.

      -
    • value: number

      Column value, accepts only number values. A null or undefined value omits the column entirely (stored as NULL).

      +
    • value: number | bigint

      Column value, accepts integer or BigInt values. LONG is a 64-bit signed integer, which is wider than the safe integer range of number, so pass a BigInt beyond Number.MAX_SAFE_INTEGER to avoid losing precision. A null or undefined value omits the column entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -

    Error if the value is not an integer

    -
  • Resets the buffer, data sitting in the buffer will be lost.
    +

    Error if the value is not an integer or a BigInt

    +

    RangeError if the value does not fit into a 64-bit signed integer

    +
  • Writes a string column with its value into the buffer.
    Use it to insert into VARCHAR and STRING columns.

    Parameters

    • name: string

      Column name.

    • value: string

      Column value, accepts only string values. A null or undefined value omits the column entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -
  • Writes a symbol name and value into the buffer.
    Use it to insert into SYMBOL columns.

    Parameters

    • name: string

      Symbol name.

    • value: unknown

      Symbol value, toString() is called to extract the actual symbol value from the parameter. A null or undefined value omits the symbol entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -
  • Writes a timestamp column and its value into the buffer.

    Use this method to insert data into TIMESTAMP or TIMESTAMP_NS columns.

    Precision rules:

      @@ -143,14 +144,14 @@
    • 'ms' — milliseconds

Returns SenderBuffer

Returns with a reference to this buffer.

-

If unit is not one of 'ns', 'us', or 'ms' (checked +

If unit is not one of 'ns', 'us', or 'ms' (checked even when value is null or undefined).

-

If value is not an integer or BigInt.

-

If unit is 'ns' but value is not a BigInt.

-
  • Parameters

    • pos: number = ...

    Returns Buffer

    Returns a cropped buffer ready to send to the server, or null if there is nothing to send.
    +

    If value is not an integer or BigInt.

    +

    If unit is 'ns' but value is not a BigInt.

    +
  • Parameters

    • pos: number = ...

    Returns Buffer

    Returns a cropped buffer ready to send to the server, or null if there is nothing to send.
    The returned buffer is a copy of this buffer. It also compacts the buffer.

    -
  • Parameters

    • pos: number = ...

    Returns Buffer

    Returns a cropped buffer, or null if there is nothing to send.
    +

  • Parameters

    • pos: number = ...

    Returns Buffer

    Returns a cropped buffer, or null if there is nothing to send.
    The returned buffer is backed by this buffer instance, meaning the view can change as the buffer is mutated. Used only in tests to assert the buffer's content.

    -
+
diff --git a/docs/classes/_questdb_nodejs-client.SenderBufferV2.html b/docs/classes/_questdb_nodejs-client.SenderBufferV2.html index e4171444..a8ffc510 100644 --- a/docs/classes/_questdb_nodejs-client.SenderBufferV2.html +++ b/docs/classes/_questdb_nodejs-client.SenderBufferV2.html @@ -1,6 +1,6 @@ SenderBufferV2 | QuestDB JavaScript Client - v5.0.0

Buffer implementation for protocol version 2.
Sends floating point numbers in binary form, and provides support for arrays.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

buffer log position @@ -25,7 +25,7 @@

Constructors

Properties

buffer: Buffer
log: Logger
position: number

Methods

  • Write an array column with its values into the buffer using v2 format.

    +

Returns SenderBufferV2

Properties

buffer: Buffer
log: Logger
position: number

Methods

  • Write an array column with its values into the buffer using v2 format.

    Parameters

    • name: string

      Column name

    • value: unknown[]

      Array values to write (currently supports double arrays). A null or undefined value omits the column entirely, storing NULL.

    Returns SenderBuffer

    Returns with a reference to this buffer.

    @@ -35,7 +35,7 @@
  • or the shape of the array is irregular: the length of sub-arrays are different
  • or the array is not homogeneous: its elements are not all the same type
-
  • Closes the row after writing the designated timestamp into the buffer.

    Precision rules:

    • Protocol v2 and higher: @@ -65,19 +65,19 @@

    If the row cannot be closed within max_buf_size. The partial close is rewound, so the same call succeeds once a flush() frees space.

    -
  • Closes the row without writing designated timestamp into the buffer.
    Designated timestamp will be populated by the server on this record.

    -

    Returns void

  • Writes a boolean column with its value into the buffer.
    Use it to insert into BOOLEAN columns.

    Parameters

    • name: string

      Column name.

    • value: boolean

      Column value, accepts only boolean values. A null or undefined value omits the column entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -
  • Checks if the buffer has sufficient capacity for additional data and resizes if needed.

    +
  • Checks if the buffer has sufficient capacity for additional data and resizes if needed.

    Parameters

    • data: string[]

      Array of strings to calculate the required capacity for

    • base: number = 0

      Base number of bytes to add to the calculation

      -

    Returns void

  • Returns the current position of the buffer.
    +

Returns void

  • Returns the current position of the buffer.
    New data will be written into the buffer starting from this position.

    -

    Returns number

  • Writes a decimal value into the buffer using its binary format.

    +

    Returns number

  • Writes a decimal value into the buffer using its binary format.

    Use it to insert into DECIMAL database columns.

    Decimals are not supported by protocol v1/v2, so this base implementation rejects the call even when the value is null or undefined. Protocol v3 @@ -90,7 +90,7 @@

    If scale is not an integer between 0 and 76. Scale validation runs even when unscaled is null or undefined.

    Indicating decimals are not supported in protocol v1/v2.

    -
  • Writes a decimal value into the buffer using its text format.

    Use it to insert into DECIMAL database columns.

    Decimals are not supported by protocol v1/v2, so this base implementation rejects the call even when the value is null or undefined. Protocol v3 @@ -100,34 +100,35 @@ write.

Returns SenderBuffer

Returns with a reference to this buffer.

Indicating decimals are not supported in protocol v1/v2.

-
  • Writes a 64-bit floating point value into the buffer using v2 serialization (binary format).
    Use it to insert into DOUBLE or FLOAT database columns.

    Parameters

    • name: string

      Column name.

    • value: number

      Column value, accepts only number values. A null or undefined value omits the column entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -
  • Writes a 64-bit signed integer into the buffer.
    Use it to insert into LONG, INT, SHORT and BYTE columns.

    Parameters

    • name: string

      Column name.

      -
    • value: number

      Column value, accepts only number values. A null or undefined value omits the column entirely (stored as NULL).

      +
    • value: number | bigint

      Column value, accepts integer or BigInt values. LONG is a 64-bit signed integer, which is wider than the safe integer range of number, so pass a BigInt beyond Number.MAX_SAFE_INTEGER to avoid losing precision. A null or undefined value omits the column entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -

    Error if the value is not an integer

    -
  • Resets the buffer, data sitting in the buffer will be lost.
    +

    Error if the value is not an integer or a BigInt

    +

    RangeError if the value does not fit into a 64-bit signed integer

    +
  • Writes a string column with its value into the buffer.
    Use it to insert into VARCHAR and STRING columns.

    Parameters

    • name: string

      Column name.

    • value: string

      Column value, accepts only string values. A null or undefined value omits the column entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -
  • Writes a symbol name and value into the buffer.
    Use it to insert into SYMBOL columns.

    Parameters

    • name: string

      Symbol name.

    • value: unknown

      Symbol value, toString() is called to extract the actual symbol value from the parameter. A null or undefined value omits the symbol entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -
  • Writes a timestamp column and its value into the buffer.

    Use this method to insert data into TIMESTAMP or TIMESTAMP_NS columns.

    Precision rules:

      @@ -147,14 +148,14 @@
    • 'ms' — milliseconds

Returns SenderBuffer

Returns with a reference to this buffer.

-

If unit is not one of 'ns', 'us', or 'ms' (checked +

If unit is not one of 'ns', 'us', or 'ms' (checked even when value is null or undefined).

-

If value is not an integer or BigInt.

-

If unit is 'ns' but value is not a BigInt.

-
  • Parameters

    • pos: number = ...

    Returns Buffer

    Returns a cropped buffer ready to send to the server, or null if there is nothing to send.
    +

    If value is not an integer or BigInt.

    +

    If unit is 'ns' but value is not a BigInt.

    +
  • Parameters

    • pos: number = ...

    Returns Buffer

    Returns a cropped buffer ready to send to the server, or null if there is nothing to send.
    The returned buffer is a copy of this buffer. It also compacts the buffer.

    -
  • Parameters

    • pos: number = ...

    Returns Buffer

    Returns a cropped buffer, or null if there is nothing to send.
    +

  • Parameters

    • pos: number = ...

    Returns Buffer

    Returns a cropped buffer, or null if there is nothing to send.
    The returned buffer is backed by this buffer instance, meaning the view can change as the buffer is mutated. Used only in tests to assert the buffer's content.

    -
+
diff --git a/docs/classes/_questdb_nodejs-client.SenderBufferV3.html b/docs/classes/_questdb_nodejs-client.SenderBufferV3.html index fffdc4dd..ae840798 100644 --- a/docs/classes/_questdb_nodejs-client.SenderBufferV3.html +++ b/docs/classes/_questdb_nodejs-client.SenderBufferV3.html @@ -1,6 +1,6 @@ SenderBufferV3 | QuestDB JavaScript Client - v5.0.0

Buffer implementation for protocol version 3.

Provides support for decimals.

-

Hierarchy (View Summary)

Index

Constructors

Hierarchy (View Summary)

Index

Constructors

Properties

buffer log position @@ -25,7 +25,7 @@

Constructors

Properties

buffer: Buffer
log: Logger
position: number

Methods

  • Write an array column with its values into the buffer using v2 format.

    +

Returns SenderBufferV3

Properties

buffer: Buffer
log: Logger
position: number

Methods

  • Write an array column with its values into the buffer using v2 format.

    Parameters

    • name: string

      Column name

    • value: unknown[]

      Array values to write (currently supports double arrays). A null or undefined value omits the column entirely, storing NULL.

    Returns SenderBuffer

    Returns with a reference to this buffer.

    @@ -35,7 +35,7 @@
  • or the shape of the array is irregular: the length of sub-arrays are different
  • or the array is not homogeneous: its elements are not all the same type
-
  • Closes the row after writing the designated timestamp into the buffer.

    Precision rules:

    • Protocol v2 and higher: @@ -65,19 +65,19 @@

    If the row cannot be closed within max_buf_size. The partial close is rewound, so the same call succeeds once a flush() frees space.

    -
  • Checks if the buffer has sufficient capacity for additional data and resizes if needed.

    Parameters

    • data: string[]

      Array of strings to calculate the required capacity for

    • base: number = 0

      Base number of bytes to add to the calculation

      -

    Returns void

  • Returns the current position of the buffer.
    +

Returns void

  • Writes a decimal value into the buffer using its binary format.

    Use it to insert into DECIMAL database columns.

    Parameters

    • name: string

      Column name.

    • unscaled: bigint | Int8Array<ArrayBufferLike>

      The unscaled integer portion of the decimal value.

      @@ -96,7 +96,7 @@
    • scale is not an integer between 0 and 76.
    • unscaled contains invalid bytes.
    -
  • Writes a 64-bit floating point value into the buffer using v2 serialization (binary format).
    Use it to insert into DOUBLE or FLOAT database columns.

    Parameters

    • name: string

      Column name.

    • value: number

      Column value, accepts only number values. A null or undefined value omits the column entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -
  • Writes a 64-bit signed integer into the buffer.
    Use it to insert into LONG, INT, SHORT and BYTE columns.

    Parameters

    • name: string

      Column name.

      -
    • value: number

      Column value, accepts only number values. A null or undefined value omits the column entirely (stored as NULL).

      +
    • value: number | bigint

      Column value, accepts integer or BigInt values. LONG is a 64-bit signed integer, which is wider than the safe integer range of number, so pass a BigInt beyond Number.MAX_SAFE_INTEGER to avoid losing precision. A null or undefined value omits the column entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -

    Error if the value is not an integer

    -
  • Writes a string column with its value into the buffer.
    Use it to insert into VARCHAR and STRING columns.

    Parameters

    • name: string

      Column name.

    • value: string

      Column value, accepts only string values. A null or undefined value omits the column entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -
  • Writes a symbol name and value into the buffer.
    Use it to insert into SYMBOL columns.

    Parameters

    • name: string

      Symbol name.

    • value: unknown

      Symbol value, toString() is called to extract the actual symbol value from the parameter. A null or undefined value omits the symbol entirely (stored as NULL).

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -
  • Writes a timestamp column and its value into the buffer.

    Use this method to insert data into TIMESTAMP or TIMESTAMP_NS columns.

    Precision rules:

      @@ -157,14 +158,14 @@
    • 'ms' — milliseconds

Returns SenderBuffer

Returns with a reference to this buffer.

-

If unit is not one of 'ns', 'us', or 'ms' (checked +

If unit is not one of 'ns', 'us', or 'ms' (checked even when value is null or undefined).

-

If value is not an integer or BigInt.

-

If unit is 'ns' but value is not a BigInt.

-
  • Parameters

    • pos: number = ...

    Returns Buffer

    Returns a cropped buffer, or null if there is nothing to send.
    The returned buffer is backed by this buffer instance, meaning the view can change as the buffer is mutated. Used only in tests to assert the buffer's content.

    -
+
diff --git a/docs/classes/_questdb_nodejs-client.SenderOptions.html b/docs/classes/_questdb_nodejs-client.SenderOptions.html index 761cd657..59e34fcc 100644 --- a/docs/classes/_questdb_nodejs-client.SenderOptions.html +++ b/docs/classes/_questdb_nodejs-client.SenderOptions.html @@ -124,7 +124,7 @@ Supported by the udp transport only. A connection string rejects it on every other transport, and ws/wss reject it however the sender was built. -
Index

Constructors

Index

Constructors

Properties

addr? agent? auth? @@ -170,7 +170,7 @@
  • 'agent' is a custom http/https agent used by the Sender when http/https transport is used. Depends on which transport implementation and protocol used, one of the followings expected: undici.Agent, http.Agent or https.Agent.
  • -

    Returns SenderOptions

    Properties

    addr?: string
    agent?: Agent | Agent | Agent
    auth?: { keyId?: string; password?: string; token?: string; username?: string }
    auto_flush?: boolean
    auto_flush_bytes?: number
    auto_flush_interval?: number
    auto_flush_rows?: number
    host?: string
    init_buf_size?: number
    jwk?: Record<string, string>
    log?: Logger
    max_buf_size?: number
    max_datagram_size?: number
    max_name_len?: number
    multicast_ttl?: number
    password?: string
    port?: number
    protocol: string
    protocol_version?: string
    request_min_throughput?: number
    request_timeout?: number
    retry_timeout?: number
    stdlib_http?: boolean
    tls_ca?: PathOrFileDescriptor
    tls_roots?: never
    tls_roots_password?: never
    tls_verify?: boolean
    token?: string
    token_x?: string
    token_y?: string
    username?: string

    Methods

    • Creates a Sender options object by parsing the provided configuration string.

      +

    Returns SenderOptions

    Properties

    addr?: string
    agent?: Agent | Agent | Agent
    auth?: { keyId?: string; password?: string; token?: string; username?: string }
    auto_flush?: boolean
    auto_flush_bytes?: number
    auto_flush_interval?: number
    auto_flush_rows?: number
    host?: string
    init_buf_size?: number
    jwk?: Record<string, string>
    log?: Logger
    max_buf_size?: number
    max_datagram_size?: number
    max_name_len?: number
    multicast_ttl?: number
    password?: string
    port?: number
    protocol: string
    protocol_version?: string
    request_min_throughput?: number
    request_timeout?: number
    retry_timeout?: number
    stdlib_http?: boolean
    tls_ca?: PathOrFileDescriptor
    tls_roots?: never
    tls_roots_password?: never
    tls_verify?: boolean
    token?: string
    token_x?: string
    token_y?: string
    username?: string

    Methods

    • Creates a Sender options object by parsing the provided configuration string.

      Parameters

      • configurationString: string

        Configuration string.

      • OptionalextraOptions: ExtraOptions

        Optional extra configuration.

          @@ -180,7 +180,7 @@ Depends on which transport implementation and protocol used, one of the followings expected: undici.Agent, http.Agent or https.Agent.

      Returns Promise<SenderOptions>

      A Sender configuration object initialized from the provided configuration string.

      -
    • Creates a Sender options object by parsing the configuration string set in the QDB_CLIENT_CONF environment variable.

      Parameters

      • OptionalextraOptions: ExtraOptions

        Optional extra configuration.

        • 'log' is a logging function used by the Sender. @@ -189,10 +189,10 @@ Depends on which transport implementation and protocol used, one of the followings expected: undici.Agent, http.Agent or https.Agent.

      Returns Promise<SenderOptions>

      A Sender configuration object initialized from the QDB_CLIENT_CONF environment variable.

      -
    • Resolves the protocol version, if it is set to 'auto'.
      If TCP transport is used, the protocol version will default to 1. In case of HTTP transport the /settings endpoint of the database is used to find the protocol versions supported by the server, and the highest will be selected. When calling the /settings endpoint the timeout and TLS options are used from the options object.

      Parameters

      • options: SenderOptions

        SenderOptions instance needs resolving protocol version

        -

      Returns Promise<SenderOptions>

    +

    Returns Promise<SenderOptions>

    diff --git a/docs/classes/_questdb_nodejs-client.TcpTransport.html b/docs/classes/_questdb_nodejs-client.TcpTransport.html index 268e0222..e563a34a 100644 --- a/docs/classes/_questdb_nodejs-client.TcpTransport.html +++ b/docs/classes/_questdb_nodejs-client.TcpTransport.html @@ -1,6 +1,6 @@ TcpTransport | QuestDB JavaScript Client - v5.0.0

    TCP transport implementation.
    Supports both plain TCP or secure TLS-encrypted connections with configurable JWK token authentication.

    -

    Implements

    Index

    Constructors

    Implements

    Index

    Constructors

    Methods

    Constructors

    Methods

    Methods

    • Sends data over the established TCP connection.

      Parameters

      • data: Buffer

        Buffer containing the data to send

      Returns Promise<boolean>

      Promise resolving to true if data was sent successfully

      Error if the data could not be written to the socket

      -
    +
    diff --git a/docs/classes/_questdb_nodejs-client.UndiciTransport.html b/docs/classes/_questdb_nodejs-client.UndiciTransport.html index 649074fd..5b8f1614 100644 --- a/docs/classes/_questdb_nodejs-client.UndiciTransport.html +++ b/docs/classes/_questdb_nodejs-client.UndiciTransport.html @@ -1,7 +1,7 @@ UndiciTransport | QuestDB JavaScript Client - v5.0.0

    HTTP transport implementation using the Undici library.
    Provides high-performance HTTP requests with connection pooling and retry logic.
    Supports both HTTP and HTTPS protocols with configurable authentication.

    -

    Hierarchy

    • HttpTransportBase
      • UndiciTransport
    Index

    Constructors

    Hierarchy

    • HttpTransportBase
      • UndiciTransport
    Index

    Constructors

    Properties

    host log password @@ -21,14 +21,14 @@

    Constructors

    Properties

    host: string
    log: Logger
    password: string
    port: number
    requestMinThroughput: number
    requestTimeout: number
    retryTimeout: number
    secure: boolean
    tlsCA: Buffer
    tlsVerify: boolean
    token: string
    username: string

    Methods

    Properties

    host: string
    log: Logger
    password: string
    port: number
    requestMinThroughput: number
    requestTimeout: number
    retryTimeout: number
    secure: boolean
    tlsCA: Buffer
    tlsVerify: boolean
    token: string
    username: string

    Methods

    • HTTP transport does not require explicit connection establishment.

      Returns Promise<boolean>

      Error indicating connect is not required for HTTP transport

      -
    • Gets the default auto-flush row count for HTTP transport.

      Returns number

      Default number of rows that trigger auto-flush

      -
    • Sends data to QuestDB using HTTP POST.

      Parameters

      • data: Buffer

        Buffer containing the data to send

      Returns Promise<boolean>

      Promise resolving to true if data was sent successfully

      Error if request fails after all retries or times out

      -
    +
    diff --git a/docs/functions/_questdb_browser-client.addQwpDurableAckWebSocketProtocol.html b/docs/functions/_questdb_browser-client.addQwpDurableAckWebSocketProtocol.html index ad471821..1b39dc47 100644 --- a/docs/functions/_questdb_browser-client.addQwpDurableAckWebSocketProtocol.html +++ b/docs/functions/_questdb_browser-client.addQwpDurableAckWebSocketProtocol.html @@ -1,2 +1,2 @@ addQwpDurableAckWebSocketProtocol | QuestDB JavaScript Client - v5.0.0

    Function addQwpDurableAckWebSocketProtocol

    • Adds the durable-ACK capability token without mutating user options.

      -

      Parameters

      • protocols: undefined | string | readonly string[]

      Returns string | string[]

    +

    Parameters

    • protocols: undefined | string | readonly string[]

    Returns string | string[]

    diff --git a/docs/functions/_questdb_browser-client.binary.html b/docs/functions/_questdb_browser-client.binary.html index 5bb5dab7..557320bd 100644 --- a/docs/functions/_questdb_browser-client.binary.html +++ b/docs/functions/_questdb_browser-client.binary.html @@ -1,2 +1,2 @@ binary | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<Uint8Array<ArrayBufferLike>>

    diff --git a/docs/functions/_questdb_browser-client.bool.html b/docs/functions/_questdb_browser-client.bool.html index 98cb6992..6da0d482 100644 --- a/docs/functions/_questdb_browser-client.bool.html +++ b/docs/functions/_questdb_browser-client.bool.html @@ -1,2 +1,2 @@ bool | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<boolean>

    diff --git a/docs/functions/_questdb_browser-client.bootstrapQwpBrowserSession.html b/docs/functions/_questdb_browser-client.bootstrapQwpBrowserSession.html index c2bb5553..4e76c153 100644 --- a/docs/functions/_questdb_browser-client.bootstrapQwpBrowserSession.html +++ b/docs/functions/_questdb_browser-client.bootstrapQwpBrowserSession.html @@ -2,4 +2,4 @@ browser needs before opening QWP WebSockets. REST and OIDC tokens both use Bearer authentication. When serviceAccount is present the same request also creates Enterprise's qdbServiceAccount impersonation cookie.

    -

    Returns Promise<QwpBrowserSessionBootstrapResult>

    +

    Returns Promise<QwpBrowserSessionBootstrapResult>

    diff --git a/docs/functions/_questdb_browser-client.byte.html b/docs/functions/_questdb_browser-client.byte.html index b601861b..c5554d44 100644 --- a/docs/functions/_questdb_browser-client.byte.html +++ b/docs/functions/_questdb_browser-client.byte.html @@ -1,2 +1,2 @@ byte | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_browser-client.char.html b/docs/functions/_questdb_browser-client.char.html index 6be660de..62184be7 100644 --- a/docs/functions/_questdb_browser-client.char.html +++ b/docs/functions/_questdb_browser-client.char.html @@ -1,2 +1,2 @@ char | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<string>

    diff --git a/docs/functions/_questdb_browser-client.concatBytes.html b/docs/functions/_questdb_browser-client.concatBytes.html index f8abab56..dc526cbe 100644 --- a/docs/functions/_questdb_browser-client.concatBytes.html +++ b/docs/functions/_questdb_browser-client.concatBytes.html @@ -1 +1 @@ -concatBytes | QuestDB JavaScript Client - v5.0.0
    +concatBytes | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_browser-client.connectQwpBrowserClient.html b/docs/functions/_questdb_browser-client.connectQwpBrowserClient.html index 1a1043a5..945525b9 100644 --- a/docs/functions/_questdb_browser-client.connectQwpBrowserClient.html +++ b/docs/functions/_questdb_browser-client.connectQwpBrowserClient.html @@ -1,2 +1,2 @@ connectQwpBrowserClient | QuestDB JavaScript Client - v5.0.0

    Function connectQwpBrowserClient

    +

    Parameters

    Returns Promise<QwpClient>

    diff --git a/docs/functions/_questdb_browser-client.connectQwpBrowserEgress.html b/docs/functions/_questdb_browser-client.connectQwpBrowserEgress.html index 0eb4dc8b..975e97b3 100644 --- a/docs/functions/_questdb_browser-client.connectQwpBrowserEgress.html +++ b/docs/functions/_questdb_browser-client.connectQwpBrowserEgress.html @@ -1,3 +1,3 @@ connectQwpBrowserEgress | QuestDB JavaScript Client - v5.0.0

    Function connectQwpBrowserEgress

    +

    Returns Promise<QwpEgressSession>

    diff --git a/docs/functions/_questdb_browser-client.connectQwpBrowserIngress.html b/docs/functions/_questdb_browser-client.connectQwpBrowserIngress.html index 6789fbbe..925d4ac9 100644 --- a/docs/functions/_questdb_browser-client.connectQwpBrowserIngress.html +++ b/docs/functions/_questdb_browser-client.connectQwpBrowserIngress.html @@ -1,3 +1,3 @@ connectQwpBrowserIngress | QuestDB JavaScript Client - v5.0.0

    Function connectQwpBrowserIngress

    +

    Returns Promise<QwpIngressSession>

    diff --git a/docs/functions/_questdb_browser-client.connectQwpBrowserSender.html b/docs/functions/_questdb_browser-client.connectQwpBrowserSender.html index 1125b0ed..e53c9f53 100644 --- a/docs/functions/_questdb_browser-client.connectQwpBrowserSender.html +++ b/docs/functions/_questdb_browser-client.connectQwpBrowserSender.html @@ -1,2 +1,2 @@ connectQwpBrowserSender | QuestDB JavaScript Client - v5.0.0

    Function connectQwpBrowserSender

    +

    Parameters

    Returns Promise<QwpSender>

    diff --git a/docs/functions/_questdb_browser-client.connectQwpBrowserWebSocket.html b/docs/functions/_questdb_browser-client.connectQwpBrowserWebSocket.html index 0dd56a5c..8f0024dd 100644 --- a/docs/functions/_questdb_browser-client.connectQwpBrowserWebSocket.html +++ b/docs/functions/_questdb_browser-client.connectQwpBrowserWebSocket.html @@ -1,7 +1,8 @@ connectQwpBrowserWebSocket | QuestDB JavaScript Client - v5.0.0

    Function connectQwpBrowserWebSocket

    +browser upgrades when Origin and Host have the same authority, or when the +server lists the Origin in qwp.browser.allowed.origins. When +authentication is enabled, a same-origin app can pass sessionBootstrap or +call bootstrapQwpBrowserSession first so the browser can attach +qdb_session; an app on a listed origin passes auth instead.

    +

    Parameters

    Returns Promise<QwpBinaryConnection>

    diff --git a/docs/functions/_questdb_browser-client.createQwpBrowserClient.html b/docs/functions/_questdb_browser-client.createQwpBrowserClient.html index 8765d470..0b620e31 100644 --- a/docs/functions/_questdb_browser-client.createQwpBrowserClient.html +++ b/docs/functions/_questdb_browser-client.createQwpBrowserClient.html @@ -1,2 +1,2 @@ createQwpBrowserClient | QuestDB JavaScript Client - v5.0.0

    Function createQwpBrowserClient

    +

    Parameters

    Returns QwpClient

    diff --git a/docs/functions/_questdb_browser-client.createQwpBrowserConnectionFactory.html b/docs/functions/_questdb_browser-client.createQwpBrowserConnectionFactory.html index 5cffd276..e7703c0e 100644 --- a/docs/functions/_questdb_browser-client.createQwpBrowserConnectionFactory.html +++ b/docs/functions/_questdb_browser-client.createQwpBrowserConnectionFactory.html @@ -1,2 +1,2 @@ createQwpBrowserConnectionFactory | QuestDB JavaScript Client - v5.0.0

    Function createQwpBrowserConnectionFactory

    +

    Parameters

    Returns QwpConnectionFactory

    diff --git a/docs/functions/_questdb_browser-client.createQwpBrowserSender.html b/docs/functions/_questdb_browser-client.createQwpBrowserSender.html index 30b7270e..9c1f4b5a 100644 --- a/docs/functions/_questdb_browser-client.createQwpBrowserSender.html +++ b/docs/functions/_questdb_browser-client.createQwpBrowserSender.html @@ -1,3 +1,3 @@ createQwpBrowserSender | QuestDB JavaScript Client - v5.0.0

    Function createQwpBrowserSender

    +

    Parameters

    Returns QwpSender

    diff --git a/docs/functions/_questdb_browser-client.createQwpDataLossSenderError.html b/docs/functions/_questdb_browser-client.createQwpDataLossSenderError.html index b3fc0e68..d9ea6a78 100644 --- a/docs/functions/_questdb_browser-client.createQwpDataLossSenderError.html +++ b/docs/functions/_questdb_browser-client.createQwpDataLossSenderError.html @@ -1,2 +1,2 @@ createQwpDataLossSenderError | QuestDB JavaScript Client - v5.0.0

    Function createQwpDataLossSenderError

    +

    Returns QwpSenderError

    diff --git a/docs/functions/_questdb_browser-client.createQwpProtocolViolationSenderError.html b/docs/functions/_questdb_browser-client.createQwpProtocolViolationSenderError.html index 64e9de03..6cd5970c 100644 --- a/docs/functions/_questdb_browser-client.createQwpProtocolViolationSenderError.html +++ b/docs/functions/_questdb_browser-client.createQwpProtocolViolationSenderError.html @@ -1 +1 @@ -createQwpProtocolViolationSenderError | QuestDB JavaScript Client - v5.0.0

    Function createQwpProtocolViolationSenderError

    +createQwpProtocolViolationSenderError | QuestDB JavaScript Client - v5.0.0

    Function createQwpProtocolViolationSenderError

    diff --git a/docs/functions/_questdb_browser-client.createQwpSenderError.html b/docs/functions/_questdb_browser-client.createQwpSenderError.html index a8584a4f..89120591 100644 --- a/docs/functions/_questdb_browser-client.createQwpSenderError.html +++ b/docs/functions/_questdb_browser-client.createQwpSenderError.html @@ -1 +1 @@ -createQwpSenderError | QuestDB JavaScript Client - v5.0.0

    Function createQwpSenderError

    +createQwpSenderError | QuestDB JavaScript Client - v5.0.0

    Function createQwpSenderError

    diff --git a/docs/functions/_questdb_browser-client.date.html b/docs/functions/_questdb_browser-client.date.html index 9a23247d..810c7be8 100644 --- a/docs/functions/_questdb_browser-client.date.html +++ b/docs/functions/_questdb_browser-client.date.html @@ -1,4 +1,4 @@ date | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number | bigint>

    diff --git a/docs/functions/_questdb_browser-client.decimal128.html b/docs/functions/_questdb_browser-client.decimal128.html index b34afeeb..21bc0833 100644 --- a/docs/functions/_questdb_browser-client.decimal128.html +++ b/docs/functions/_questdb_browser-client.decimal128.html @@ -1,2 +1,2 @@ decimal128 | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    • scale: number

    Returns QwpWriterColumn<QwpDecimalInput>

    diff --git a/docs/functions/_questdb_browser-client.decimal256.html b/docs/functions/_questdb_browser-client.decimal256.html index 33f0a606..8b568703 100644 --- a/docs/functions/_questdb_browser-client.decimal256.html +++ b/docs/functions/_questdb_browser-client.decimal256.html @@ -1,2 +1,2 @@ decimal256 | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    • scale: number

    Returns QwpWriterColumn<QwpDecimalInput>

    diff --git a/docs/functions/_questdb_browser-client.decimal64.html b/docs/functions/_questdb_browser-client.decimal64.html index 38b9d1d9..eae6bcdc 100644 --- a/docs/functions/_questdb_browser-client.decimal64.html +++ b/docs/functions/_questdb_browser-client.decimal64.html @@ -1,2 +1,2 @@ decimal64 | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    • scale: number

    Returns QwpWriterColumn<QwpDecimalInput>

    diff --git a/docs/functions/_questdb_browser-client.decodeQwpContentEncoding.html b/docs/functions/_questdb_browser-client.decodeQwpContentEncoding.html index 2bb7c8a8..795dca47 100644 --- a/docs/functions/_questdb_browser-client.decodeQwpContentEncoding.html +++ b/docs/functions/_questdb_browser-client.decodeQwpContentEncoding.html @@ -1,4 +1,4 @@ decodeQwpContentEncoding | QuestDB JavaScript Client - v5.0.0

    Function decodeQwpContentEncoding

    +

    Parameters

    • value: undefined | string

    Returns QwpNegotiatedEgressCompression

    diff --git a/docs/functions/_questdb_browser-client.decodeQwpEgressMessage.html b/docs/functions/_questdb_browser-client.decodeQwpEgressMessage.html index b3acc794..80d696a6 100644 --- a/docs/functions/_questdb_browser-client.decodeQwpEgressMessage.html +++ b/docs/functions/_questdb_browser-client.decodeQwpEgressMessage.html @@ -1,2 +1,2 @@ decodeQwpEgressMessage | QuestDB JavaScript Client - v5.0.0

    Function decodeQwpEgressMessage

    +

    Parameters

    • bytes: Uint8Array

    Returns QwpEgressMessage

    diff --git a/docs/functions/_questdb_browser-client.decodeQwpFrame.html b/docs/functions/_questdb_browser-client.decodeQwpFrame.html index 62b91707..66d3c207 100644 --- a/docs/functions/_questdb_browser-client.decodeQwpFrame.html +++ b/docs/functions/_questdb_browser-client.decodeQwpFrame.html @@ -1 +1 @@ -decodeQwpFrame | QuestDB JavaScript Client - v5.0.0
    +decodeQwpFrame | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_browser-client.decodeQwpIngressResponse.html b/docs/functions/_questdb_browser-client.decodeQwpIngressResponse.html index 7339550a..6c05ccc4 100644 --- a/docs/functions/_questdb_browser-client.decodeQwpIngressResponse.html +++ b/docs/functions/_questdb_browser-client.decodeQwpIngressResponse.html @@ -1,2 +1,2 @@ decodeQwpIngressResponse | QuestDB JavaScript Client - v5.0.0

    Function decodeQwpIngressResponse

    +

    Parameters

    • payload: Uint8Array

    Returns QwpIngressResponse

    diff --git a/docs/functions/_questdb_browser-client.decodeQwpIngressServerInfo.html b/docs/functions/_questdb_browser-client.decodeQwpIngressServerInfo.html index 0668c4d5..1c24027f 100644 --- a/docs/functions/_questdb_browser-client.decodeQwpIngressServerInfo.html +++ b/docs/functions/_questdb_browser-client.decodeQwpIngressServerInfo.html @@ -1,2 +1,2 @@ decodeQwpIngressServerInfo | QuestDB JavaScript Client - v5.0.0

    Function decodeQwpIngressServerInfo

    +

    Parameters

    • payload: Uint8Array

    Returns undefined | QwpIngressServerInfo

    diff --git a/docs/functions/_questdb_browser-client.decodeQwpIngressSymbolDictionaryDelta.html b/docs/functions/_questdb_browser-client.decodeQwpIngressSymbolDictionaryDelta.html index 98b8e82f..7557c6df 100644 --- a/docs/functions/_questdb_browser-client.decodeQwpIngressSymbolDictionaryDelta.html +++ b/docs/functions/_questdb_browser-client.decodeQwpIngressSymbolDictionaryDelta.html @@ -1,2 +1,2 @@ decodeQwpIngressSymbolDictionaryDelta | QuestDB JavaScript Client - v5.0.0

    Function decodeQwpIngressSymbolDictionaryDelta

    +

    Parameters

    • bytes: Uint8Array

    Returns undefined | QwpIngressSymbolDictionaryDelta

    diff --git a/docs/functions/_questdb_browser-client.decodeQwpVarint.html b/docs/functions/_questdb_browser-client.decodeQwpVarint.html index 8619b8fc..1f9ec265 100644 --- a/docs/functions/_questdb_browser-client.decodeQwpVarint.html +++ b/docs/functions/_questdb_browser-client.decodeQwpVarint.html @@ -1 +1 @@ -decodeQwpVarint | QuestDB JavaScript Client - v5.0.0
    • Parameters

      • bytes: Uint8Array
      • offset: number = 0

      Returns { offset: number; value: bigint }

    +decodeQwpVarint | QuestDB JavaScript Client - v5.0.0
    • Parameters

      • bytes: Uint8Array
      • offset: number = 0

      Returns { offset: number; value: bigint }

    diff --git a/docs/functions/_questdb_browser-client.decodeUtf8.html b/docs/functions/_questdb_browser-client.decodeUtf8.html index fb98e764..36cb1dae 100644 --- a/docs/functions/_questdb_browser-client.decodeUtf8.html +++ b/docs/functions/_questdb_browser-client.decodeUtf8.html @@ -1 +1 @@ -decodeUtf8 | QuestDB JavaScript Client - v5.0.0
    +decodeUtf8 | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_browser-client.decompressQwpZstdFrame.html b/docs/functions/_questdb_browser-client.decompressQwpZstdFrame.html index 77d384d1..d48cfd76 100644 --- a/docs/functions/_questdb_browser-client.decompressQwpZstdFrame.html +++ b/docs/functions/_questdb_browser-client.decompressQwpZstdFrame.html @@ -1,2 +1,2 @@ decompressQwpZstdFrame | QuestDB JavaScript Client - v5.0.0

    Function decompressQwpZstdFrame

    +

    Parameters

    • frame: Uint8Array

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_browser-client.defaultQwpSenderErrorHandler.html b/docs/functions/_questdb_browser-client.defaultQwpSenderErrorHandler.html index 1c6207be..86b42051 100644 --- a/docs/functions/_questdb_browser-client.defaultQwpSenderErrorHandler.html +++ b/docs/functions/_questdb_browser-client.defaultQwpSenderErrorHandler.html @@ -1,3 +1,3 @@ defaultQwpSenderErrorHandler | QuestDB JavaScript Client - v5.0.0

    Function defaultQwpSenderErrorHandler

    +

    Parameters

    Returns void

    diff --git a/docs/functions/_questdb_browser-client.designatedTimestamp.html b/docs/functions/_questdb_browser-client.designatedTimestamp.html index d0b20657..cf6fd48a 100644 --- a/docs/functions/_questdb_browser-client.designatedTimestamp.html +++ b/docs/functions/_questdb_browser-client.designatedTimestamp.html @@ -1,2 +1,2 @@ designatedTimestamp | QuestDB JavaScript Client - v5.0.0

    Function designatedTimestamp

    +

    Type Parameters

    Parameters

    Returns QwpWriterColumn<TimestampInput<Unit>, true>

    diff --git a/docs/functions/_questdb_browser-client.double.html b/docs/functions/_questdb_browser-client.double.html index eccd83a5..fa56acfb 100644 --- a/docs/functions/_questdb_browser-client.double.html +++ b/docs/functions/_questdb_browser-client.double.html @@ -1,2 +1,2 @@ double | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_browser-client.doubleArray.html b/docs/functions/_questdb_browser-client.doubleArray.html index e0305434..3d0458cc 100644 --- a/docs/functions/_questdb_browser-client.doubleArray.html +++ b/docs/functions/_questdb_browser-client.doubleArray.html @@ -1,2 +1,2 @@ doubleArray | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpDoubleArrayInput>

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpAcceptEncoding.html b/docs/functions/_questdb_browser-client.encodeQwpAcceptEncoding.html index f046f529..fa751a7e 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpAcceptEncoding.html +++ b/docs/functions/_questdb_browser-client.encodeQwpAcceptEncoding.html @@ -1,2 +1,2 @@ encodeQwpAcceptEncoding | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpAcceptEncoding

    +

    Parameters

    Returns undefined | string

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpBinds.html b/docs/functions/_questdb_browser-client.encodeQwpBinds.html index b767024b..b7df2eca 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpBinds.html +++ b/docs/functions/_questdb_browser-client.encodeQwpBinds.html @@ -1,2 +1,2 @@ encodeQwpBinds | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    Returns QwpEncodedBinds

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpCancel.html b/docs/functions/_questdb_browser-client.encodeQwpCancel.html index 048e289b..8a5b996b 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpCancel.html +++ b/docs/functions/_questdb_browser-client.encodeQwpCancel.html @@ -1,2 +1,2 @@ encodeQwpCancel | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    • request: number | bigint

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpCredit.html b/docs/functions/_questdb_browser-client.encodeQwpCredit.html index f752e749..daa75040 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpCredit.html +++ b/docs/functions/_questdb_browser-client.encodeQwpCredit.html @@ -1,2 +1,2 @@ encodeQwpCredit | QuestDB JavaScript Client - v5.0.0
    • Encodes the unframed client-to-server CREDIT payload.

      -

      Parameters

      • request: number | bigint
      • additionalBytes: number | bigint

      Returns Uint8Array

    +

    Parameters

    • request: number | bigint
    • additionalBytes: number | bigint

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpDurableAckPollFrame.html b/docs/functions/_questdb_browser-client.encodeQwpDurableAckPollFrame.html index a3b46073..bf8d877b 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpDurableAckPollFrame.html +++ b/docs/functions/_questdb_browser-client.encodeQwpDurableAckPollFrame.html @@ -1,2 +1,2 @@ encodeQwpDurableAckPollFrame | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpDurableAckPollFrame

    +

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpFrame.html b/docs/functions/_questdb_browser-client.encodeQwpFrame.html index 7b2ade30..0679a0e8 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpFrame.html +++ b/docs/functions/_questdb_browser-client.encodeQwpFrame.html @@ -1 +1 @@ -encodeQwpFrame | QuestDB JavaScript Client - v5.0.0
    • Parameters

      • payload: Uint8Array
      • flags: number = 0
      • tableCount: number = 0

      Returns Uint8Array

    +encodeQwpFrame | QuestDB JavaScript Client - v5.0.0
    • Parameters

      • payload: Uint8Array
      • flags: number = 0
      • tableCount: number = 0

      Returns Uint8Array

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpGorilla.html b/docs/functions/_questdb_browser-client.encodeQwpGorilla.html index a83518f5..6b13cfe2 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpGorilla.html +++ b/docs/functions/_questdb_browser-client.encodeQwpGorilla.html @@ -1,2 +1,2 @@ encodeQwpGorilla | QuestDB JavaScript Client - v5.0.0
    • Encodes signed int64 timestamps with the QWP LSB-first Gorilla variant.

      -

      Parameters

      • timestamps: readonly bigint[]

      Returns Uint8Array

    +

    Parameters

    • timestamps: readonly bigint[]

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpIngressCommitFrame.html b/docs/functions/_questdb_browser-client.encodeQwpIngressCommitFrame.html index 51d9b952..a6eb48da 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpIngressCommitFrame.html +++ b/docs/functions/_questdb_browser-client.encodeQwpIngressCommitFrame.html @@ -1 +1 @@ -encodeQwpIngressCommitFrame | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpIngressCommitFrame

    +encodeQwpIngressCommitFrame | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpIngressCommitFrame

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpIngressFrame.html b/docs/functions/_questdb_browser-client.encodeQwpIngressFrame.html index 26e60b11..d0d0d8b5 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpIngressFrame.html +++ b/docs/functions/_questdb_browser-client.encodeQwpIngressFrame.html @@ -1,2 +1,2 @@ encodeQwpIngressFrame | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpIngressFrame

    +

    Parameters

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpIngressSymbolDictionaryFrame.html b/docs/functions/_questdb_browser-client.encodeQwpIngressSymbolDictionaryFrame.html index 3129a28a..7217d57e 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpIngressSymbolDictionaryFrame.html +++ b/docs/functions/_questdb_browser-client.encodeQwpIngressSymbolDictionaryFrame.html @@ -1,2 +1,2 @@ encodeQwpIngressSymbolDictionaryFrame | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpIngressSymbolDictionaryFrame

    • Encodes a table-less committed dictionary catch-up frame.

      -

      Parameters

      • startId: number
      • entries: readonly string[]

      Returns Uint8Array

    +

    Parameters

    • startId: number
    • entries: readonly string[]

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpQueryRequest.html b/docs/functions/_questdb_browser-client.encodeQwpQueryRequest.html index 0382998f..e8876004 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpQueryRequest.html +++ b/docs/functions/_questdb_browser-client.encodeQwpQueryRequest.html @@ -1,2 +1,2 @@ encodeQwpQueryRequest | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpQueryRequest

    +

    Parameters

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_browser-client.encodeQwpVarint.html b/docs/functions/_questdb_browser-client.encodeQwpVarint.html index 9d40a99e..794475fd 100644 --- a/docs/functions/_questdb_browser-client.encodeQwpVarint.html +++ b/docs/functions/_questdb_browser-client.encodeQwpVarint.html @@ -1 +1 @@ -encodeQwpVarint | QuestDB JavaScript Client - v5.0.0
    +encodeQwpVarint | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_browser-client.encodeUtf8.html b/docs/functions/_questdb_browser-client.encodeUtf8.html index 886dae1f..6f744dd5 100644 --- a/docs/functions/_questdb_browser-client.encodeUtf8.html +++ b/docs/functions/_questdb_browser-client.encodeUtf8.html @@ -1 +1 @@ -encodeUtf8 | QuestDB JavaScript Client - v5.0.0
    +encodeUtf8 | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_browser-client.flattenQwpArray.html b/docs/functions/_questdb_browser-client.flattenQwpArray.html index 56f3f9e3..d3aef1e0 100644 --- a/docs/functions/_questdb_browser-client.flattenQwpArray.html +++ b/docs/functions/_questdb_browser-client.flattenQwpArray.html @@ -1 +1 @@ -flattenQwpArray | QuestDB JavaScript Client - v5.0.0
    +flattenQwpArray | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_browser-client.float32.html b/docs/functions/_questdb_browser-client.float32.html index 07551616..4b795c51 100644 --- a/docs/functions/_questdb_browser-client.float32.html +++ b/docs/functions/_questdb_browser-client.float32.html @@ -1,2 +1,2 @@ float32 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_browser-client.float64.html b/docs/functions/_questdb_browser-client.float64.html index e53ddf55..9c2fb90b 100644 --- a/docs/functions/_questdb_browser-client.float64.html +++ b/docs/functions/_questdb_browser-client.float64.html @@ -1,2 +1,2 @@ float64 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_browser-client.geohash.html b/docs/functions/_questdb_browser-client.geohash.html index c42eafc9..d4904682 100644 --- a/docs/functions/_questdb_browser-client.geohash.html +++ b/docs/functions/_questdb_browser-client.geohash.html @@ -1,4 +1,4 @@ geohash | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpGeohashInput>

    diff --git a/docs/functions/_questdb_browser-client.int32.html b/docs/functions/_questdb_browser-client.int32.html index 49983003..21adb4f8 100644 --- a/docs/functions/_questdb_browser-client.int32.html +++ b/docs/functions/_questdb_browser-client.int32.html @@ -1,4 +1,4 @@ int32 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_browser-client.int64.html b/docs/functions/_questdb_browser-client.int64.html index 6e6f1e26..f8c6cf72 100644 --- a/docs/functions/_questdb_browser-client.int64.html +++ b/docs/functions/_questdb_browser-client.int64.html @@ -1,4 +1,4 @@ int64 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<bigint>

    diff --git a/docs/functions/_questdb_browser-client.ipv4.html b/docs/functions/_questdb_browser-client.ipv4.html index 977c1c0e..dc071361 100644 --- a/docs/functions/_questdb_browser-client.ipv4.html +++ b/docs/functions/_questdb_browser-client.ipv4.html @@ -1,2 +1,2 @@ ipv4 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpIpv4Input>

    diff --git a/docs/functions/_questdb_browser-client.isQwpDurableAckWebSocketProtocol.html b/docs/functions/_questdb_browser-client.isQwpDurableAckWebSocketProtocol.html index 47c1b317..fc1eda83 100644 --- a/docs/functions/_questdb_browser-client.isQwpDurableAckWebSocketProtocol.html +++ b/docs/functions/_questdb_browser-client.isQwpDurableAckWebSocketProtocol.html @@ -1,2 +1,2 @@ isQwpDurableAckWebSocketProtocol | QuestDB JavaScript Client - v5.0.0

    Function isQwpDurableAckWebSocketProtocol

    +

    Parameters

    • protocol: undefined | string

    Returns boolean

    diff --git a/docs/functions/_questdb_browser-client.long.html b/docs/functions/_questdb_browser-client.long.html index 4999300e..ab4263ff 100644 --- a/docs/functions/_questdb_browser-client.long.html +++ b/docs/functions/_questdb_browser-client.long.html @@ -1,2 +1,2 @@ long | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<bigint>

    diff --git a/docs/functions/_questdb_browser-client.long256.html b/docs/functions/_questdb_browser-client.long256.html index 0a5dffbd..2ed2e9fd 100644 --- a/docs/functions/_questdb_browser-client.long256.html +++ b/docs/functions/_questdb_browser-client.long256.html @@ -1,2 +1,2 @@ long256 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpLong256Input>

    diff --git a/docs/functions/_questdb_browser-client.longArray.html b/docs/functions/_questdb_browser-client.longArray.html index b7aef360..aff2af8b 100644 --- a/docs/functions/_questdb_browser-client.longArray.html +++ b/docs/functions/_questdb_browser-client.longArray.html @@ -1,4 +1,4 @@ longArray | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpLongArrayInput>

    diff --git a/docs/functions/_questdb_browser-client.qwpDefaultSenderErrorPolicy.html b/docs/functions/_questdb_browser-client.qwpDefaultSenderErrorPolicy.html index 1c93c292..82c9ed29 100644 --- a/docs/functions/_questdb_browser-client.qwpDefaultSenderErrorPolicy.html +++ b/docs/functions/_questdb_browser-client.qwpDefaultSenderErrorPolicy.html @@ -1 +1 @@ -qwpDefaultSenderErrorPolicy | QuestDB JavaScript Client - v5.0.0

    Function qwpDefaultSenderErrorPolicy

    +qwpDefaultSenderErrorPolicy | QuestDB JavaScript Client - v5.0.0

    Function qwpDefaultSenderErrorPolicy

    diff --git a/docs/functions/_questdb_browser-client.qwpGorillaSize.html b/docs/functions/_questdb_browser-client.qwpGorillaSize.html index 414f27df..9bb933c5 100644 --- a/docs/functions/_questdb_browser-client.qwpGorillaSize.html +++ b/docs/functions/_questdb_browser-client.qwpGorillaSize.html @@ -1,3 +1,3 @@ qwpGorillaSize | QuestDB JavaScript Client - v5.0.0
    • Encoded byte count, or -1 when a delta-of-delta leaves int32 range. Throws when a timestamp is outside the signed int64 wire range.

      -

      Parameters

      • timestamps: readonly bigint[]

      Returns number

    +

    Parameters

    • timestamps: readonly bigint[]

    Returns number

    diff --git a/docs/functions/_questdb_browser-client.qwpSenderErrorCategory.html b/docs/functions/_questdb_browser-client.qwpSenderErrorCategory.html index 1b67afe0..2a7c87f6 100644 --- a/docs/functions/_questdb_browser-client.qwpSenderErrorCategory.html +++ b/docs/functions/_questdb_browser-client.qwpSenderErrorCategory.html @@ -1 +1 @@ -qwpSenderErrorCategory | QuestDB JavaScript Client - v5.0.0

    Function qwpSenderErrorCategory

    +qwpSenderErrorCategory | QuestDB JavaScript Client - v5.0.0

    Function qwpSenderErrorCategory

    diff --git a/docs/functions/_questdb_browser-client.qwpVarintSize.html b/docs/functions/_questdb_browser-client.qwpVarintSize.html index 1c32f402..96ba13aa 100644 --- a/docs/functions/_questdb_browser-client.qwpVarintSize.html +++ b/docs/functions/_questdb_browser-client.qwpVarintSize.html @@ -1,2 +1,2 @@ qwpVarintSize | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    • value: number | bigint

    Returns number

    diff --git a/docs/functions/_questdb_browser-client.readQwpVarint.html b/docs/functions/_questdb_browser-client.readQwpVarint.html index 44367c92..0cb8a927 100644 --- a/docs/functions/_questdb_browser-client.readQwpVarint.html +++ b/docs/functions/_questdb_browser-client.readQwpVarint.html @@ -1,2 +1,2 @@ readQwpVarint | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    Returns bigint

    diff --git a/docs/functions/_questdb_browser-client.readQwpVarintNumber.html b/docs/functions/_questdb_browser-client.readQwpVarintNumber.html index d1b8d910..8a249c01 100644 --- a/docs/functions/_questdb_browser-client.readQwpVarintNumber.html +++ b/docs/functions/_questdb_browser-client.readQwpVarintNumber.html @@ -1 +1 @@ -readQwpVarintNumber | QuestDB JavaScript Client - v5.0.0

    Function readQwpVarintNumber

    +readQwpVarintNumber | QuestDB JavaScript Client - v5.0.0

    Function readQwpVarintNumber

    diff --git a/docs/functions/_questdb_browser-client.short.html b/docs/functions/_questdb_browser-client.short.html index 6a9a2167..4cf39ef9 100644 --- a/docs/functions/_questdb_browser-client.short.html +++ b/docs/functions/_questdb_browser-client.short.html @@ -1,2 +1,2 @@ short | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_browser-client.symbol.html b/docs/functions/_questdb_browser-client.symbol.html index f73c422b..1dca5d09 100644 --- a/docs/functions/_questdb_browser-client.symbol.html +++ b/docs/functions/_questdb_browser-client.symbol.html @@ -1,2 +1,2 @@ symbol | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<string>

    diff --git a/docs/functions/_questdb_browser-client.timestamp.html b/docs/functions/_questdb_browser-client.timestamp.html index 8e6f1996..c6d1883a 100644 --- a/docs/functions/_questdb_browser-client.timestamp.html +++ b/docs/functions/_questdb_browser-client.timestamp.html @@ -1,2 +1,2 @@ timestamp | QuestDB JavaScript Client - v5.0.0
    +

    Type Parameters

    Parameters

    Returns QwpWriterColumn<TimestampInput<Unit>>

    diff --git a/docs/functions/_questdb_browser-client.utf8Length.html b/docs/functions/_questdb_browser-client.utf8Length.html index fab437c9..f83628c1 100644 --- a/docs/functions/_questdb_browser-client.utf8Length.html +++ b/docs/functions/_questdb_browser-client.utf8Length.html @@ -1 +1 @@ -utf8Length | QuestDB JavaScript Client - v5.0.0
    +utf8Length | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_browser-client.uuid.html b/docs/functions/_questdb_browser-client.uuid.html index 22fddc16..8fe6c6a6 100644 --- a/docs/functions/_questdb_browser-client.uuid.html +++ b/docs/functions/_questdb_browser-client.uuid.html @@ -1,2 +1,2 @@ uuid | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpUuidInput>

    diff --git a/docs/functions/_questdb_browser-client.varchar.html b/docs/functions/_questdb_browser-client.varchar.html index 7eb82acd..8d100d09 100644 --- a/docs/functions/_questdb_browser-client.varchar.html +++ b/docs/functions/_questdb_browser-client.varchar.html @@ -1,2 +1,2 @@ varchar | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<string>

    diff --git a/docs/functions/_questdb_browser-client.writeQwpFrameHeader.html b/docs/functions/_questdb_browser-client.writeQwpFrameHeader.html index 57f3301c..88d996b3 100644 --- a/docs/functions/_questdb_browser-client.writeQwpFrameHeader.html +++ b/docs/functions/_questdb_browser-client.writeQwpFrameHeader.html @@ -1 +1 @@ -writeQwpFrameHeader | QuestDB JavaScript Client - v5.0.0

    Function writeQwpFrameHeader

    +writeQwpFrameHeader | QuestDB JavaScript Client - v5.0.0

    Function writeQwpFrameHeader

    diff --git a/docs/functions/_questdb_browser-client.writeQwpVarint.html b/docs/functions/_questdb_browser-client.writeQwpVarint.html index 9776f9ae..98a46b13 100644 --- a/docs/functions/_questdb_browser-client.writeQwpVarint.html +++ b/docs/functions/_questdb_browser-client.writeQwpVarint.html @@ -1,2 +1,2 @@ writeQwpVarint | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    Returns void

    diff --git a/docs/functions/_questdb_nodejs-client.addQwpDurableAckWebSocketProtocol.html b/docs/functions/_questdb_nodejs-client.addQwpDurableAckWebSocketProtocol.html index c4c904cb..70f675b3 100644 --- a/docs/functions/_questdb_nodejs-client.addQwpDurableAckWebSocketProtocol.html +++ b/docs/functions/_questdb_nodejs-client.addQwpDurableAckWebSocketProtocol.html @@ -1,2 +1,2 @@ addQwpDurableAckWebSocketProtocol | QuestDB JavaScript Client - v5.0.0

    Function addQwpDurableAckWebSocketProtocol

    • Adds the durable-ACK capability token without mutating user options.

      -

      Parameters

      • protocols: string | readonly string[]

      Returns string | string[]

    +

    Parameters

    • protocols: string | readonly string[]

    Returns string | string[]

    diff --git a/docs/functions/_questdb_nodejs-client.bigintToTwosComplementBytes.html b/docs/functions/_questdb_nodejs-client.bigintToTwosComplementBytes.html index 7e2da2f8..21d077ab 100644 --- a/docs/functions/_questdb_nodejs-client.bigintToTwosComplementBytes.html +++ b/docs/functions/_questdb_nodejs-client.bigintToTwosComplementBytes.html @@ -2,4 +2,4 @@ Produces the minimal-width representation that preserves the sign.

    Parameters

    • value: bigint

      The value to serialise

    Returns number[]

    Byte array in big-endian order

    -
    +
    diff --git a/docs/functions/_questdb_nodejs-client.binary.html b/docs/functions/_questdb_nodejs-client.binary.html index b287c302..aedab557 100644 --- a/docs/functions/_questdb_nodejs-client.binary.html +++ b/docs/functions/_questdb_nodejs-client.binary.html @@ -1,2 +1,2 @@ binary | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<Uint8Array<ArrayBufferLike>>

    diff --git a/docs/functions/_questdb_nodejs-client.bool.html b/docs/functions/_questdb_nodejs-client.bool.html index 021eb7ee..dfe183dd 100644 --- a/docs/functions/_questdb_nodejs-client.bool.html +++ b/docs/functions/_questdb_nodejs-client.bool.html @@ -1,2 +1,2 @@ bool | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<boolean>

    diff --git a/docs/functions/_questdb_nodejs-client.byte.html b/docs/functions/_questdb_nodejs-client.byte.html index 2a742ae4..530904a0 100644 --- a/docs/functions/_questdb_nodejs-client.byte.html +++ b/docs/functions/_questdb_nodejs-client.byte.html @@ -1,2 +1,2 @@ byte | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_nodejs-client.char.html b/docs/functions/_questdb_nodejs-client.char.html index b05c2138..9cab966e 100644 --- a/docs/functions/_questdb_nodejs-client.char.html +++ b/docs/functions/_questdb_nodejs-client.char.html @@ -1,2 +1,2 @@ char | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<string>

    diff --git a/docs/functions/_questdb_nodejs-client.concatBytes.html b/docs/functions/_questdb_nodejs-client.concatBytes.html index 6e560b74..8012526e 100644 --- a/docs/functions/_questdb_nodejs-client.concatBytes.html +++ b/docs/functions/_questdb_nodejs-client.concatBytes.html @@ -1 +1 @@ -concatBytes | QuestDB JavaScript Client - v5.0.0
    +concatBytes | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_nodejs-client.connectQwpNodeClient.html b/docs/functions/_questdb_nodejs-client.connectQwpNodeClient.html index f2ede3b8..a41cf2db 100644 --- a/docs/functions/_questdb_nodejs-client.connectQwpNodeClient.html +++ b/docs/functions/_questdb_nodejs-client.connectQwpNodeClient.html @@ -1,3 +1,3 @@ connectQwpNodeClient | QuestDB JavaScript Client - v5.0.0

    Function connectQwpNodeClient

    +

    Parameters

    Returns Promise<QwpClient>

  • Creates and prewarms a combined Node QWP ingress/egress client.

    +

    Parameters

    Returns Promise<QwpClient>

  • diff --git a/docs/functions/_questdb_nodejs-client.connectQwpNodeEgress.html b/docs/functions/_questdb_nodejs-client.connectQwpNodeEgress.html index 1e45c526..e289ac87 100644 --- a/docs/functions/_questdb_nodejs-client.connectQwpNodeEgress.html +++ b/docs/functions/_questdb_nodejs-client.connectQwpNodeEgress.html @@ -1,3 +1,3 @@ connectQwpNodeEgress | QuestDB JavaScript Client - v5.0.0

    Function connectQwpNodeEgress

    +

    Returns Promise<QwpEgressSession>

    diff --git a/docs/functions/_questdb_nodejs-client.connectQwpNodeIngress.html b/docs/functions/_questdb_nodejs-client.connectQwpNodeIngress.html index c599a322..f87e818d 100644 --- a/docs/functions/_questdb_nodejs-client.connectQwpNodeIngress.html +++ b/docs/functions/_questdb_nodejs-client.connectQwpNodeIngress.html @@ -1,3 +1,3 @@ connectQwpNodeIngress | QuestDB JavaScript Client - v5.0.0

    Function connectQwpNodeIngress

    +

    Returns Promise<QwpIngressSession>

    diff --git a/docs/functions/_questdb_nodejs-client.connectQwpNodeSender.html b/docs/functions/_questdb_nodejs-client.connectQwpNodeSender.html index 2d23412d..3b247273 100644 --- a/docs/functions/_questdb_nodejs-client.connectQwpNodeSender.html +++ b/docs/functions/_questdb_nodejs-client.connectQwpNodeSender.html @@ -1,2 +1,2 @@ connectQwpNodeSender | QuestDB JavaScript Client - v5.0.0

    Function connectQwpNodeSender

    +

    Parameters

    Returns Promise<QwpSender>

    diff --git a/docs/functions/_questdb_nodejs-client.connectQwpNodeUdp.html b/docs/functions/_questdb_nodejs-client.connectQwpNodeUdp.html index 47241673..d73da60d 100644 --- a/docs/functions/_questdb_nodejs-client.connectQwpNodeUdp.html +++ b/docs/functions/_questdb_nodejs-client.connectQwpNodeUdp.html @@ -1,2 +1,2 @@ connectQwpNodeUdp | QuestDB JavaScript Client - v5.0.0

    Function connectQwpNodeUdp

    +

    Parameters

    Returns Promise<QwpNodeUdpSession>

    diff --git a/docs/functions/_questdb_nodejs-client.connectQwpNodeUdpSender.html b/docs/functions/_questdb_nodejs-client.connectQwpNodeUdpSender.html index 1484e175..2857fa6e 100644 --- a/docs/functions/_questdb_nodejs-client.connectQwpNodeUdpSender.html +++ b/docs/functions/_questdb_nodejs-client.connectQwpNodeUdpSender.html @@ -1,2 +1,2 @@ connectQwpNodeUdpSender | QuestDB JavaScript Client - v5.0.0

    Function connectQwpNodeUdpSender

    +

    Parameters

    Returns Promise<QwpSender>

    diff --git a/docs/functions/_questdb_nodejs-client.connectQwpNodeWebSocket.html b/docs/functions/_questdb_nodejs-client.connectQwpNodeWebSocket.html index a2eb5cae..e6a467fe 100644 --- a/docs/functions/_questdb_nodejs-client.connectQwpNodeWebSocket.html +++ b/docs/functions/_questdb_nodejs-client.connectQwpNodeWebSocket.html @@ -1,2 +1,2 @@ connectQwpNodeWebSocket | QuestDB JavaScript Client - v5.0.0

    Function connectQwpNodeWebSocket

    +

    Parameters

    Returns Promise<QwpBinaryConnection>

    diff --git a/docs/functions/_questdb_nodejs-client.createBuffer.html b/docs/functions/_questdb_nodejs-client.createBuffer.html index c6626978..e281b19a 100644 --- a/docs/functions/_questdb_nodejs-client.createBuffer.html +++ b/docs/functions/_questdb_nodejs-client.createBuffer.html @@ -3,4 +3,4 @@ See SenderOptions documentation for detailed description of configuration options.

    Returns SenderBuffer

    A SenderBuffer instance appropriate for the specified protocol version

    Error if protocol version is not specified or is unsupported

    -
    +
    diff --git a/docs/functions/_questdb_nodejs-client.createQwpDataLossSenderError.html b/docs/functions/_questdb_nodejs-client.createQwpDataLossSenderError.html index a8cc6db0..e46233fb 100644 --- a/docs/functions/_questdb_nodejs-client.createQwpDataLossSenderError.html +++ b/docs/functions/_questdb_nodejs-client.createQwpDataLossSenderError.html @@ -1,2 +1,2 @@ createQwpDataLossSenderError | QuestDB JavaScript Client - v5.0.0

    Function createQwpDataLossSenderError

    +

    Returns QwpSenderError

    diff --git a/docs/functions/_questdb_nodejs-client.createQwpNodeClient.html b/docs/functions/_questdb_nodejs-client.createQwpNodeClient.html index 7402fbfd..2733369e 100644 --- a/docs/functions/_questdb_nodejs-client.createQwpNodeClient.html +++ b/docs/functions/_questdb_nodejs-client.createQwpNodeClient.html @@ -1,3 +1,3 @@ createQwpNodeClient | QuestDB JavaScript Client - v5.0.0

    Function createQwpNodeClient

    +

    Parameters

    Returns QwpClient

  • Creates a lazy Node QWP client with bounded sender and query pools.

    +

    Parameters

    Returns QwpClient

  • diff --git a/docs/functions/_questdb_nodejs-client.createQwpNodeConnectionFactory.html b/docs/functions/_questdb_nodejs-client.createQwpNodeConnectionFactory.html index 9d1f9caa..1fa1b624 100644 --- a/docs/functions/_questdb_nodejs-client.createQwpNodeConnectionFactory.html +++ b/docs/functions/_questdb_nodejs-client.createQwpNodeConnectionFactory.html @@ -1,2 +1,2 @@ createQwpNodeConnectionFactory | QuestDB JavaScript Client - v5.0.0

    Function createQwpNodeConnectionFactory

    +

    Parameters

    Returns QwpConnectionFactory

    diff --git a/docs/functions/_questdb_nodejs-client.createQwpNodeSender.html b/docs/functions/_questdb_nodejs-client.createQwpNodeSender.html index f665eb1b..cdeb0197 100644 --- a/docs/functions/_questdb_nodejs-client.createQwpNodeSender.html +++ b/docs/functions/_questdb_nodejs-client.createQwpNodeSender.html @@ -1,3 +1,3 @@ createQwpNodeSender | QuestDB JavaScript Client - v5.0.0

    Function createQwpNodeSender

    +

    Parameters

    Returns QwpSender

    diff --git a/docs/functions/_questdb_nodejs-client.createQwpNodeUdpSender.html b/docs/functions/_questdb_nodejs-client.createQwpNodeUdpSender.html index 74cee2e9..a360b2f1 100644 --- a/docs/functions/_questdb_nodejs-client.createQwpNodeUdpSender.html +++ b/docs/functions/_questdb_nodejs-client.createQwpNodeUdpSender.html @@ -1,4 +1,4 @@ createQwpNodeUdpSender | QuestDB JavaScript Client - v5.0.0

    Function createQwpNodeUdpSender

    +

    Parameters

    Returns QwpSender

    diff --git a/docs/functions/_questdb_nodejs-client.createQwpProtocolViolationSenderError.html b/docs/functions/_questdb_nodejs-client.createQwpProtocolViolationSenderError.html index 0bde3f92..d9507a49 100644 --- a/docs/functions/_questdb_nodejs-client.createQwpProtocolViolationSenderError.html +++ b/docs/functions/_questdb_nodejs-client.createQwpProtocolViolationSenderError.html @@ -1 +1 @@ -createQwpProtocolViolationSenderError | QuestDB JavaScript Client - v5.0.0

    Function createQwpProtocolViolationSenderError

    +createQwpProtocolViolationSenderError | QuestDB JavaScript Client - v5.0.0

    Function createQwpProtocolViolationSenderError

    diff --git a/docs/functions/_questdb_nodejs-client.createQwpSenderError.html b/docs/functions/_questdb_nodejs-client.createQwpSenderError.html index 875f5a72..f61891d0 100644 --- a/docs/functions/_questdb_nodejs-client.createQwpSenderError.html +++ b/docs/functions/_questdb_nodejs-client.createQwpSenderError.html @@ -1 +1 @@ -createQwpSenderError | QuestDB JavaScript Client - v5.0.0

    Function createQwpSenderError

    +createQwpSenderError | QuestDB JavaScript Client - v5.0.0

    Function createQwpSenderError

    diff --git a/docs/functions/_questdb_nodejs-client.createTransport.html b/docs/functions/_questdb_nodejs-client.createTransport.html index 20d9a11b..0cc04faf 100644 --- a/docs/functions/_questdb_nodejs-client.createTransport.html +++ b/docs/functions/_questdb_nodejs-client.createTransport.html @@ -2,4 +2,4 @@

    Parameters

    • options: SenderOptions

      Sender configuration options including protocol and connection details

    Returns SenderTransport

    Transport instance appropriate for the specified protocol

    Error if protocol or host options are missing or invalid

    -
    +
    diff --git a/docs/functions/_questdb_nodejs-client.date.html b/docs/functions/_questdb_nodejs-client.date.html index 52bab5c0..ba9ceb3f 100644 --- a/docs/functions/_questdb_nodejs-client.date.html +++ b/docs/functions/_questdb_nodejs-client.date.html @@ -1,4 +1,4 @@ date | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number | bigint>

    diff --git a/docs/functions/_questdb_nodejs-client.decimal128.html b/docs/functions/_questdb_nodejs-client.decimal128.html index d0292c6b..99c846f8 100644 --- a/docs/functions/_questdb_nodejs-client.decimal128.html +++ b/docs/functions/_questdb_nodejs-client.decimal128.html @@ -1,2 +1,2 @@ decimal128 | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    • scale: number

    Returns QwpWriterColumn<QwpDecimalInput>

    diff --git a/docs/functions/_questdb_nodejs-client.decimal256.html b/docs/functions/_questdb_nodejs-client.decimal256.html index b68589f1..a4b2a5cf 100644 --- a/docs/functions/_questdb_nodejs-client.decimal256.html +++ b/docs/functions/_questdb_nodejs-client.decimal256.html @@ -1,2 +1,2 @@ decimal256 | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    • scale: number

    Returns QwpWriterColumn<QwpDecimalInput>

    diff --git a/docs/functions/_questdb_nodejs-client.decimal64.html b/docs/functions/_questdb_nodejs-client.decimal64.html index 2c520cfa..3a1651fa 100644 --- a/docs/functions/_questdb_nodejs-client.decimal64.html +++ b/docs/functions/_questdb_nodejs-client.decimal64.html @@ -1,2 +1,2 @@ decimal64 | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    • scale: number

    Returns QwpWriterColumn<QwpDecimalInput>

    diff --git a/docs/functions/_questdb_nodejs-client.decodeQwpContentEncoding.html b/docs/functions/_questdb_nodejs-client.decodeQwpContentEncoding.html index dc9241da..70f56954 100644 --- a/docs/functions/_questdb_nodejs-client.decodeQwpContentEncoding.html +++ b/docs/functions/_questdb_nodejs-client.decodeQwpContentEncoding.html @@ -1,4 +1,4 @@ decodeQwpContentEncoding | QuestDB JavaScript Client - v5.0.0

    Function decodeQwpContentEncoding

    +

    Parameters

    • value: string

    Returns QwpNegotiatedEgressCompression

    diff --git a/docs/functions/_questdb_nodejs-client.decodeQwpEgressMessage.html b/docs/functions/_questdb_nodejs-client.decodeQwpEgressMessage.html index 133c6c4c..d5c5f929 100644 --- a/docs/functions/_questdb_nodejs-client.decodeQwpEgressMessage.html +++ b/docs/functions/_questdb_nodejs-client.decodeQwpEgressMessage.html @@ -1,2 +1,2 @@ decodeQwpEgressMessage | QuestDB JavaScript Client - v5.0.0

    Function decodeQwpEgressMessage

    +

    Parameters

    • bytes: Uint8Array

    Returns QwpEgressMessage

    diff --git a/docs/functions/_questdb_nodejs-client.decodeQwpFrame.html b/docs/functions/_questdb_nodejs-client.decodeQwpFrame.html index b773efd7..6e50f852 100644 --- a/docs/functions/_questdb_nodejs-client.decodeQwpFrame.html +++ b/docs/functions/_questdb_nodejs-client.decodeQwpFrame.html @@ -1 +1 @@ -decodeQwpFrame | QuestDB JavaScript Client - v5.0.0
    +decodeQwpFrame | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_nodejs-client.decodeQwpIngressResponse.html b/docs/functions/_questdb_nodejs-client.decodeQwpIngressResponse.html index b8dd3aa4..cbdf56fe 100644 --- a/docs/functions/_questdb_nodejs-client.decodeQwpIngressResponse.html +++ b/docs/functions/_questdb_nodejs-client.decodeQwpIngressResponse.html @@ -1,2 +1,2 @@ decodeQwpIngressResponse | QuestDB JavaScript Client - v5.0.0

    Function decodeQwpIngressResponse

    +

    Parameters

    • payload: Uint8Array

    Returns QwpIngressResponse

    diff --git a/docs/functions/_questdb_nodejs-client.decodeQwpIngressServerInfo.html b/docs/functions/_questdb_nodejs-client.decodeQwpIngressServerInfo.html index 870cce4d..9d2c07a4 100644 --- a/docs/functions/_questdb_nodejs-client.decodeQwpIngressServerInfo.html +++ b/docs/functions/_questdb_nodejs-client.decodeQwpIngressServerInfo.html @@ -1,2 +1,2 @@ decodeQwpIngressServerInfo | QuestDB JavaScript Client - v5.0.0

    Function decodeQwpIngressServerInfo

    +

    Parameters

    • payload: Uint8Array

    Returns QwpIngressServerInfo

    diff --git a/docs/functions/_questdb_nodejs-client.decodeQwpIngressSymbolDictionaryDelta.html b/docs/functions/_questdb_nodejs-client.decodeQwpIngressSymbolDictionaryDelta.html index 037968ba..67418d42 100644 --- a/docs/functions/_questdb_nodejs-client.decodeQwpIngressSymbolDictionaryDelta.html +++ b/docs/functions/_questdb_nodejs-client.decodeQwpIngressSymbolDictionaryDelta.html @@ -1,2 +1,2 @@ decodeQwpIngressSymbolDictionaryDelta | QuestDB JavaScript Client - v5.0.0

    Function decodeQwpIngressSymbolDictionaryDelta

    +

    Parameters

    • bytes: Uint8Array

    Returns QwpIngressSymbolDictionaryDelta

    diff --git a/docs/functions/_questdb_nodejs-client.decodeQwpVarint.html b/docs/functions/_questdb_nodejs-client.decodeQwpVarint.html index 024c6157..39dabe91 100644 --- a/docs/functions/_questdb_nodejs-client.decodeQwpVarint.html +++ b/docs/functions/_questdb_nodejs-client.decodeQwpVarint.html @@ -1 +1 @@ -decodeQwpVarint | QuestDB JavaScript Client - v5.0.0
    • Parameters

      • bytes: Uint8Array
      • offset: number = 0

      Returns { offset: number; value: bigint }

    +decodeQwpVarint | QuestDB JavaScript Client - v5.0.0
    • Parameters

      • bytes: Uint8Array
      • offset: number = 0

      Returns { offset: number; value: bigint }

    diff --git a/docs/functions/_questdb_nodejs-client.decodeUtf8.html b/docs/functions/_questdb_nodejs-client.decodeUtf8.html index 16e1753f..c3c5eb42 100644 --- a/docs/functions/_questdb_nodejs-client.decodeUtf8.html +++ b/docs/functions/_questdb_nodejs-client.decodeUtf8.html @@ -1 +1 @@ -decodeUtf8 | QuestDB JavaScript Client - v5.0.0
    +decodeUtf8 | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_nodejs-client.decompressQwpZstdFrame.html b/docs/functions/_questdb_nodejs-client.decompressQwpZstdFrame.html index 491ff94e..a1f60b80 100644 --- a/docs/functions/_questdb_nodejs-client.decompressQwpZstdFrame.html +++ b/docs/functions/_questdb_nodejs-client.decompressQwpZstdFrame.html @@ -1,2 +1,2 @@ decompressQwpZstdFrame | QuestDB JavaScript Client - v5.0.0

    Function decompressQwpZstdFrame

    +

    Parameters

    • frame: Uint8Array

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_nodejs-client.defaultQwpSenderErrorHandler.html b/docs/functions/_questdb_nodejs-client.defaultQwpSenderErrorHandler.html index 3d703c46..420268b8 100644 --- a/docs/functions/_questdb_nodejs-client.defaultQwpSenderErrorHandler.html +++ b/docs/functions/_questdb_nodejs-client.defaultQwpSenderErrorHandler.html @@ -1,3 +1,3 @@ defaultQwpSenderErrorHandler | QuestDB JavaScript Client - v5.0.0

    Function defaultQwpSenderErrorHandler

    +

    Parameters

    Returns void

    diff --git a/docs/functions/_questdb_nodejs-client.designatedTimestamp.html b/docs/functions/_questdb_nodejs-client.designatedTimestamp.html index 9a82b96e..c5388c3a 100644 --- a/docs/functions/_questdb_nodejs-client.designatedTimestamp.html +++ b/docs/functions/_questdb_nodejs-client.designatedTimestamp.html @@ -1,2 +1,2 @@ designatedTimestamp | QuestDB JavaScript Client - v5.0.0

    Function designatedTimestamp

    +

    Type Parameters

    Parameters

    Returns QwpWriterColumn<TimestampInput<Unit>, true>

    diff --git a/docs/functions/_questdb_nodejs-client.double.html b/docs/functions/_questdb_nodejs-client.double.html index 147848b2..bdabbc98 100644 --- a/docs/functions/_questdb_nodejs-client.double.html +++ b/docs/functions/_questdb_nodejs-client.double.html @@ -1,2 +1,2 @@ double | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_nodejs-client.doubleArray.html b/docs/functions/_questdb_nodejs-client.doubleArray.html index e46576ed..5da4324a 100644 --- a/docs/functions/_questdb_nodejs-client.doubleArray.html +++ b/docs/functions/_questdb_nodejs-client.doubleArray.html @@ -1,2 +1,2 @@ doubleArray | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpDoubleArrayInput>

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpAcceptEncoding.html b/docs/functions/_questdb_nodejs-client.encodeQwpAcceptEncoding.html index 6bc3de23..d098c54f 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpAcceptEncoding.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpAcceptEncoding.html @@ -1,2 +1,2 @@ encodeQwpAcceptEncoding | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpAcceptEncoding

    +

    Parameters

    Returns string

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpBinds.html b/docs/functions/_questdb_nodejs-client.encodeQwpBinds.html index 6a9f2d13..ab44cada 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpBinds.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpBinds.html @@ -1,2 +1,2 @@ encodeQwpBinds | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    Returns QwpEncodedBinds

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpCancel.html b/docs/functions/_questdb_nodejs-client.encodeQwpCancel.html index c7ce7035..7a028d29 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpCancel.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpCancel.html @@ -1,2 +1,2 @@ encodeQwpCancel | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    • request: number | bigint

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpCredit.html b/docs/functions/_questdb_nodejs-client.encodeQwpCredit.html index 8bafdcff..3c1f3dbb 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpCredit.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpCredit.html @@ -1,2 +1,2 @@ encodeQwpCredit | QuestDB JavaScript Client - v5.0.0
    • Encodes the unframed client-to-server CREDIT payload.

      -

      Parameters

      • request: number | bigint
      • additionalBytes: number | bigint

      Returns Uint8Array

    +

    Parameters

    • request: number | bigint
    • additionalBytes: number | bigint

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpDurableAckPollFrame.html b/docs/functions/_questdb_nodejs-client.encodeQwpDurableAckPollFrame.html index 429c5826..240a2de7 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpDurableAckPollFrame.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpDurableAckPollFrame.html @@ -1,2 +1,2 @@ encodeQwpDurableAckPollFrame | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpDurableAckPollFrame

    +

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpFrame.html b/docs/functions/_questdb_nodejs-client.encodeQwpFrame.html index 5b9e4891..3b0ba05c 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpFrame.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpFrame.html @@ -1 +1 @@ -encodeQwpFrame | QuestDB JavaScript Client - v5.0.0
    • Parameters

      • payload: Uint8Array
      • flags: number = 0
      • tableCount: number = 0

      Returns Uint8Array

    +encodeQwpFrame | QuestDB JavaScript Client - v5.0.0
    • Parameters

      • payload: Uint8Array
      • flags: number = 0
      • tableCount: number = 0

      Returns Uint8Array

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpGorilla.html b/docs/functions/_questdb_nodejs-client.encodeQwpGorilla.html index 2e583f5d..94720e80 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpGorilla.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpGorilla.html @@ -1,2 +1,2 @@ encodeQwpGorilla | QuestDB JavaScript Client - v5.0.0
    • Encodes signed int64 timestamps with the QWP LSB-first Gorilla variant.

      -

      Parameters

      • timestamps: readonly bigint[]

      Returns Uint8Array

    +

    Parameters

    • timestamps: readonly bigint[]

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpIngressCommitFrame.html b/docs/functions/_questdb_nodejs-client.encodeQwpIngressCommitFrame.html index 4749b571..3ed75134 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpIngressCommitFrame.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpIngressCommitFrame.html @@ -1 +1 @@ -encodeQwpIngressCommitFrame | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpIngressCommitFrame

    +encodeQwpIngressCommitFrame | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpIngressCommitFrame

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpIngressFrame.html b/docs/functions/_questdb_nodejs-client.encodeQwpIngressFrame.html index 5dd9947f..0d6b8c02 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpIngressFrame.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpIngressFrame.html @@ -1,2 +1,2 @@ encodeQwpIngressFrame | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpIngressFrame

    +

    Parameters

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpIngressSymbolDictionaryFrame.html b/docs/functions/_questdb_nodejs-client.encodeQwpIngressSymbolDictionaryFrame.html index 177cfb70..5e118c3b 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpIngressSymbolDictionaryFrame.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpIngressSymbolDictionaryFrame.html @@ -1,2 +1,2 @@ encodeQwpIngressSymbolDictionaryFrame | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpIngressSymbolDictionaryFrame

    • Encodes a table-less committed dictionary catch-up frame.

      -

      Parameters

      • startId: number
      • entries: readonly string[]

      Returns Uint8Array

    +

    Parameters

    • startId: number
    • entries: readonly string[]

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpQueryRequest.html b/docs/functions/_questdb_nodejs-client.encodeQwpQueryRequest.html index cf80aaca..f2ab8528 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpQueryRequest.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpQueryRequest.html @@ -1,2 +1,2 @@ encodeQwpQueryRequest | QuestDB JavaScript Client - v5.0.0

    Function encodeQwpQueryRequest

    +

    Parameters

    Returns Uint8Array

    diff --git a/docs/functions/_questdb_nodejs-client.encodeQwpVarint.html b/docs/functions/_questdb_nodejs-client.encodeQwpVarint.html index c0841fcc..76d1cb0e 100644 --- a/docs/functions/_questdb_nodejs-client.encodeQwpVarint.html +++ b/docs/functions/_questdb_nodejs-client.encodeQwpVarint.html @@ -1 +1 @@ -encodeQwpVarint | QuestDB JavaScript Client - v5.0.0
    +encodeQwpVarint | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_nodejs-client.encodeUtf8.html b/docs/functions/_questdb_nodejs-client.encodeUtf8.html index 24be614f..f609603c 100644 --- a/docs/functions/_questdb_nodejs-client.encodeUtf8.html +++ b/docs/functions/_questdb_nodejs-client.encodeUtf8.html @@ -1 +1 @@ -encodeUtf8 | QuestDB JavaScript Client - v5.0.0
    +encodeUtf8 | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_nodejs-client.flattenQwpArray.html b/docs/functions/_questdb_nodejs-client.flattenQwpArray.html index f7a4c987..6a017200 100644 --- a/docs/functions/_questdb_nodejs-client.flattenQwpArray.html +++ b/docs/functions/_questdb_nodejs-client.flattenQwpArray.html @@ -1 +1 @@ -flattenQwpArray | QuestDB JavaScript Client - v5.0.0
    +flattenQwpArray | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_nodejs-client.float32.html b/docs/functions/_questdb_nodejs-client.float32.html index 8507fc50..ec1d08ed 100644 --- a/docs/functions/_questdb_nodejs-client.float32.html +++ b/docs/functions/_questdb_nodejs-client.float32.html @@ -1,2 +1,2 @@ float32 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_nodejs-client.float64.html b/docs/functions/_questdb_nodejs-client.float64.html index 378f2d6b..4774863f 100644 --- a/docs/functions/_questdb_nodejs-client.float64.html +++ b/docs/functions/_questdb_nodejs-client.float64.html @@ -1,2 +1,2 @@ float64 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_nodejs-client.geohash.html b/docs/functions/_questdb_nodejs-client.geohash.html index 2282440f..fd81ddf8 100644 --- a/docs/functions/_questdb_nodejs-client.geohash.html +++ b/docs/functions/_questdb_nodejs-client.geohash.html @@ -1,4 +1,4 @@ geohash | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpGeohashInput>

    diff --git a/docs/functions/_questdb_nodejs-client.int32.html b/docs/functions/_questdb_nodejs-client.int32.html index facdb5f3..569ad727 100644 --- a/docs/functions/_questdb_nodejs-client.int32.html +++ b/docs/functions/_questdb_nodejs-client.int32.html @@ -1,4 +1,4 @@ int32 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_nodejs-client.int64.html b/docs/functions/_questdb_nodejs-client.int64.html index c7dde6c9..2678208b 100644 --- a/docs/functions/_questdb_nodejs-client.int64.html +++ b/docs/functions/_questdb_nodejs-client.int64.html @@ -1,4 +1,4 @@ int64 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<bigint>

    diff --git a/docs/functions/_questdb_nodejs-client.ipv4.html b/docs/functions/_questdb_nodejs-client.ipv4.html index 2b060422..e09660e6 100644 --- a/docs/functions/_questdb_nodejs-client.ipv4.html +++ b/docs/functions/_questdb_nodejs-client.ipv4.html @@ -1,2 +1,2 @@ ipv4 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpIpv4Input>

    diff --git a/docs/functions/_questdb_nodejs-client.isQwpDurableAckWebSocketProtocol.html b/docs/functions/_questdb_nodejs-client.isQwpDurableAckWebSocketProtocol.html index b5e79a9a..2f7a72ff 100644 --- a/docs/functions/_questdb_nodejs-client.isQwpDurableAckWebSocketProtocol.html +++ b/docs/functions/_questdb_nodejs-client.isQwpDurableAckWebSocketProtocol.html @@ -1,2 +1,2 @@ isQwpDurableAckWebSocketProtocol | QuestDB JavaScript Client - v5.0.0

    Function isQwpDurableAckWebSocketProtocol

    +

    Parameters

    • protocol: string

    Returns boolean

    diff --git a/docs/functions/_questdb_nodejs-client.long.html b/docs/functions/_questdb_nodejs-client.long.html index dc2fba2c..74ed31b8 100644 --- a/docs/functions/_questdb_nodejs-client.long.html +++ b/docs/functions/_questdb_nodejs-client.long.html @@ -1,2 +1,2 @@ long | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<bigint>

    diff --git a/docs/functions/_questdb_nodejs-client.long256.html b/docs/functions/_questdb_nodejs-client.long256.html index ece7f33f..3f54b01a 100644 --- a/docs/functions/_questdb_nodejs-client.long256.html +++ b/docs/functions/_questdb_nodejs-client.long256.html @@ -1,2 +1,2 @@ long256 | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpLong256Input>

    diff --git a/docs/functions/_questdb_nodejs-client.longArray.html b/docs/functions/_questdb_nodejs-client.longArray.html index 4e58cd64..d25835ee 100644 --- a/docs/functions/_questdb_nodejs-client.longArray.html +++ b/docs/functions/_questdb_nodejs-client.longArray.html @@ -1,4 +1,4 @@ longArray | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpLongArrayInput>

    diff --git a/docs/functions/_questdb_nodejs-client.parseQwpNodeClientConfig.html b/docs/functions/_questdb_nodejs-client.parseQwpNodeClientConfig.html index 0b456729..041548c9 100644 --- a/docs/functions/_questdb_nodejs-client.parseQwpNodeClientConfig.html +++ b/docs/functions/_questdb_nodejs-client.parseQwpNodeClientConfig.html @@ -1,2 +1,2 @@ parseQwpNodeClientConfig | QuestDB JavaScript Client - v5.0.0

    Function parseQwpNodeClientConfig

    +

    Parameters

    Returns QwpNodeClientOptions

    diff --git a/docs/functions/_questdb_nodejs-client.qwpDefaultSenderErrorPolicy.html b/docs/functions/_questdb_nodejs-client.qwpDefaultSenderErrorPolicy.html index 1e2ce05b..9e36c5d5 100644 --- a/docs/functions/_questdb_nodejs-client.qwpDefaultSenderErrorPolicy.html +++ b/docs/functions/_questdb_nodejs-client.qwpDefaultSenderErrorPolicy.html @@ -1 +1 @@ -qwpDefaultSenderErrorPolicy | QuestDB JavaScript Client - v5.0.0

    Function qwpDefaultSenderErrorPolicy

    +qwpDefaultSenderErrorPolicy | QuestDB JavaScript Client - v5.0.0

    Function qwpDefaultSenderErrorPolicy

    diff --git a/docs/functions/_questdb_nodejs-client.qwpGorillaSize.html b/docs/functions/_questdb_nodejs-client.qwpGorillaSize.html index d0401e6a..0f0e7e20 100644 --- a/docs/functions/_questdb_nodejs-client.qwpGorillaSize.html +++ b/docs/functions/_questdb_nodejs-client.qwpGorillaSize.html @@ -1,3 +1,3 @@ qwpGorillaSize | QuestDB JavaScript Client - v5.0.0
    • Encoded byte count, or -1 when a delta-of-delta leaves int32 range. Throws when a timestamp is outside the signed int64 wire range.

      -

      Parameters

      • timestamps: readonly bigint[]

      Returns number

    +

    Parameters

    • timestamps: readonly bigint[]

    Returns number

    diff --git a/docs/functions/_questdb_nodejs-client.qwpSenderErrorCategory.html b/docs/functions/_questdb_nodejs-client.qwpSenderErrorCategory.html index cb20eda1..c1b85a53 100644 --- a/docs/functions/_questdb_nodejs-client.qwpSenderErrorCategory.html +++ b/docs/functions/_questdb_nodejs-client.qwpSenderErrorCategory.html @@ -1 +1 @@ -qwpSenderErrorCategory | QuestDB JavaScript Client - v5.0.0

    Function qwpSenderErrorCategory

    +qwpSenderErrorCategory | QuestDB JavaScript Client - v5.0.0

    Function qwpSenderErrorCategory

    diff --git a/docs/functions/_questdb_nodejs-client.qwpVarintSize.html b/docs/functions/_questdb_nodejs-client.qwpVarintSize.html index ab8c71b3..9c134e48 100644 --- a/docs/functions/_questdb_nodejs-client.qwpVarintSize.html +++ b/docs/functions/_questdb_nodejs-client.qwpVarintSize.html @@ -1,2 +1,2 @@ qwpVarintSize | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    • value: number | bigint

    Returns number

    diff --git a/docs/functions/_questdb_nodejs-client.readQwpVarint.html b/docs/functions/_questdb_nodejs-client.readQwpVarint.html index 6141b424..f5a0e291 100644 --- a/docs/functions/_questdb_nodejs-client.readQwpVarint.html +++ b/docs/functions/_questdb_nodejs-client.readQwpVarint.html @@ -1,2 +1,2 @@ readQwpVarint | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    Returns bigint

    diff --git a/docs/functions/_questdb_nodejs-client.readQwpVarintNumber.html b/docs/functions/_questdb_nodejs-client.readQwpVarintNumber.html index 071e3cab..66d99150 100644 --- a/docs/functions/_questdb_nodejs-client.readQwpVarintNumber.html +++ b/docs/functions/_questdb_nodejs-client.readQwpVarintNumber.html @@ -1 +1 @@ -readQwpVarintNumber | QuestDB JavaScript Client - v5.0.0

    Function readQwpVarintNumber

    +readQwpVarintNumber | QuestDB JavaScript Client - v5.0.0

    Function readQwpVarintNumber

    diff --git a/docs/functions/_questdb_nodejs-client.retryQwpNodeOrphanSlot.html b/docs/functions/_questdb_nodejs-client.retryQwpNodeOrphanSlot.html index f8d81521..255f09f0 100644 --- a/docs/functions/_questdb_nodejs-client.retryQwpNodeOrphanSlot.html +++ b/docs/functions/_questdb_nodejs-client.retryQwpNodeOrphanSlot.html @@ -1,2 +1,2 @@ retryQwpNodeOrphanSlot | QuestDB JavaScript Client - v5.0.0

    Function retryQwpNodeOrphanSlot

    +

    Parameters

    • directory: string

    Returns Promise<void>

    diff --git a/docs/functions/_questdb_nodejs-client.scanQwpNodeOrphanSlots.html b/docs/functions/_questdb_nodejs-client.scanQwpNodeOrphanSlots.html index 61a5fba3..55c70dd6 100644 --- a/docs/functions/_questdb_nodejs-client.scanQwpNodeOrphanSlots.html +++ b/docs/functions/_questdb_nodejs-client.scanQwpNodeOrphanSlots.html @@ -2,4 +2,4 @@

    The scan is deliberately read-only and does not inspect lock ownership. Adoption obtains the replay store's exclusive lock, closing the race with a live foreground producer or another drainer.

    -

    Parameters

    • rootDirectory: string
    • OptionalexcludeSlot: (slotName: string) => boolean

    Returns Promise<readonly string[]>

    +

    Parameters

    • rootDirectory: string
    • OptionalexcludeSlot: (slotName: string) => boolean

    Returns Promise<readonly string[]>

    diff --git a/docs/functions/_questdb_nodejs-client.short.html b/docs/functions/_questdb_nodejs-client.short.html index 38c6f0db..85e2a409 100644 --- a/docs/functions/_questdb_nodejs-client.short.html +++ b/docs/functions/_questdb_nodejs-client.short.html @@ -1,2 +1,2 @@ short | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<number>

    diff --git a/docs/functions/_questdb_nodejs-client.symbol.html b/docs/functions/_questdb_nodejs-client.symbol.html index 40c8b0dd..08818a48 100644 --- a/docs/functions/_questdb_nodejs-client.symbol.html +++ b/docs/functions/_questdb_nodejs-client.symbol.html @@ -1,2 +1,2 @@ symbol | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<string>

    diff --git a/docs/functions/_questdb_nodejs-client.timestamp.html b/docs/functions/_questdb_nodejs-client.timestamp.html index 7d8e5f26..33029909 100644 --- a/docs/functions/_questdb_nodejs-client.timestamp.html +++ b/docs/functions/_questdb_nodejs-client.timestamp.html @@ -1,2 +1,2 @@ timestamp | QuestDB JavaScript Client - v5.0.0
    +

    Type Parameters

    Parameters

    Returns QwpWriterColumn<TimestampInput<Unit>>

    diff --git a/docs/functions/_questdb_nodejs-client.utf8Length.html b/docs/functions/_questdb_nodejs-client.utf8Length.html index ea8c8680..14a62f24 100644 --- a/docs/functions/_questdb_nodejs-client.utf8Length.html +++ b/docs/functions/_questdb_nodejs-client.utf8Length.html @@ -1 +1 @@ -utf8Length | QuestDB JavaScript Client - v5.0.0
    +utf8Length | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/functions/_questdb_nodejs-client.uuid.html b/docs/functions/_questdb_nodejs-client.uuid.html index 0a35918c..0dc555fe 100644 --- a/docs/functions/_questdb_nodejs-client.uuid.html +++ b/docs/functions/_questdb_nodejs-client.uuid.html @@ -1,2 +1,2 @@ uuid | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<QwpUuidInput>

    diff --git a/docs/functions/_questdb_nodejs-client.varchar.html b/docs/functions/_questdb_nodejs-client.varchar.html index 7c6632dc..1657793a 100644 --- a/docs/functions/_questdb_nodejs-client.varchar.html +++ b/docs/functions/_questdb_nodejs-client.varchar.html @@ -1,2 +1,2 @@ varchar | QuestDB JavaScript Client - v5.0.0
    +

    Returns QwpWriterColumn<string>

    diff --git a/docs/functions/_questdb_nodejs-client.writeQwpFrameHeader.html b/docs/functions/_questdb_nodejs-client.writeQwpFrameHeader.html index 36713879..4780f0fa 100644 --- a/docs/functions/_questdb_nodejs-client.writeQwpFrameHeader.html +++ b/docs/functions/_questdb_nodejs-client.writeQwpFrameHeader.html @@ -1 +1 @@ -writeQwpFrameHeader | QuestDB JavaScript Client - v5.0.0

    Function writeQwpFrameHeader

    +writeQwpFrameHeader | QuestDB JavaScript Client - v5.0.0

    Function writeQwpFrameHeader

    diff --git a/docs/functions/_questdb_nodejs-client.writeQwpVarint.html b/docs/functions/_questdb_nodejs-client.writeQwpVarint.html index 61b40ab9..89f1d800 100644 --- a/docs/functions/_questdb_nodejs-client.writeQwpVarint.html +++ b/docs/functions/_questdb_nodejs-client.writeQwpVarint.html @@ -1,2 +1,2 @@ writeQwpVarint | QuestDB JavaScript Client - v5.0.0
    +

    Parameters

    Returns void

    diff --git a/docs/hierarchy.html b/docs/hierarchy.html index 2049bdb2..6490cdc7 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -1 +1 @@ -QuestDB JavaScript Client - v5.0.0

    QuestDB JavaScript Client - v5.0.0

    Hierarchy Summary

    +QuestDB JavaScript Client - v5.0.0

    QuestDB JavaScript Client - v5.0.0

    Hierarchy Summary

    diff --git a/docs/index.html b/docs/index.html index 9feff97d..d464dacc 100644 --- a/docs/index.html +++ b/docs/index.html @@ -229,6 +229,16 @@

    Returns void

    diff --git a/docs/interfaces/_questdb_browser-client.QwpBrowserAuthContext.html b/docs/interfaces/_questdb_browser-client.QwpBrowserAuthContext.html new file mode 100644 index 00000000..d984bc6c --- /dev/null +++ b/docs/interfaces/_questdb_browser-client.QwpBrowserAuthContext.html @@ -0,0 +1,6 @@ +QwpBrowserAuthContext | QuestDB JavaScript Client - v5.0.0

    Interface QwpBrowserAuthContext

    Describes the connection attempt a QwpBrowserAuthProvider serves.

    +
    interface QwpBrowserAuthContext {
        signal: AbortSignal;
    }
    Index

    Properties

    Properties

    signal: AbortSignal

    Aborted when the attempt is abandoned, because its connectTimeoutMs +deadline expired or its session closed. Pass it to a token refresh so the +refresh is cancelled together with the attempt.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpBrowserClusterOptions.html b/docs/interfaces/_questdb_browser-client.QwpBrowserClusterOptions.html index 588638db..aab7fc74 100644 --- a/docs/interfaces/_questdb_browser-client.QwpBrowserClusterOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpBrowserClusterOptions.html @@ -1,5 +1,6 @@ QwpBrowserClusterOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpBrowserClusterOptions

    Shared browser transport and authentication for one QWP cluster.

    -
    interface QwpBrowserClusterOptions {
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        protocols?: string | string[];
        sendTimeoutMs?: number;
        sessionBootstrap?: QwpBrowserSessionBootstrapConfig;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            protocols?: string | string[],
        ) => QwpWebSocketLike;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface QwpBrowserClusterOptions {
        auth?: QwpBrowserSessionAuthentication | QwpBrowserAuthProvider;
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        protocols?: string | string[];
        sendTimeoutMs?: number;
        sessionBootstrap?: QwpBrowserSessionBootstrapConfig;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            protocols?: string | string[],
        ) => QwpWebSocketLike;
    }

    Hierarchy (View Summary)

    Index

    Properties

    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. +

    Properties

    Credential sent with every ingress and egress WebSocket upgrade; see +QwpBrowserWebSocketOptions.auth. A provider is called before every +connection attempt of either side. Cannot be combined with +sessionBootstrap.

    +
    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a +

    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a browser. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    -
    protocols?: string | string[]
    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. +

    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    +
    protocols?: string | string[]
    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -

    Authenticates before every connection attempt. When url is omitted from -this bootstrap, its REST endpoint follows the active cluster endpoint.

    -
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        protocols?: string | string[],
    ) => QwpWebSocketLike

    Shared test or framework hook; either side may override it.

    -
    +

    Authenticates before every connection attempt. When url is omitted from +this bootstrap, its REST endpoint follows the active cluster endpoint. +Cannot be combined with auth.

    +
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        protocols?: string | string[],
    ) => QwpWebSocketLike

    Shared test or framework hook; either side may override it.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpBrowserEgressOptions.html b/docs/interfaces/_questdb_browser-client.QwpBrowserEgressOptions.html index 39224375..95bbbb3b 100644 --- a/docs/interfaces/_questdb_browser-client.QwpBrowserEgressOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpBrowserEgressOptions.html @@ -1,5 +1,6 @@ QwpBrowserEgressOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpBrowserEgressOptions

    Browser WebSocket options plus protocol-level egress topology routing.

    -
    interface QwpBrowserEgressOptions {
        closeTimeoutMs?: number;
        compression?: QwpEgressCompression;
        compressionLevel?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        ingressNegotiationTimeoutMs?: number;
        maxBatchRows?: number;
        protocols?: string | string[];
        requestDurableAck?: boolean;
        sendTimeoutMs?: number;
        sessionBootstrap?: QwpBrowserSessionBootstrapConfig;
        target?: QwpTarget;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            protocols?: string | string[],
        ) => QwpWebSocketLike;
        zone?: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface QwpBrowserEgressOptions {
        auth?: QwpBrowserSessionAuthentication | QwpBrowserAuthProvider;
        closeTimeoutMs?: number;
        compression?: QwpEgressCompression;
        compressionLevel?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        ingressNegotiationTimeoutMs?: number;
        maxBatchRows?: number;
        protocols?: string | string[];
        requestDurableAck?: boolean;
        sendTimeoutMs?: number;
        sessionBootstrap?: QwpBrowserSessionBootstrapConfig;
        target?: QwpTarget;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            protocols?: string | string[],
        ) => QwpWebSocketLike;
        zone?: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. +

    Properties

    Authenticates every WebSocket upgrade with a credential carried in its +subprotocol offer instead of a session cookie. This is how a web +application served from another origin, which QuestDB lists in +qwp.browser.allowed.origins, connects. Pass a fixed credential, or a +QwpBrowserAuthProvider the client calls before every connect, +reconnect, and failover attempt, for example to supply a refreshed OIDC +access token.

    +

    QuestDB accepts the credential only from a listed origin: a page served +from QuestDB's own origin must be listed too, or keep using +sessionBootstrap. It creates no session for the credential and ignores +cookies on the upgrade. Use wss:: the credential travels in the opening +HTTP request. Cannot be combined with sessionBootstrap.

    +
    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    compression?: QwpEgressCompression

    Requests Zstd-compressed result batches through browser-visible URL +

    compression?: QwpEgressCompression

    Requests Zstd-compressed result batches through browser-visible URL negotiation. Defaults to raw for compatibility.

    -
    compressionLevel?: number

    Zstd level hint. Must be between 1 and 22, and only takes effect +

    compressionLevel?: number

    Zstd level hint. Must be between 1 and 22, and only takes effect alongside compression; the default raw negotiates no compression for a level to travel on.

    -
    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a +

    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a browser. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    -
    ingressNegotiationTimeoutMs?: number

    Time allowed for the optional ingress SERVER_INFO message. Defaults to +

    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    +
    ingressNegotiationTimeoutMs?: number

    Time allowed for the optional ingress SERVER_INFO message. Defaults to 250ms; zero disables the initial wait while retaining late negotiation. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    maxBatchRows?: number

    Requests a server-side RESULT_BATCH row cap.

    -
    protocols?: string | string[]
    requestDurableAck?: boolean

    Requests durable ingress ACKs through browser-visible WebSocket +

    maxBatchRows?: number

    Requests a server-side RESULT_BATCH row cap.

    +
    protocols?: string | string[]
    requestDurableAck?: boolean

    Requests durable ingress ACKs through browser-visible WebSocket subprotocol negotiation.

    -
    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. +

    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -

    Authenticates over REST before every WebSocket connection attempt so the -browser can attach QuestDB's HttpOnly session cookies to the upgrade.

    -
    target?: QwpTarget

    Selects any readable node, a primary/standalone node, or a replica.

    -
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        protocols?: string | string[],
    ) => QwpWebSocketLike

    Test or framework hook; defaults to the browser's global WebSocket.

    -
    zone?: string

    Opaque, case-insensitive preferred zone; cross-zone fallback stays enabled.

    -
    +

    Authenticates over REST before every WebSocket connection attempt so the +browser can attach QuestDB's HttpOnly session cookies to the upgrade. +Cannot be combined with auth.

    +
    target?: QwpTarget

    Selects any readable node, a primary/standalone node, or a replica.

    +
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        protocols?: string | string[],
    ) => QwpWebSocketLike

    Test or framework hook; defaults to the browser's global WebSocket.

    +
    zone?: string

    Opaque, case-insensitive preferred zone; cross-zone fallback stays enabled.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpBrowserSessionBootstrapOptions.html b/docs/interfaces/_questdb_browser-client.QwpBrowserSessionBootstrapOptions.html index 1e230cef..2fe03823 100644 --- a/docs/interfaces/_questdb_browser-client.QwpBrowserSessionBootstrapOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpBrowserSessionBootstrapOptions.html @@ -1,10 +1,10 @@ -QwpBrowserSessionBootstrapOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpBrowserSessionBootstrapOptions

    interface QwpBrowserSessionBootstrapOptions {
        authentication: QwpBrowserSessionAuthentication;
        fetch?: QwpBrowserFetch;
        serviceAccount?: string;
        signal?: AbortSignal;
        url: string | URL;
    }
    Index

    Properties

    authentication +QwpBrowserSessionBootstrapOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpBrowserSessionBootstrapOptions

    interface QwpBrowserSessionBootstrapOptions {
        authentication: QwpBrowserSessionAuthentication;
        fetch?: QwpBrowserFetch;
        serviceAccount?: string;
        signal?: AbortSignal;
        url: string | URL;
    }
    Index

    Properties

    Test or framework hook; defaults to the browser's global fetch.

    -
    serviceAccount?: string

    Optional Enterprise service account to assume for subsequent QWP use.

    -
    signal?: AbortSignal

    Cancels only the REST bootstrap request.

    -
    url: string | URL

    Exact QuestDB /exec HTTP(S) URL used to create the session cookie.

    -
    +

    Properties

    Test or framework hook; defaults to the browser's global fetch.

    +
    serviceAccount?: string

    Optional Enterprise service account to assume for subsequent QWP use.

    +
    signal?: AbortSignal

    Cancels only the REST bootstrap request.

    +
    url: string | URL

    Exact QuestDB /exec HTTP(S) URL used to create the session cookie.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpBrowserSessionBootstrapResult.html b/docs/interfaces/_questdb_browser-client.QwpBrowserSessionBootstrapResult.html index 6c44d89e..83054d2e 100644 --- a/docs/interfaces/_questdb_browser-client.QwpBrowserSessionBootstrapResult.html +++ b/docs/interfaces/_questdb_browser-client.QwpBrowserSessionBootstrapResult.html @@ -1,4 +1,4 @@ -QwpBrowserSessionBootstrapResult | QuestDB JavaScript Client - v5.0.0

    Interface QwpBrowserSessionBootstrapResult

    interface QwpBrowserSessionBootstrapResult {
        serviceAccount?: string;
        status: number;
        url: string;
    }
    Index

    Properties

    serviceAccount? +QwpBrowserSessionBootstrapResult | QuestDB JavaScript Client - v5.0.0

    Interface QwpBrowserSessionBootstrapResult

    interface QwpBrowserSessionBootstrapResult {
        serviceAccount?: string;
        status: number;
        url: string;
    }
    Index

    Properties

    serviceAccount?: string
    status: number
    url: string
    +

    Properties

    serviceAccount?: string
    status: number
    url: string
    diff --git a/docs/interfaces/_questdb_browser-client.QwpBrowserSplitClientOptions.html b/docs/interfaces/_questdb_browser-client.QwpBrowserSplitClientOptions.html index 2a9ba1a5..4d0da0b4 100644 --- a/docs/interfaces/_questdb_browser-client.QwpBrowserSplitClientOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpBrowserSplitClientOptions.html @@ -1,9 +1,9 @@ QwpBrowserSplitClientOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpBrowserSplitClientOptions

    Backwards-compatible form with completely independent connection trees.

    -
    interface QwpBrowserSplitClientOptions {
        cluster?: undefined;
        egress: QwpBrowserEgressOptions;
        egressSession?: QwpEgressSessionOptions;
        ingress: QwpBrowserWebSocketOptions;
        ingressSession?: QwpIngressSessionOptions;
        pool?: QwpClientPoolOptions;
        sender?: QwpSenderOptions;
    }

    Hierarchy

    • QwpBrowserClientBaseOptions
      • QwpBrowserSplitClientOptions
    Index

    Properties

    interface QwpBrowserSplitClientOptions {
        cluster?: undefined;
        egress: QwpBrowserEgressOptions;
        egressSession?: QwpEgressSessionOptions;
        ingress: QwpBrowserWebSocketOptions;
        ingressSession?: QwpIngressSessionOptions;
        pool?: QwpClientPoolOptions;
        sender?: QwpSenderOptions;
    }

    Hierarchy

    • QwpBrowserClientBaseOptions
      • QwpBrowserSplitClientOptions
    Index

    Properties

    cluster?: undefined
    egressSession?: QwpEgressSessionOptions
    ingressSession?: QwpIngressSessionOptions
    +

    Properties

    cluster?: undefined
    egressSession?: QwpEgressSessionOptions
    ingressSession?: QwpIngressSessionOptions
    diff --git a/docs/interfaces/_questdb_browser-client.QwpBrowserUnifiedClientOptions.html b/docs/interfaces/_questdb_browser-client.QwpBrowserUnifiedClientOptions.html index 773f7e26..0496ca33 100644 --- a/docs/interfaces/_questdb_browser-client.QwpBrowserUnifiedClientOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpBrowserUnifiedClientOptions.html @@ -1,10 +1,10 @@ QwpBrowserUnifiedClientOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpBrowserUnifiedClientOptions

    Recommended combined-browser form. One endpoint list and authentication bootstrap are shared while side-specific protocol options remain explicit.

    -
    interface QwpBrowserUnifiedClientOptions {
        cluster: QwpBrowserClusterOptions;
        egress?: Partial<
            Pick<
                QwpBrowserEgressOptions,
                | "target"
                | "compressionLevel"
                | "connectTimeoutMs"
                | "sendTimeoutMs"
                | "closeTimeoutMs"
                | "compression"
                | "maxBatchRows"
                | "webSocketFactory"
                | "protocols"
                | "zone",
            >,
        >;
        egressSession?: QwpEgressSessionOptions;
        ingress?: Partial<
            Pick<
                QwpBrowserWebSocketOptions,
                | "connectTimeoutMs"
                | "sendTimeoutMs"
                | "closeTimeoutMs"
                | "requestDurableAck"
                | "ingressNegotiationTimeoutMs"
                | "webSocketFactory"
                | "protocols",
            >,
        >;
        ingressSession?: QwpIngressSessionOptions;
        pool?: QwpClientPoolOptions;
        sender?: QwpSenderOptions;
    }

    Hierarchy

    • QwpBrowserClientBaseOptions
      • QwpBrowserUnifiedClientOptions
    Index

    Properties

    interface QwpBrowserUnifiedClientOptions {
        cluster: QwpBrowserClusterOptions;
        egress?: Partial<
            Pick<
                QwpBrowserEgressOptions,
                | "target"
                | "compressionLevel"
                | "connectTimeoutMs"
                | "sendTimeoutMs"
                | "closeTimeoutMs"
                | "compression"
                | "maxBatchRows"
                | "webSocketFactory"
                | "protocols"
                | "zone",
            >,
        >;
        egressSession?: QwpEgressSessionOptions;
        ingress?: Partial<
            Pick<
                QwpBrowserWebSocketOptions,
                | "connectTimeoutMs"
                | "sendTimeoutMs"
                | "closeTimeoutMs"
                | "requestDurableAck"
                | "ingressNegotiationTimeoutMs"
                | "webSocketFactory"
                | "protocols",
            >,
        >;
        ingressSession?: QwpIngressSessionOptions;
        pool?: QwpClientPoolOptions;
        sender?: QwpSenderOptions;
    }

    Hierarchy

    • QwpBrowserClientBaseOptions
      • QwpBrowserUnifiedClientOptions
    Index

    Properties

    egress?: Partial<
        Pick<
            QwpBrowserEgressOptions,
            | "target"
            | "compressionLevel"
            | "connectTimeoutMs"
            | "sendTimeoutMs"
            | "closeTimeoutMs"
            | "compression"
            | "maxBatchRows"
            | "webSocketFactory"
            | "protocols"
            | "zone",
        >,
    >
    egressSession?: QwpEgressSessionOptions
    ingress?: Partial<
        Pick<
            QwpBrowserWebSocketOptions,
            | "connectTimeoutMs"
            | "sendTimeoutMs"
            | "closeTimeoutMs"
            | "requestDurableAck"
            | "ingressNegotiationTimeoutMs"
            | "webSocketFactory"
            | "protocols",
        >,
    >
    ingressSession?: QwpIngressSessionOptions
    +

    Properties

    egress?: Partial<
        Pick<
            QwpBrowserEgressOptions,
            | "target"
            | "compressionLevel"
            | "connectTimeoutMs"
            | "sendTimeoutMs"
            | "closeTimeoutMs"
            | "compression"
            | "maxBatchRows"
            | "webSocketFactory"
            | "protocols"
            | "zone",
        >,
    >
    egressSession?: QwpEgressSessionOptions
    ingress?: Partial<
        Pick<
            QwpBrowserWebSocketOptions,
            | "connectTimeoutMs"
            | "sendTimeoutMs"
            | "closeTimeoutMs"
            | "requestDurableAck"
            | "ingressNegotiationTimeoutMs"
            | "webSocketFactory"
            | "protocols",
        >,
    >
    ingressSession?: QwpIngressSessionOptions
    diff --git a/docs/interfaces/_questdb_browser-client.QwpBrowserWebSocketOptions.html b/docs/interfaces/_questdb_browser-client.QwpBrowserWebSocketOptions.html index 171b5c19..6ea6a047 100644 --- a/docs/interfaces/_questdb_browser-client.QwpBrowserWebSocketOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpBrowserWebSocketOptions.html @@ -1,4 +1,5 @@ -QwpBrowserWebSocketOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpBrowserWebSocketOptions

    interface QwpBrowserWebSocketOptions {
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        ingressNegotiationTimeoutMs?: number;
        protocols?: string | string[];
        requestDurableAck?: boolean;
        sendTimeoutMs?: number;
        sessionBootstrap?: QwpBrowserSessionBootstrapConfig;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            protocols?: string | string[],
        ) => QwpWebSocketLike;
    }

    Hierarchy (View Summary)

    Index

    Properties

    closeTimeoutMs? +QwpBrowserWebSocketOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpBrowserWebSocketOptions

    interface QwpBrowserWebSocketOptions {
        auth?: QwpBrowserSessionAuthentication | QwpBrowserAuthProvider;
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        ingressNegotiationTimeoutMs?: number;
        protocols?: string | string[];
        requestDurableAck?: boolean;
        sendTimeoutMs?: number;
        sessionBootstrap?: QwpBrowserSessionBootstrapConfig;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            protocols?: string | string[],
        ) => QwpWebSocketLike;
    }

    Hierarchy (View Summary)

    Index

    Properties

    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. +

    Properties

    Authenticates every WebSocket upgrade with a credential carried in its +subprotocol offer instead of a session cookie. This is how a web +application served from another origin, which QuestDB lists in +qwp.browser.allowed.origins, connects. Pass a fixed credential, or a +QwpBrowserAuthProvider the client calls before every connect, +reconnect, and failover attempt, for example to supply a refreshed OIDC +access token.

    +

    QuestDB accepts the credential only from a listed origin: a page served +from QuestDB's own origin must be listed too, or keep using +sessionBootstrap. It creates no session for the credential and ignores +cookies on the upgrade. Use wss:: the credential travels in the opening +HTTP request. Cannot be combined with sessionBootstrap.

    +
    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a +

    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a browser. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    -
    ingressNegotiationTimeoutMs?: number

    Time allowed for the optional ingress SERVER_INFO message. Defaults to +

    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    +
    ingressNegotiationTimeoutMs?: number

    Time allowed for the optional ingress SERVER_INFO message. Defaults to 250ms; zero disables the initial wait while retaining late negotiation. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    protocols?: string | string[]
    requestDurableAck?: boolean

    Requests durable ingress ACKs through browser-visible WebSocket +

    protocols?: string | string[]
    requestDurableAck?: boolean

    Requests durable ingress ACKs through browser-visible WebSocket subprotocol negotiation.

    -
    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. +

    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -

    Authenticates over REST before every WebSocket connection attempt so the -browser can attach QuestDB's HttpOnly session cookies to the upgrade.

    -
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        protocols?: string | string[],
    ) => QwpWebSocketLike

    Test or framework hook; defaults to the browser's global WebSocket.

    -
    +

    Authenticates over REST before every WebSocket connection attempt so the +browser can attach QuestDB's HttpOnly session cookies to the upgrade. +Cannot be combined with auth.

    +
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        protocols?: string | string[],
    ) => QwpWebSocketLike

    Test or framework hook; defaults to the browser's global WebSocket.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpCacheResetMessage.html b/docs/interfaces/_questdb_browser-client.QwpCacheResetMessage.html index ad4a5bee..ac375fe5 100644 --- a/docs/interfaces/_questdb_browser-client.QwpCacheResetMessage.html +++ b/docs/interfaces/_questdb_browser-client.QwpCacheResetMessage.html @@ -1,7 +1,7 @@ -QwpCacheResetMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpCacheResetMessage

    interface QwpCacheResetMessage {
        flags: number;
        kind: "cache-reset";
        payloadLength: number;
        resetMask: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags +QwpCacheResetMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpCacheResetMessage

    interface QwpCacheResetMessage {
        flags: number;
        kind: "cache-reset";
        payloadLength: number;
        resetMask: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags: number
    kind: "cache-reset"
    payloadLength: number
    resetMask: number
    tableCount: number
    version: number
    +

    Properties

    flags: number
    kind: "cache-reset"
    payloadLength: number
    resetMask: number
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpClientFactories.html b/docs/interfaces/_questdb_browser-client.QwpClientFactories.html index 71758434..e6107095 100644 --- a/docs/interfaces/_questdb_browser-client.QwpClientFactories.html +++ b/docs/interfaces/_questdb_browser-client.QwpClientFactories.html @@ -1,9 +1,9 @@ -QwpClientFactories | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientFactories

    interface QwpClientFactories {
        senderSlotReservation?: QwpPoolSlotReservation;
        close(): void | Promise<void>;
        createQuerySession(
            slot: number,
            signal?: AbortSignal,
        ): Promise<QwpEgressSession>;
        createSender(slot: number, signal?: AbortSignal): Promise<QwpSender>;
        start(): void | Promise<void>;
    }
    Index

    Properties

    senderSlotReservation? +QwpClientFactories | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientFactories

    interface QwpClientFactories {
        senderSlotReservation?: QwpPoolSlotReservation;
        close(): void | Promise<void>;
        createQuerySession(
            slot: number,
            signal?: AbortSignal,
        ): Promise<QwpEgressSession>;
        createSender(slot: number, signal?: AbortSignal): Promise<QwpSender>;
        start(): void | Promise<void>;
    }
    Index

    Properties

    senderSlotReservation?: QwpPoolSlotReservation

    Coordinates stable persistent sender slots with recovery.

    -

    Methods

    +

    Methods

    diff --git a/docs/interfaces/_questdb_browser-client.QwpClientMetrics.html b/docs/interfaces/_questdb_browser-client.QwpClientMetrics.html index 8c36f713..1a9ae40e 100644 --- a/docs/interfaces/_questdb_browser-client.QwpClientMetrics.html +++ b/docs/interfaces/_questdb_browser-client.QwpClientMetrics.html @@ -1,5 +1,5 @@ -QwpClientMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientMetrics

    interface QwpClientMetrics {
        closed: boolean;
        closing: boolean;
        queries: QwpResourcePoolMetrics;
        senders: QwpResourcePoolMetrics;
    }
    Index

    Properties

    closed +QwpClientMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientMetrics

    interface QwpClientMetrics {
        closed: boolean;
        closing: boolean;
        queries: QwpResourcePoolMetrics;
        senders: QwpResourcePoolMetrics;
    }
    Index

    Properties

    closed: boolean
    closing: boolean
    +

    Properties

    closed: boolean
    closing: boolean
    diff --git a/docs/interfaces/_questdb_browser-client.QwpClientPoolOptions.html b/docs/interfaces/_questdb_browser-client.QwpClientPoolOptions.html index f98d95a3..12e43532 100644 --- a/docs/interfaces/_questdb_browser-client.QwpClientPoolOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpClientPoolOptions.html @@ -1,4 +1,4 @@ -QwpClientPoolOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientPoolOptions

    interface QwpClientPoolOptions {
        acquireTimeoutMs?: number;
        housekeepingIntervalMs?: number;
        idleTimeoutMs?: number;
        maxLifetimeMs?: number;
        queryPoolMax?: number;
        queryPoolMin?: number;
        senderPoolMax?: number;
        senderPoolMin?: number;
    }
    Index

    Properties

    acquireTimeoutMs? +QwpClientPoolOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientPoolOptions

    interface QwpClientPoolOptions {
        acquireTimeoutMs?: number;
        housekeepingIntervalMs?: number;
        idleTimeoutMs?: number;
        maxLifetimeMs?: number;
        queryPoolMax?: number;
        queryPoolMin?: number;
        senderPoolMax?: number;
        senderPoolMin?: number;
    }
    Index

    Properties

    acquireTimeoutMs? housekeepingIntervalMs? idleTimeoutMs? maxLifetimeMs? @@ -10,17 +10,17 @@ The shutdown wait is capped at 5 seconds. Defaults to 5 seconds. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    housekeepingIntervalMs?: number

    Idle/lifetime sweep interval. Defaults to 5s and must be at least 100ms. +

    housekeepingIntervalMs?: number

    Idle/lifetime sweep interval. Defaults to 5s and must be at least 100ms. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    idleTimeoutMs?: number

    Idle time before an excess pooled connection is closed. Defaults to 60s; +

    idleTimeoutMs?: number

    Idle time before an excess pooled connection is closed. Defaults to 60s; zero disables. Not capped at the host timer ceiling: compared against elapsed time only.

    -
    maxLifetimeMs?: number

    Maximum pooled connection age before recycling it while idle. Defaults to +

    maxLifetimeMs?: number

    Maximum pooled connection age before recycling it while idle. Defaults to 30m; zero disables. Not capped at the host timer ceiling: compared against elapsed time only.

    -
    queryPoolMax?: number

    Maximum concurrently borrowed query connections. Defaults to 4.

    -
    queryPoolMin?: number

    Warm egress connections created by connect(). Defaults to 1.

    -
    senderPoolMax?: number

    Maximum concurrently borrowed ingress senders. Defaults to 4.

    -
    senderPoolMin?: number

    Warm ingress connections created by connect(). Defaults to 1.

    -
    +
    queryPoolMax?: number

    Maximum concurrently borrowed query connections. Defaults to 4.

    +
    queryPoolMin?: number

    Warm egress connections created by connect(). Defaults to 1.

    +
    senderPoolMax?: number

    Maximum concurrently borrowed ingress senders. Defaults to 4.

    +
    senderPoolMin?: number

    Warm ingress connections created by connect(). Defaults to 1.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpColumnBuffer.html b/docs/interfaces/_questdb_browser-client.QwpColumnBuffer.html index d29e8aef..a07c48d0 100644 --- a/docs/interfaces/_questdb_browser-client.QwpColumnBuffer.html +++ b/docs/interfaces/_questdb_browser-client.QwpColumnBuffer.html @@ -1,4 +1,4 @@ -QwpColumnBuffer | QuestDB JavaScript Client - v5.0.0
    interface QwpColumnBuffer {
        committedValues: number;
        decimalScale?: number;
        geohashPrecision?: number;
        name: string;
        nulls: boolean[];
        size: number;
        type: QwpColumnType;
        values: unknown[];
    }
    Index

    Properties

    committedValues +QwpColumnBuffer | QuestDB JavaScript Client - v5.0.0
    interface QwpColumnBuffer {
        committedValues: number;
        decimalScale?: number;
        geohashPrecision?: number;
        name: string;
        nulls: boolean[];
        size: number;
        type: QwpColumnType;
        values: unknown[];
    }
    Index

    Properties

    committedValues: number

    Length values had when the last row completed -- everything past it belongs to the row in progress. rollbackRow() truncates to this mark; see the failure it exists to prevent there. Maintained by QwpTableBuffer.

    -
    decimalScale?: number
    geohashPrecision?: number
    name: string
    nulls: boolean[]

    One entry per row; true means NULL.

    -
    size: number

    Rows accounted for so far, including nulls.

    -
    values: unknown[]

    Non-null values only; QWP compacts values around the null bitmap. +

    decimalScale?: number
    geohashPrecision?: number
    name: string
    nulls: boolean[]

    One entry per row; true means NULL.

    +
    size: number

    Rows accounted for so far, including nulls.

    +
    values: unknown[]

    Non-null values only; QWP compacts values around the null bitmap. LONG, DATE, and TIMESTAMP values accept safe integer numbers or signed int64 bigints. LONG_ARRAY applies the same rule to every element.

    -
    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpConnectionCloseInfo.html b/docs/interfaces/_questdb_browser-client.QwpConnectionCloseInfo.html index 2899d769..6d8cdbc8 100644 --- a/docs/interfaces/_questdb_browser-client.QwpConnectionCloseInfo.html +++ b/docs/interfaces/_questdb_browser-client.QwpConnectionCloseInfo.html @@ -1,4 +1,4 @@ -QwpConnectionCloseInfo | QuestDB JavaScript Client - v5.0.0

    Interface QwpConnectionCloseInfo

    interface QwpConnectionCloseInfo {
        code: number;
        reason: string;
        wasClean: boolean;
    }
    Index

    Properties

    code +QwpConnectionCloseInfo | QuestDB JavaScript Client - v5.0.0

    Interface QwpConnectionCloseInfo

    interface QwpConnectionCloseInfo {
        code: number;
        reason: string;
        wasClean: boolean;
    }
    Index

    Properties

    Properties

    code: number
    reason: string
    wasClean: boolean
    +

    Properties

    code: number
    reason: string
    wasClean: boolean
    diff --git a/docs/interfaces/_questdb_browser-client.QwpDecimalValue.html b/docs/interfaces/_questdb_browser-client.QwpDecimalValue.html index 96082172..ecf28d1f 100644 --- a/docs/interfaces/_questdb_browser-client.QwpDecimalValue.html +++ b/docs/interfaces/_questdb_browser-client.QwpDecimalValue.html @@ -1,3 +1,3 @@ -QwpDecimalValue | QuestDB JavaScript Client - v5.0.0
    interface QwpDecimalValue {
        scale: number;
        unscaled: bigint;
    }
    Index

    Properties

    scale +QwpDecimalValue | QuestDB JavaScript Client - v5.0.0
    interface QwpDecimalValue {
        scale: number;
        unscaled: bigint;
    }
    Index

    Properties

    Properties

    scale: number
    unscaled: bigint
    +

    Properties

    scale: number
    unscaled: bigint
    diff --git a/docs/interfaces/_questdb_browser-client.QwpEgressMetrics.html b/docs/interfaces/_questdb_browser-client.QwpEgressMetrics.html index f34894c1..bf220bcf 100644 --- a/docs/interfaces/_questdb_browser-client.QwpEgressMetrics.html +++ b/docs/interfaces/_questdb_browser-client.QwpEgressMetrics.html @@ -1,4 +1,4 @@ QwpEgressMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressMetrics

    Immutable notification-inbox counters for an egress session.

    -
    interface QwpEgressMetrics {
        deliveredConnectionNotifications: number;
        droppedConnectionNotifications: number;
    }
    Index

    Properties

    interface QwpEgressMetrics {
        deliveredConnectionNotifications: number;
        droppedConnectionNotifications: number;
    }
    Index

    Properties

    deliveredConnectionNotifications: number
    droppedConnectionNotifications: number
    +

    Properties

    deliveredConnectionNotifications: number
    droppedConnectionNotifications: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpEgressQueryOptions.html b/docs/interfaces/_questdb_browser-client.QwpEgressQueryOptions.html index 9d8b0295..803e1dab 100644 --- a/docs/interfaces/_questdb_browser-client.QwpEgressQueryOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpEgressQueryOptions.html @@ -1,4 +1,4 @@ -QwpEgressQueryOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressQueryOptions

    interface QwpEgressQueryOptions {
        autoCredit?: boolean;
        bindCount?: number;
        bindPayload?: Uint8Array<ArrayBufferLike>;
        binds?: QwpBindSetter;
        initialCredit?: number | bigint;
        resetDictionary?: boolean;
        timeoutMs?: number;
    }
    Index

    Properties

    autoCredit? +QwpEgressQueryOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressQueryOptions

    interface QwpEgressQueryOptions {
        autoCredit?: boolean;
        bindCount?: number;
        bindPayload?: Uint8Array<ArrayBufferLike>;
        binds?: QwpBindSetter;
        initialCredit?: number | bigint;
        resetDictionary?: boolean;
        timeoutMs?: number;
    }
    Index

    Properties

    Properties

    autoCredit?: boolean

    Replenishes positive initial credit by each RESULT_BATCH wire size after the async iterator advances past that batch. Defaults to true.

    -
    bindCount?: number

    Advanced escape hatch for an already encoded bind section.

    -
    bindPayload?: Uint8Array<ArrayBufferLike>

    Advanced escape hatch for an already encoded bind section.

    -

    Sets typed positional parameters; index 0 maps to SQL placeholder $1.

    -
    initialCredit?: number | bigint

    Overrides session send-ahead credit. Zero explicitly disables flow control.

    -
    resetDictionary?: boolean

    Ask a capable server to reset its connection-scoped symbol dictionary. +

    bindCount?: number

    Advanced escape hatch for an already encoded bind section.

    +
    bindPayload?: Uint8Array<ArrayBufferLike>

    Advanced escape hatch for an already encoded bind section.

    +

    Sets typed positional parameters; index 0 maps to SQL placeholder $1.

    +
    initialCredit?: number | bigint

    Overrides session send-ahead credit. Zero explicitly disables flow control.

    +
    resetDictionary?: boolean

    Ask a capable server to reset its connection-scoped symbol dictionary. Silently omitted when the server lacks QUERY_FLAGS for rolling upgrades.

    -
    timeoutMs?: number

    Per-query deadline overriding the session default. Zero disables it. +

    timeoutMs?: number

    Per-query deadline overriding the session default. Zero disables it. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpEgressReplayResetEvent.html b/docs/interfaces/_questdb_browser-client.QwpEgressReplayResetEvent.html index 084b27cc..0e3d89a1 100644 --- a/docs/interfaces/_questdb_browser-client.QwpEgressReplayResetEvent.html +++ b/docs/interfaces/_questdb_browser-client.QwpEgressReplayResetEvent.html @@ -1,8 +1,8 @@ -QwpEgressReplayResetEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressReplayResetEvent

    interface QwpEgressReplayResetEvent {
        cause?: unknown;
        endpoint?: string | URL;
        previousEndpoint?: string | URL;
        requestId: bigint;
        serverInfo: QwpServerInfoMessage;
    }
    Index

    Properties

    cause? +QwpEgressReplayResetEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressReplayResetEvent

    interface QwpEgressReplayResetEvent {
        cause?: unknown;
        endpoint?: string | URL;
        previousEndpoint?: string | URL;
        requestId: bigint;
        serverInfo: QwpServerInfoMessage;
    }
    Index

    Properties

    cause?: unknown
    endpoint?: string | URL
    previousEndpoint?: string | URL
    requestId: bigint

    Client request being re-executed on the replacement connection.

    -

    Authoritative SERVER_INFO received from the replacement endpoint.

    -
    +

    Properties

    cause?: unknown
    endpoint?: string | URL
    previousEndpoint?: string | URL
    requestId: bigint

    Client request being re-executed on the replacement connection.

    +

    Authoritative SERVER_INFO received from the replacement endpoint.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpEgressRoutingOptions.html b/docs/interfaces/_questdb_browser-client.QwpEgressRoutingOptions.html index 3e281fb9..a0704026 100644 --- a/docs/interfaces/_questdb_browser-client.QwpEgressRoutingOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpEgressRoutingOptions.html @@ -1,8 +1,8 @@ QwpEgressRoutingOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressRoutingOptions

    Endpoint routing preferences. Named for egress, where they landed first, but ingress ranks and validates its endpoints with the same machinery and honours the same two keys.

    -
    interface QwpEgressRoutingOptions {
        target?: QwpTarget;
        zone?: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface QwpEgressRoutingOptions {
        target?: QwpTarget;
        zone?: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    target?: QwpTarget

    Selects any readable node, a primary/standalone node, or a replica.

    -
    zone?: string

    Opaque, case-insensitive preferred zone; cross-zone fallback stays enabled.

    -
    +
    zone?: string

    Opaque, case-insensitive preferred zone; cross-zone fallback stays enabled.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpEgressSessionOptions.html b/docs/interfaces/_questdb_browser-client.QwpEgressSessionOptions.html index fbd11c33..ae151e6e 100644 --- a/docs/interfaces/_questdb_browser-client.QwpEgressSessionOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpEgressSessionOptions.html @@ -1,4 +1,4 @@ -QwpEgressSessionOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressSessionOptions

    interface QwpEgressSessionOptions {
        bufferPoolSize?: number;
        cancelDrainTimeoutMs?: number;
        connectionListenerInboxCapacity?: number;
        initialCredit?: number | bigint;
        maxBatchRows?: number;
        onReplayReset?: (event: QwpEgressReplayResetEvent) => void | Promise<void>;
        queryTimeoutMs?: number;
        reconnect?: false | QwpReconnectOptions;
        serverInfoTimeoutMs?: number;
    }
    Index

    Properties

    bufferPoolSize? +QwpEgressSessionOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressSessionOptions

    interface QwpEgressSessionOptions {
        bufferPoolSize?: number;
        cancelDrainTimeoutMs?: number;
        connectionListenerInboxCapacity?: number;
        initialCredit?: number | bigint;
        maxBatchRows?: number;
        onReplayReset?: (event: QwpEgressReplayResetEvent) => void | Promise<void>;
        queryTimeoutMs?: number;
        reconnect?: false | QwpReconnectOptions;
        serverInfoTimeoutMs?: number;
    }
    Index

    Properties

    bufferPoolSize?: number

    Maximum decoded batches waiting for a consumer. Defaults to 4.

    -
    cancelDrainTimeoutMs?: number

    Maximum wait for a terminal response after CANCEL. Defaults to 5 seconds. +

    cancelDrainTimeoutMs?: number

    Maximum wait for a terminal response after CANCEL. Defaults to 5 seconds. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    connectionListenerInboxCapacity?: number

    Bounded inbox depth for reconnect.onEvent. Defaults to 64, matching +

    connectionListenerInboxCapacity?: number

    Bounded inbox depth for reconnect.onEvent. Defaults to 64, matching ingress. Overflow drops the oldest pending notification.

    -
    initialCredit?: number | bigint

    Default per-query send-ahead credit. Defaults to zero (unbounded).

    -
    maxBatchRows?: number

    Rejects a RESULT_BATCH declaring more rows than this. The connect helpers +

    initialCredit?: number | bigint

    Default per-query send-ahead credit. Defaults to zero (unbounded).

    +
    maxBatchRows?: number

    Rejects a RESULT_BATCH declaring more rows than this. The connect helpers default it to the maxBatchRows they put on the wire, so the request the client makes is also the bound it enforces; decoder scratch is sized from the declared row count and retained per pool slot, so an answer above the request would set this session's memory floor for its lifetime.

    -
    onReplayReset?: (event: QwpEgressReplayResetEvent) => void | Promise<void>

    Optional notification immediately before an active query is re-executed. +

    onReplayReset?: (event: QwpEgressReplayResetEvent) => void | Promise<void>

    Optional notification immediately before an active query is re-executed. Not-yet-consumed batches are discarded automatically; callers that retain an already-consumed prefix should discard it here. Omitting this callback leaves replay enabled and is appropriate for idempotent consumers.

    -
    queryTimeoutMs?: number

    Default per-query deadline. Zero or undefined disables query deadlines. +

    queryTimeoutMs?: number

    Default per-query deadline. Zero or undefined disables query deadlines. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    reconnect?: false | QwpReconnectOptions

    Bounded failover policy. Failover and at-least-once active-query replay +

    reconnect?: false | QwpReconnectOptions

    Bounded failover policy. Failover and at-least-once active-query replay are enabled by default; set false to keep one fixed connection.

    -
    serverInfoTimeoutMs?: number

    SERVER_INFO handshake deadline. Defaults to 5 seconds. Capped at +

    serverInfoTimeoutMs?: number

    SERVER_INFO handshake deadline. Defaults to 5 seconds. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpEgressTransportMetrics.html b/docs/interfaces/_questdb_browser-client.QwpEgressTransportMetrics.html index e9211c7b..41323757 100644 --- a/docs/interfaces/_questdb_browser-client.QwpEgressTransportMetrics.html +++ b/docs/interfaces/_questdb_browser-client.QwpEgressTransportMetrics.html @@ -4,6 +4,6 @@ was unobservable, so a run of discarded events was indistinguishable from a healthy one: attempt resets on every success, so the delivered stream carries no gap to infer from.

    -
    interface QwpEgressTransportMetrics {
        deliveredConnectionNotifications: number;
        droppedConnectionNotifications: number;
    }
    Index

    Properties

    interface QwpEgressTransportMetrics {
        deliveredConnectionNotifications: number;
        droppedConnectionNotifications: number;
    }
    Index

    Properties

    deliveredConnectionNotifications: number
    droppedConnectionNotifications: number
    +

    Properties

    deliveredConnectionNotifications: number
    droppedConnectionNotifications: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpEgressViewQuery.html b/docs/interfaces/_questdb_browser-client.QwpEgressViewQuery.html index 8f4dfe50..a498ddf9 100644 --- a/docs/interfaces/_questdb_browser-client.QwpEgressViewQuery.html +++ b/docs/interfaces/_questdb_browser-client.QwpEgressViewQuery.html @@ -1,9 +1,9 @@ QwpEgressViewQuery | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressViewQuery

    Control handle returned by queryViews().

    -
    interface QwpEgressViewQuery {
        completion: Promise<QwpQueryCompletion>;
        requestId: bigint;
        awaitCompletion(timeoutMs: number): Promise<boolean>;
        cancel(): Promise<void>;
        grantCredit(additionalBytes: number | bigint): Promise<void>;
        isDone(): boolean;
    }
    Index

    Properties

    interface QwpEgressViewQuery {
        completion: Promise<QwpQueryCompletion>;
        requestId: bigint;
        awaitCompletion(timeoutMs: number): Promise<boolean>;
        cancel(): Promise<void>;
        grantCredit(additionalBytes: number | bigint): Promise<void>;
        isDone(): boolean;
    }
    Index

    Properties

    completion: Promise<QwpQueryCompletion>
    requestId: bigint

    Methods

    +

    Properties

    completion: Promise<QwpQueryCompletion>
    requestId: bigint

    Methods

    diff --git a/docs/interfaces/_questdb_browser-client.QwpEncodedBinds.html b/docs/interfaces/_questdb_browser-client.QwpEncodedBinds.html index b976803e..f645e029 100644 --- a/docs/interfaces/_questdb_browser-client.QwpEncodedBinds.html +++ b/docs/interfaces/_questdb_browser-client.QwpEncodedBinds.html @@ -1,3 +1,3 @@ -QwpEncodedBinds | QuestDB JavaScript Client - v5.0.0
    interface QwpEncodedBinds {
        count: number;
        payload: Uint8Array;
    }
    Index

    Properties

    count +QwpEncodedBinds | QuestDB JavaScript Client - v5.0.0
    interface QwpEncodedBinds {
        count: number;
        payload: Uint8Array;
    }
    Index

    Properties

    Properties

    count: number
    payload: Uint8Array
    +

    Properties

    count: number
    payload: Uint8Array
    diff --git a/docs/interfaces/_questdb_browser-client.QwpExecDoneMessage.html b/docs/interfaces/_questdb_browser-client.QwpExecDoneMessage.html index 4409924a..13a9e09b 100644 --- a/docs/interfaces/_questdb_browser-client.QwpExecDoneMessage.html +++ b/docs/interfaces/_questdb_browser-client.QwpExecDoneMessage.html @@ -1,4 +1,4 @@ -QwpExecDoneMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpExecDoneMessage

    interface QwpExecDoneMessage {
        flags: number;
        kind: "exec-done";
        operationType: number;
        payloadLength: number;
        requestId: bigint;
        rowsAffected: bigint;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags +QwpExecDoneMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpExecDoneMessage

    interface QwpExecDoneMessage {
        flags: number;
        kind: "exec-done";
        operationType: number;
        payloadLength: number;
        requestId: bigint;
        rowsAffected: bigint;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags: number
    kind: "exec-done"
    operationType: number
    payloadLength: number
    requestId: bigint
    rowsAffected: bigint
    tableCount: number
    version: number
    +

    Properties

    flags: number
    kind: "exec-done"
    operationType: number
    payloadLength: number
    requestId: bigint
    rowsAffected: bigint
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpFailoverAttempt.html b/docs/interfaces/_questdb_browser-client.QwpFailoverAttempt.html index a2d67e00..737e85fd 100644 --- a/docs/interfaces/_questdb_browser-client.QwpFailoverAttempt.html +++ b/docs/interfaces/_questdb_browser-client.QwpFailoverAttempt.html @@ -1,3 +1,3 @@ -QwpFailoverAttempt | QuestDB JavaScript Client - v5.0.0

    Interface QwpFailoverAttempt

    interface QwpFailoverAttempt {
        endpoint: string | URL;
        error: unknown;
    }
    Index

    Properties

    endpoint +QwpFailoverAttempt | QuestDB JavaScript Client - v5.0.0

    Interface QwpFailoverAttempt

    interface QwpFailoverAttempt {
        endpoint: string | URL;
        error: unknown;
    }
    Index

    Properties

    Properties

    endpoint: string | URL
    error: unknown
    +

    Properties

    endpoint: string | URL
    error: unknown
    diff --git a/docs/interfaces/_questdb_browser-client.QwpFrame.html b/docs/interfaces/_questdb_browser-client.QwpFrame.html index d7f6ef8e..5502f5f7 100644 --- a/docs/interfaces/_questdb_browser-client.QwpFrame.html +++ b/docs/interfaces/_questdb_browser-client.QwpFrame.html @@ -1,6 +1,6 @@ -QwpFrame | QuestDB JavaScript Client - v5.0.0
    interface QwpFrame {
        flags: number;
        payload: Uint8Array;
        payloadLength: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags +QwpFrame | QuestDB JavaScript Client - v5.0.0
    interface QwpFrame {
        flags: number;
        payload: Uint8Array;
        payloadLength: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags: number
    payload: Uint8Array
    payloadLength: number
    tableCount: number
    version: number
    +

    Properties

    flags: number
    payload: Uint8Array
    payloadLength: number
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpFrameHeader.html b/docs/interfaces/_questdb_browser-client.QwpFrameHeader.html index 4a67eb69..27254d5b 100644 --- a/docs/interfaces/_questdb_browser-client.QwpFrameHeader.html +++ b/docs/interfaces/_questdb_browser-client.QwpFrameHeader.html @@ -1,5 +1,5 @@ -QwpFrameHeader | QuestDB JavaScript Client - v5.0.0
    interface QwpFrameHeader {
        flags: number;
        payloadLength: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags +QwpFrameHeader | QuestDB JavaScript Client - v5.0.0
    interface QwpFrameHeader {
        flags: number;
        payloadLength: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags: number
    payloadLength: number
    tableCount: number
    version: number
    +

    Properties

    flags: number
    payloadLength: number
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpGeohashValue.html b/docs/interfaces/_questdb_browser-client.QwpGeohashValue.html index 9708d3d4..9b30448b 100644 --- a/docs/interfaces/_questdb_browser-client.QwpGeohashValue.html +++ b/docs/interfaces/_questdb_browser-client.QwpGeohashValue.html @@ -1,3 +1,3 @@ -QwpGeohashValue | QuestDB JavaScript Client - v5.0.0
    interface QwpGeohashValue {
        bits: bigint;
        precisionBits: number;
    }
    Index

    Properties

    bits +QwpGeohashValue | QuestDB JavaScript Client - v5.0.0
    interface QwpGeohashValue {
        bits: bigint;
        precisionBits: number;
    }
    Index

    Properties

    Properties

    bits: bigint
    precisionBits: number
    +

    Properties

    bits: bigint
    precisionBits: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpHandshakeMetadata.html b/docs/interfaces/_questdb_browser-client.QwpHandshakeMetadata.html index 26966a9a..0dd02528 100644 --- a/docs/interfaces/_questdb_browser-client.QwpHandshakeMetadata.html +++ b/docs/interfaces/_questdb_browser-client.QwpHandshakeMetadata.html @@ -1,5 +1,5 @@ QwpHandshakeMetadata | QuestDB JavaScript Client - v5.0.0

    Interface QwpHandshakeMetadata

    Metadata negotiated during the QWP WebSocket upgrade.

    -
    interface QwpHandshakeMetadata {
        contentEncoding?: string;
        durableAckEnabled?: boolean;
        maxBatchSizeBytes?: number;
        negotiatedCompression?: QwpNegotiatedEgressCompression;
        qwpVersion: number;
        serverRole?: string;
        serverZone?: string;
    }
    Index

    Properties

    interface QwpHandshakeMetadata {
        contentEncoding?: string;
        durableAckEnabled?: boolean;
        maxBatchSizeBytes?: number;
        negotiatedCompression?: QwpNegotiatedEgressCompression;
        qwpVersion: number;
        serverRole?: string;
        serverZone?: string;
    }
    Index

    Properties

    contentEncoding?: string

    Server-selected egress content encoding, when advertised.

    -
    durableAckEnabled?: boolean

    Whether the server confirmed durable-ACK support.

    -
    maxBatchSizeBytes?: number

    Server's hard ingress WebSocket-payload cap, when advertised.

    -
    negotiatedCompression?: QwpNegotiatedEgressCompression

    Parsed effective egress codec and level selected by the server.

    -
    qwpVersion: number

    QWP protocol version selected by the server.

    -
    serverRole?: string

    Server role advertised on a successful upgrade, when available.

    -
    serverZone?: string

    Server zone advertised on a successful upgrade, when available.

    -
    +
    durableAckEnabled?: boolean

    Whether the server confirmed durable-ACK support.

    +
    maxBatchSizeBytes?: number

    Server's hard ingress WebSocket-payload cap, when advertised.

    +
    negotiatedCompression?: QwpNegotiatedEgressCompression

    Parsed effective egress codec and level selected by the server.

    +
    qwpVersion: number

    QWP protocol version selected by the server.

    +
    serverRole?: string

    Server role advertised on a successful upgrade, when available.

    +
    serverZone?: string

    Server zone advertised on a successful upgrade, when available.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressEncodeOptions.html b/docs/interfaces/_questdb_browser-client.QwpIngressEncodeOptions.html index e9745293..2b895694 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressEncodeOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressEncodeOptions.html @@ -1,7 +1,7 @@ -QwpIngressEncodeOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressEncodeOptions

    interface QwpIngressEncodeOptions {
        confirmedMaxSymbolId?: number;
        deferCommit?: boolean;
        dictionary?: QwpSymbolDictionary;
        gorilla?: boolean;
    }
    Index

    Properties

    confirmedMaxSymbolId? +QwpIngressEncodeOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressEncodeOptions

    interface QwpIngressEncodeOptions {
        confirmedMaxSymbolId?: number;
        deferCommit?: boolean;
        dictionary?: QwpSymbolDictionary;
        gorilla?: boolean;
    }
    Index

    Properties

    confirmedMaxSymbolId?: number

    Highest global symbol ID already published on this logical connection.

    -
    deferCommit?: boolean
    dictionary?: QwpSymbolDictionary

    Present means connection-scoped delta dictionary mode.

    -
    gorilla?: boolean
    +
    deferCommit?: boolean
    dictionary?: QwpSymbolDictionary

    Present means connection-scoped delta dictionary mode.

    +
    gorilla?: boolean
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressErrorEvent.html b/docs/interfaces/_questdb_browser-client.QwpIngressErrorEvent.html index 6c60a59b..12f97364 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressErrorEvent.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressErrorEvent.html @@ -1,8 +1,8 @@ -QwpIngressErrorEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressErrorEvent

    interface QwpIngressErrorEvent {
        error: Error;
        metrics: QwpIngressMetrics;
        response?: QwpIngressResponse;
        senderError?: QwpSenderError;
        terminal: boolean;
        timestampMs: number;
    }
    Index

    Properties

    error +QwpIngressErrorEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressErrorEvent

    interface QwpIngressErrorEvent {
        error: Error;
        metrics: QwpIngressMetrics;
        response?: QwpIngressResponse;
        senderError?: QwpSenderError;
        terminal: boolean;
        timestampMs: number;
    }
    Index

    Properties

    error: Error
    senderError?: QwpSenderError

    Present for a classified server rejection.

    -
    terminal: boolean
    timestampMs: number
    +

    Properties

    error: Error
    senderError?: QwpSenderError

    Present for a classified server rejection.

    +
    terminal: boolean
    timestampMs: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressMetrics.html b/docs/interfaces/_questdb_browser-client.QwpIngressMetrics.html index d6f0fbd7..24e45294 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressMetrics.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressMetrics.html @@ -1,5 +1,5 @@ QwpIngressMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressMetrics

    Immutable point-in-time ingress telemetry, safe in browsers and Node.js.

    -
    interface QwpIngressMetrics {
        acknowledgedSequence: bigint;
        deliveredConnectionNotifications: number;
        deliveredErrorNotifications: number;
        deliveredProgressNotifications: number;
        droppedConnectionNotifications: number;
        droppedErrorNotifications: number;
        droppedProgressNotifications: number;
        lastError?: Error;
        memoryReplayMaxBytes?: number;
        memoryReplayUsedBytes?: number;
        pendingDurableTables: number;
        pendingReplayBytes: number;
        pendingReplayFrames: number;
        pendingResponseBytes: number;
        pendingResponses: number;
        publishedSequence: bigint;
        replayAcknowledgedFrameSequence?: bigint;
        replayPublishedFrameSequence?: bigint;
        totalAcks: number;
        totalBytesPublished: number;
        totalBytesReplayed: number;
        totalBytesSent: number;
        totalDurableAcks: number;
        totalErrors: number;
        totalFailovers: number;
        totalFramesPublished: number;
        totalFramesReplayed: number;
        totalFramesSent: number;
        totalMemoryReplayAppendTimeouts: number;
        totalMemoryReplayBackpressureStalls: number;
        totalNacks: number;
        totalReconnectAttempts: number;
        totalReconnectErrors: number;
        totalReconnectsSucceeded: number;
        waitingMemoryReplayAppends: number;
    }
    Index

    Properties

    interface QwpIngressMetrics {
        acknowledgedSequence: bigint;
        deliveredConnectionNotifications: number;
        deliveredErrorNotifications: number;
        deliveredProgressNotifications: number;
        droppedConnectionNotifications: number;
        droppedErrorNotifications: number;
        droppedProgressNotifications: number;
        lastError?: Error;
        memoryReplayMaxBytes?: number;
        memoryReplayUsedBytes?: number;
        pendingDurableTables: number;
        pendingReplayBytes: number;
        pendingReplayFrames: number;
        pendingResponseBytes: number;
        pendingResponses: number;
        publishedSequence: bigint;
        replayAcknowledgedFrameSequence?: bigint;
        replayPublishedFrameSequence?: bigint;
        totalAcks: number;
        totalBytesPublished: number;
        totalBytesReplayed: number;
        totalBytesSent: number;
        totalDurableAcks: number;
        totalErrors: number;
        totalFailovers: number;
        totalFramesPublished: number;
        totalFramesReplayed: number;
        totalFramesSent: number;
        totalMemoryReplayAppendTimeouts: number;
        totalMemoryReplayBackpressureStalls: number;
        totalNacks: number;
        totalReconnectAttempts: number;
        totalReconnectErrors: number;
        totalReconnectsSucceeded: number;
        waitingMemoryReplayAppends: number;
    }
    Index

    Properties

    acknowledgedSequence: bigint

    Highest client-session sequence covered by a successful cumulative ACK.

    -
    deliveredConnectionNotifications: number
    deliveredErrorNotifications: number
    deliveredProgressNotifications: number
    droppedConnectionNotifications: number
    droppedErrorNotifications: number
    droppedProgressNotifications: number
    lastError?: Error
    memoryReplayMaxBytes?: number
    memoryReplayUsedBytes?: number
    pendingDurableTables: number
    pendingReplayBytes: number
    pendingReplayFrames: number
    pendingResponseBytes: number
    pendingResponses: number
    publishedSequence: bigint

    Highest client-session sequence allocated, or -1 before the first send.

    -
    replayAcknowledgedFrameSequence?: bigint

    Trim watermark; in durable-ACK mode it advances only after durability.

    -
    replayPublishedFrameSequence?: bigint

    Stable store-and-forward watermark; absent without reconnect/replay.

    -
    totalAcks: number
    totalBytesPublished: number
    totalBytesReplayed: number
    totalBytesSent: number
    totalDurableAcks: number
    totalErrors: number
    totalFailovers: number
    totalFramesPublished: number
    totalFramesReplayed: number
    totalFramesSent: number

    Physical sends; includes replay and dictionary catch-up when available.

    -
    totalMemoryReplayAppendTimeouts: number
    totalMemoryReplayBackpressureStalls: number
    totalNacks: number
    totalReconnectAttempts: number
    totalReconnectErrors: number
    totalReconnectsSucceeded: number
    waitingMemoryReplayAppends: number
    +
    deliveredConnectionNotifications: number
    deliveredErrorNotifications: number
    deliveredProgressNotifications: number
    droppedConnectionNotifications: number
    droppedErrorNotifications: number
    droppedProgressNotifications: number
    lastError?: Error
    memoryReplayMaxBytes?: number
    memoryReplayUsedBytes?: number
    pendingDurableTables: number
    pendingReplayBytes: number
    pendingReplayFrames: number
    pendingResponseBytes: number
    pendingResponses: number
    publishedSequence: bigint

    Highest client-session sequence allocated, or -1 before the first send.

    +
    replayAcknowledgedFrameSequence?: bigint

    Trim watermark; in durable-ACK mode it advances only after durability.

    +
    replayPublishedFrameSequence?: bigint

    Stable store-and-forward watermark; absent without reconnect/replay.

    +
    totalAcks: number
    totalBytesPublished: number
    totalBytesReplayed: number
    totalBytesSent: number
    totalDurableAcks: number
    totalErrors: number
    totalFailovers: number
    totalFramesPublished: number
    totalFramesReplayed: number
    totalFramesSent: number

    Physical sends; includes replay and dictionary catch-up when available.

    +
    totalMemoryReplayAppendTimeouts: number
    totalMemoryReplayBackpressureStalls: number
    totalNacks: number
    totalReconnectAttempts: number
    totalReconnectErrors: number
    totalReconnectsSucceeded: number
    waitingMemoryReplayAppends: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressProgressEvent.html b/docs/interfaces/_questdb_browser-client.QwpIngressProgressEvent.html index 4615204f..a6d5395c 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressProgressEvent.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressProgressEvent.html @@ -1,6 +1,6 @@ -QwpIngressProgressEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressProgressEvent

    interface QwpIngressProgressEvent {
        kind: QwpIngressProgressKind;
        metrics: QwpIngressMetrics;
        response?: QwpIngressResponse;
        sequence?: bigint;
        timestampMs: number;
    }
    Index

    Properties

    kind +QwpIngressProgressEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressProgressEvent

    interface QwpIngressProgressEvent {
        kind: QwpIngressProgressKind;
        metrics: QwpIngressMetrics;
        response?: QwpIngressResponse;
        sequence?: bigint;
        timestampMs: number;
    }
    Index

    Properties

    sequence?: bigint
    timestampMs: number
    +

    Properties

    sequence?: bigint
    timestampMs: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressReplayRecord.html b/docs/interfaces/_questdb_browser-client.QwpIngressReplayRecord.html index 469ba63b..8308003e 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressReplayRecord.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressReplayRecord.html @@ -1,3 +1,3 @@ -QwpIngressReplayRecord | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressReplayRecord

    interface QwpIngressReplayRecord {
        frameSequence: bigint;
        payload: Uint8Array;
    }
    Index

    Properties

    frameSequence +QwpIngressReplayRecord | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressReplayRecord

    interface QwpIngressReplayRecord {
        frameSequence: bigint;
        payload: Uint8Array;
    }
    Index

    Properties

    frameSequence: bigint
    payload: Uint8Array
    +

    Properties

    frameSequence: bigint
    payload: Uint8Array
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressReplayReference.html b/docs/interfaces/_questdb_browser-client.QwpIngressReplayReference.html index 236ec2b6..502fad30 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressReplayReference.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressReplayReference.html @@ -1,4 +1,4 @@ QwpIngressReplayReference | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressReplayReference

    Lightweight durable-frame descriptor used by disk-backed replay stores.

    -
    interface QwpIngressReplayReference {
        frameSequence: bigint;
        payloadLength: number;
    }
    Index

    Properties

    interface QwpIngressReplayReference {
        frameSequence: bigint;
        payloadLength: number;
    }
    Index

    Properties

    frameSequence: bigint
    payloadLength: number
    +

    Properties

    frameSequence: bigint
    payloadLength: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressReplayStore.html b/docs/interfaces/_questdb_browser-client.QwpIngressReplayStore.html index 4d7bbada..626d0547 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressReplayStore.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressReplayStore.html @@ -1,5 +1,5 @@ QwpIngressReplayStore | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressReplayStore

    Browser-safe abstraction; Node supplies a persistent filesystem implementation.

    -
    interface QwpIngressReplayStore {
        acknowledgeThrough(frameSequence: bigint): Promise<void>;
        append(record: QwpIngressReplayRecord): Promise<void>;
        appendSymbolDictionary(
            startId: number,
            entries: readonly string[],
        ): Promise<void>;
        close(): Promise<void>;
        discardThrough(frameSequence: bigint): Promise<void>;
        load(): Promise<readonly QwpIngressReplayRecord[]>;
        loadReferences(): Promise<readonly QwpIngressReplayReference[]>;
        loadSymbolDictionary(): Promise<readonly string[]>;
        prepareAppendBatch(
            payloads: readonly Uint8Array<ArrayBufferLike>[],
        ): Promise<void>;
        readPayload(frameSequence: bigint): Promise<Uint8Array<ArrayBufferLike>>;
        replaceSymbolDictionary(entries: readonly string[]): Promise<void>;
    }
    Index

    Methods

    interface QwpIngressReplayStore {
        acknowledgeThrough(frameSequence: bigint): Promise<void>;
        append(record: QwpIngressReplayRecord): Promise<void>;
        appendSymbolDictionary(
            startId: number,
            entries: readonly string[],
        ): Promise<void>;
        close(): Promise<void>;
        discardThrough(frameSequence: bigint): Promise<void>;
        load(): Promise<readonly QwpIngressReplayRecord[]>;
        loadReferences(): Promise<readonly QwpIngressReplayReference[]>;
        loadSymbolDictionary(): Promise<readonly string[]>;
        prepareAppendBatch(
            payloads: readonly Uint8Array<ArrayBufferLike>[],
        ): Promise<void>;
        readPayload(frameSequence: bigint): Promise<Uint8Array<ArrayBufferLike>>;
        replaceSymbolDictionary(entries: readonly string[]): Promise<void>;
    }
    Index

    Methods

    • Persists new dense entries before a delta frame is made replayable.

      -

      Parameters

      • startId: number
      • entries: readonly string[]

      Returns Promise<void>

    • Internal

      Removes a local prefix without representing it as a server ACK. +

    Methods

    • Persists new dense entries before a delta frame is made replayable.

      +

      Parameters

      • startId: number
      • entries: readonly string[]

      Returns Promise<void>

    • Internal

      Removes a local prefix without representing it as a server ACK. Persistent stores should provide this when recovery can abandon frames.

      "Without representing it as a server ACK" is about the transport's public watermark, which the caller leaves alone. The removal itself must be as durable as acknowledgeThrough's: a discarded prefix that a later load() can still see is a prefix this client reported abandoned and then sent anyway.

      -

      Parameters

      • frameSequence: bigint

      Returns Promise<void>

    • Internal

      Waits until every payload in one logical batch can be appended without an ACK between frames. Implementations must not mutate the journal.

      -

      Parameters

      • payloads: readonly Uint8Array<ArrayBufferLike>[]

      Returns Promise<void>

    • Reads one previously loaded durable payload on demand.

      -

      Parameters

      • frameSequence: bigint

      Returns Promise<Uint8Array<ArrayBufferLike>>

    • Atomically replaces an unusable dictionary after surviving committed +

      Parameters

      • payloads: readonly Uint8Array<ArrayBufferLike>[]

      Returns Promise<void>

    • Reads one previously loaded durable payload on demand.

      +

      Parameters

      • frameSequence: bigint

      Returns Promise<Uint8Array<ArrayBufferLike>>

    • Atomically replaces an unusable dictionary after surviving committed frames prove that its complete ID space can be reconstructed.

      -

      Parameters

      • entries: readonly string[]

      Returns Promise<void>

    +

    Parameters

    • entries: readonly string[]

    Returns Promise<void>

    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressResponse.html b/docs/interfaces/_questdb_browser-client.QwpIngressResponse.html index 03175624..cb7980fc 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressResponse.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressResponse.html @@ -1,5 +1,5 @@ -QwpIngressResponse | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressResponse

    interface QwpIngressResponse {
        errorMessage?: string;
        sequence: null | bigint;
        status: number;
        tables: QwpIngressTableResult[];
    }
    Index

    Properties

    errorMessage? +QwpIngressResponse | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressResponse

    interface QwpIngressResponse {
        errorMessage?: string;
        sequence: null | bigint;
        status: number;
        tables: QwpIngressTableResult[];
    }
    Index

    Properties

    errorMessage?: string
    sequence: null | bigint
    status: number
    +

    Properties

    errorMessage?: string
    sequence: null | bigint
    status: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressSendResult.html b/docs/interfaces/_questdb_browser-client.QwpIngressSendResult.html index 75a62812..d0ac4a15 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressSendResult.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressSendResult.html @@ -2,10 +2,10 @@ completion. Publication resolves after every physical frame belonging to the logical batch has been accepted by the connection. For persistent Node transports that means the frames are durable in the replay journal.

    -
    interface QwpIngressSendResult {
        acknowledgement: Promise<QwpIngressResponse>;
        publication: Promise<void>;
        sequence: bigint;
    }
    Index

    Properties

    interface QwpIngressSendResult {
        acknowledgement: Promise<QwpIngressResponse>;
        publication: Promise<void>;
        sequence: bigint;
    }
    Index

    Properties

    acknowledgement: Promise<QwpIngressResponse>

    Cumulative server response for every frame in the logical batch.

    -
    publication: Promise<void>

    Local transport/journal ownership boundary.

    -
    sequence: bigint

    Last client-session sequence allocated to this logical batch.

    -
    +
    publication: Promise<void>

    Local transport/journal ownership boundary.

    +
    sequence: bigint

    Last client-session sequence allocated to this logical batch.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressServerInfo.html b/docs/interfaces/_questdb_browser-client.QwpIngressServerInfo.html index 97caec38..66592715 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressServerInfo.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressServerInfo.html @@ -1,8 +1,8 @@ QwpIngressServerInfo | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressServerInfo

    What the browser-requested ingress SERVER_INFO frame reports.

    -
    interface QwpIngressServerInfo {
        durableAckEnabled: boolean;
        maxBatchSizeBytes: number;
    }
    Index

    Properties

    interface QwpIngressServerInfo {
        durableAckEnabled: boolean;
        maxBatchSizeBytes: number;
    }
    Index

    Properties

    durableAckEnabled: boolean

    Whether this connection negotiated durable acknowledgements. This is the only durable-ACK verdict a browser can read: the confirmation header is invisible to page JavaScript and the subprotocol echo confirms the negotiation dialect, not the capability.

    -
    maxBatchSizeBytes: number
    +
    maxBatchSizeBytes: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressSessionOptions.html b/docs/interfaces/_questdb_browser-client.QwpIngressSessionOptions.html index 092f7d76..13e92c17 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressSessionOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressSessionOptions.html @@ -1,4 +1,4 @@ -QwpIngressSessionOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressSessionOptions

    interface QwpIngressSessionOptions {
        ackTimeoutMs?: number;
        backgroundStoreAndForward?: boolean;
        catchUpCapGapMinEscalationWindowMs?: number;
        connectionListenerInboxCapacity?: number;
        durableAckKeepaliveMs?: number;
        errorInboxCapacity?: number;
        initialConnectMode?: QwpInitialConnectMode;
        maxBatchSizeBytes?: number;
        memoryReplayAppendDeadlineMs?: number;
        memoryReplayMaxBytes?: number;
        onDurableAck?: (response: QwpIngressResponse) => void;
        onError?: (event: QwpIngressErrorEvent) => void;
        onProgress?: (event: QwpIngressProgressEvent) => void;
        onResponse?: (response: QwpIngressResponse) => void;
        onSenderError?: (error: QwpSenderError) => void;
        orphanDurableAckMismatchMaxDurationMs?: number;
        orphanStoreAndForward?: boolean;
        reconnect?: false | QwpReconnectOptions;
        replayStore?: QwpIngressReplayStore;
    }
    Index

    Properties

    ackTimeoutMs? +QwpIngressSessionOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressSessionOptions

    interface QwpIngressSessionOptions {
        ackTimeoutMs?: number;
        backgroundStoreAndForward?: boolean;
        catchUpCapGapMinEscalationWindowMs?: number;
        connectionListenerInboxCapacity?: number;
        durableAckKeepaliveMs?: number;
        errorInboxCapacity?: number;
        initialConnectMode?: QwpInitialConnectMode;
        maxBatchSizeBytes?: number;
        memoryReplayAppendDeadlineMs?: number;
        memoryReplayMaxBytes?: number;
        onDurableAck?: (response: QwpIngressResponse) => void;
        onError?: (event: QwpIngressErrorEvent) => void;
        onProgress?: (event: QwpIngressProgressEvent) => void;
        onResponse?: (response: QwpIngressResponse) => void;
        onSenderError?: (error: QwpSenderError) => void;
        orphanDurableAckMismatchMaxDurationMs?: number;
        orphanStoreAndForward?: boolean;
        reconnect?: false | QwpReconnectOptions;
        replayStore?: QwpIngressReplayStore;
    }
    Index

    Properties

    ackTimeoutMs?: number

    Per-frame ACK deadline. Defaults to 15 seconds. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    backgroundStoreAndForward?: boolean

    Starts memory or persistent replay without waiting for a server.

    -
    catchUpCapGapMinEscalationWindowMs?: number

    Minimum cap-gap dwell before an orphan can be quarantined. +

    backgroundStoreAndForward?: boolean

    Starts memory or persistent replay without waiting for a server.

    +
    catchUpCapGapMinEscalationWindowMs?: number

    Minimum cap-gap dwell before an orphan can be quarantined. Not capped at the host timer ceiling: compared against elapsed time only.

    -
    connectionListenerInboxCapacity?: number

    Bounded reconnect-listener inbox. Oldest pending events are dropped when +

    connectionListenerInboxCapacity?: number

    Bounded reconnect-listener inbox. Oldest pending events are dropped when full. Defaults to 64, matching the Java client.

    -
    durableAckKeepaliveMs?: number

    Enables durable-ACK tracking. While committed table transactions await +

    durableAckKeepaliveMs?: number

    Enables durable-ACK tracking. While committed table transactions await durable upload, Node transports send WebSocket PING frames and browser transports send table-less QWP poll frames. Zero keeps tracking enabled but disables automatic polling. Factory-created browser sessions require requestDurableAck=true when this option is supplied. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    errorInboxCapacity?: number

    Bounded typed/legacy error inbox. Oldest pending errors are dropped when +

    errorInboxCapacity?: number

    Bounded typed/legacy error inbox. Oldest pending errors are dropped when full. Defaults to 256, matching the Java client.

    -
    initialConnectMode?: QwpInitialConnectMode

    Initial connection policy supplied by the Node adapter.

    -
    maxBatchSizeBytes?: number

    Optional local ingress frame cap. Browsers cannot read WebSocket upgrade +

    initialConnectMode?: QwpInitialConnectMode

    Initial connection policy supplied by the Node adapter.

    +
    maxBatchSizeBytes?: number

    Optional local ingress frame cap. Browsers cannot read WebSocket upgrade headers, so browser applications should set this to the server's configured QWP cap. When the server also advertises a cap, the smaller value wins. Table batches are split at row boundaries automatically; an individual row that cannot fit is rejected with QwpBatchTooLargeError before it is sent.

    -
    memoryReplayAppendDeadlineMs?: number

    Maximum time a memory replay append waits for ACK-driven trimming after +

    memoryReplayAppendDeadlineMs?: number

    Maximum time a memory replay append waits for ACK-driven trimming after reaching memoryReplayMaxBytes. Defaults to 30 seconds.

    -
    memoryReplayMaxBytes?: number

    Target cap for the built-in memory-only replay queue, including estimated +

    memoryReplayMaxBytes?: number

    Target cap for the built-in memory-only replay queue, including estimated per-frame bookkeeping. Defaults to 128 MiB. A transaction-closing logical batch may temporarily exceed this target by up to one target-sized batch, because the server cannot ACK its deferred prefix before receiving that batch. This applies in browsers and non-persistent Node sessions; custom replay stores enforce their own cap.

    -
    onDurableAck?: (response: QwpIngressResponse) => void
    onError?: (event: QwpIngressErrorEvent) => void

    Server rejections, deadlines, and terminal session failures.

    -
    onProgress?: (event: QwpIngressProgressEvent) => void

    Monotonic send/accept/durability notifications. Callback errors are ignored.

    -
    onResponse?: (response: QwpIngressResponse) => void
    onSenderError?: (error: QwpSenderError) => void

    Java-parity typed server-rejection and data-loss notifications. When +

    onDurableAck?: (response: QwpIngressResponse) => void
    onError?: (event: QwpIngressErrorEvent) => void

    Server rejections, deadlines, and terminal session failures.

    +
    onProgress?: (event: QwpIngressProgressEvent) => void

    Monotonic send/accept/durability notifications. Callback errors are ignored.

    +
    onResponse?: (response: QwpIngressResponse) => void
    onSenderError?: (error: QwpSenderError) => void

    Java-parity typed server-rejection and data-loss notifications. When omitted, the default handler logs retriable errors at warn and terminal errors or abandoned data at error.

    -
    orphanDurableAckMismatchMaxDurationMs?: number

    Consecutive durable-ACK gap budget retained for orphan SF. +

    orphanDurableAckMismatchMaxDurationMs?: number

    Consecutive durable-ACK gap budget retained for orphan SF. Not capped at the host timer ceiling: compared against elapsed time only.

    -
    orphanStoreAndForward?: boolean

    Orphan sessions may quarantine persistent catch-up cap gaps.

    -
    reconnect?: false | QwpReconnectOptions

    Bounded reconnection and at-least-once replay policy. Reconnection is +

    orphanStoreAndForward?: boolean

    Orphan sessions may quarantine persistent catch-up cap gaps.

    +
    reconnect?: false | QwpReconnectOptions

    Bounded reconnection and at-least-once replay policy. Reconnection is enabled by default for factory-created sessions; set false to keep one fixed connection. Browser and non-persistent Node replay is memory-only.

    An ACK lost during disconnect can cause a frame to be replayed after the server accepted it; configure server-side deduplication when duplicates are not acceptable.

    -
    replayStore?: QwpIngressReplayStore

    Node adapter hook for persistent store-and-forward.

    -
    +
    replayStore?: QwpIngressReplayStore

    Node adapter hook for persistent store-and-forward.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressSymbolDictionaryDelta.html b/docs/interfaces/_questdb_browser-client.QwpIngressSymbolDictionaryDelta.html index 6cc565f4..1c8eff40 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressSymbolDictionaryDelta.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressSymbolDictionaryDelta.html @@ -1,3 +1,3 @@ -QwpIngressSymbolDictionaryDelta | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressSymbolDictionaryDelta

    interface QwpIngressSymbolDictionaryDelta {
        entries: readonly string[];
        startId: number;
    }
    Index

    Properties

    entries +QwpIngressSymbolDictionaryDelta | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressSymbolDictionaryDelta

    interface QwpIngressSymbolDictionaryDelta {
        entries: readonly string[];
        startId: number;
    }
    Index

    Properties

    Properties

    entries: readonly string[]
    startId: number
    +

    Properties

    entries: readonly string[]
    startId: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressTableResult.html b/docs/interfaces/_questdb_browser-client.QwpIngressTableResult.html index 055caf7b..a2859c18 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressTableResult.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressTableResult.html @@ -1,3 +1,3 @@ -QwpIngressTableResult | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressTableResult

    interface QwpIngressTableResult {
        name: string;
        sequenceTransaction: bigint;
    }
    Index

    Properties

    name +QwpIngressTableResult | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressTableResult

    interface QwpIngressTableResult {
        name: string;
        sequenceTransaction: bigint;
    }
    Index

    Properties

    name: string
    sequenceTransaction: bigint
    +

    Properties

    name: string
    sequenceTransaction: bigint
    diff --git a/docs/interfaces/_questdb_browser-client.QwpIngressTransportMetrics.html b/docs/interfaces/_questdb_browser-client.QwpIngressTransportMetrics.html index 0cab75fe..ad1d44af 100644 --- a/docs/interfaces/_questdb_browser-client.QwpIngressTransportMetrics.html +++ b/docs/interfaces/_questdb_browser-client.QwpIngressTransportMetrics.html @@ -1,5 +1,5 @@ QwpIngressTransportMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressTransportMetrics

    Physical ingress delivery counters maintained by reconnecting transports.

    -
    interface QwpIngressTransportMetrics {
        abandonedFrameRanges?: readonly { fromFsn: bigint; toFsn: bigint }[];
        acknowledgedFrameSequence: bigint;
        deliveredConnectionNotifications?: number;
        deliveredErrorNotifications?: number;
        droppedConnectionNotifications?: number;
        droppedErrorNotifications?: number;
        memoryReplayMaxBytes?: number;
        memoryReplayUsedBytes?: number;
        pendingReplayBytes: number;
        pendingReplayFrames: number;
        publishedFrameSequence: bigint;
        totalBytesReplayed: number;
        totalBytesSent: number;
        totalFailovers: number;
        totalFramesReplayed: number;
        totalFramesSent: number;
        totalMemoryReplayAppendTimeouts: number;
        totalMemoryReplayBackpressureStalls: number;
        totalReconnectAttempts: number;
        totalReconnectErrors: number;
        totalReconnectsSucceeded: number;
        totalServerNacks: number;
        waitingMemoryReplayAppends: number;
    }
    Index

    Properties

    interface QwpIngressTransportMetrics {
        abandonedFrameRanges?: readonly { fromFsn: bigint; toFsn: bigint }[];
        acknowledgedFrameSequence: bigint;
        deliveredConnectionNotifications?: number;
        deliveredErrorNotifications?: number;
        droppedConnectionNotifications?: number;
        droppedErrorNotifications?: number;
        memoryReplayMaxBytes?: number;
        memoryReplayUsedBytes?: number;
        pendingReplayBytes: number;
        pendingReplayFrames: number;
        publishedFrameSequence: bigint;
        totalBytesReplayed: number;
        totalBytesSent: number;
        totalFailovers: number;
        totalFramesReplayed: number;
        totalFramesSent: number;
        totalMemoryReplayAppendTimeouts: number;
        totalMemoryReplayBackpressureStalls: number;
        totalReconnectAttempts: number;
        totalReconnectErrors: number;
        totalReconnectsSucceeded: number;
        totalServerNacks: number;
        waitingMemoryReplayAppends: number;
    }
    Index

    Properties

    abandonedFrameRanges?: readonly { fromFsn: bigint; toFsn: bigint }[]

    Stable frame ranges retired without ever receiving a server ACK.

    -
    acknowledgedFrameSequence: bigint

    Highest replay-frame sequence removed after a server acknowledgement.

    -
    deliveredConnectionNotifications?: number
    deliveredErrorNotifications?: number
    droppedConnectionNotifications?: number
    droppedErrorNotifications?: number
    memoryReplayMaxBytes?: number

    Configured cap for the built-in memory replay store.

    -
    memoryReplayUsedBytes?: number

    Estimated payload and record-bookkeeping bytes charged to that cap.

    -
    pendingReplayBytes: number
    pendingReplayFrames: number
    publishedFrameSequence: bigint

    Highest stable replay-frame sequence handed to the transport.

    -
    totalBytesReplayed: number
    totalBytesSent: number
    totalFailovers: number
    totalFramesReplayed: number
    totalFramesSent: number

    Physical WebSocket sends, including replay and dictionary catch-up.

    -
    totalMemoryReplayAppendTimeouts: number
    totalMemoryReplayBackpressureStalls: number
    totalReconnectAttempts: number
    totalReconnectErrors: number
    totalReconnectsSucceeded: number
    totalServerNacks: number
    waitingMemoryReplayAppends: number
    +
    acknowledgedFrameSequence: bigint

    Highest replay-frame sequence removed after a server acknowledgement.

    +
    deliveredConnectionNotifications?: number
    deliveredErrorNotifications?: number
    droppedConnectionNotifications?: number
    droppedErrorNotifications?: number
    memoryReplayMaxBytes?: number

    Configured cap for the built-in memory replay store.

    +
    memoryReplayUsedBytes?: number

    Estimated payload and record-bookkeeping bytes charged to that cap.

    +
    pendingReplayBytes: number
    pendingReplayFrames: number
    publishedFrameSequence: bigint

    Highest stable replay-frame sequence handed to the transport.

    +
    totalBytesReplayed: number
    totalBytesSent: number
    totalFailovers: number
    totalFramesReplayed: number
    totalFramesSent: number

    Physical WebSocket sends, including replay and dictionary catch-up.

    +
    totalMemoryReplayAppendTimeouts: number
    totalMemoryReplayBackpressureStalls: number
    totalReconnectAttempts: number
    totalReconnectErrors: number
    totalReconnectsSucceeded: number
    totalServerNacks: number
    waitingMemoryReplayAppends: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpLong256Value.html b/docs/interfaces/_questdb_browser-client.QwpLong256Value.html index bc018be8..11d02256 100644 --- a/docs/interfaces/_questdb_browser-client.QwpLong256Value.html +++ b/docs/interfaces/_questdb_browser-client.QwpLong256Value.html @@ -1,3 +1,3 @@ -QwpLong256Value | QuestDB JavaScript Client - v5.0.0
    interface QwpLong256Value {
        words: readonly [bigint, bigint, bigint, bigint];
    }
    Index

    Properties

    words +QwpLong256Value | QuestDB JavaScript Client - v5.0.0
    interface QwpLong256Value {
        words: readonly [bigint, bigint, bigint, bigint];
    }
    Index

    Properties

    Properties

    words: readonly [bigint, bigint, bigint, bigint]

    Little-endian 64-bit words; word 0 is least significant.

    -
    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpPoolSlotReservation.html b/docs/interfaces/_questdb_browser-client.QwpPoolSlotReservation.html index 8910bcba..a4ab5061 100644 --- a/docs/interfaces/_questdb_browser-client.QwpPoolSlotReservation.html +++ b/docs/interfaces/_questdb_browser-client.QwpPoolSlotReservation.html @@ -1,5 +1,5 @@ QwpPoolSlotReservation | QuestDB JavaScript Client - v5.0.0

    Interface QwpPoolSlotReservationInternal

    Cross-owner reservation for stable pooled sender slot indexes.

    -
    interface QwpPoolSlotReservation {
        onAvailable(listener: () => void): () => void;
        release(slot: number): void;
        tryReserve(slot: number): boolean;
    }
    Index

    Methods

    interface QwpPoolSlotReservation {
        onAvailable(listener: () => void): () => void;
        release(slot: number): void;
        tryReserve(slot: number): boolean;
    }
    Index

    Methods

    +

    Methods

    diff --git a/docs/interfaces/_questdb_browser-client.QwpQueryErrorMessage.html b/docs/interfaces/_questdb_browser-client.QwpQueryErrorMessage.html index 3a49e6f3..6288b181 100644 --- a/docs/interfaces/_questdb_browser-client.QwpQueryErrorMessage.html +++ b/docs/interfaces/_questdb_browser-client.QwpQueryErrorMessage.html @@ -1,4 +1,4 @@ -QwpQueryErrorMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpQueryErrorMessage

    interface QwpQueryErrorMessage {
        flags: number;
        kind: "query-error";
        message: string;
        payloadLength: number;
        requestId: bigint;
        status: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags +QwpQueryErrorMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpQueryErrorMessage

    interface QwpQueryErrorMessage {
        flags: number;
        kind: "query-error";
        message: string;
        payloadLength: number;
        requestId: bigint;
        status: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags: number
    kind: "query-error"
    message: string
    payloadLength: number
    requestId: bigint
    status: number
    tableCount: number
    version: number
    +

    Properties

    flags: number
    kind: "query-error"
    message: string
    payloadLength: number
    requestId: bigint
    status: number
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpQueryRequest.html b/docs/interfaces/_questdb_browser-client.QwpQueryRequest.html index 7903fd20..5ef7df90 100644 --- a/docs/interfaces/_questdb_browser-client.QwpQueryRequest.html +++ b/docs/interfaces/_questdb_browser-client.QwpQueryRequest.html @@ -1,4 +1,4 @@ -QwpQueryRequest | QuestDB JavaScript Client - v5.0.0
    interface QwpQueryRequest {
        bindCount?: number;
        bindPayload?: Uint8Array<ArrayBufferLike>;
        binds?: QwpBindSetter;
        initialCredit?: number | bigint;
        queryFlags?: number | bigint;
        requestId: number | bigint;
        sql: string;
    }
    Index

    Properties

    bindCount? +QwpQueryRequest | QuestDB JavaScript Client - v5.0.0
    interface QwpQueryRequest {
        bindCount?: number;
        bindPayload?: Uint8Array<ArrayBufferLike>;
        binds?: QwpBindSetter;
        initialCredit?: number | bigint;
        queryFlags?: number | bigint;
        requestId: number | bigint;
        sql: string;
    }
    Index

    Properties

    bindCount?: number

    Advanced escape hatch for an already encoded bind section.

    -
    bindPayload?: Uint8Array<ArrayBufferLike>

    Advanced escape hatch for an already encoded bind section.

    -

    Browser-safe typed positional binds.

    -
    initialCredit?: number | bigint

    Zero means unbounded.

    -
    queryFlags?: number | bigint

    Append only after SERVER_INFO advertises QUERY_FLAGS.

    -
    requestId: number | bigint
    sql: string
    +
    bindPayload?: Uint8Array<ArrayBufferLike>

    Advanced escape hatch for an already encoded bind section.

    +

    Browser-safe typed positional binds.

    +
    initialCredit?: number | bigint

    Zero means unbounded.

    +
    queryFlags?: number | bigint

    Append only after SERVER_INFO advertises QUERY_FLAGS.

    +
    requestId: number | bigint
    sql: string
    diff --git a/docs/interfaces/_questdb_browser-client.QwpReconnectEvent.html b/docs/interfaces/_questdb_browser-client.QwpReconnectEvent.html index a521a6e8..d05ca822 100644 --- a/docs/interfaces/_questdb_browser-client.QwpReconnectEvent.html +++ b/docs/interfaces/_questdb_browser-client.QwpReconnectEvent.html @@ -1,4 +1,4 @@ -QwpReconnectEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpReconnectEvent

    interface QwpReconnectEvent {
        attempt: number;
        cause?: unknown;
        endpoint?: string | URL;
        episodeMs?: number;
        kind: QwpReconnectEventKind;
        previousEndpoint?: string | URL;
        timestampMs: number;
    }
    Index

    Properties

    attempt +QwpReconnectEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpReconnectEvent

    interface QwpReconnectEvent {
        attempt: number;
        cause?: unknown;
        endpoint?: string | URL;
        episodeMs?: number;
        kind: QwpReconnectEventKind;
        previousEndpoint?: string | URL;
        timestampMs: number;
    }
    Index

    Properties

    attempt: number

    One-based reconnect sweep number; zero for lifecycle-only events.

    -
    cause?: unknown
    endpoint?: string | URL
    episodeMs?: number

    Elapsed time in the current consecutive capability-gap episode.

    -
    previousEndpoint?: string | URL
    timestampMs: number
    +
    cause?: unknown
    endpoint?: string | URL
    episodeMs?: number

    Elapsed time in the current consecutive capability-gap episode.

    +
    previousEndpoint?: string | URL
    timestampMs: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpReconnectOptions.html b/docs/interfaces/_questdb_browser-client.QwpReconnectOptions.html index 63cb0e5a..17fdb279 100644 --- a/docs/interfaces/_questdb_browser-client.QwpReconnectOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpReconnectOptions.html @@ -4,7 +4,7 @@

    The ingress defaults favour survival -- a producer holding buffered or journalled rows must outlast an outage rather than give up on it -- while egress bounds a query connection so a caller is not left waiting.

    -
    interface QwpReconnectOptions {
        initialBackoffMs?: number;
        maxAttempts?: number;
        maxBackoffMs?: number;
        maxDurationMs?: number;
        maxFrameRejections?: number;
        onEvent?: (event: QwpReconnectEvent) => void;
        poisonMinEscalationWindowMs?: number;
    }
    Index

    Properties

    interface QwpReconnectOptions {
        initialBackoffMs?: number;
        maxAttempts?: number;
        maxBackoffMs?: number;
        maxDurationMs?: number;
        maxFrameRejections?: number;
        onEvent?: (event: QwpReconnectEvent) => void;
        poisonMinEscalationWindowMs?: number;
    }
    Index

    Properties

    initialBackoffMs?: number

    Full-jitter ceiling before the first failed sweep is retried. Must not exceed 2_147_483_647ms. Ingress defaults to 100ms, egress to 50ms.

    -
    maxAttempts?: number

    Maximum connection sweeps per outage; zero is unlimited. +

    maxAttempts?: number

    Maximum connection sweeps per outage; zero is unlimited. Ingress defaults to zero, egress to 8.

    -
    maxBackoffMs?: number

    Full-jitter exponential-backoff ceiling. Must not exceed +

    maxBackoffMs?: number

    Full-jitter exponential-backoff ceiling. Must not exceed 2_147_483_647ms. Ingress defaults to 5s, egress to 1s.

    -
    maxDurationMs?: number

    Total reconnect deadline; zero disables the deadline. +

    maxDurationMs?: number

    Total reconnect deadline; zero disables the deadline. Ingress defaults to 5 minutes, egress to 30s.

    -
    maxFrameRejections?: number

    Consecutive retriable rejections of one ingress frame before it is treated +

    maxFrameRejections?: number

    Consecutive retriable rejections of one ingress frame before it is treated as poison and retained for inspection. Defaults to 4. Ingress only.

    -
    onEvent?: (event: QwpReconnectEvent) => void
    poisonMinEscalationWindowMs?: number

    Minimum time the same ingress frame must remain suspect before repeated +

    onEvent?: (event: QwpReconnectEvent) => void
    poisonMinEscalationWindowMs?: number

    Minimum time the same ingress frame must remain suspect before repeated rejections or non-orderly closes become terminal. Defaults to 5 minutes; zero escalates as soon as maxFrameRejections is reached. Ingress only.

    -
    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpResourcePoolMetrics.html b/docs/interfaces/_questdb_browser-client.QwpResourcePoolMetrics.html index cf76e4ee..1728a6b4 100644 --- a/docs/interfaces/_questdb_browser-client.QwpResourcePoolMetrics.html +++ b/docs/interfaces/_questdb_browser-client.QwpResourcePoolMetrics.html @@ -1,8 +1,8 @@ -QwpResourcePoolMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpResourcePoolMetrics

    interface QwpResourcePoolMetrics {
        available: number;
        creating: number;
        leased: number;
        maximum: number;
        minimum: number;
        total: number;
        waiting: number;
    }
    Index

    Properties

    available +QwpResourcePoolMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpResourcePoolMetrics

    interface QwpResourcePoolMetrics {
        available: number;
        creating: number;
        leased: number;
        maximum: number;
        minimum: number;
        total: number;
        waiting: number;
    }
    Index

    Properties

    available: number
    creating: number
    leased: number
    maximum: number
    minimum: number
    total: number
    waiting: number
    +

    Properties

    available: number
    creating: number
    leased: number
    maximum: number
    minimum: number
    total: number
    waiting: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpResultArrayValue.html b/docs/interfaces/_questdb_browser-client.QwpResultArrayValue.html index 2c693d93..f0e84c80 100644 --- a/docs/interfaces/_questdb_browser-client.QwpResultArrayValue.html +++ b/docs/interfaces/_questdb_browser-client.QwpResultArrayValue.html @@ -1,3 +1,3 @@ -QwpResultArrayValue | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultArrayValue

    interface QwpResultArrayValue {
        dimensions: readonly number[];
        values: readonly number[] | readonly bigint[];
    }
    Index

    Properties

    dimensions +QwpResultArrayValue | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultArrayValue

    interface QwpResultArrayValue {
        dimensions: readonly number[];
        values: readonly number[] | readonly bigint[];
    }
    Index

    Properties

    Properties

    dimensions: readonly number[]
    values: readonly number[] | readonly bigint[]
    +

    Properties

    dimensions: readonly number[]
    values: readonly number[] | readonly bigint[]
    diff --git a/docs/interfaces/_questdb_browser-client.QwpResultBatchMessage.html b/docs/interfaces/_questdb_browser-client.QwpResultBatchMessage.html index 39d7b2e6..97786318 100644 --- a/docs/interfaces/_questdb_browser-client.QwpResultBatchMessage.html +++ b/docs/interfaces/_questdb_browser-client.QwpResultBatchMessage.html @@ -1,4 +1,4 @@ -QwpResultBatchMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultBatchMessage

    interface QwpResultBatchMessage {
        batchSequence: bigint;
        body: Uint8Array;
        flags: number;
        kind: "result-batch";
        payloadLength: number;
        requestId: bigint;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    batchSequence +QwpResultBatchMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultBatchMessage

    interface QwpResultBatchMessage {
        batchSequence: bigint;
        body: Uint8Array;
        flags: number;
        kind: "result-batch";
        payloadLength: number;
        requestId: bigint;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    batchSequence: bigint
    body: Uint8Array

    Raw or Zstd-compressed delta dictionary and columnar table block; decoded +

    Properties

    batchSequence: bigint
    body: Uint8Array

    Raw or Zstd-compressed delta dictionary and columnar table block; decoded by the batch decoder according to the frame flags.

    -
    flags: number
    kind: "result-batch"
    payloadLength: number
    requestId: bigint
    tableCount: number
    version: number
    +
    flags: number
    kind: "result-batch"
    payloadLength: number
    requestId: bigint
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpResultColumn.html b/docs/interfaces/_questdb_browser-client.QwpResultColumn.html index dc9a0ca0..2279234d 100644 --- a/docs/interfaces/_questdb_browser-client.QwpResultColumn.html +++ b/docs/interfaces/_questdb_browser-client.QwpResultColumn.html @@ -1,6 +1,6 @@ -QwpResultColumn | QuestDB JavaScript Client - v5.0.0
    interface QwpResultColumn {
        name: string;
        precisionBits?: number;
        scale?: number;
        type: QwpColumnType;
        values: readonly QwpResultValue[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    name +QwpResultColumn | QuestDB JavaScript Client - v5.0.0
    interface QwpResultColumn {
        name: string;
        precisionBits?: number;
        scale?: number;
        type: QwpColumnType;
        values: readonly QwpResultValue[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    name: string
    precisionBits?: number
    scale?: number
    values: readonly QwpResultValue[]
    +

    Properties

    name: string
    precisionBits?: number
    scale?: number
    values: readonly QwpResultValue[]
    diff --git a/docs/interfaces/_questdb_browser-client.QwpResultColumnSchema.html b/docs/interfaces/_questdb_browser-client.QwpResultColumnSchema.html index 2bac482c..ffd43d2e 100644 --- a/docs/interfaces/_questdb_browser-client.QwpResultColumnSchema.html +++ b/docs/interfaces/_questdb_browser-client.QwpResultColumnSchema.html @@ -1,3 +1,3 @@ -QwpResultColumnSchema | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultColumnSchema

    interface QwpResultColumnSchema {
        name: string;
        type: QwpColumnType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    name +QwpResultColumnSchema | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultColumnSchema

    interface QwpResultColumnSchema {
        name: string;
        type: QwpColumnType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    name: string
    +

    Properties

    name: string
    diff --git a/docs/interfaces/_questdb_browser-client.QwpResultEndMessage.html b/docs/interfaces/_questdb_browser-client.QwpResultEndMessage.html index 1cbf2d88..8870be4e 100644 --- a/docs/interfaces/_questdb_browser-client.QwpResultEndMessage.html +++ b/docs/interfaces/_questdb_browser-client.QwpResultEndMessage.html @@ -1,4 +1,4 @@ -QwpResultEndMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultEndMessage

    interface QwpResultEndMessage {
        finalSequence: bigint;
        flags: number;
        kind: "result-end";
        payloadLength: number;
        requestId: bigint;
        tableCount: number;
        totalRows: bigint;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    finalSequence +QwpResultEndMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultEndMessage

    interface QwpResultEndMessage {
        finalSequence: bigint;
        flags: number;
        kind: "result-end";
        payloadLength: number;
        requestId: bigint;
        tableCount: number;
        totalRows: bigint;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    finalSequence: bigint
    flags: number
    kind: "result-end"
    payloadLength: number
    requestId: bigint
    tableCount: number
    totalRows: bigint
    version: number
    +

    Properties

    finalSequence: bigint
    flags: number
    kind: "result-end"
    payloadLength: number
    requestId: bigint
    tableCount: number
    totalRows: bigint
    version: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpSenderEncodeOptions.html b/docs/interfaces/_questdb_browser-client.QwpSenderEncodeOptions.html index fa2206ec..cbc8a01e 100644 --- a/docs/interfaces/_questdb_browser-client.QwpSenderEncodeOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpSenderEncodeOptions.html @@ -1,4 +1,4 @@ -QwpSenderEncodeOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderEncodeOptions

    interface QwpSenderEncodeOptions {
        gorilla?: boolean;
        symbolDictionary?: "delta" | "full";
    }

    Hierarchy

    Index

    Properties

    gorilla? +QwpSenderEncodeOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderEncodeOptions

    interface QwpSenderEncodeOptions {
        gorilla?: boolean;
        symbolDictionary?: "delta" | "full";
    }

    Hierarchy

    Index

    Properties

    gorilla?: boolean
    symbolDictionary?: "delta" | "full"

    Connection-scoped deltas are the default; use full to opt out.

    -
    +

    Properties

    gorilla?: boolean
    symbolDictionary?: "delta" | "full"

    Connection-scoped deltas are the default; use full to opt out.

    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpSenderError.html b/docs/interfaces/_questdb_browser-client.QwpSenderError.html index 8ae5fc2c..8a8e8258 100644 --- a/docs/interfaces/_questdb_browser-client.QwpSenderError.html +++ b/docs/interfaces/_questdb_browser-client.QwpSenderError.html @@ -1,5 +1,5 @@ QwpSenderError | QuestDB JavaScript Client - v5.0.0

    Immutable Java-parity context for an ingress rejection or data loss.

    -
    interface QwpSenderError {
        appliedPolicy: QwpSenderErrorPolicy;
        category: QwpSenderErrorCategory;
        detectedAtMs: number;
        fromFsn?: bigint;
        messageSequence?: bigint;
        quarantinedPath?: string;
        serverMessage?: string;
        serverStatusByte?: number;
        tableName?: string;
        toFsn?: bigint;
    }
    Index

    Properties

    interface QwpSenderError {
        appliedPolicy: QwpSenderErrorPolicy;
        category: QwpSenderErrorCategory;
        detectedAtMs: number;
        fromFsn?: bigint;
        messageSequence?: bigint;
        quarantinedPath?: string;
        serverMessage?: string;
        serverStatusByte?: number;
        tableName?: string;
        toFsn?: bigint;
    }
    Index

    Properties

    appliedPolicy: QwpSenderErrorPolicy
    detectedAtMs: number
    fromFsn?: bigint

    Inclusive stable store-and-forward frame-sequence range.

    -
    messageSequence?: bigint
    quarantinedPath?: string

    Preserved on-disk bytes for a data-loss/quarantine notification.

    -
    serverMessage?: string
    serverStatusByte?: number
    tableName?: string
    toFsn?: bigint
    +

    Properties

    appliedPolicy: QwpSenderErrorPolicy
    detectedAtMs: number
    fromFsn?: bigint

    Inclusive stable store-and-forward frame-sequence range.

    +
    messageSequence?: bigint
    quarantinedPath?: string

    Preserved on-disk bytes for a data-loss/quarantine notification.

    +
    serverMessage?: string
    serverStatusByte?: number
    tableName?: string
    toFsn?: bigint
    diff --git a/docs/interfaces/_questdb_browser-client.QwpSenderErrorResponseContext.html b/docs/interfaces/_questdb_browser-client.QwpSenderErrorResponseContext.html index b1d41cff..29ce78a0 100644 --- a/docs/interfaces/_questdb_browser-client.QwpSenderErrorResponseContext.html +++ b/docs/interfaces/_questdb_browser-client.QwpSenderErrorResponseContext.html @@ -1,7 +1,7 @@ -QwpSenderErrorResponseContext | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderErrorResponseContext

    interface QwpSenderErrorResponseContext {
        appliedPolicy?: QwpSenderErrorPolicy;
        detectedAtMs?: number;
        fromFsn?: bigint;
        messageSequence?: bigint;
        tableName?: string;
        toFsn?: bigint;
    }
    Index

    Properties

    appliedPolicy? +QwpSenderErrorResponseContext | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderErrorResponseContext

    interface QwpSenderErrorResponseContext {
        appliedPolicy?: QwpSenderErrorPolicy;
        detectedAtMs?: number;
        fromFsn?: bigint;
        messageSequence?: bigint;
        tableName?: string;
        toFsn?: bigint;
    }
    Index

    Properties

    appliedPolicy?: QwpSenderErrorPolicy
    detectedAtMs?: number
    fromFsn?: bigint
    messageSequence?: bigint
    tableName?: string
    toFsn?: bigint
    +

    Properties

    appliedPolicy?: QwpSenderErrorPolicy
    detectedAtMs?: number
    fromFsn?: bigint
    messageSequence?: bigint
    tableName?: string
    toFsn?: bigint
    diff --git a/docs/interfaces/_questdb_browser-client.QwpSenderMetrics.html b/docs/interfaces/_questdb_browser-client.QwpSenderMetrics.html index f41413e9..abb4f95b 100644 --- a/docs/interfaces/_questdb_browser-client.QwpSenderMetrics.html +++ b/docs/interfaces/_questdb_browser-client.QwpSenderMetrics.html @@ -1,5 +1,5 @@ QwpSenderMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderMetrics

    Immutable high-level sender counters plus the active ingress snapshot.

    -
    interface QwpSenderMetrics {
        autoFlushBytes: number;
        closed: boolean;
        closing: boolean;
        connected: boolean;
        deferredRows: number;
        effectiveAutoFlushBytes: number;
        ingress?: QwpIngressMetrics;
        pendingBytes: number;
        pendingRows: number;
        totalFlushes: number;
        totalFlushFailures: number;
        totalRowsPublished: number;
        totalRowsStaged: number;
        totalTransactionsCommitted: number;
    }
    Index

    Properties

    interface QwpSenderMetrics {
        autoFlushBytes: number;
        closed: boolean;
        closing: boolean;
        connected: boolean;
        deferredRows: number;
        effectiveAutoFlushBytes: number;
        ingress?: QwpIngressMetrics;
        pendingBytes: number;
        pendingRows: number;
        totalFlushes: number;
        totalFlushFailures: number;
        totalRowsPublished: number;
        totalRowsStaged: number;
        totalTransactionsCommitted: number;
    }
    Index

    Properties

    autoFlushBytes: number
    closed: boolean
    closing: boolean
    connected: boolean
    deferredRows: number
    effectiveAutoFlushBytes: number
    pendingBytes: number

    Estimated raw column-buffer bytes currently staged.

    -
    pendingRows: number
    totalFlushes: number
    totalFlushFailures: number
    totalRowsPublished: number

    Rows whose encoded frames have entered the ingress session.

    -
    totalRowsStaged: number
    totalTransactionsCommitted: number
    +

    Properties

    autoFlushBytes: number
    closed: boolean
    closing: boolean
    connected: boolean
    deferredRows: number
    effectiveAutoFlushBytes: number
    pendingBytes: number

    Estimated raw column-buffer bytes currently staged.

    +
    pendingRows: number
    totalFlushes: number
    totalFlushFailures: number
    totalRowsPublished: number

    Rows whose encoded frames have entered the ingress session.

    +
    totalRowsStaged: number
    totalTransactionsCommitted: number
    diff --git a/docs/interfaces/_questdb_browser-client.QwpSenderOptions.html b/docs/interfaces/_questdb_browser-client.QwpSenderOptions.html index d5577dee..df7e3d23 100644 --- a/docs/interfaces/_questdb_browser-client.QwpSenderOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpSenderOptions.html @@ -1,5 +1,5 @@ QwpSenderOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderOptions

    Options for the browser-safe, fluent QWP sender.

    -
    interface QwpSenderOptions {
        autoFlush?: boolean;
        autoFlushBytes?: number;
        autoFlushIntervalMs?: number;
        autoFlushRows?: number;
        awaitDurableAck?: boolean;
        awaitServerAck?: boolean;
        closeFlushTimeoutMs?: number;
        durableAckTimeoutMs?: number;
        encode?: QwpSenderEncodeOptions;
        log?: QwpSenderLogger;
        maxNameLength?: number;
        transactional?: boolean;
    }
    Index

    Properties

    interface QwpSenderOptions {
        autoFlush?: boolean;
        autoFlushBytes?: number;
        autoFlushIntervalMs?: number;
        autoFlushRows?: number;
        awaitDurableAck?: boolean;
        awaitServerAck?: boolean;
        closeFlushTimeoutMs?: number;
        durableAckTimeoutMs?: number;
        encode?: QwpSenderEncodeOptions;
        log?: QwpSenderLogger;
        maxNameLength?: number;
        transactional?: boolean;
    }
    Index

    Properties

    autoFlush?: boolean
    autoFlushBytes?: number

    Soft threshold for estimated buffered column bytes. Zero disables the byte +

    Properties

    autoFlush?: boolean
    autoFlushBytes?: number

    Soft threshold for estimated buffered column bytes. Zero disables the byte trigger. Defaults to zero and is clamped below a connected server's batch cap; exact encoded frames remain subject to the protocol batch limit.

    -
    autoFlushIntervalMs?: number

    Not capped at the host timer ceiling: compared against elapsed time only.

    -
    autoFlushRows?: number
    awaitDurableAck?: boolean

    Wait for durable upload after every successful ingress ACK. When true, +

    autoFlushIntervalMs?: number

    Not capped at the host timer ceiling: compared against elapsed time only.

    +
    autoFlushRows?: number
    awaitDurableAck?: boolean

    Wait for durable upload after every successful ingress ACK. When true, this implies awaitServerAck unless awaitServerAck is explicitly false.

    -
    awaitServerAck?: boolean

    Wait for the server's protocol ACK before flush()/commit() resolves. +

    awaitServerAck?: boolean

    Wait for the server's protocol ACK before flush()/commit() resolves. Defaults to false, matching the Java QWP sender's local-publication boundary. Set this to true for an acknowledgement barrier, or use flushAndGetSequence() followed by waitForAcknowledged().

    -
    closeFlushTimeoutMs?: number

    Maximum time close() spends publishing queued rows and waiting for the +

    closeFlushTimeoutMs?: number

    Maximum time close() spends publishing queued rows and waiting for the server ACK watermark. Zero or a negative value skips the drain. Defaults to 5 seconds. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    durableAckTimeoutMs?: number

    Durable-upload deadline applied after each ingress ACK. Capped at +

    durableAckTimeoutMs?: number

    Durable-upload deadline applied after each ingress ACK. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -

    QWP frame encoding options supported by the high-level sender.

    -
    maxNameLength?: number

    Maximum UTF-8 byte length of table and column names. Defaults to 127.

    -
    transactional?: boolean

    Keep auto-flushed rows in an open server-side transaction. An explicit +

    QWP frame encoding options supported by the high-level sender.

    +
    maxNameLength?: number

    Maximum UTF-8 byte length of table and column names. Defaults to 127.

    +
    transactional?: boolean

    Keep auto-flushed rows in an open server-side transaction. An explicit flush()/commit() closes the transaction. QWP transactions are atomic per table, rather than across every table in a multi-table flush.

    -
    +
    diff --git a/docs/interfaces/_questdb_browser-client.QwpSenderSession.html b/docs/interfaces/_questdb_browser-client.QwpSenderSession.html index 88b467c3..320baeb9 100644 --- a/docs/interfaces/_questdb_browser-client.QwpSenderSession.html +++ b/docs/interfaces/_questdb_browser-client.QwpSenderSession.html @@ -6,7 +6,7 @@ dictionaries, and waitForAcknowledged exposes the ACK watermark. A session that implements only the required members is supported and falls back to sendTables.

    -
    interface QwpSenderSession {
        acknowledgedFrameSequence?: bigint;
        maxBatchSizeBytes?: number;
        metrics?: QwpIngressMetrics;
        publishedFrameSequence?: bigint;
        close(code?: number, reason?: string): Promise<void>;
        publishTables(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): Promise<void>;
        publishTablesDelta(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): Promise<void>;
        sendTables(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): Promise<QwpIngressResponse>;
        sendTablesDelta(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): Promise<QwpIngressResponse>;
        sendTablesDeltaWithPublication(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): QwpIngressSendResult;
        sendTablesWithPublication(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): QwpIngressSendResult;
        waitForAcknowledged(
            targetSequence: bigint,
            timeoutMs?: number,
        ): Promise<void>;
        waitForDurable(
            response: QwpIngressResponse,
            timeoutMs?: number,
        ): Promise<void>;
    }
    Index

    Properties

    interface QwpSenderSession {
        acknowledgedFrameSequence?: bigint;
        maxBatchSizeBytes?: number;
        metrics?: QwpIngressMetrics;
        publishedFrameSequence?: bigint;
        close(code?: number, reason?: string): Promise<void>;
        publishTables(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): Promise<void>;
        publishTablesDelta(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): Promise<void>;
        sendTables(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): Promise<QwpIngressResponse>;
        sendTablesDelta(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): Promise<QwpIngressResponse>;
        sendTablesDeltaWithPublication(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): QwpIngressSendResult;
        sendTablesWithPublication(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): QwpIngressSendResult;
        waitForAcknowledged(
            targetSequence: bigint,
            timeoutMs?: number,
        ): Promise<void>;
        waitForDurable(
            response: QwpIngressResponse,
            timeoutMs?: number,
        ): Promise<void>;
    }
    Index

    Properties

    acknowledgedFrameSequence?: bigint
    maxBatchSizeBytes?: number
    publishedFrameSequence?: bigint

    Methods

    +

    Properties

    acknowledgedFrameSequence?: bigint
    maxBatchSizeBytes?: number
    publishedFrameSequence?: bigint

    Methods

    diff --git a/docs/interfaces/_questdb_browser-client.QwpServerInfoMessage.html b/docs/interfaces/_questdb_browser-client.QwpServerInfoMessage.html index 6c373a27..36e333ea 100644 --- a/docs/interfaces/_questdb_browser-client.QwpServerInfoMessage.html +++ b/docs/interfaces/_questdb_browser-client.QwpServerInfoMessage.html @@ -1,5 +1,5 @@ QwpServerInfoMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpServerInfoMessage

    Immutable endpoint metadata from the most recent successful egress bind.

    -
    interface QwpServerInfoMessage {
        capabilities: number;
        clusterId: string;
        compressionCodec: null | number;
        compressionLevel: null | number;
        epoch: bigint;
        flags: number;
        kind: "server-info";
        nodeId: string;
        payloadLength: number;
        role: number;
        serverWallNanoseconds: bigint;
        tableCount: number;
        version: number;
        zoneId: null | string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface QwpServerInfoMessage {
        capabilities: number;
        clusterId: string;
        compressionCodec: null | number;
        compressionLevel: null | number;
        epoch: bigint;
        flags: number;
        kind: "server-info";
        nodeId: string;
        payloadLength: number;
        role: number;
        serverWallNanoseconds: bigint;
        tableCount: number;
        version: number;
        zoneId: null | string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    capabilities: number
    clusterId: string
    compressionCodec: null | number
    compressionLevel: null | number
    epoch: bigint
    flags: number
    kind: "server-info"
    nodeId: string
    payloadLength: number
    role: number
    serverWallNanoseconds: bigint
    tableCount: number
    version: number
    zoneId: null | string
    +

    Properties

    capabilities: number
    clusterId: string
    compressionCodec: null | number
    compressionLevel: null | number
    epoch: bigint
    flags: number
    kind: "server-info"
    nodeId: string
    payloadLength: number
    role: number
    serverWallNanoseconds: bigint
    tableCount: number
    version: number
    zoneId: null | string
    diff --git a/docs/interfaces/_questdb_browser-client.QwpSymbolValue.html b/docs/interfaces/_questdb_browser-client.QwpSymbolValue.html index e2e6dc36..c51e1d93 100644 --- a/docs/interfaces/_questdb_browser-client.QwpSymbolValue.html +++ b/docs/interfaces/_questdb_browser-client.QwpSymbolValue.html @@ -1,3 +1,3 @@ -QwpSymbolValue | QuestDB JavaScript Client - v5.0.0
    interface QwpSymbolValue {
        id: number;
        text: string;
    }
    Index

    Properties

    id +QwpSymbolValue | QuestDB JavaScript Client - v5.0.0
    interface QwpSymbolValue {
        id: number;
        text: string;
    }
    Index

    Properties

    Properties

    id: number
    text: string
    +

    Properties

    id: number
    text: string
    diff --git a/docs/interfaces/_questdb_browser-client.QwpUpgradeErrorDetails.html b/docs/interfaces/_questdb_browser-client.QwpUpgradeErrorDetails.html index 8109ff63..e6c0703e 100644 --- a/docs/interfaces/_questdb_browser-client.QwpUpgradeErrorDetails.html +++ b/docs/interfaces/_questdb_browser-client.QwpUpgradeErrorDetails.html @@ -1,4 +1,4 @@ -QwpUpgradeErrorDetails | QuestDB JavaScript Client - v5.0.0

    Interface QwpUpgradeErrorDetails

    interface QwpUpgradeErrorDetails {
        cause?: unknown;
        closeCode?: number;
        kind: QwpUpgradeErrorKind;
        retryable?: boolean;
        serverRole?: string;
        serverZone?: string;
        statusCode?: number;
        statusMessage?: string;
        timeoutPhase?: QwpUpgradeTimeoutPhase;
        tryNextEndpoint?: boolean;
        url?: string | URL;
    }
    Index

    Properties

    cause? +QwpUpgradeErrorDetails | QuestDB JavaScript Client - v5.0.0

    Interface QwpUpgradeErrorDetails

    interface QwpUpgradeErrorDetails {
        cause?: unknown;
        closeCode?: number;
        kind: QwpUpgradeErrorKind;
        retryable?: boolean;
        serverRole?: string;
        serverZone?: string;
        statusCode?: number;
        statusMessage?: string;
        timeoutPhase?: QwpUpgradeTimeoutPhase;
        tryNextEndpoint?: boolean;
        url?: string | URL;
    }
    Index

    Properties

    cause?: unknown
    closeCode?: number
    retryable?: boolean

    Whether a later retry against the configured endpoint set may recover.

    -
    serverRole?: string
    serverZone?: string
    statusCode?: number
    statusMessage?: string
    timeoutPhase?: QwpUpgradeTimeoutPhase
    tryNextEndpoint?: boolean

    Whether failover code should try another endpoint before surfacing this.

    -
    url?: string | URL
    +

    Properties

    cause?: unknown
    closeCode?: number
    retryable?: boolean

    Whether a later retry against the configured endpoint set may recover.

    +
    serverRole?: string
    serverZone?: string
    statusCode?: number
    statusMessage?: string
    timeoutPhase?: QwpUpgradeTimeoutPhase
    tryNextEndpoint?: boolean

    Whether failover code should try another endpoint before surfacing this.

    +
    url?: string | URL
    diff --git a/docs/interfaces/_questdb_browser-client.QwpUuidValue.html b/docs/interfaces/_questdb_browser-client.QwpUuidValue.html index 17ba905b..96a3aa14 100644 --- a/docs/interfaces/_questdb_browser-client.QwpUuidValue.html +++ b/docs/interfaces/_questdb_browser-client.QwpUuidValue.html @@ -1,3 +1,3 @@ -QwpUuidValue | QuestDB JavaScript Client - v5.0.0
    interface QwpUuidValue {
        high: bigint;
        low: bigint;
    }
    Index

    Properties

    high +QwpUuidValue | QuestDB JavaScript Client - v5.0.0
    interface QwpUuidValue {
        high: bigint;
        low: bigint;
    }
    Index

    Properties

    Properties

    high: bigint
    low: bigint
    +

    Properties

    high: bigint
    low: bigint
    diff --git a/docs/interfaces/_questdb_browser-client.QwpWebSocketConnectOptions.html b/docs/interfaces/_questdb_browser-client.QwpWebSocketConnectOptions.html index 01be8829..4188b546 100644 --- a/docs/interfaces/_questdb_browser-client.QwpWebSocketConnectOptions.html +++ b/docs/interfaces/_questdb_browser-client.QwpWebSocketConnectOptions.html @@ -1,4 +1,4 @@ -QwpWebSocketConnectOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpWebSocketConnectOptions

    interface QwpWebSocketConnectOptions {
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        protocols?: string | string[];
        sendTimeoutMs?: number;
        url: string | URL;
    }

    Hierarchy (View Summary)

    Index

    Properties

    closeTimeoutMs? +QwpWebSocketConnectOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpWebSocketConnectOptions

    interface QwpWebSocketConnectOptions {
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        protocols?: string | string[];
        sendTimeoutMs?: number;
        url: string | URL;
    }

    Hierarchy (View Summary)

    Index

    Properties

    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a +

    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a browser. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    -
    protocols?: string | string[]
    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. +

    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    +
    protocols?: string | string[]
    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    url: string | URL
    +
    url: string | URL
    diff --git a/docs/interfaces/_questdb_browser-client.QwpWebSocketLike.html b/docs/interfaces/_questdb_browser-client.QwpWebSocketLike.html index 5492ff88..fe3aa4f7 100644 --- a/docs/interfaces/_questdb_browser-client.QwpWebSocketLike.html +++ b/docs/interfaces/_questdb_browser-client.QwpWebSocketLike.html @@ -1,4 +1,4 @@ -QwpWebSocketLike | QuestDB JavaScript Client - v5.0.0

    Interface QwpWebSocketLike

    interface QwpWebSocketLike {
        binaryType: string;
        bufferedAmount?: number;
        protocol?: string;
        readyState: number;
        addEventListener(
            type: "open",
            listener: (event: unknown) => void,
            options?: { once?: boolean },
        ): void;
        addEventListener(
            type: "message",
            listener: (event: QwpWebSocketMessageEvent) => void,
        ): void;
        addEventListener(
            type: "error",
            listener: (event: unknown) => void,
            options?: { once?: boolean },
        ): void;
        addEventListener(
            type: "close",
            listener: (event: QwpWebSocketCloseEvent) => void,
            options?: { once?: boolean },
        ): void;
        close(code?: number, reason?: string): void;
        ping(): void;
        removeEventListener(type: "open", listener: (event: unknown) => void): void;
        removeEventListener(
            type: "message",
            listener: (event: QwpWebSocketMessageEvent) => void,
        ): void;
        removeEventListener(
            type: "error",
            listener: (event: unknown) => void,
        ): void;
        removeEventListener(
            type: "close",
            listener: (event: QwpWebSocketCloseEvent) => void,
        ): void;
        send(data: Uint8Array): void;
        sendWithCallback(data: Uint8Array, callback: (error?: Error) => void): void;
        terminate(): void;
    }
    Index

    Properties

    binaryType +QwpWebSocketLike | QuestDB JavaScript Client - v5.0.0

    Interface QwpWebSocketLike

    interface QwpWebSocketLike {
        binaryType: string;
        bufferedAmount?: number;
        protocol?: string;
        readyState: number;
        addEventListener(
            type: "open",
            listener: (event: unknown) => void,
            options?: { once?: boolean },
        ): void;
        addEventListener(
            type: "message",
            listener: (event: QwpWebSocketMessageEvent) => void,
        ): void;
        addEventListener(
            type: "error",
            listener: (event: unknown) => void,
            options?: { once?: boolean },
        ): void;
        addEventListener(
            type: "close",
            listener: (event: QwpWebSocketCloseEvent) => void,
            options?: { once?: boolean },
        ): void;
        close(code?: number, reason?: string): void;
        ping(): void;
        removeEventListener(type: "open", listener: (event: unknown) => void): void;
        removeEventListener(
            type: "message",
            listener: (event: QwpWebSocketMessageEvent) => void,
        ): void;
        removeEventListener(
            type: "error",
            listener: (event: unknown) => void,
        ): void;
        removeEventListener(
            type: "close",
            listener: (event: QwpWebSocketCloseEvent) => void,
        ): void;
        send(data: Uint8Array): void;
        sendWithCallback(data: Uint8Array, callback: (error?: Error) => void): void;
        terminate(): void;
    }
    Index

    Properties

    binaryType: string
    bufferedAmount?: number

    Number of application bytes queued by WHATWG-compatible WebSockets.

    -
    protocol?: string

    WebSocket subprotocol selected by the server, or an empty string.

    -
    readyState: number

    Methods

    +

    Properties

    binaryType: string
    bufferedAmount?: number

    Number of application bytes queued by WHATWG-compatible WebSockets.

    +
    protocol?: string

    WebSocket subprotocol selected by the server, or an empty string.

    +
    readyState: number

    Methods

    diff --git a/docs/interfaces/_questdb_browser-client.QwpWriterColumn.html b/docs/interfaces/_questdb_browser-client.QwpWriterColumn.html index 7c0e9db3..3f273323 100644 --- a/docs/interfaces/_questdb_browser-client.QwpWriterColumn.html +++ b/docs/interfaces/_questdb_browser-client.QwpWriterColumn.html @@ -1,5 +1,5 @@ QwpWriterColumn | QuestDB JavaScript Client - v5.0.0

    Interface QwpWriterColumn<T, DesignatedTimestamp>

    A reusable, immutable column definition for a compiled QWP table writer.

    -
    interface QwpWriterColumn<T, DesignatedTimestamp extends boolean = false> {
        __qwpWriterInput?: T;
        designatedTimestamp: DesignatedTimestamp;
        kind: QwpWriterColumnKind;
        precisionBits?: number;
        scale?: number;
        unit?: QwpTimestampUnit;
    }

    Type Parameters

    • T
    • DesignatedTimestamp extends boolean = false
    Index

    Properties

    interface QwpWriterColumn<T, DesignatedTimestamp extends boolean = false> {
        __qwpWriterInput?: T;
        designatedTimestamp: DesignatedTimestamp;
        kind: QwpWriterColumnKind;
        precisionBits?: number;
        scale?: number;
        unit?: QwpTimestampUnit;
    }

    Type Parameters

    • T
    • DesignatedTimestamp extends boolean = false
    Index

    Properties

    __qwpWriterInput? designatedTimestamp kind precisionBits? @@ -14,6 +14,6 @@ silently accept anything. A shared property name resolves structurally across bundles, which is what keeps row typing alive for consumers of the published package.

    -
    designatedTimestamp: DesignatedTimestamp
    precisionBits?: number

    GEOHASH precision in bits, fixed for the whole column.

    -
    scale?: number

    DECIMAL scale, fixed for the whole column.

    -
    +
    designatedTimestamp: DesignatedTimestamp
    precisionBits?: number

    GEOHASH precision in bits, fixed for the whole column.

    +
    scale?: number

    DECIMAL scale, fixed for the whole column.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpArrayValue.html b/docs/interfaces/_questdb_nodejs-client.QwpArrayValue.html index fdccfcb6..460b3f97 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpArrayValue.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpArrayValue.html @@ -1,4 +1,4 @@ -QwpArrayValue | QuestDB JavaScript Client - v5.0.0
    interface QwpArrayValue {
        dimensions: number[];
        values: (number | bigint)[];
    }
    Index

    Properties

    dimensions +QwpArrayValue | QuestDB JavaScript Client - v5.0.0
    interface QwpArrayValue {
        dimensions: number[];
        values: (number | bigint)[];
    }
    Index

    Properties

    Properties

    dimensions: number[]
    values: (number | bigint)[]

    DOUBLE_ARRAY uses numbers; LONG_ARRAY uses safe integers or signed int64 bigints.

    -
    +

    Properties

    dimensions: number[]
    values: (number | bigint)[]

    DOUBLE_ARRAY uses numbers; LONG_ARRAY uses safe integers or signed int64 bigints.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpBinaryConnection.html b/docs/interfaces/_questdb_nodejs-client.QwpBinaryConnection.html index 3158de30..8004d231 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpBinaryConnection.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpBinaryConnection.html @@ -1,7 +1,7 @@ QwpBinaryConnection | QuestDB JavaScript Client - v5.0.0

    Interface QwpBinaryConnection

    Normalized binary connection consumed by QWP sessions.

    Adapters buffer messages until the single async iterator consumes them, so unsolicited frames such as egress SERVER_INFO cannot race session startup.

    -
    interface QwpBinaryConnection {
        closed: Promise<QwpConnectionCloseInfo>;
        endpoint?: string | URL;
        handshake: QwpHandshakeMetadata;
        ingressDeltaSymbolDictionaryEnabled?: boolean;
        ingressSymbolDictionary?: readonly string[];
        managesIngressSenderErrors?: boolean;
        messages: AsyncIterable<Uint8Array<ArrayBufferLike>>;
        close(code?: number, reason?: string): Promise<void>;
        deprioritizeEndpoint(): void;
        getEgressMetrics(): QwpEgressTransportMetrics;
        getIngressFrameSequence(clientSequence: bigint): bigint;
        getIngressMetrics(): QwpIngressTransportMetrics;
        getPublishedFrameSequence(): bigint;
        ping(): Promise<void>;
        prepareIngressBatch(
            payloads: readonly Uint8Array<ArrayBufferLike>[],
        ): Promise<void>;
        send(payload: Uint8Array): Promise<void>;
        skipIngressClientSequence(): void;
    }
    Index

    Properties

    interface QwpBinaryConnection {
        closed: Promise<QwpConnectionCloseInfo>;
        endpoint?: string | URL;
        handshake: QwpHandshakeMetadata;
        ingressDeltaSymbolDictionaryEnabled?: boolean;
        ingressSymbolDictionary?: readonly string[];
        managesIngressSenderErrors?: boolean;
        messages: AsyncIterable<Uint8Array<ArrayBufferLike>>;
        close(code?: number, reason?: string): Promise<void>;
        deprioritizeEndpoint(): void;
        getEgressMetrics(): QwpEgressTransportMetrics;
        getIngressFrameSequence(clientSequence: bigint): bigint;
        getIngressMetrics(): QwpIngressTransportMetrics;
        getPublishedFrameSequence(): bigint;
        ping(): Promise<void>;
        prepareIngressBatch(
            payloads: readonly Uint8Array<ArrayBufferLike>[],
        ): Promise<void>;
        send(payload: Uint8Array): Promise<void>;
        skipIngressClientSequence(): void;
    }
    Index

    Properties

    closed: Promise<QwpConnectionCloseInfo>
    endpoint?: string | URL

    Endpoint backing this connection, when supplied by its adapter.

    -
    ingressDeltaSymbolDictionaryEnabled?: boolean

    False after replay dictionary persistence becomes unavailable.

    -
    ingressSymbolDictionary?: readonly string[]

    Recovered ingress dictionary supplied by replay connections.

    -
    managesIngressSenderErrors?: boolean

    True when the transport dispatches typed sender errors itself.

    -
    messages: AsyncIterable<Uint8Array<ArrayBufferLike>>

    Methods

    • Internal

      Marks this endpoint as temporarily unsuitable and asks a stateful +

    Properties

    closed: Promise<QwpConnectionCloseInfo>
    endpoint?: string | URL

    Endpoint backing this connection, when supplied by its adapter.

    +
    ingressDeltaSymbolDictionaryEnabled?: boolean

    False after replay dictionary persistence becomes unavailable.

    +
    ingressSymbolDictionary?: readonly string[]

    Recovered ingress dictionary supplied by replay connections.

    +
    managesIngressSenderErrors?: boolean

    True when the transport dispatches typed sender errors itself.

    +
    messages: AsyncIterable<Uint8Array<ArrayBufferLike>>

    Methods

    • Internal

      Marks this endpoint as temporarily unsuitable and asks a stateful connection factory to start its next sweep at another configured endpoint.

      -

      Returns void

    • Internal

      Published watermark alone, for the flush path.

      Transports that expose this must keep it consistent with getIngressMetrics's publishedFrameSequence; callers fall back to the full snapshot when it is absent.

      -

      Returns bigint

    • Internal

      Serializes a whole logical batch capacity check before its first +

      Returns bigint

    • Internal

      Serializes a whole logical batch capacity check before its first frame is sent, preventing a deferred prefix from consuming the only space needed by its commit-bearing suffix.

      -

      Parameters

      • payloads: readonly Uint8Array<ArrayBufferLike>[]

      Returns Promise<void>

    • Internal

      Reserves a client sequence for a split-batch suffix suppressed +

      Parameters

      • payloads: readonly Uint8Array<ArrayBufferLike>[]

      Returns Promise<void>

    • Internal

      Reserves a client sequence for a split-batch suffix suppressed before send(), keeping replay ACK translation aligned with the session.

      -

      Returns void

    +

    Returns void

    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpCacheResetMessage.html b/docs/interfaces/_questdb_nodejs-client.QwpCacheResetMessage.html index 9b0097ad..cbd6b2d3 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpCacheResetMessage.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpCacheResetMessage.html @@ -1,7 +1,7 @@ -QwpCacheResetMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpCacheResetMessage

    interface QwpCacheResetMessage {
        flags: number;
        kind: "cache-reset";
        payloadLength: number;
        resetMask: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags +QwpCacheResetMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpCacheResetMessage

    interface QwpCacheResetMessage {
        flags: number;
        kind: "cache-reset";
        payloadLength: number;
        resetMask: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags: number
    kind: "cache-reset"
    payloadLength: number
    resetMask: number
    tableCount: number
    version: number
    +

    Properties

    flags: number
    kind: "cache-reset"
    payloadLength: number
    resetMask: number
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpClientFactories.html b/docs/interfaces/_questdb_nodejs-client.QwpClientFactories.html index ceb20bef..cb2376de 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpClientFactories.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpClientFactories.html @@ -1,9 +1,9 @@ -QwpClientFactories | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientFactories

    interface QwpClientFactories {
        senderSlotReservation?: QwpPoolSlotReservation;
        close(): void | Promise<void>;
        createQuerySession(
            slot: number,
            signal?: AbortSignal,
        ): Promise<QwpEgressSession>;
        createSender(slot: number, signal?: AbortSignal): Promise<QwpSender>;
        start(): void | Promise<void>;
    }
    Index

    Properties

    senderSlotReservation? +QwpClientFactories | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientFactories

    interface QwpClientFactories {
        senderSlotReservation?: QwpPoolSlotReservation;
        close(): void | Promise<void>;
        createQuerySession(
            slot: number,
            signal?: AbortSignal,
        ): Promise<QwpEgressSession>;
        createSender(slot: number, signal?: AbortSignal): Promise<QwpSender>;
        start(): void | Promise<void>;
    }
    Index

    Properties

    senderSlotReservation?: QwpPoolSlotReservation

    Coordinates stable persistent sender slots with recovery.

    -

    Methods

    +

    Methods

    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpClientMetrics.html b/docs/interfaces/_questdb_nodejs-client.QwpClientMetrics.html index 30942223..7b846de6 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpClientMetrics.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpClientMetrics.html @@ -1,5 +1,5 @@ -QwpClientMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientMetrics

    interface QwpClientMetrics {
        closed: boolean;
        closing: boolean;
        queries: QwpResourcePoolMetrics;
        senders: QwpResourcePoolMetrics;
    }
    Index

    Properties

    closed +QwpClientMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientMetrics

    interface QwpClientMetrics {
        closed: boolean;
        closing: boolean;
        queries: QwpResourcePoolMetrics;
        senders: QwpResourcePoolMetrics;
    }
    Index

    Properties

    closed: boolean
    closing: boolean
    +

    Properties

    closed: boolean
    closing: boolean
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpClientPoolOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpClientPoolOptions.html index d59bd13f..d72ab65c 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpClientPoolOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpClientPoolOptions.html @@ -1,4 +1,4 @@ -QwpClientPoolOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientPoolOptions

    interface QwpClientPoolOptions {
        acquireTimeoutMs?: number;
        housekeepingIntervalMs?: number;
        idleTimeoutMs?: number;
        maxLifetimeMs?: number;
        queryPoolMax?: number;
        queryPoolMin?: number;
        senderPoolMax?: number;
        senderPoolMin?: number;
    }
    Index

    Properties

    acquireTimeoutMs? +QwpClientPoolOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpClientPoolOptions

    interface QwpClientPoolOptions {
        acquireTimeoutMs?: number;
        housekeepingIntervalMs?: number;
        idleTimeoutMs?: number;
        maxLifetimeMs?: number;
        queryPoolMax?: number;
        queryPoolMin?: number;
        senderPoolMax?: number;
        senderPoolMin?: number;
    }
    Index

    Properties

    acquireTimeoutMs? housekeepingIntervalMs? idleTimeoutMs? maxLifetimeMs? @@ -10,17 +10,17 @@ The shutdown wait is capped at 5 seconds. Defaults to 5 seconds. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    housekeepingIntervalMs?: number

    Idle/lifetime sweep interval. Defaults to 5s and must be at least 100ms. +

    housekeepingIntervalMs?: number

    Idle/lifetime sweep interval. Defaults to 5s and must be at least 100ms. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    idleTimeoutMs?: number

    Idle time before an excess pooled connection is closed. Defaults to 60s; +

    idleTimeoutMs?: number

    Idle time before an excess pooled connection is closed. Defaults to 60s; zero disables. Not capped at the host timer ceiling: compared against elapsed time only.

    -
    maxLifetimeMs?: number

    Maximum pooled connection age before recycling it while idle. Defaults to +

    maxLifetimeMs?: number

    Maximum pooled connection age before recycling it while idle. Defaults to 30m; zero disables. Not capped at the host timer ceiling: compared against elapsed time only.

    -
    queryPoolMax?: number

    Maximum concurrently borrowed query connections. Defaults to 4.

    -
    queryPoolMin?: number

    Warm egress connections created by connect(). Defaults to 1.

    -
    senderPoolMax?: number

    Maximum concurrently borrowed ingress senders. Defaults to 4.

    -
    senderPoolMin?: number

    Warm ingress connections created by connect(). Defaults to 1.

    -
    +
    queryPoolMax?: number

    Maximum concurrently borrowed query connections. Defaults to 4.

    +
    queryPoolMin?: number

    Warm egress connections created by connect(). Defaults to 1.

    +
    senderPoolMax?: number

    Maximum concurrently borrowed ingress senders. Defaults to 4.

    +
    senderPoolMin?: number

    Warm ingress connections created by connect(). Defaults to 1.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpColumnBuffer.html b/docs/interfaces/_questdb_nodejs-client.QwpColumnBuffer.html index ee4553fc..bc679067 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpColumnBuffer.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpColumnBuffer.html @@ -1,4 +1,4 @@ -QwpColumnBuffer | QuestDB JavaScript Client - v5.0.0

    Interface QwpColumnBuffer

    interface QwpColumnBuffer {
        committedValues: number;
        decimalScale?: number;
        geohashPrecision?: number;
        name: string;
        nulls: boolean[];
        size: number;
        type: QwpColumnType;
        values: unknown[];
    }
    Index

    Properties

    committedValues +QwpColumnBuffer | QuestDB JavaScript Client - v5.0.0

    Interface QwpColumnBuffer

    interface QwpColumnBuffer {
        committedValues: number;
        decimalScale?: number;
        geohashPrecision?: number;
        name: string;
        nulls: boolean[];
        size: number;
        type: QwpColumnType;
        values: unknown[];
    }
    Index

    Properties

    committedValues: number

    Length values had when the last row completed -- everything past it belongs to the row in progress. rollbackRow() truncates to this mark; see the failure it exists to prevent there. Maintained by QwpTableBuffer.

    -
    decimalScale?: number
    geohashPrecision?: number
    name: string
    nulls: boolean[]

    One entry per row; true means NULL.

    -
    size: number

    Rows accounted for so far, including nulls.

    -
    values: unknown[]

    Non-null values only; QWP compacts values around the null bitmap. +

    decimalScale?: number
    geohashPrecision?: number
    name: string
    nulls: boolean[]

    One entry per row; true means NULL.

    +
    size: number

    Rows accounted for so far, including nulls.

    +
    values: unknown[]

    Non-null values only; QWP compacts values around the null bitmap. LONG, DATE, and TIMESTAMP values accept safe integer numbers or signed int64 bigints. LONG_ARRAY applies the same rule to every element.

    -
    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpConnectionCloseInfo.html b/docs/interfaces/_questdb_nodejs-client.QwpConnectionCloseInfo.html index 0c7d6361..0ea84fb2 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpConnectionCloseInfo.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpConnectionCloseInfo.html @@ -1,4 +1,4 @@ -QwpConnectionCloseInfo | QuestDB JavaScript Client - v5.0.0

    Interface QwpConnectionCloseInfo

    interface QwpConnectionCloseInfo {
        code: number;
        reason: string;
        wasClean: boolean;
    }
    Index

    Properties

    code +QwpConnectionCloseInfo | QuestDB JavaScript Client - v5.0.0

    Interface QwpConnectionCloseInfo

    interface QwpConnectionCloseInfo {
        code: number;
        reason: string;
        wasClean: boolean;
    }
    Index

    Properties

    Properties

    code: number
    reason: string
    wasClean: boolean
    +

    Properties

    code: number
    reason: string
    wasClean: boolean
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpDecimalValue.html b/docs/interfaces/_questdb_nodejs-client.QwpDecimalValue.html index 83e54aba..ee8f20d0 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpDecimalValue.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpDecimalValue.html @@ -1,3 +1,3 @@ -QwpDecimalValue | QuestDB JavaScript Client - v5.0.0

    Interface QwpDecimalValue

    interface QwpDecimalValue {
        scale: number;
        unscaled: bigint;
    }
    Index

    Properties

    scale +QwpDecimalValue | QuestDB JavaScript Client - v5.0.0

    Interface QwpDecimalValue

    interface QwpDecimalValue {
        scale: number;
        unscaled: bigint;
    }
    Index

    Properties

    Properties

    scale: number
    unscaled: bigint
    +

    Properties

    scale: number
    unscaled: bigint
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpEgressMetrics.html b/docs/interfaces/_questdb_nodejs-client.QwpEgressMetrics.html index 11caa601..c3da5d48 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpEgressMetrics.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpEgressMetrics.html @@ -1,4 +1,4 @@ QwpEgressMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressMetrics

    Immutable notification-inbox counters for an egress session.

    -
    interface QwpEgressMetrics {
        deliveredConnectionNotifications: number;
        droppedConnectionNotifications: number;
    }
    Index

    Properties

    interface QwpEgressMetrics {
        deliveredConnectionNotifications: number;
        droppedConnectionNotifications: number;
    }
    Index

    Properties

    deliveredConnectionNotifications: number
    droppedConnectionNotifications: number
    +

    Properties

    deliveredConnectionNotifications: number
    droppedConnectionNotifications: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpEgressQueryOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpEgressQueryOptions.html index 12aa7fb3..5c667153 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpEgressQueryOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpEgressQueryOptions.html @@ -1,4 +1,4 @@ -QwpEgressQueryOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressQueryOptions

    interface QwpEgressQueryOptions {
        autoCredit?: boolean;
        bindCount?: number;
        bindPayload?: Uint8Array;
        binds?: QwpBindSetter;
        initialCredit?: number | bigint;
        resetDictionary?: boolean;
        timeoutMs?: number;
    }
    Index

    Properties

    autoCredit? +QwpEgressQueryOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressQueryOptions

    interface QwpEgressQueryOptions {
        autoCredit?: boolean;
        bindCount?: number;
        bindPayload?: Uint8Array;
        binds?: QwpBindSetter;
        initialCredit?: number | bigint;
        resetDictionary?: boolean;
        timeoutMs?: number;
    }
    Index

    Properties

    Properties

    autoCredit?: boolean

    Replenishes positive initial credit by each RESULT_BATCH wire size after the async iterator advances past that batch. Defaults to true.

    -
    bindCount?: number

    Advanced escape hatch for an already encoded bind section.

    -
    bindPayload?: Uint8Array

    Advanced escape hatch for an already encoded bind section.

    -

    Sets typed positional parameters; index 0 maps to SQL placeholder $1.

    -
    initialCredit?: number | bigint

    Overrides session send-ahead credit. Zero explicitly disables flow control.

    -
    resetDictionary?: boolean

    Ask a capable server to reset its connection-scoped symbol dictionary. +

    bindCount?: number

    Advanced escape hatch for an already encoded bind section.

    +
    bindPayload?: Uint8Array

    Advanced escape hatch for an already encoded bind section.

    +

    Sets typed positional parameters; index 0 maps to SQL placeholder $1.

    +
    initialCredit?: number | bigint

    Overrides session send-ahead credit. Zero explicitly disables flow control.

    +
    resetDictionary?: boolean

    Ask a capable server to reset its connection-scoped symbol dictionary. Silently omitted when the server lacks QUERY_FLAGS for rolling upgrades.

    -
    timeoutMs?: number

    Per-query deadline overriding the session default. Zero disables it. +

    timeoutMs?: number

    Per-query deadline overriding the session default. Zero disables it. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpEgressReplayResetEvent.html b/docs/interfaces/_questdb_nodejs-client.QwpEgressReplayResetEvent.html index 7c7b9a66..1b9ac8cb 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpEgressReplayResetEvent.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpEgressReplayResetEvent.html @@ -1,8 +1,8 @@ -QwpEgressReplayResetEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressReplayResetEvent

    interface QwpEgressReplayResetEvent {
        cause?: unknown;
        endpoint?: string | URL;
        previousEndpoint?: string | URL;
        requestId: bigint;
        serverInfo: QwpServerInfoMessage;
    }
    Index

    Properties

    cause? +QwpEgressReplayResetEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressReplayResetEvent

    interface QwpEgressReplayResetEvent {
        cause?: unknown;
        endpoint?: string | URL;
        previousEndpoint?: string | URL;
        requestId: bigint;
        serverInfo: QwpServerInfoMessage;
    }
    Index

    Properties

    cause?: unknown
    endpoint?: string | URL
    previousEndpoint?: string | URL
    requestId: bigint

    Client request being re-executed on the replacement connection.

    -

    Authoritative SERVER_INFO received from the replacement endpoint.

    -
    +

    Properties

    cause?: unknown
    endpoint?: string | URL
    previousEndpoint?: string | URL
    requestId: bigint

    Client request being re-executed on the replacement connection.

    +

    Authoritative SERVER_INFO received from the replacement endpoint.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpEgressRoutingOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpEgressRoutingOptions.html index 8a188544..ef976364 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpEgressRoutingOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpEgressRoutingOptions.html @@ -1,8 +1,8 @@ QwpEgressRoutingOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressRoutingOptions

    Endpoint routing preferences. Named for egress, where they landed first, but ingress ranks and validates its endpoints with the same machinery and honours the same two keys.

    -
    interface QwpEgressRoutingOptions {
        target?: QwpTarget;
        zone?: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface QwpEgressRoutingOptions {
        target?: QwpTarget;
        zone?: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    target?: QwpTarget

    Selects any readable node, a primary/standalone node, or a replica.

    -
    zone?: string

    Opaque, case-insensitive preferred zone; cross-zone fallback stays enabled.

    -
    +
    zone?: string

    Opaque, case-insensitive preferred zone; cross-zone fallback stays enabled.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpEgressSessionOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpEgressSessionOptions.html index f39eb303..13ab881d 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpEgressSessionOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpEgressSessionOptions.html @@ -1,4 +1,4 @@ -QwpEgressSessionOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressSessionOptions

    interface QwpEgressSessionOptions {
        bufferPoolSize?: number;
        cancelDrainTimeoutMs?: number;
        connectionListenerInboxCapacity?: number;
        initialCredit?: number | bigint;
        maxBatchRows?: number;
        onReplayReset?: (event: QwpEgressReplayResetEvent) => void | Promise<void>;
        queryTimeoutMs?: number;
        reconnect?: false | QwpReconnectOptions;
        serverInfoTimeoutMs?: number;
    }
    Index

    Properties

    bufferPoolSize? +QwpEgressSessionOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressSessionOptions

    interface QwpEgressSessionOptions {
        bufferPoolSize?: number;
        cancelDrainTimeoutMs?: number;
        connectionListenerInboxCapacity?: number;
        initialCredit?: number | bigint;
        maxBatchRows?: number;
        onReplayReset?: (event: QwpEgressReplayResetEvent) => void | Promise<void>;
        queryTimeoutMs?: number;
        reconnect?: false | QwpReconnectOptions;
        serverInfoTimeoutMs?: number;
    }
    Index

    Properties

    bufferPoolSize?: number

    Maximum decoded batches waiting for a consumer. Defaults to 4.

    -
    cancelDrainTimeoutMs?: number

    Maximum wait for a terminal response after CANCEL. Defaults to 5 seconds. +

    cancelDrainTimeoutMs?: number

    Maximum wait for a terminal response after CANCEL. Defaults to 5 seconds. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    connectionListenerInboxCapacity?: number

    Bounded inbox depth for reconnect.onEvent. Defaults to 64, matching +

    connectionListenerInboxCapacity?: number

    Bounded inbox depth for reconnect.onEvent. Defaults to 64, matching ingress. Overflow drops the oldest pending notification.

    -
    initialCredit?: number | bigint

    Default per-query send-ahead credit. Defaults to zero (unbounded).

    -
    maxBatchRows?: number

    Rejects a RESULT_BATCH declaring more rows than this. The connect helpers +

    initialCredit?: number | bigint

    Default per-query send-ahead credit. Defaults to zero (unbounded).

    +
    maxBatchRows?: number

    Rejects a RESULT_BATCH declaring more rows than this. The connect helpers default it to the maxBatchRows they put on the wire, so the request the client makes is also the bound it enforces; decoder scratch is sized from the declared row count and retained per pool slot, so an answer above the request would set this session's memory floor for its lifetime.

    -
    onReplayReset?: (event: QwpEgressReplayResetEvent) => void | Promise<void>

    Optional notification immediately before an active query is re-executed. +

    onReplayReset?: (event: QwpEgressReplayResetEvent) => void | Promise<void>

    Optional notification immediately before an active query is re-executed. Not-yet-consumed batches are discarded automatically; callers that retain an already-consumed prefix should discard it here. Omitting this callback leaves replay enabled and is appropriate for idempotent consumers.

    -
    queryTimeoutMs?: number

    Default per-query deadline. Zero or undefined disables query deadlines. +

    queryTimeoutMs?: number

    Default per-query deadline. Zero or undefined disables query deadlines. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    reconnect?: false | QwpReconnectOptions

    Bounded failover policy. Failover and at-least-once active-query replay +

    reconnect?: false | QwpReconnectOptions

    Bounded failover policy. Failover and at-least-once active-query replay are enabled by default; set false to keep one fixed connection.

    -
    serverInfoTimeoutMs?: number

    SERVER_INFO handshake deadline. Defaults to 5 seconds. Capped at +

    serverInfoTimeoutMs?: number

    SERVER_INFO handshake deadline. Defaults to 5 seconds. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpEgressTransportMetrics.html b/docs/interfaces/_questdb_nodejs-client.QwpEgressTransportMetrics.html index 5e2d8737..6b8873b0 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpEgressTransportMetrics.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpEgressTransportMetrics.html @@ -4,6 +4,6 @@ was unobservable, so a run of discarded events was indistinguishable from a healthy one: attempt resets on every success, so the delivered stream carries no gap to infer from.

    -
    interface QwpEgressTransportMetrics {
        deliveredConnectionNotifications: number;
        droppedConnectionNotifications: number;
    }
    Index

    Properties

    interface QwpEgressTransportMetrics {
        deliveredConnectionNotifications: number;
        droppedConnectionNotifications: number;
    }
    Index

    Properties

    deliveredConnectionNotifications: number
    droppedConnectionNotifications: number
    +

    Properties

    deliveredConnectionNotifications: number
    droppedConnectionNotifications: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpEgressViewQuery.html b/docs/interfaces/_questdb_nodejs-client.QwpEgressViewQuery.html index fb420749..33dd3580 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpEgressViewQuery.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpEgressViewQuery.html @@ -1,9 +1,9 @@ QwpEgressViewQuery | QuestDB JavaScript Client - v5.0.0

    Interface QwpEgressViewQuery

    Control handle returned by queryViews().

    -
    interface QwpEgressViewQuery {
        completion: Promise<QwpQueryCompletion>;
        requestId: bigint;
        awaitCompletion(timeoutMs: number): Promise<boolean>;
        cancel(): Promise<void>;
        grantCredit(additionalBytes: number | bigint): Promise<void>;
        isDone(): boolean;
    }
    Index

    Properties

    interface QwpEgressViewQuery {
        completion: Promise<QwpQueryCompletion>;
        requestId: bigint;
        awaitCompletion(timeoutMs: number): Promise<boolean>;
        cancel(): Promise<void>;
        grantCredit(additionalBytes: number | bigint): Promise<void>;
        isDone(): boolean;
    }
    Index

    Properties

    completion: Promise<QwpQueryCompletion>
    requestId: bigint

    Methods

    +

    Properties

    completion: Promise<QwpQueryCompletion>
    requestId: bigint

    Methods

    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpEncodedBinds.html b/docs/interfaces/_questdb_nodejs-client.QwpEncodedBinds.html index c53dda25..0f1165c4 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpEncodedBinds.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpEncodedBinds.html @@ -1,3 +1,3 @@ -QwpEncodedBinds | QuestDB JavaScript Client - v5.0.0

    Interface QwpEncodedBinds

    interface QwpEncodedBinds {
        count: number;
        payload: Uint8Array;
    }
    Index

    Properties

    count +QwpEncodedBinds | QuestDB JavaScript Client - v5.0.0

    Interface QwpEncodedBinds

    interface QwpEncodedBinds {
        count: number;
        payload: Uint8Array;
    }
    Index

    Properties

    Properties

    count: number
    payload: Uint8Array
    +

    Properties

    count: number
    payload: Uint8Array
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpExecDoneMessage.html b/docs/interfaces/_questdb_nodejs-client.QwpExecDoneMessage.html index 23a8625e..5b4570bf 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpExecDoneMessage.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpExecDoneMessage.html @@ -1,4 +1,4 @@ -QwpExecDoneMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpExecDoneMessage

    interface QwpExecDoneMessage {
        flags: number;
        kind: "exec-done";
        operationType: number;
        payloadLength: number;
        requestId: bigint;
        rowsAffected: bigint;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags +QwpExecDoneMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpExecDoneMessage

    interface QwpExecDoneMessage {
        flags: number;
        kind: "exec-done";
        operationType: number;
        payloadLength: number;
        requestId: bigint;
        rowsAffected: bigint;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags: number
    kind: "exec-done"
    operationType: number
    payloadLength: number
    requestId: bigint
    rowsAffected: bigint
    tableCount: number
    version: number
    +

    Properties

    flags: number
    kind: "exec-done"
    operationType: number
    payloadLength: number
    requestId: bigint
    rowsAffected: bigint
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpFailoverAttempt.html b/docs/interfaces/_questdb_nodejs-client.QwpFailoverAttempt.html index ba74f9fa..827ca2fa 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpFailoverAttempt.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpFailoverAttempt.html @@ -1,3 +1,3 @@ -QwpFailoverAttempt | QuestDB JavaScript Client - v5.0.0

    Interface QwpFailoverAttempt

    interface QwpFailoverAttempt {
        endpoint: string | URL;
        error: unknown;
    }
    Index

    Properties

    endpoint +QwpFailoverAttempt | QuestDB JavaScript Client - v5.0.0

    Interface QwpFailoverAttempt

    interface QwpFailoverAttempt {
        endpoint: string | URL;
        error: unknown;
    }
    Index

    Properties

    Properties

    endpoint: string | URL
    error: unknown
    +

    Properties

    endpoint: string | URL
    error: unknown
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpFrame.html b/docs/interfaces/_questdb_nodejs-client.QwpFrame.html index 662c19ad..25d6a5f6 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpFrame.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpFrame.html @@ -1,6 +1,6 @@ -QwpFrame | QuestDB JavaScript Client - v5.0.0
    interface QwpFrame {
        flags: number;
        payload: Uint8Array;
        payloadLength: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags +QwpFrame | QuestDB JavaScript Client - v5.0.0
    interface QwpFrame {
        flags: number;
        payload: Uint8Array;
        payloadLength: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags: number
    payload: Uint8Array
    payloadLength: number
    tableCount: number
    version: number
    +

    Properties

    flags: number
    payload: Uint8Array
    payloadLength: number
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpFrameHeader.html b/docs/interfaces/_questdb_nodejs-client.QwpFrameHeader.html index a66c7ee6..aacb1d6e 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpFrameHeader.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpFrameHeader.html @@ -1,5 +1,5 @@ -QwpFrameHeader | QuestDB JavaScript Client - v5.0.0

    Interface QwpFrameHeader

    interface QwpFrameHeader {
        flags: number;
        payloadLength: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags +QwpFrameHeader | QuestDB JavaScript Client - v5.0.0

    Interface QwpFrameHeader

    interface QwpFrameHeader {
        flags: number;
        payloadLength: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags: number
    payloadLength: number
    tableCount: number
    version: number
    +

    Properties

    flags: number
    payloadLength: number
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpGeohashValue.html b/docs/interfaces/_questdb_nodejs-client.QwpGeohashValue.html index b84d0e64..2dcbf9f3 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpGeohashValue.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpGeohashValue.html @@ -1,3 +1,3 @@ -QwpGeohashValue | QuestDB JavaScript Client - v5.0.0

    Interface QwpGeohashValue

    interface QwpGeohashValue {
        bits: bigint;
        precisionBits: number;
    }
    Index

    Properties

    bits +QwpGeohashValue | QuestDB JavaScript Client - v5.0.0

    Interface QwpGeohashValue

    interface QwpGeohashValue {
        bits: bigint;
        precisionBits: number;
    }
    Index

    Properties

    Properties

    bits: bigint
    precisionBits: number
    +

    Properties

    bits: bigint
    precisionBits: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpHandshakeMetadata.html b/docs/interfaces/_questdb_nodejs-client.QwpHandshakeMetadata.html index 870e5faa..5fa95254 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpHandshakeMetadata.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpHandshakeMetadata.html @@ -1,5 +1,5 @@ QwpHandshakeMetadata | QuestDB JavaScript Client - v5.0.0

    Interface QwpHandshakeMetadata

    Metadata negotiated during the QWP WebSocket upgrade.

    -
    interface QwpHandshakeMetadata {
        contentEncoding?: string;
        durableAckEnabled?: boolean;
        maxBatchSizeBytes?: number;
        negotiatedCompression?: QwpNegotiatedEgressCompression;
        qwpVersion: number;
        serverRole?: string;
        serverZone?: string;
    }
    Index

    Properties

    interface QwpHandshakeMetadata {
        contentEncoding?: string;
        durableAckEnabled?: boolean;
        maxBatchSizeBytes?: number;
        negotiatedCompression?: QwpNegotiatedEgressCompression;
        qwpVersion: number;
        serverRole?: string;
        serverZone?: string;
    }
    Index

    Properties

    contentEncoding?: string

    Server-selected egress content encoding, when advertised.

    -
    durableAckEnabled?: boolean

    Whether the server confirmed durable-ACK support.

    -
    maxBatchSizeBytes?: number

    Server's hard ingress WebSocket-payload cap, when advertised.

    -
    negotiatedCompression?: QwpNegotiatedEgressCompression

    Parsed effective egress codec and level selected by the server.

    -
    qwpVersion: number

    QWP protocol version selected by the server.

    -
    serverRole?: string

    Server role advertised on a successful upgrade, when available.

    -
    serverZone?: string

    Server zone advertised on a successful upgrade, when available.

    -
    +
    durableAckEnabled?: boolean

    Whether the server confirmed durable-ACK support.

    +
    maxBatchSizeBytes?: number

    Server's hard ingress WebSocket-payload cap, when advertised.

    +
    negotiatedCompression?: QwpNegotiatedEgressCompression

    Parsed effective egress codec and level selected by the server.

    +
    qwpVersion: number

    QWP protocol version selected by the server.

    +
    serverRole?: string

    Server role advertised on a successful upgrade, when available.

    +
    serverZone?: string

    Server zone advertised on a successful upgrade, when available.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressEncodeOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressEncodeOptions.html index 98a43a70..5fde5003 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressEncodeOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressEncodeOptions.html @@ -1,7 +1,7 @@ -QwpIngressEncodeOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressEncodeOptions

    interface QwpIngressEncodeOptions {
        confirmedMaxSymbolId?: number;
        deferCommit?: boolean;
        dictionary?: QwpSymbolDictionary;
        gorilla?: boolean;
    }
    Index

    Properties

    confirmedMaxSymbolId? +QwpIngressEncodeOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressEncodeOptions

    interface QwpIngressEncodeOptions {
        confirmedMaxSymbolId?: number;
        deferCommit?: boolean;
        dictionary?: QwpSymbolDictionary;
        gorilla?: boolean;
    }
    Index

    Properties

    confirmedMaxSymbolId?: number

    Highest global symbol ID already published on this logical connection.

    -
    deferCommit?: boolean
    dictionary?: QwpSymbolDictionary

    Present means connection-scoped delta dictionary mode.

    -
    gorilla?: boolean
    +
    deferCommit?: boolean
    dictionary?: QwpSymbolDictionary

    Present means connection-scoped delta dictionary mode.

    +
    gorilla?: boolean
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressErrorEvent.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressErrorEvent.html index a0b3ea51..60269201 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressErrorEvent.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressErrorEvent.html @@ -1,8 +1,8 @@ -QwpIngressErrorEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressErrorEvent

    interface QwpIngressErrorEvent {
        error: Error;
        metrics: QwpIngressMetrics;
        response?: QwpIngressResponse;
        senderError?: QwpSenderError;
        terminal: boolean;
        timestampMs: number;
    }
    Index

    Properties

    error +QwpIngressErrorEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressErrorEvent

    interface QwpIngressErrorEvent {
        error: Error;
        metrics: QwpIngressMetrics;
        response?: QwpIngressResponse;
        senderError?: QwpSenderError;
        terminal: boolean;
        timestampMs: number;
    }
    Index

    Properties

    error: Error
    senderError?: QwpSenderError

    Present for a classified server rejection.

    -
    terminal: boolean
    timestampMs: number
    +

    Properties

    error: Error
    senderError?: QwpSenderError

    Present for a classified server rejection.

    +
    terminal: boolean
    timestampMs: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressMetrics.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressMetrics.html index 2da9db47..20dff6df 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressMetrics.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressMetrics.html @@ -1,5 +1,5 @@ QwpIngressMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressMetrics

    Immutable point-in-time ingress telemetry, safe in browsers and Node.js.

    -
    interface QwpIngressMetrics {
        acknowledgedSequence: bigint;
        deliveredConnectionNotifications: number;
        deliveredErrorNotifications: number;
        deliveredProgressNotifications: number;
        droppedConnectionNotifications: number;
        droppedErrorNotifications: number;
        droppedProgressNotifications: number;
        lastError?: Error;
        memoryReplayMaxBytes?: number;
        memoryReplayUsedBytes?: number;
        pendingDurableTables: number;
        pendingReplayBytes: number;
        pendingReplayFrames: number;
        pendingResponseBytes: number;
        pendingResponses: number;
        publishedSequence: bigint;
        replayAcknowledgedFrameSequence?: bigint;
        replayPublishedFrameSequence?: bigint;
        totalAcks: number;
        totalBytesPublished: number;
        totalBytesReplayed: number;
        totalBytesSent: number;
        totalDurableAcks: number;
        totalErrors: number;
        totalFailovers: number;
        totalFramesPublished: number;
        totalFramesReplayed: number;
        totalFramesSent: number;
        totalMemoryReplayAppendTimeouts: number;
        totalMemoryReplayBackpressureStalls: number;
        totalNacks: number;
        totalReconnectAttempts: number;
        totalReconnectErrors: number;
        totalReconnectsSucceeded: number;
        waitingMemoryReplayAppends: number;
    }
    Index

    Properties

    interface QwpIngressMetrics {
        acknowledgedSequence: bigint;
        deliveredConnectionNotifications: number;
        deliveredErrorNotifications: number;
        deliveredProgressNotifications: number;
        droppedConnectionNotifications: number;
        droppedErrorNotifications: number;
        droppedProgressNotifications: number;
        lastError?: Error;
        memoryReplayMaxBytes?: number;
        memoryReplayUsedBytes?: number;
        pendingDurableTables: number;
        pendingReplayBytes: number;
        pendingReplayFrames: number;
        pendingResponseBytes: number;
        pendingResponses: number;
        publishedSequence: bigint;
        replayAcknowledgedFrameSequence?: bigint;
        replayPublishedFrameSequence?: bigint;
        totalAcks: number;
        totalBytesPublished: number;
        totalBytesReplayed: number;
        totalBytesSent: number;
        totalDurableAcks: number;
        totalErrors: number;
        totalFailovers: number;
        totalFramesPublished: number;
        totalFramesReplayed: number;
        totalFramesSent: number;
        totalMemoryReplayAppendTimeouts: number;
        totalMemoryReplayBackpressureStalls: number;
        totalNacks: number;
        totalReconnectAttempts: number;
        totalReconnectErrors: number;
        totalReconnectsSucceeded: number;
        waitingMemoryReplayAppends: number;
    }
    Index

    Properties

    acknowledgedSequence: bigint

    Highest client-session sequence covered by a successful cumulative ACK.

    -
    deliveredConnectionNotifications: number
    deliveredErrorNotifications: number
    deliveredProgressNotifications: number
    droppedConnectionNotifications: number
    droppedErrorNotifications: number
    droppedProgressNotifications: number
    lastError?: Error
    memoryReplayMaxBytes?: number
    memoryReplayUsedBytes?: number
    pendingDurableTables: number
    pendingReplayBytes: number
    pendingReplayFrames: number
    pendingResponseBytes: number
    pendingResponses: number
    publishedSequence: bigint

    Highest client-session sequence allocated, or -1 before the first send.

    -
    replayAcknowledgedFrameSequence?: bigint

    Trim watermark; in durable-ACK mode it advances only after durability.

    -
    replayPublishedFrameSequence?: bigint

    Stable store-and-forward watermark; absent without reconnect/replay.

    -
    totalAcks: number
    totalBytesPublished: number
    totalBytesReplayed: number
    totalBytesSent: number
    totalDurableAcks: number
    totalErrors: number
    totalFailovers: number
    totalFramesPublished: number
    totalFramesReplayed: number
    totalFramesSent: number

    Physical sends; includes replay and dictionary catch-up when available.

    -
    totalMemoryReplayAppendTimeouts: number
    totalMemoryReplayBackpressureStalls: number
    totalNacks: number
    totalReconnectAttempts: number
    totalReconnectErrors: number
    totalReconnectsSucceeded: number
    waitingMemoryReplayAppends: number
    +
    deliveredConnectionNotifications: number
    deliveredErrorNotifications: number
    deliveredProgressNotifications: number
    droppedConnectionNotifications: number
    droppedErrorNotifications: number
    droppedProgressNotifications: number
    lastError?: Error
    memoryReplayMaxBytes?: number
    memoryReplayUsedBytes?: number
    pendingDurableTables: number
    pendingReplayBytes: number
    pendingReplayFrames: number
    pendingResponseBytes: number
    pendingResponses: number
    publishedSequence: bigint

    Highest client-session sequence allocated, or -1 before the first send.

    +
    replayAcknowledgedFrameSequence?: bigint

    Trim watermark; in durable-ACK mode it advances only after durability.

    +
    replayPublishedFrameSequence?: bigint

    Stable store-and-forward watermark; absent without reconnect/replay.

    +
    totalAcks: number
    totalBytesPublished: number
    totalBytesReplayed: number
    totalBytesSent: number
    totalDurableAcks: number
    totalErrors: number
    totalFailovers: number
    totalFramesPublished: number
    totalFramesReplayed: number
    totalFramesSent: number

    Physical sends; includes replay and dictionary catch-up when available.

    +
    totalMemoryReplayAppendTimeouts: number
    totalMemoryReplayBackpressureStalls: number
    totalNacks: number
    totalReconnectAttempts: number
    totalReconnectErrors: number
    totalReconnectsSucceeded: number
    waitingMemoryReplayAppends: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressProgressEvent.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressProgressEvent.html index 19b48b92..05b608ee 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressProgressEvent.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressProgressEvent.html @@ -1,6 +1,6 @@ -QwpIngressProgressEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressProgressEvent

    interface QwpIngressProgressEvent {
        kind: QwpIngressProgressKind;
        metrics: QwpIngressMetrics;
        response?: QwpIngressResponse;
        sequence?: bigint;
        timestampMs: number;
    }
    Index

    Properties

    kind +QwpIngressProgressEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressProgressEvent

    interface QwpIngressProgressEvent {
        kind: QwpIngressProgressKind;
        metrics: QwpIngressMetrics;
        response?: QwpIngressResponse;
        sequence?: bigint;
        timestampMs: number;
    }
    Index

    Properties

    sequence?: bigint
    timestampMs: number
    +

    Properties

    sequence?: bigint
    timestampMs: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayRecord.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayRecord.html index cc45ab68..5311a9fc 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayRecord.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayRecord.html @@ -1,3 +1,3 @@ -QwpIngressReplayRecord | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressReplayRecord

    interface QwpIngressReplayRecord {
        frameSequence: bigint;
        payload: Uint8Array;
    }
    Index

    Properties

    frameSequence +QwpIngressReplayRecord | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressReplayRecord

    interface QwpIngressReplayRecord {
        frameSequence: bigint;
        payload: Uint8Array;
    }
    Index

    Properties

    frameSequence: bigint
    payload: Uint8Array
    +

    Properties

    frameSequence: bigint
    payload: Uint8Array
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayReference.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayReference.html index e8eef8f5..e76015bc 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayReference.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayReference.html @@ -1,4 +1,4 @@ QwpIngressReplayReference | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressReplayReference

    Lightweight durable-frame descriptor used by disk-backed replay stores.

    -
    interface QwpIngressReplayReference {
        frameSequence: bigint;
        payloadLength: number;
    }
    Index

    Properties

    interface QwpIngressReplayReference {
        frameSequence: bigint;
        payloadLength: number;
    }
    Index

    Properties

    frameSequence: bigint
    payloadLength: number
    +

    Properties

    frameSequence: bigint
    payloadLength: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayStore.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayStore.html index 4bbcdb92..6b924ceb 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayStore.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressReplayStore.html @@ -1,5 +1,5 @@ QwpIngressReplayStore | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressReplayStore

    Browser-safe abstraction; Node supplies a persistent filesystem implementation.

    -
    interface QwpIngressReplayStore {
        acknowledgeThrough(frameSequence: bigint): Promise<void>;
        append(record: QwpIngressReplayRecord): Promise<void>;
        appendSymbolDictionary(
            startId: number,
            entries: readonly string[],
        ): Promise<void>;
        close(): Promise<void>;
        discardThrough(frameSequence: bigint): Promise<void>;
        load(): Promise<readonly QwpIngressReplayRecord[]>;
        loadReferences(): Promise<readonly QwpIngressReplayReference[]>;
        loadSymbolDictionary(): Promise<readonly string[]>;
        prepareAppendBatch(
            payloads: readonly Uint8Array<ArrayBufferLike>[],
        ): Promise<void>;
        readPayload(frameSequence: bigint): Promise<Uint8Array<ArrayBufferLike>>;
        replaceSymbolDictionary(entries: readonly string[]): Promise<void>;
    }

    Implemented by

    Index

    Methods

    interface QwpIngressReplayStore {
        acknowledgeThrough(frameSequence: bigint): Promise<void>;
        append(record: QwpIngressReplayRecord): Promise<void>;
        appendSymbolDictionary(
            startId: number,
            entries: readonly string[],
        ): Promise<void>;
        close(): Promise<void>;
        discardThrough(frameSequence: bigint): Promise<void>;
        load(): Promise<readonly QwpIngressReplayRecord[]>;
        loadReferences(): Promise<readonly QwpIngressReplayReference[]>;
        loadSymbolDictionary(): Promise<readonly string[]>;
        prepareAppendBatch(
            payloads: readonly Uint8Array<ArrayBufferLike>[],
        ): Promise<void>;
        readPayload(frameSequence: bigint): Promise<Uint8Array<ArrayBufferLike>>;
        replaceSymbolDictionary(entries: readonly string[]): Promise<void>;
    }

    Implemented by

    Index

    Methods

    • Persists new dense entries before a delta frame is made replayable.

      -

      Parameters

      • startId: number
      • entries: readonly string[]

      Returns Promise<void>

    • Internal

      Removes a local prefix without representing it as a server ACK. +

    Methods

    • Persists new dense entries before a delta frame is made replayable.

      +

      Parameters

      • startId: number
      • entries: readonly string[]

      Returns Promise<void>

    • Internal

      Removes a local prefix without representing it as a server ACK. Persistent stores should provide this when recovery can abandon frames.

      "Without representing it as a server ACK" is about the transport's public watermark, which the caller leaves alone. The removal itself must be as durable as acknowledgeThrough's: a discarded prefix that a later load() can still see is a prefix this client reported abandoned and then sent anyway.

      -

      Parameters

      • frameSequence: bigint

      Returns Promise<void>

    • Internal

      Waits until every payload in one logical batch can be appended without an ACK between frames. Implementations must not mutate the journal.

      -

      Parameters

      • payloads: readonly Uint8Array<ArrayBufferLike>[]

      Returns Promise<void>

    • Reads one previously loaded durable payload on demand.

      -

      Parameters

      • frameSequence: bigint

      Returns Promise<Uint8Array<ArrayBufferLike>>

    • Atomically replaces an unusable dictionary after surviving committed +

      Parameters

      • payloads: readonly Uint8Array<ArrayBufferLike>[]

      Returns Promise<void>

    • Reads one previously loaded durable payload on demand.

      +

      Parameters

      • frameSequence: bigint

      Returns Promise<Uint8Array<ArrayBufferLike>>

    • Atomically replaces an unusable dictionary after surviving committed frames prove that its complete ID space can be reconstructed.

      -

      Parameters

      • entries: readonly string[]

      Returns Promise<void>

    +

    Parameters

    • entries: readonly string[]

    Returns Promise<void>

    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressResponse.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressResponse.html index 190cb7db..cebeb525 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressResponse.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressResponse.html @@ -1,5 +1,5 @@ -QwpIngressResponse | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressResponse

    interface QwpIngressResponse {
        errorMessage?: string;
        sequence: bigint;
        status: number;
        tables: QwpIngressTableResult[];
    }
    Index

    Properties

    errorMessage? +QwpIngressResponse | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressResponse

    interface QwpIngressResponse {
        errorMessage?: string;
        sequence: bigint;
        status: number;
        tables: QwpIngressTableResult[];
    }
    Index

    Properties

    errorMessage?: string
    sequence: bigint
    status: number
    +

    Properties

    errorMessage?: string
    sequence: bigint
    status: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressSendResult.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressSendResult.html index 55c0ae1e..4adfbeb4 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressSendResult.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressSendResult.html @@ -2,10 +2,10 @@ completion. Publication resolves after every physical frame belonging to the logical batch has been accepted by the connection. For persistent Node transports that means the frames are durable in the replay journal.

    -
    interface QwpIngressSendResult {
        acknowledgement: Promise<QwpIngressResponse>;
        publication: Promise<void>;
        sequence: bigint;
    }
    Index

    Properties

    interface QwpIngressSendResult {
        acknowledgement: Promise<QwpIngressResponse>;
        publication: Promise<void>;
        sequence: bigint;
    }
    Index

    Properties

    acknowledgement: Promise<QwpIngressResponse>

    Cumulative server response for every frame in the logical batch.

    -
    publication: Promise<void>

    Local transport/journal ownership boundary.

    -
    sequence: bigint

    Last client-session sequence allocated to this logical batch.

    -
    +
    publication: Promise<void>

    Local transport/journal ownership boundary.

    +
    sequence: bigint

    Last client-session sequence allocated to this logical batch.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressServerInfo.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressServerInfo.html index 5c003a8f..d7c6c05f 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressServerInfo.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressServerInfo.html @@ -1,8 +1,8 @@ QwpIngressServerInfo | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressServerInfo

    What the browser-requested ingress SERVER_INFO frame reports.

    -
    interface QwpIngressServerInfo {
        durableAckEnabled: boolean;
        maxBatchSizeBytes: number;
    }
    Index

    Properties

    interface QwpIngressServerInfo {
        durableAckEnabled: boolean;
        maxBatchSizeBytes: number;
    }
    Index

    Properties

    durableAckEnabled: boolean

    Whether this connection negotiated durable acknowledgements. This is the only durable-ACK verdict a browser can read: the confirmation header is invisible to page JavaScript and the subprotocol echo confirms the negotiation dialect, not the capability.

    -
    maxBatchSizeBytes: number
    +
    maxBatchSizeBytes: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressSessionOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressSessionOptions.html index a02b9249..381f0dc7 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressSessionOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressSessionOptions.html @@ -1,4 +1,4 @@ -QwpIngressSessionOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressSessionOptions

    interface QwpIngressSessionOptions {
        ackTimeoutMs?: number;
        backgroundStoreAndForward?: boolean;
        catchUpCapGapMinEscalationWindowMs?: number;
        connectionListenerInboxCapacity?: number;
        durableAckKeepaliveMs?: number;
        errorInboxCapacity?: number;
        initialConnectMode?: QwpInitialConnectMode;
        maxBatchSizeBytes?: number;
        memoryReplayAppendDeadlineMs?: number;
        memoryReplayMaxBytes?: number;
        onDurableAck?: (response: QwpIngressResponse) => void;
        onError?: (event: QwpIngressErrorEvent) => void;
        onProgress?: (event: QwpIngressProgressEvent) => void;
        onResponse?: (response: QwpIngressResponse) => void;
        onSenderError?: (error: QwpSenderError) => void;
        orphanDurableAckMismatchMaxDurationMs?: number;
        orphanStoreAndForward?: boolean;
        reconnect?: false | QwpReconnectOptions;
        replayStore?: QwpIngressReplayStore;
    }
    Index

    Properties

    ackTimeoutMs? +QwpIngressSessionOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressSessionOptions

    interface QwpIngressSessionOptions {
        ackTimeoutMs?: number;
        backgroundStoreAndForward?: boolean;
        catchUpCapGapMinEscalationWindowMs?: number;
        connectionListenerInboxCapacity?: number;
        durableAckKeepaliveMs?: number;
        errorInboxCapacity?: number;
        initialConnectMode?: QwpInitialConnectMode;
        maxBatchSizeBytes?: number;
        memoryReplayAppendDeadlineMs?: number;
        memoryReplayMaxBytes?: number;
        onDurableAck?: (response: QwpIngressResponse) => void;
        onError?: (event: QwpIngressErrorEvent) => void;
        onProgress?: (event: QwpIngressProgressEvent) => void;
        onResponse?: (response: QwpIngressResponse) => void;
        onSenderError?: (error: QwpSenderError) => void;
        orphanDurableAckMismatchMaxDurationMs?: number;
        orphanStoreAndForward?: boolean;
        reconnect?: false | QwpReconnectOptions;
        replayStore?: QwpIngressReplayStore;
    }
    Index

    Properties

    ackTimeoutMs?: number

    Per-frame ACK deadline. Defaults to 15 seconds. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    backgroundStoreAndForward?: boolean

    Starts memory or persistent replay without waiting for a server.

    -
    catchUpCapGapMinEscalationWindowMs?: number

    Minimum cap-gap dwell before an orphan can be quarantined. +

    backgroundStoreAndForward?: boolean

    Starts memory or persistent replay without waiting for a server.

    +
    catchUpCapGapMinEscalationWindowMs?: number

    Minimum cap-gap dwell before an orphan can be quarantined. Not capped at the host timer ceiling: compared against elapsed time only.

    -
    connectionListenerInboxCapacity?: number

    Bounded reconnect-listener inbox. Oldest pending events are dropped when +

    connectionListenerInboxCapacity?: number

    Bounded reconnect-listener inbox. Oldest pending events are dropped when full. Defaults to 64, matching the Java client.

    -
    durableAckKeepaliveMs?: number

    Enables durable-ACK tracking. While committed table transactions await +

    durableAckKeepaliveMs?: number

    Enables durable-ACK tracking. While committed table transactions await durable upload, Node transports send WebSocket PING frames and browser transports send table-less QWP poll frames. Zero keeps tracking enabled but disables automatic polling. Factory-created browser sessions require requestDurableAck=true when this option is supplied. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    errorInboxCapacity?: number

    Bounded typed/legacy error inbox. Oldest pending errors are dropped when +

    errorInboxCapacity?: number

    Bounded typed/legacy error inbox. Oldest pending errors are dropped when full. Defaults to 256, matching the Java client.

    -
    initialConnectMode?: QwpInitialConnectMode

    Initial connection policy supplied by the Node adapter.

    -
    maxBatchSizeBytes?: number

    Optional local ingress frame cap. Browsers cannot read WebSocket upgrade +

    initialConnectMode?: QwpInitialConnectMode

    Initial connection policy supplied by the Node adapter.

    +
    maxBatchSizeBytes?: number

    Optional local ingress frame cap. Browsers cannot read WebSocket upgrade headers, so browser applications should set this to the server's configured QWP cap. When the server also advertises a cap, the smaller value wins. Table batches are split at row boundaries automatically; an individual row that cannot fit is rejected with QwpBatchTooLargeError before it is sent.

    -
    memoryReplayAppendDeadlineMs?: number

    Maximum time a memory replay append waits for ACK-driven trimming after +

    memoryReplayAppendDeadlineMs?: number

    Maximum time a memory replay append waits for ACK-driven trimming after reaching memoryReplayMaxBytes. Defaults to 30 seconds.

    -
    memoryReplayMaxBytes?: number

    Target cap for the built-in memory-only replay queue, including estimated +

    memoryReplayMaxBytes?: number

    Target cap for the built-in memory-only replay queue, including estimated per-frame bookkeeping. Defaults to 128 MiB. A transaction-closing logical batch may temporarily exceed this target by up to one target-sized batch, because the server cannot ACK its deferred prefix before receiving that batch. This applies in browsers and non-persistent Node sessions; custom replay stores enforce their own cap.

    -
    onDurableAck?: (response: QwpIngressResponse) => void
    onError?: (event: QwpIngressErrorEvent) => void

    Server rejections, deadlines, and terminal session failures.

    -
    onProgress?: (event: QwpIngressProgressEvent) => void

    Monotonic send/accept/durability notifications. Callback errors are ignored.

    -
    onResponse?: (response: QwpIngressResponse) => void
    onSenderError?: (error: QwpSenderError) => void

    Java-parity typed server-rejection and data-loss notifications. When +

    onDurableAck?: (response: QwpIngressResponse) => void
    onError?: (event: QwpIngressErrorEvent) => void

    Server rejections, deadlines, and terminal session failures.

    +
    onProgress?: (event: QwpIngressProgressEvent) => void

    Monotonic send/accept/durability notifications. Callback errors are ignored.

    +
    onResponse?: (response: QwpIngressResponse) => void
    onSenderError?: (error: QwpSenderError) => void

    Java-parity typed server-rejection and data-loss notifications. When omitted, the default handler logs retriable errors at warn and terminal errors or abandoned data at error.

    -
    orphanDurableAckMismatchMaxDurationMs?: number

    Consecutive durable-ACK gap budget retained for orphan SF. +

    orphanDurableAckMismatchMaxDurationMs?: number

    Consecutive durable-ACK gap budget retained for orphan SF. Not capped at the host timer ceiling: compared against elapsed time only.

    -
    orphanStoreAndForward?: boolean

    Orphan sessions may quarantine persistent catch-up cap gaps.

    -
    reconnect?: false | QwpReconnectOptions

    Bounded reconnection and at-least-once replay policy. Reconnection is +

    orphanStoreAndForward?: boolean

    Orphan sessions may quarantine persistent catch-up cap gaps.

    +
    reconnect?: false | QwpReconnectOptions

    Bounded reconnection and at-least-once replay policy. Reconnection is enabled by default for factory-created sessions; set false to keep one fixed connection. Browser and non-persistent Node replay is memory-only.

    An ACK lost during disconnect can cause a frame to be replayed after the server accepted it; configure server-side deduplication when duplicates are not acceptable.

    -
    replayStore?: QwpIngressReplayStore

    Node adapter hook for persistent store-and-forward.

    -
    +
    replayStore?: QwpIngressReplayStore

    Node adapter hook for persistent store-and-forward.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressSymbolDictionaryDelta.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressSymbolDictionaryDelta.html index fcfbc183..40548227 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressSymbolDictionaryDelta.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressSymbolDictionaryDelta.html @@ -1,3 +1,3 @@ -QwpIngressSymbolDictionaryDelta | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressSymbolDictionaryDelta

    interface QwpIngressSymbolDictionaryDelta {
        entries: readonly string[];
        startId: number;
    }
    Index

    Properties

    entries +QwpIngressSymbolDictionaryDelta | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressSymbolDictionaryDelta

    interface QwpIngressSymbolDictionaryDelta {
        entries: readonly string[];
        startId: number;
    }
    Index

    Properties

    Properties

    entries: readonly string[]
    startId: number
    +

    Properties

    entries: readonly string[]
    startId: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressTableResult.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressTableResult.html index 1943c04e..6dd41bfa 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressTableResult.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressTableResult.html @@ -1,3 +1,3 @@ -QwpIngressTableResult | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressTableResult

    interface QwpIngressTableResult {
        name: string;
        sequenceTransaction: bigint;
    }
    Index

    Properties

    name +QwpIngressTableResult | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressTableResult

    interface QwpIngressTableResult {
        name: string;
        sequenceTransaction: bigint;
    }
    Index

    Properties

    name: string
    sequenceTransaction: bigint
    +

    Properties

    name: string
    sequenceTransaction: bigint
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpIngressTransportMetrics.html b/docs/interfaces/_questdb_nodejs-client.QwpIngressTransportMetrics.html index 43b81e75..f6e9b71a 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpIngressTransportMetrics.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpIngressTransportMetrics.html @@ -1,5 +1,5 @@ QwpIngressTransportMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpIngressTransportMetrics

    Physical ingress delivery counters maintained by reconnecting transports.

    -
    interface QwpIngressTransportMetrics {
        abandonedFrameRanges?: readonly { fromFsn: bigint; toFsn: bigint }[];
        acknowledgedFrameSequence: bigint;
        deliveredConnectionNotifications?: number;
        deliveredErrorNotifications?: number;
        droppedConnectionNotifications?: number;
        droppedErrorNotifications?: number;
        memoryReplayMaxBytes?: number;
        memoryReplayUsedBytes?: number;
        pendingReplayBytes: number;
        pendingReplayFrames: number;
        publishedFrameSequence: bigint;
        totalBytesReplayed: number;
        totalBytesSent: number;
        totalFailovers: number;
        totalFramesReplayed: number;
        totalFramesSent: number;
        totalMemoryReplayAppendTimeouts: number;
        totalMemoryReplayBackpressureStalls: number;
        totalReconnectAttempts: number;
        totalReconnectErrors: number;
        totalReconnectsSucceeded: number;
        totalServerNacks: number;
        waitingMemoryReplayAppends: number;
    }
    Index

    Properties

    interface QwpIngressTransportMetrics {
        abandonedFrameRanges?: readonly { fromFsn: bigint; toFsn: bigint }[];
        acknowledgedFrameSequence: bigint;
        deliveredConnectionNotifications?: number;
        deliveredErrorNotifications?: number;
        droppedConnectionNotifications?: number;
        droppedErrorNotifications?: number;
        memoryReplayMaxBytes?: number;
        memoryReplayUsedBytes?: number;
        pendingReplayBytes: number;
        pendingReplayFrames: number;
        publishedFrameSequence: bigint;
        totalBytesReplayed: number;
        totalBytesSent: number;
        totalFailovers: number;
        totalFramesReplayed: number;
        totalFramesSent: number;
        totalMemoryReplayAppendTimeouts: number;
        totalMemoryReplayBackpressureStalls: number;
        totalReconnectAttempts: number;
        totalReconnectErrors: number;
        totalReconnectsSucceeded: number;
        totalServerNacks: number;
        waitingMemoryReplayAppends: number;
    }
    Index

    Properties

    abandonedFrameRanges?: readonly { fromFsn: bigint; toFsn: bigint }[]

    Stable frame ranges retired without ever receiving a server ACK.

    -
    acknowledgedFrameSequence: bigint

    Highest replay-frame sequence removed after a server acknowledgement.

    -
    deliveredConnectionNotifications?: number
    deliveredErrorNotifications?: number
    droppedConnectionNotifications?: number
    droppedErrorNotifications?: number
    memoryReplayMaxBytes?: number

    Configured cap for the built-in memory replay store.

    -
    memoryReplayUsedBytes?: number

    Estimated payload and record-bookkeeping bytes charged to that cap.

    -
    pendingReplayBytes: number
    pendingReplayFrames: number
    publishedFrameSequence: bigint

    Highest stable replay-frame sequence handed to the transport.

    -
    totalBytesReplayed: number
    totalBytesSent: number
    totalFailovers: number
    totalFramesReplayed: number
    totalFramesSent: number

    Physical WebSocket sends, including replay and dictionary catch-up.

    -
    totalMemoryReplayAppendTimeouts: number
    totalMemoryReplayBackpressureStalls: number
    totalReconnectAttempts: number
    totalReconnectErrors: number
    totalReconnectsSucceeded: number
    totalServerNacks: number
    waitingMemoryReplayAppends: number
    +
    acknowledgedFrameSequence: bigint

    Highest replay-frame sequence removed after a server acknowledgement.

    +
    deliveredConnectionNotifications?: number
    deliveredErrorNotifications?: number
    droppedConnectionNotifications?: number
    droppedErrorNotifications?: number
    memoryReplayMaxBytes?: number

    Configured cap for the built-in memory replay store.

    +
    memoryReplayUsedBytes?: number

    Estimated payload and record-bookkeeping bytes charged to that cap.

    +
    pendingReplayBytes: number
    pendingReplayFrames: number
    publishedFrameSequence: bigint

    Highest stable replay-frame sequence handed to the transport.

    +
    totalBytesReplayed: number
    totalBytesSent: number
    totalFailovers: number
    totalFramesReplayed: number
    totalFramesSent: number

    Physical WebSocket sends, including replay and dictionary catch-up.

    +
    totalMemoryReplayAppendTimeouts: number
    totalMemoryReplayBackpressureStalls: number
    totalReconnectAttempts: number
    totalReconnectErrors: number
    totalReconnectsSucceeded: number
    totalServerNacks: number
    waitingMemoryReplayAppends: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpLong256Value.html b/docs/interfaces/_questdb_nodejs-client.QwpLong256Value.html index 729bc69c..e90936cd 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpLong256Value.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpLong256Value.html @@ -1,3 +1,3 @@ -QwpLong256Value | QuestDB JavaScript Client - v5.0.0

    Interface QwpLong256Value

    interface QwpLong256Value {
        words: readonly [bigint, bigint, bigint, bigint];
    }
    Index

    Properties

    words +QwpLong256Value | QuestDB JavaScript Client - v5.0.0

    Interface QwpLong256Value

    interface QwpLong256Value {
        words: readonly [bigint, bigint, bigint, bigint];
    }
    Index

    Properties

    Properties

    words: readonly [bigint, bigint, bigint, bigint]

    Little-endian 64-bit words; word 0 is least significant.

    -
    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeClientConfigOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeClientConfigOptions.html index f45fec73..f9d208bf 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeClientConfigOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeClientConfigOptions.html @@ -1,6 +1,6 @@ QwpNodeClientConfigOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeClientConfigOptions

    Programmatic hooks layered over a unified ws/wss cluster string. Values in this object take precedence after the complete string has been validated.

    -
    interface QwpNodeClientConfigOptions {
        egress?: Partial<
            Pick<
                QwpNodeEgressOptions,
                "target"
                | "zone"
                | "compression"
                | "compressionLevel"
                | "maxBatchRows",
            >,
        >;
        egressSession?: QwpEgressSessionOptions;
        ingressSession?: QwpIngressSessionOptions;
        pool?: QwpClientPoolOptions;
        sender?: QwpSenderOptions;
        storeAndForward?: QwpNodeStoreAndForwardOptions;
        webSocket?: Partial<Omit<QwpNodeWebSocketOptions, "url" | "failoverUrls">>;
    }
    Index

    Properties

    interface QwpNodeClientConfigOptions {
        egress?: Partial<
            Pick<
                QwpNodeEgressOptions,
                "target"
                | "zone"
                | "compression"
                | "compressionLevel"
                | "maxBatchRows",
            >,
        >;
        egressSession?: QwpEgressSessionOptions;
        ingressSession?: QwpIngressSessionOptions;
        pool?: QwpClientPoolOptions;
        sender?: QwpSenderOptions;
        storeAndForward?: QwpNodeStoreAndForwardOptions;
        webSocket?: Partial<Omit<QwpNodeWebSocketOptions, "url" | "failoverUrls">>;
    }
    Index

    Properties

    egress?: Partial<
        Pick<
            QwpNodeEgressOptions,
            "target"
            | "zone"
            | "compression"
            | "compressionLevel"
            | "maxBatchRows",
        >,
    >

    Egress-only routing and compression overrides.

    -
    egressSession?: QwpEgressSessionOptions
    ingressSession?: QwpIngressSessionOptions

    Optional persistent ingress configuration; may supply/override sf_dir.

    -
    webSocket?: Partial<Omit<QwpNodeWebSocketOptions, "url" | "failoverUrls">>

    Shared transport overrides applied to both ingress and egress.

    -
    +
    egressSession?: QwpEgressSessionOptions
    ingressSession?: QwpIngressSessionOptions

    Optional persistent ingress configuration; may supply/override sf_dir.

    +
    webSocket?: Partial<Omit<QwpNodeWebSocketOptions, "url" | "failoverUrls">>

    Shared transport overrides applied to both ingress and egress.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeClientOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeClientOptions.html index f41ee221..0e11168c 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeClientOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeClientOptions.html @@ -1,13 +1,13 @@ QwpNodeClientOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeClientOptions

    Node configuration for a combined pooled QWP ingress/egress client.

    -
    Index

    Properties

    Index

    Properties

    egressSession?: QwpEgressSessionOptions
    ingressSession?: QwpIngressSessionOptions
    lazyConnect?: boolean

    Coordinates a non-blocking startup: ingress connects in the background, +

    Properties

    egressSession?: QwpEgressSessionOptions
    ingressSession?: QwpIngressSessionOptions
    lazyConnect?: boolean

    Coordinates a non-blocking startup: ingress connects in the background, using memory replay when store-and-forward is absent, and the egress pool remains cold until the first query. Conflicts with a positive queryPoolMin or a non-async initialConnectMode.

    -
    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeEgressOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeEgressOptions.html index 9a545ebf..574e9df9 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeEgressOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeEgressOptions.html @@ -1,7 +1,7 @@ QwpNodeEgressOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeEgressOptions

    Endpoint routing preferences. Named for egress, where they landed first, but ingress ranks and validates its endpoints with the same machinery and honours the same two keys.

    -
    interface QwpNodeEgressOptions {
        agent?: Agent;
        authorization?: string;
        authTimeoutMs?: number;
        clientId?: string;
        closeTimeoutMs?: number;
        compression?: QwpEgressCompression;
        compressionLevel?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        headers?: Record<string, string>;
        maxBatchRows?: number;
        maxVersion?: number;
        protocols?: string | string[];
        requestDurableAck?: boolean;
        sendTimeoutMs?: number;
        target?: QwpTarget;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            options: {
                agent?: Agent;
                headers: Record<string, string>;
                onConnected: () => void;
                onUpgrade: (headers: IncomingHttpHeaders) => void;
                onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
                protocols?: string | string[];
            },
        ) => QwpWebSocketLike;
        zone?: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface QwpNodeEgressOptions {
        agent?: Agent;
        authorization?: string;
        authTimeoutMs?: number;
        clientId?: string;
        closeTimeoutMs?: number;
        compression?: QwpEgressCompression;
        compressionLevel?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        headers?: Record<string, string>;
        maxBatchRows?: number;
        maxVersion?: number;
        protocols?: string | string[];
        requestDurableAck?: boolean;
        sendTimeoutMs?: number;
        target?: QwpTarget;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            options: {
                agent?: Agent;
                headers: Record<string, string>;
                onConnected: () => void;
                onUpgrade: (headers: IncomingHttpHeaders) => void;
                onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
                protocols?: string | string[];
            },
        ) => QwpWebSocketLike;
        zone?: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    agent?: Agent

    Optional HTTP(S) agent used for the WebSocket upgrade.

    -
    authorization?: string
    authTimeoutMs?: number

    Time allowed after TCP/TLS connection for HTTP authentication and the +

    authorization?: string
    authTimeoutMs?: number

    Time allowed after TCP/TLS connection for HTTP authentication and the WebSocket upgrade.

    Defaults to QwpWebSocketConnectOptions.connectTimeoutMs when that is set, and to 15s otherwise, so narrowing only the connect deadline @@ -29,27 +29,27 @@ chose. Set this to give the slower phase its own budget. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    clientId?: string
    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. +

    clientId?: string
    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    compression?: QwpEgressCompression

    Requests Zstd-compressed result batches. The default is raw, which +

    compression?: QwpEgressCompression

    Requests Zstd-compressed result batches. The default is raw, which preserves compatibility with servers that predate QWP compression. auto currently advertises the same ordered preference as zstd.

    -
    compressionLevel?: number

    Zstd level hint sent to the server. Must be between 1 and 22, and only +

    compressionLevel?: number

    Zstd level hint sent to the server. Must be between 1 and 22, and only takes effect alongside compression; the default raw sends no accept-encoding header for a level to travel on.

    -
    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a +

    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a browser. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    -
    headers?: Record<string, string>
    maxBatchRows?: number

    Requests a server-side RESULT_BATCH row cap.

    -
    maxVersion?: number
    protocols?: string | string[]
    requestDurableAck?: boolean

    Ingress-only. Durable ACK is negotiated on /write/v4; egress ignores it +

    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    +
    headers?: Record<string, string>
    maxBatchRows?: number

    Requests a server-side RESULT_BATCH row cap.

    +
    maxVersion?: number
    protocols?: string | string[]
    requestDurableAck?: boolean

    Ingress-only. Durable ACK is negotiated on /write/v4; egress ignores it and egressTransportOptions() strips it, because sending the header on /read/v1 makes every query session fail the capability check.

    -
    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. +

    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    target?: QwpTarget

    Selects any readable node, a primary/standalone node, or a replica.

    -
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        options: {
            agent?: Agent;
            headers: Record<string, string>;
            onConnected: () => void;
            onUpgrade: (headers: IncomingHttpHeaders) => void;
            onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
            protocols?: string | string[];
        },
    ) => QwpWebSocketLike

    Test hook; defaults to the Node-only ws implementation.

    -
    zone?: string

    Opaque, case-insensitive preferred zone; cross-zone fallback stays enabled.

    -
    +
    target?: QwpTarget

    Selects any readable node, a primary/standalone node, or a replica.

    +
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        options: {
            agent?: Agent;
            headers: Record<string, string>;
            onConnected: () => void;
            onUpgrade: (headers: IncomingHttpHeaders) => void;
            onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
            protocols?: string | string[];
        },
    ) => QwpWebSocketLike

    Test hook; defaults to the Node-only ws implementation.

    +
    zone?: string

    Opaque, case-insensitive preferred zone; cross-zone fallback stays enabled.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeFileReplayStoreMetrics.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeFileReplayStoreMetrics.html index cc665a8a..57a10eab 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeFileReplayStoreMetrics.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeFileReplayStoreMetrics.html @@ -1,4 +1,4 @@ -QwpNodeFileReplayStoreMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeFileReplayStoreMetrics

    interface QwpNodeFileReplayStoreMetrics {
        backpressurePolicy: QwpSfBackpressurePolicy;
        checkpointPending: boolean;
        dirtyRecords: number;
        durability: QwpSfDurability;
        lastCheckpointError?: QwpReplayStoreCheckpointError;
        pendingRecords: number;
        pendingSegments: number;
        totalAppendTimeouts: number;
        totalBackpressureStalls: number;
        totalBytes: number;
        totalCheckpointFailures: number;
        totalCheckpoints: number;
        waitingAppends: number;
    }
    Index

    Properties

    backpressurePolicy +QwpNodeFileReplayStoreMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeFileReplayStoreMetrics

    interface QwpNodeFileReplayStoreMetrics {
        backpressurePolicy: QwpSfBackpressurePolicy;
        checkpointPending: boolean;
        dirtyRecords: number;
        durability: QwpSfDurability;
        lastCheckpointError?: QwpReplayStoreCheckpointError;
        pendingRecords: number;
        pendingSegments: number;
        totalAppendTimeouts: number;
        totalBackpressureStalls: number;
        totalBytes: number;
        totalCheckpointFailures: number;
        totalCheckpoints: number;
        waitingAppends: number;
    }
    Index

    Properties

    backpressurePolicy: QwpSfBackpressurePolicy
    checkpointPending: boolean
    dirtyRecords: number
    durability: QwpSfDurability
    lastCheckpointError?: QwpReplayStoreCheckpointError
    pendingRecords: number
    pendingSegments: number
    totalAppendTimeouts: number
    totalBackpressureStalls: number
    totalBytes: number
    totalCheckpointFailures: number
    totalCheckpoints: number
    waitingAppends: number
    +

    Properties

    backpressurePolicy: QwpSfBackpressurePolicy
    checkpointPending: boolean
    dirtyRecords: number
    durability: QwpSfDurability
    lastCheckpointError?: QwpReplayStoreCheckpointError
    pendingRecords: number
    pendingSegments: number
    totalAppendTimeouts: number
    totalBackpressureStalls: number
    totalBytes: number
    totalCheckpointFailures: number
    totalCheckpoints: number
    waitingAppends: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeFileReplayStoreOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeFileReplayStoreOptions.html index 78b30d8e..d3154c08 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeFileReplayStoreOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeFileReplayStoreOptions.html @@ -1,4 +1,4 @@ -QwpNodeFileReplayStoreOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeFileReplayStoreOptions

    interface QwpNodeFileReplayStoreOptions {
        appendDeadlineMs?: number;
        backpressurePolicy?: QwpSfBackpressurePolicy;
        checkpointIntervalMs?: number;
        directory: string;
        durability?: QwpSfDurability;
        maxBytes?: number;
        maxSegmentBytes?: number;
        onRecoveryDataLoss?: (report: QwpNodeReplayDataLossReport) => void;
    }

    Hierarchy (View Summary)

    Index

    Properties

    appendDeadlineMs? +QwpNodeFileReplayStoreOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeFileReplayStoreOptions

    interface QwpNodeFileReplayStoreOptions {
        appendDeadlineMs?: number;
        backpressurePolicy?: QwpSfBackpressurePolicy;
        checkpointIntervalMs?: number;
        directory: string;
        durability?: QwpSfDurability;
        maxBytes?: number;
        maxSegmentBytes?: number;
        onRecoveryDataLoss?: (report: QwpNodeReplayDataLossReport) => void;
    }

    Hierarchy (View Summary)

    Index

    Properties

    appendDeadlineMs?: number

    Per-append capacity or retryable store-fault deadline. Defaults to 30 seconds.

    -
    backpressurePolicy?: QwpSfBackpressurePolicy

    Behavior when maxBytes is exhausted. error fails immediately; wait +

    backpressurePolicy?: QwpSfBackpressurePolicy

    Behavior when maxBytes is exhausted. error fails immediately; wait pauses the append until ACK trimming frees space or its deadline expires. Defaults to error for backwards compatibility.

    This decides journal exhaustion only. A transient retryable fault parks until appendDeadlineMs under either policy, so the only errors an append surfaces are exhaustion and that deadline.

    -
    checkpointIntervalMs?: number

    Periodic durability checkpoint cadence. Defaults to 5 seconds.

    -
    directory: string

    Exclusive directory used by one ingress session.

    -
    durability?: QwpSfDurability

    Local persistence barrier. append preserves the existing fsync-per-frame +

    checkpointIntervalMs?: number

    Periodic durability checkpoint cadence. Defaults to 5 seconds.

    +
    directory: string

    Exclusive directory used by one ingress session.

    +
    durability?: QwpSfDurability

    Local persistence barrier. append preserves the existing fsync-per-frame behavior, periodic checkpoints dirty files in the background, and memory relies on OS page-cache writeback. Defaults to append.

    -
    maxBytes?: number

    Target maximum journal size including fixed segment reservations and +

    maxBytes?: number

    Target maximum journal size including fixed segment reservations and symbol metadata. Defaults to 1 GiB. The current symbol dictionary may exceed this target so it cannot consume the journal's live frame budget before a drained close retires that dictionary generation.

    @@ -35,11 +35,11 @@ 24-byte SFA header and the 8-byte frame header. A smaller target throws a RangeError, because no append could ever reserve its first segment and no acknowledgement could ever free room for one.

    -
    maxSegmentBytes?: number

    Maximum QWP frame payload and target segment data size. Each fixed segment +

    maxSegmentBytes?: number

    Maximum QWP frame payload and target segment data size. Each fixed segment reserves this value plus one record header and its 24-byte SFA header, so a maximum-sized frame still fits. Defaults to 4 MiB. With a directory, QwpNodeFileReplayStoreOptions.maxBytes must leave room for one whole segment of this size plus those 32 bytes of headers.

    -
    onRecoveryDataLoss?: (report: QwpNodeReplayDataLossReport) => void

    Reports journal bytes abandoned during recovery. Defaults to logging at +

    onRecoveryDataLoss?: (report: QwpNodeReplayDataLossReport) => void

    Reports journal bytes abandoned during recovery. Defaults to logging at error level; recovery still succeeds, so this must never be silent.

    -
    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeIngressOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeIngressOptions.html index dc4b2eaa..9c87b5d3 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeIngressOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeIngressOptions.html @@ -1,7 +1,7 @@ QwpNodeIngressOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeIngressOptions

    Endpoint routing preferences. Named for egress, where they landed first, but ingress ranks and validates its endpoints with the same machinery and honours the same two keys.

    -
    interface QwpNodeIngressOptions {
        agent?: Agent;
        authorization?: string;
        authTimeoutMs?: number;
        clientId?: string;
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        headers?: Record<string, string>;
        maxVersion?: number;
        protocols?: string | string[];
        requestDurableAck?: boolean;
        senderId?: string;
        sendTimeoutMs?: number;
        storeAndForward?: QwpNodeStoreAndForwardOptions;
        target?: QwpTarget;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            options: {
                agent?: Agent;
                headers: Record<string, string>;
                onConnected: () => void;
                onUpgrade: (headers: IncomingHttpHeaders) => void;
                onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
                protocols?: string | string[];
            },
        ) => QwpWebSocketLike;
        zone?: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface QwpNodeIngressOptions {
        agent?: Agent;
        authorization?: string;
        authTimeoutMs?: number;
        clientId?: string;
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        headers?: Record<string, string>;
        maxVersion?: number;
        protocols?: string | string[];
        requestDurableAck?: boolean;
        senderId?: string;
        sendTimeoutMs?: number;
        storeAndForward?: QwpNodeStoreAndForwardOptions;
        target?: QwpTarget;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            options: {
                agent?: Agent;
                headers: Record<string, string>;
                onConnected: () => void;
                onUpgrade: (headers: IncomingHttpHeaders) => void;
                onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
                protocols?: string | string[];
            },
        ) => QwpWebSocketLike;
        zone?: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    agent?: Agent

    Optional HTTP(S) agent used for the WebSocket upgrade.

    -
    authorization?: string
    authTimeoutMs?: number

    Time allowed after TCP/TLS connection for HTTP authentication and the +

    authorization?: string
    authTimeoutMs?: number

    Time allowed after TCP/TLS connection for HTTP authentication and the WebSocket upgrade.

    Defaults to QwpWebSocketConnectOptions.connectTimeoutMs when that is set, and to 15s otherwise, so narrowing only the connect deadline @@ -28,27 +28,27 @@ chose. Set this to give the slower phase its own budget. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    clientId?: string
    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. +

    clientId?: string
    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a +

    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a browser. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    -
    headers?: Record<string, string>
    maxVersion?: number
    protocols?: string | string[]
    requestDurableAck?: boolean

    Ingress-only. Durable ACK is negotiated on /write/v4; egress ignores it +

    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    +
    headers?: Record<string, string>
    maxVersion?: number
    protocols?: string | string[]
    requestDurableAck?: boolean

    Ingress-only. Durable ACK is negotiated on /write/v4; egress ignores it and egressTransportOptions() strips it, because sending the header on /read/v1 makes every query session fail the capability check.

    -
    senderId?: string

    Slot name below storeAndForward.directory.

    +
    senderId?: string

    Slot name below storeAndForward.directory.

    A connect string defaults it to default. Through the typed API it has no default: a standalone sender writes straight into directory, and a pooled client derives sender-<slot> names, or <senderId>-<slot> when this is set.

    -
    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. +

    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -

    Upgrades the default in-memory ingress replay to persistent Node +

    Upgrades the default in-memory ingress replay to persistent Node store-and-forward. Use a directory owned exclusively by this session.

    -
    target?: QwpTarget

    Selects any readable node, a primary/standalone node, or a replica.

    -
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        options: {
            agent?: Agent;
            headers: Record<string, string>;
            onConnected: () => void;
            onUpgrade: (headers: IncomingHttpHeaders) => void;
            onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
            protocols?: string | string[];
        },
    ) => QwpWebSocketLike

    Test hook; defaults to the Node-only ws implementation.

    -
    zone?: string

    Opaque, case-insensitive preferred zone; cross-zone fallback stays enabled.

    -
    +
    target?: QwpTarget

    Selects any readable node, a primary/standalone node, or a replica.

    +
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        options: {
            agent?: Agent;
            headers: Record<string, string>;
            onConnected: () => void;
            onUpgrade: (headers: IncomingHttpHeaders) => void;
            onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
            protocols?: string | string[];
        },
    ) => QwpWebSocketLike

    Test hook; defaults to the Node-only ws implementation.

    +
    zone?: string

    Opaque, case-insensitive preferred zone; cross-zone fallback stays enabled.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainEvent.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainEvent.html index 839f8411..a79b881b 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainEvent.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainEvent.html @@ -1,4 +1,4 @@ -QwpNodeOrphanDrainEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeOrphanDrainEvent

    interface QwpNodeOrphanDrainEvent {
        attempt?: number;
        directory?: string;
        episodeMs?: number;
        error?: Error;
        kind: QwpNodeOrphanDrainEventKind;
        metrics: QwpNodeOrphanDrainerMetrics;
        senderError?: QwpSenderError;
        timestampMs: number;
    }
    Index

    Properties

    attempt? +QwpNodeOrphanDrainEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeOrphanDrainEvent

    interface QwpNodeOrphanDrainEvent {
        attempt?: number;
        directory?: string;
        episodeMs?: number;
        error?: Error;
        kind: QwpNodeOrphanDrainEventKind;
        metrics: QwpNodeOrphanDrainerMetrics;
        senderError?: QwpSenderError;
        timestampMs: number;
    }
    Index

    Properties

    attempt?: number

    One-based attempt in the current capability/topology episode.

    -
    directory?: string
    episodeMs?: number

    Elapsed time in the current consecutive capability-gap episode.

    -
    error?: Error
    senderError?: QwpSenderError

    Present when a failed slot has been abandoned behind its sentinel.

    -
    timestampMs: number
    +
    directory?: string
    episodeMs?: number

    Elapsed time in the current consecutive capability-gap episode.

    +
    error?: Error
    senderError?: QwpSenderError

    Present when a failed slot has been abandoned behind its sentinel.

    +
    timestampMs: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainSession.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainSession.html index c2a8dc2d..045d5868 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainSession.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainSession.html @@ -1,7 +1,7 @@ QwpNodeOrphanDrainSession | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeOrphanDrainSession

    Minimal session surface used by the Node orphan drainer.

    -
    interface QwpNodeOrphanDrainSession {
        closed: Promise<QwpConnectionCloseInfo>;
        metrics: Pick<
            QwpIngressTransportMetrics,
            "pendingReplayFrames"
            | "pendingReplayBytes",
        > & { lastError?: Error };
        close(code?: number, reason?: string): Promise<void>;
        pollDurableAck(): Promise<void>;
    }
    Index

    Properties

    interface QwpNodeOrphanDrainSession {
        closed: Promise<QwpConnectionCloseInfo>;
        metrics: Pick<
            QwpIngressTransportMetrics,
            "pendingReplayFrames"
            | "pendingReplayBytes",
        > & { lastError?: Error };
        close(code?: number, reason?: string): Promise<void>;
        pollDurableAck(): Promise<void>;
    }
    Index

    Properties

    Methods

    Properties

    closed: Promise<QwpConnectionCloseInfo>
    metrics: Pick<
        QwpIngressTransportMetrics,
        "pendingReplayFrames"
        | "pendingReplayBytes",
    > & { lastError?: Error }

    Methods

    +

    Properties

    closed: Promise<QwpConnectionCloseInfo>
    metrics: Pick<
        QwpIngressTransportMetrics,
        "pendingReplayFrames"
        | "pendingReplayBytes",
    > & { lastError?: Error }

    Methods

    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainerMetrics.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainerMetrics.html index d21d3aa0..c58301d4 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainerMetrics.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainerMetrics.html @@ -1,4 +1,4 @@ -QwpNodeOrphanDrainerMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeOrphanDrainerMetrics

    interface QwpNodeOrphanDrainerMetrics {
        active: number;
        closed: boolean;
        closing: boolean;
        deliveredErrorNotifications: number;
        deliveredNotifications: number;
        discovered: number;
        drained: number;
        droppedErrorNotifications: number;
        droppedNotifications: number;
        failed: number;
        locked: number;
        queued: number;
        retrying: number;
        scanFailures: number;
        scans: number;
    }
    Index

    Properties

    active +QwpNodeOrphanDrainerMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeOrphanDrainerMetrics

    interface QwpNodeOrphanDrainerMetrics {
        active: number;
        closed: boolean;
        closing: boolean;
        deliveredErrorNotifications: number;
        deliveredNotifications: number;
        discovered: number;
        drained: number;
        droppedErrorNotifications: number;
        droppedNotifications: number;
        failed: number;
        locked: number;
        queued: number;
        retrying: number;
        scanFailures: number;
        scans: number;
    }
    Index

    Properties

    active: number
    closed: boolean
    closing: boolean
    deliveredErrorNotifications: number
    deliveredNotifications: number
    discovered: number
    drained: number
    droppedErrorNotifications: number
    droppedNotifications: number
    failed: number
    locked: number
    queued: number
    retrying: number

    Transient drain or terminal-marker writes awaiting retry.

    -
    scanFailures: number
    scans: number
    +

    Properties

    active: number
    closed: boolean
    closing: boolean
    deliveredErrorNotifications: number
    deliveredNotifications: number
    discovered: number
    drained: number
    droppedErrorNotifications: number
    droppedNotifications: number
    failed: number
    locked: number
    queued: number
    retrying: number

    Transient drain or terminal-marker writes awaiting retry.

    +
    scanFailures: number
    scans: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainerOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainerOptions.html index 34e59373..8417a614 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainerOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeOrphanDrainerOptions.html @@ -1,4 +1,4 @@ -QwpNodeOrphanDrainerOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeOrphanDrainerOptions

    interface QwpNodeOrphanDrainerOptions {
        durableAckPollIntervalMs?: number;
        errorInboxCapacity?: number;
        eventInboxCapacity?: number;
        excludeSlot?: (slotName: string) => boolean;
        maxConcurrent?: number;
        onEvent?: (event: QwpNodeOrphanDrainEvent) => void;
        onSenderError?: (error: QwpSenderError) => void;
        releaseSlot?: (directory: string) => void;
        rootDirectory: string;
        scanIntervalMs?: number;
        tryReserveSlot?: (directory: string) => boolean;
        createSession(
            directory: string,
            onReconnectEvent?: (event: QwpReconnectEvent) => void,
        ): Promise<QwpNodeOrphanDrainSession>;
    }
    Index

    Properties

    durableAckPollIntervalMs? +QwpNodeOrphanDrainerOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeOrphanDrainerOptions

    interface QwpNodeOrphanDrainerOptions {
        durableAckPollIntervalMs?: number;
        errorInboxCapacity?: number;
        eventInboxCapacity?: number;
        excludeSlot?: (slotName: string) => boolean;
        maxConcurrent?: number;
        onEvent?: (event: QwpNodeOrphanDrainEvent) => void;
        onSenderError?: (error: QwpSenderError) => void;
        releaseSlot?: (directory: string) => void;
        rootDirectory: string;
        scanIntervalMs?: number;
        tryReserveSlot?: (directory: string) => boolean;
        createSession(
            directory: string,
            onReconnectEvent?: (event: QwpReconnectEvent) => void,
        ): Promise<QwpNodeOrphanDrainSession>;
    }
    Index

    Properties

    durableAckPollIntervalMs?: number

    Durable-ACK prompt cadence for adopted sessions. Zero disables it. Not capped at the host timer ceiling: compared against elapsed time only.

    -
    errorInboxCapacity?: number

    Bounded data-loss inbox. Defaults to 256.

    -
    eventInboxCapacity?: number

    Bounded lifecycle-event inbox. Defaults to 64.

    -
    excludeSlot?: (slotName: string) => boolean

    Slot names owned by the foreground producer/pool and never adoptable.

    -
    maxConcurrent?: number

    Maximum slots drained concurrently. Defaults to 4.

    -
    onEvent?: (event: QwpNodeOrphanDrainEvent) => void
    onSenderError?: (error: QwpSenderError) => void

    Java-parity data-loss notification for an abandoned orphan slot.

    -
    releaseSlot?: (directory: string) => void

    Releases a reservation previously granted by tryReserveSlot.

    -
    rootDirectory: string

    Directory whose child directories are independent replay slots.

    -
    scanIntervalMs?: number

    Periodic rescan cadence; zero disables the timer. Explicit scanNow() +

    errorInboxCapacity?: number

    Bounded data-loss inbox. Defaults to 256.

    +
    eventInboxCapacity?: number

    Bounded lifecycle-event inbox. Defaults to 64.

    +
    excludeSlot?: (slotName: string) => boolean

    Slot names owned by the foreground producer/pool and never adoptable.

    +
    maxConcurrent?: number

    Maximum slots drained concurrently. Defaults to 4.

    +
    onEvent?: (event: QwpNodeOrphanDrainEvent) => void
    onSenderError?: (error: QwpSenderError) => void

    Java-parity data-loss notification for an abandoned orphan slot.

    +
    releaseSlot?: (directory: string) => void

    Releases a reservation previously granted by tryReserveSlot.

    +
    rootDirectory: string

    Directory whose child directories are independent replay slots.

    +
    scanIntervalMs?: number

    Periodic rescan cadence; zero disables the timer. Explicit scanNow() requests remain available. Defaults to 30s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    tryReserveSlot?: (directory: string) => boolean

    Atomically reserves a candidate against a foreground pool owner.

    -

    Methods

    +
    tryReserveSlot?: (directory: string) => boolean

    Atomically reserves a candidate against a foreground pool owner.

    +

    Methods

    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeReplayDataLossReport.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeReplayDataLossReport.html index 0c4e322e..7249ef0b 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeReplayDataLossReport.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeReplayDataLossReport.html @@ -2,12 +2,12 @@ failing recovery when the damage sits in the active segment, matching the Java client, which zeroes an active torn tail by policy and reports the residue through a WARN plus MmapSegment.tornTailBytes().

    -
    interface QwpNodeReplayDataLossReport {
        directory: string;
        discardedBytes: number;
        reason: string;
        segmentFile: string;
    }
    Index

    Properties

    interface QwpNodeReplayDataLossReport {
        directory: string;
        discardedBytes: number;
        reason: string;
        segmentFile: string;
    }
    Index

    Properties

    directory: string
    discardedBytes: number

    Bytes at and after the damaged record that recovery could not retain.

    +

    Properties

    directory: string
    discardedBytes: number

    Bytes at and after the damaged record that recovery could not retain.

    Zero means a loss was detected whose extent the journal cannot measure -- a segment whose records are gone leaves nothing to count. Treat it as "unknown", not as "nothing lost", and read reason.

    -
    reason: string
    segmentFile: string
    +
    reason: string
    segmentFile: string
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeReplayRecoveryEvent.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeReplayRecoveryEvent.html index ed64c721..44778904 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeReplayRecoveryEvent.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeReplayRecoveryEvent.html @@ -1,7 +1,7 @@ QwpNodeReplayRecoveryEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeReplayRecoveryEvent

    Notification that an unreplayable foreground slot was preserved aside.

    -
    interface QwpNodeReplayRecoveryEvent {
        directory: string;
        error: QwpReplayStoreQuarantinedError;
        quarantineDirectory: string;
        senderError: QwpSenderError;
        timestampMs: number;
    }
    Index

    Properties

    interface QwpNodeReplayRecoveryEvent {
        directory: string;
        error: QwpReplayStoreQuarantinedError;
        quarantineDirectory: string;
        senderError: QwpSenderError;
        timestampMs: number;
    }
    Index

    Properties

    directory: string
    quarantineDirectory: string
    senderError: QwpSenderError
    timestampMs: number
    +

    Properties

    directory: string
    quarantineDirectory: string
    senderError: QwpSenderError
    timestampMs: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeStoreAndForwardOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeStoreAndForwardOptions.html index 2f1486d4..e1b2cbde 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeStoreAndForwardOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeStoreAndForwardOptions.html @@ -1,5 +1,5 @@ QwpNodeStoreAndForwardOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeStoreAndForwardOptions

    Node store-and-forward controls layered on the crash-safe replay journal.

    -
    interface QwpNodeStoreAndForwardOptions {
        appendDeadlineMs?: number;
        backpressurePolicy?: QwpSfBackpressurePolicy;
        catchUpCapGapMinEscalationWindowMs?: number;
        checkpointIntervalMs?: number;
        directory: string;
        drainOrphans?: boolean;
        durability?: QwpSfDurability;
        initialConnectMode?: QwpInitialConnectMode;
        maxBackgroundDrainers?: number;
        maxBytes?: number;
        maxSegmentBytes?: number;
        onOrphanDrainEvent?: (event: QwpNodeOrphanDrainEvent) => void;
        onRecoveryDataLoss?: (report: QwpNodeReplayDataLossReport) => void;
        onRecoveryQuarantine?: (event: QwpNodeReplayRecoveryEvent) => void;
        orphanScanIntervalMs?: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface QwpNodeStoreAndForwardOptions {
        appendDeadlineMs?: number;
        backpressurePolicy?: QwpSfBackpressurePolicy;
        catchUpCapGapMinEscalationWindowMs?: number;
        checkpointIntervalMs?: number;
        directory: string;
        drainOrphans?: boolean;
        durability?: QwpSfDurability;
        initialConnectMode?: QwpInitialConnectMode;
        maxBackgroundDrainers?: number;
        maxBytes?: number;
        maxSegmentBytes?: number;
        onOrphanDrainEvent?: (event: QwpNodeOrphanDrainEvent) => void;
        onRecoveryDataLoss?: (report: QwpNodeReplayDataLossReport) => void;
        onRecoveryQuarantine?: (event: QwpNodeReplayRecoveryEvent) => void;
        orphanScanIntervalMs?: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    appendDeadlineMs?: number

    Per-append capacity or retryable store-fault deadline. Defaults to 30 seconds.

    -
    backpressurePolicy?: QwpSfBackpressurePolicy

    Behavior when maxBytes is exhausted. error fails immediately; wait +

    backpressurePolicy?: QwpSfBackpressurePolicy

    Behavior when maxBytes is exhausted. error fails immediately; wait pauses the append until ACK trimming frees space or its deadline expires. Defaults to error for backwards compatibility.

    This decides journal exhaustion only. A transient retryable fault parks until appendDeadlineMs under either policy, so the only errors an append surfaces are exhaustion and that deadline.

    -
    catchUpCapGapMinEscalationWindowMs?: number

    Minimum time an orphan slot's symbol catch-up cap gap must persist before +

    catchUpCapGapMinEscalationWindowMs?: number

    Minimum time an orphan slot's symbol catch-up cap gap must persist before it is quarantined. The gap must also be observed 16 times. Defaults to five minutes; zero uses the observation threshold alone.

    -
    checkpointIntervalMs?: number

    Periodic durability checkpoint cadence. Defaults to 5 seconds.

    -
    directory: string

    Exclusive directory used by one ingress session.

    -
    drainOrphans?: boolean

    Adopts sibling replay slots left by terminated producers. Standalone +

    checkpointIntervalMs?: number

    Periodic durability checkpoint cadence. Defaults to 5 seconds.

    +
    directory: string

    Exclusive directory used by one ingress session.

    +
    drainOrphans?: boolean

    Adopts sibling replay slots left by terminated producers. Standalone senders default this to false; pooled clients always recover their own idle in-range and out-of-range sender-N slots.

    -
    durability?: QwpSfDurability

    Local persistence barrier. append preserves the existing fsync-per-frame +

    durability?: QwpSfDurability

    Local persistence barrier. append preserves the existing fsync-per-frame behavior, periodic checkpoints dirty files in the background, and memory relies on OS page-cache writeback. Defaults to append.

    -
    initialConnectMode?: QwpInitialConnectMode

    Initial server connection policy. Defaults to off; an explicitly tuned +

    initialConnectMode?: QwpInitialConnectMode

    Initial server connection policy. Defaults to off; an explicitly tuned reconnect policy promotes it to sync, matching the Java client.

    -
    maxBackgroundDrainers?: number

    Maximum sibling slots drained concurrently. Defaults to 4.

    -
    maxBytes?: number

    Target maximum journal size including fixed segment reservations and +

    maxBackgroundDrainers?: number

    Maximum sibling slots drained concurrently. Defaults to 4.

    +
    maxBytes?: number

    Target maximum journal size including fixed segment reservations and symbol metadata. Defaults to 1 GiB. The current symbol dictionary may exceed this target so it cannot consume the journal's live frame budget before a drained close retires that dictionary generation.

    @@ -52,19 +52,19 @@ 24-byte SFA header and the 8-byte frame header. A smaller target throws a RangeError, because no append could ever reserve its first segment and no acknowledgement could ever free room for one.

    -
    maxSegmentBytes?: number

    Maximum QWP frame payload and target segment data size. Each fixed segment +

    maxSegmentBytes?: number

    Maximum QWP frame payload and target segment data size. Each fixed segment reserves this value plus one record header and its 24-byte SFA header, so a maximum-sized frame still fits. Defaults to 4 MiB. With a directory, QwpNodeFileReplayStoreOptions.maxBytes must leave room for one whole segment of this size plus those 32 bytes of headers.

    -
    onOrphanDrainEvent?: (event: QwpNodeOrphanDrainEvent) => void

    Receives isolated scanner, drainer, durable-ACK capability-gap, and +

    onOrphanDrainEvent?: (event: QwpNodeOrphanDrainEvent) => void

    Receives isolated scanner, drainer, durable-ACK capability-gap, and primary-unavailable lifecycle notifications.

    -
    onRecoveryDataLoss?: (report: QwpNodeReplayDataLossReport) => void

    Reports journal bytes abandoned during recovery. Defaults to logging at +

    onRecoveryDataLoss?: (report: QwpNodeReplayDataLossReport) => void

    Reports journal bytes abandoned during recovery. Defaults to logging at error level; recovery still succeeds, so this must never be silent.

    -
    onRecoveryQuarantine?: (event: QwpNodeReplayRecoveryEvent) => void

    Receives a data-loss notification when corrupt foreground replay bytes are +

    onRecoveryQuarantine?: (event: QwpNodeReplayRecoveryEvent) => void

    Receives a data-loss notification when corrupt foreground replay bytes are preserved under an .unreplayable-N pathname and a fresh slot is opened.

    -
    orphanScanIntervalMs?: number

    Periodic rescan cadence; zero disables the timer. Pooled ownership +

    orphanScanIntervalMs?: number

    Periodic rescan cadence; zero disables the timer. Pooled ownership changes can still trigger a scan. Defaults to 30 seconds. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpMetrics.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpMetrics.html index c8b7f681..c07ad8bd 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpMetrics.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpMetrics.html @@ -1,6 +1,6 @@ -QwpNodeUdpMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeUdpMetrics

    interface QwpNodeUdpMetrics {
        closed: boolean;
        publishedDatagramSequence: bigint;
        totalBytesSent: number;
        totalDatagramsSent: number;
        totalSendErrors: number;
    }
    Index

    Properties

    closed +QwpNodeUdpMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeUdpMetrics

    interface QwpNodeUdpMetrics {
        closed: boolean;
        publishedDatagramSequence: bigint;
        totalBytesSent: number;
        totalDatagramsSent: number;
        totalSendErrors: number;
    }
    Index

    Properties

    closed: boolean
    publishedDatagramSequence: bigint
    totalBytesSent: number
    totalDatagramsSent: number
    totalSendErrors: number
    +

    Properties

    closed: boolean
    publishedDatagramSequence: bigint
    totalBytesSent: number
    totalDatagramsSent: number
    totalSendErrors: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpOptions.html index 5425fe66..058cdcc9 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpOptions.html @@ -1,4 +1,4 @@ -QwpNodeUdpOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeUdpOptions

    interface QwpNodeUdpOptions {
        host: string;
        maxDatagramSize?: number;
        multicastInterface?: string;
        multicastTtl?: number;
        onError?: (error: Error) => void;
        port?: number;
        socketFactory?: () => QwpNodeUdpSocketLike;
    }
    Index

    Properties

    host +QwpNodeUdpOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeUdpOptions

    interface QwpNodeUdpOptions {
        host: string;
        maxDatagramSize?: number;
        multicastInterface?: string;
        multicastTtl?: number;
        onError?: (error: Error) => void;
        port?: number;
        socketFactory?: () => QwpNodeUdpSocketLike;
    }
    Index

    Properties

    host: string

    Destination hostname or IPv4 address.

    -
    maxDatagramSize?: number

    Maximum encoded datagram size. Defaults to 1400 bytes.

    -
    multicastInterface?: string

    Optional local IPv4 interface used for multicast traffic.

    -
    multicastTtl?: number

    IPv4 multicast TTL from 0 through 255. Defaults to 0.

    -
    onError?: (error: Error) => void

    Receives isolated local socket errors; UDP has no server acknowledgement.

    -
    port?: number

    Destination port. Defaults to the Java QWP UDP port, 9007.

    -
    socketFactory?: () => QwpNodeUdpSocketLike

    Test hook.

    -
    +
    maxDatagramSize?: number

    Maximum encoded datagram size. Defaults to 1400 bytes.

    +
    multicastInterface?: string

    Optional local IPv4 interface used for multicast traffic.

    +
    multicastTtl?: number

    IPv4 multicast TTL from 0 through 255. Defaults to 0.

    +
    onError?: (error: Error) => void

    Receives isolated local socket errors; UDP has no server acknowledgement.

    +
    port?: number

    Destination port. Defaults to the Java QWP UDP port, 9007.

    +
    socketFactory?: () => QwpNodeUdpSocketLike

    Test hook.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpSocketLike.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpSocketLike.html index e246380a..60f14dc7 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpSocketLike.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeUdpSocketLike.html @@ -1,8 +1,8 @@ QwpNodeUdpSocketLike | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeUdpSocketLike

    Minimal injectable UDP socket surface used by the Node QWP sender.

    -
    interface QwpNodeUdpSocketLike {
        bind(port: number, address: string, callback: () => void): void;
        close(callback: () => void): void;
        on(event: "error", listener: (error: Error) => void): unknown;
        send(
            message: Uint8Array,
            port: number,
            address: string,
            callback: (error: Error, bytes: number) => void,
        ): void;
        setMulticastInterface(multicastInterface: string): void;
        setMulticastTTL(ttl: number): number;
    }
    Index

    Methods

    interface QwpNodeUdpSocketLike {
        bind(port: number, address: string, callback: () => void): void;
        close(callback: () => void): void;
        on(event: "error", listener: (error: Error) => void): unknown;
        send(
            message: Uint8Array,
            port: number,
            address: string,
            callback: (error: Error, bytes: number) => void,
        ): void;
        setMulticastInterface(multicastInterface: string): void;
        setMulticastTTL(ttl: number): number;
    }
    Index

    Methods

    • Parameters

      • message: Uint8Array
      • port: number
      • address: string
      • callback: (error: Error, bytes: number) => void

      Returns void

    +

    Methods

    • Parameters

      • message: Uint8Array
      • port: number
      • address: string
      • callback: (error: Error, bytes: number) => void

      Returns void

    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeUpgradeRejection.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeUpgradeRejection.html index cc9de264..efb82c92 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeUpgradeRejection.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeUpgradeRejection.html @@ -1,4 +1,4 @@ -QwpNodeUpgradeRejection | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeUpgradeRejection

    interface QwpNodeUpgradeRejection {
        headers: IncomingHttpHeaders;
        statusCode: number;
        statusMessage?: string;
    }
    Index

    Properties

    headers +QwpNodeUpgradeRejection | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeUpgradeRejection

    interface QwpNodeUpgradeRejection {
        headers: IncomingHttpHeaders;
        statusCode: number;
        statusMessage?: string;
    }
    Index

    Properties

    headers: IncomingHttpHeaders
    statusCode: number
    statusMessage?: string
    +

    Properties

    headers: IncomingHttpHeaders
    statusCode: number
    statusMessage?: string
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpNodeWebSocketOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpNodeWebSocketOptions.html index 6192ac67..88bff40d 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpNodeWebSocketOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpNodeWebSocketOptions.html @@ -1,4 +1,4 @@ -QwpNodeWebSocketOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeWebSocketOptions

    interface QwpNodeWebSocketOptions {
        agent?: Agent;
        authorization?: string;
        authTimeoutMs?: number;
        clientId?: string;
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        headers?: Record<string, string>;
        maxVersion?: number;
        protocols?: string | string[];
        requestDurableAck?: boolean;
        sendTimeoutMs?: number;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            options: {
                agent?: Agent;
                headers: Record<string, string>;
                onConnected: () => void;
                onUpgrade: (headers: IncomingHttpHeaders) => void;
                onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
                protocols?: string | string[];
            },
        ) => QwpWebSocketLike;
    }

    Hierarchy (View Summary)

    Index

    Properties

    agent? +QwpNodeWebSocketOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpNodeWebSocketOptions

    interface QwpNodeWebSocketOptions {
        agent?: Agent;
        authorization?: string;
        authTimeoutMs?: number;
        clientId?: string;
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        headers?: Record<string, string>;
        maxVersion?: number;
        protocols?: string | string[];
        requestDurableAck?: boolean;
        sendTimeoutMs?: number;
        url: string | URL;
        webSocketFactory?: (
            url: string | URL,
            options: {
                agent?: Agent;
                headers: Record<string, string>;
                onConnected: () => void;
                onUpgrade: (headers: IncomingHttpHeaders) => void;
                onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
                protocols?: string | string[];
            },
        ) => QwpWebSocketLike;
    }

    Hierarchy (View Summary)

    Index

    Properties

    agent?: Agent

    Optional HTTP(S) agent used for the WebSocket upgrade.

    -
    authorization?: string
    authTimeoutMs?: number

    Time allowed after TCP/TLS connection for HTTP authentication and the +

    authorization?: string
    authTimeoutMs?: number

    Time allowed after TCP/TLS connection for HTTP authentication and the WebSocket upgrade.

    Defaults to QwpWebSocketConnectOptions.connectTimeoutMs when that is set, and to 15s otherwise, so narrowing only the connect deadline @@ -21,18 +21,18 @@ chose. Set this to give the slower phase its own budget. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    clientId?: string
    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. +

    clientId?: string
    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a +

    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a browser. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    -
    headers?: Record<string, string>
    maxVersion?: number
    protocols?: string | string[]
    requestDurableAck?: boolean

    Ingress-only. Durable ACK is negotiated on /write/v4; egress ignores it +

    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    +
    headers?: Record<string, string>
    maxVersion?: number
    protocols?: string | string[]
    requestDurableAck?: boolean

    Ingress-only. Durable ACK is negotiated on /write/v4; egress ignores it and egressTransportOptions() strips it, because sending the header on /read/v1 makes every query session fail the capability check.

    -
    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. +

    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        options: {
            agent?: Agent;
            headers: Record<string, string>;
            onConnected: () => void;
            onUpgrade: (headers: IncomingHttpHeaders) => void;
            onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
            protocols?: string | string[];
        },
    ) => QwpWebSocketLike

    Test hook; defaults to the Node-only ws implementation.

    -
    +
    url: string | URL
    webSocketFactory?: (
        url: string | URL,
        options: {
            agent?: Agent;
            headers: Record<string, string>;
            onConnected: () => void;
            onUpgrade: (headers: IncomingHttpHeaders) => void;
            onUpgradeRejected: (rejection: QwpNodeUpgradeRejection) => void;
            protocols?: string | string[];
        },
    ) => QwpWebSocketLike

    Test hook; defaults to the Node-only ws implementation.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpPoolSlotReservation.html b/docs/interfaces/_questdb_nodejs-client.QwpPoolSlotReservation.html index 667b4d94..638562b8 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpPoolSlotReservation.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpPoolSlotReservation.html @@ -1,5 +1,5 @@ QwpPoolSlotReservation | QuestDB JavaScript Client - v5.0.0

    Interface QwpPoolSlotReservationInternal

    Cross-owner reservation for stable pooled sender slot indexes.

    -
    interface QwpPoolSlotReservation {
        onAvailable(listener: () => void): () => void;
        release(slot: number): void;
        tryReserve(slot: number): boolean;
    }
    Index

    Methods

    interface QwpPoolSlotReservation {
        onAvailable(listener: () => void): () => void;
        release(slot: number): void;
        tryReserve(slot: number): boolean;
    }
    Index

    Methods

    +

    Methods

    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpQueryErrorMessage.html b/docs/interfaces/_questdb_nodejs-client.QwpQueryErrorMessage.html index 9fcb9ecb..e059eea8 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpQueryErrorMessage.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpQueryErrorMessage.html @@ -1,4 +1,4 @@ -QwpQueryErrorMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpQueryErrorMessage

    interface QwpQueryErrorMessage {
        flags: number;
        kind: "query-error";
        message: string;
        payloadLength: number;
        requestId: bigint;
        status: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags +QwpQueryErrorMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpQueryErrorMessage

    interface QwpQueryErrorMessage {
        flags: number;
        kind: "query-error";
        message: string;
        payloadLength: number;
        requestId: bigint;
        status: number;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    flags: number
    kind: "query-error"
    message: string
    payloadLength: number
    requestId: bigint
    status: number
    tableCount: number
    version: number
    +

    Properties

    flags: number
    kind: "query-error"
    message: string
    payloadLength: number
    requestId: bigint
    status: number
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpQueryRequest.html b/docs/interfaces/_questdb_nodejs-client.QwpQueryRequest.html index 1f1ea4e4..73e888e1 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpQueryRequest.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpQueryRequest.html @@ -1,4 +1,4 @@ -QwpQueryRequest | QuestDB JavaScript Client - v5.0.0

    Interface QwpQueryRequest

    interface QwpQueryRequest {
        bindCount?: number;
        bindPayload?: Uint8Array;
        binds?: QwpBindSetter;
        initialCredit?: number | bigint;
        queryFlags?: number | bigint;
        requestId: number | bigint;
        sql: string;
    }
    Index

    Properties

    bindCount? +QwpQueryRequest | QuestDB JavaScript Client - v5.0.0

    Interface QwpQueryRequest

    interface QwpQueryRequest {
        bindCount?: number;
        bindPayload?: Uint8Array;
        binds?: QwpBindSetter;
        initialCredit?: number | bigint;
        queryFlags?: number | bigint;
        requestId: number | bigint;
        sql: string;
    }
    Index

    Properties

    bindCount?: number

    Advanced escape hatch for an already encoded bind section.

    -
    bindPayload?: Uint8Array

    Advanced escape hatch for an already encoded bind section.

    -

    Browser-safe typed positional binds.

    -
    initialCredit?: number | bigint

    Zero means unbounded.

    -
    queryFlags?: number | bigint

    Append only after SERVER_INFO advertises QUERY_FLAGS.

    -
    requestId: number | bigint
    sql: string
    +
    bindPayload?: Uint8Array

    Advanced escape hatch for an already encoded bind section.

    +

    Browser-safe typed positional binds.

    +
    initialCredit?: number | bigint

    Zero means unbounded.

    +
    queryFlags?: number | bigint

    Append only after SERVER_INFO advertises QUERY_FLAGS.

    +
    requestId: number | bigint
    sql: string
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpReconnectEvent.html b/docs/interfaces/_questdb_nodejs-client.QwpReconnectEvent.html index 2fdba9a7..f8504e26 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpReconnectEvent.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpReconnectEvent.html @@ -1,4 +1,4 @@ -QwpReconnectEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpReconnectEvent

    interface QwpReconnectEvent {
        attempt: number;
        cause?: unknown;
        endpoint?: string | URL;
        episodeMs?: number;
        kind: QwpReconnectEventKind;
        previousEndpoint?: string | URL;
        timestampMs: number;
    }
    Index

    Properties

    attempt +QwpReconnectEvent | QuestDB JavaScript Client - v5.0.0

    Interface QwpReconnectEvent

    interface QwpReconnectEvent {
        attempt: number;
        cause?: unknown;
        endpoint?: string | URL;
        episodeMs?: number;
        kind: QwpReconnectEventKind;
        previousEndpoint?: string | URL;
        timestampMs: number;
    }
    Index

    Properties

    attempt: number

    One-based reconnect sweep number; zero for lifecycle-only events.

    -
    cause?: unknown
    endpoint?: string | URL
    episodeMs?: number

    Elapsed time in the current consecutive capability-gap episode.

    -
    previousEndpoint?: string | URL
    timestampMs: number
    +
    cause?: unknown
    endpoint?: string | URL
    episodeMs?: number

    Elapsed time in the current consecutive capability-gap episode.

    +
    previousEndpoint?: string | URL
    timestampMs: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpReconnectOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpReconnectOptions.html index 514706e5..4dd5efe4 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpReconnectOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpReconnectOptions.html @@ -4,7 +4,7 @@

    The ingress defaults favour survival -- a producer holding buffered or journalled rows must outlast an outage rather than give up on it -- while egress bounds a query connection so a caller is not left waiting.

    -
    interface QwpReconnectOptions {
        initialBackoffMs?: number;
        maxAttempts?: number;
        maxBackoffMs?: number;
        maxDurationMs?: number;
        maxFrameRejections?: number;
        onEvent?: (event: QwpReconnectEvent) => void;
        poisonMinEscalationWindowMs?: number;
    }
    Index

    Properties

    interface QwpReconnectOptions {
        initialBackoffMs?: number;
        maxAttempts?: number;
        maxBackoffMs?: number;
        maxDurationMs?: number;
        maxFrameRejections?: number;
        onEvent?: (event: QwpReconnectEvent) => void;
        poisonMinEscalationWindowMs?: number;
    }
    Index

    Properties

    initialBackoffMs?: number

    Full-jitter ceiling before the first failed sweep is retried. Must not exceed 2_147_483_647ms. Ingress defaults to 100ms, egress to 50ms.

    -
    maxAttempts?: number

    Maximum connection sweeps per outage; zero is unlimited. +

    maxAttempts?: number

    Maximum connection sweeps per outage; zero is unlimited. Ingress defaults to zero, egress to 8.

    -
    maxBackoffMs?: number

    Full-jitter exponential-backoff ceiling. Must not exceed +

    maxBackoffMs?: number

    Full-jitter exponential-backoff ceiling. Must not exceed 2_147_483_647ms. Ingress defaults to 5s, egress to 1s.

    -
    maxDurationMs?: number

    Total reconnect deadline; zero disables the deadline. +

    maxDurationMs?: number

    Total reconnect deadline; zero disables the deadline. Ingress defaults to 5 minutes, egress to 30s.

    -
    maxFrameRejections?: number

    Consecutive retriable rejections of one ingress frame before it is treated +

    maxFrameRejections?: number

    Consecutive retriable rejections of one ingress frame before it is treated as poison and retained for inspection. Defaults to 4. Ingress only.

    -
    onEvent?: (event: QwpReconnectEvent) => void
    poisonMinEscalationWindowMs?: number

    Minimum time the same ingress frame must remain suspect before repeated +

    onEvent?: (event: QwpReconnectEvent) => void
    poisonMinEscalationWindowMs?: number

    Minimum time the same ingress frame must remain suspect before repeated rejections or non-orderly closes become terminal. Defaults to 5 minutes; zero escalates as soon as maxFrameRejections is reached. Ingress only.

    -
    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpResourcePoolMetrics.html b/docs/interfaces/_questdb_nodejs-client.QwpResourcePoolMetrics.html index f6303c3d..c0f243a7 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpResourcePoolMetrics.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpResourcePoolMetrics.html @@ -1,8 +1,8 @@ -QwpResourcePoolMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpResourcePoolMetrics

    interface QwpResourcePoolMetrics {
        available: number;
        creating: number;
        leased: number;
        maximum: number;
        minimum: number;
        total: number;
        waiting: number;
    }
    Index

    Properties

    available +QwpResourcePoolMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpResourcePoolMetrics

    interface QwpResourcePoolMetrics {
        available: number;
        creating: number;
        leased: number;
        maximum: number;
        minimum: number;
        total: number;
        waiting: number;
    }
    Index

    Properties

    available: number
    creating: number
    leased: number
    maximum: number
    minimum: number
    total: number
    waiting: number
    +

    Properties

    available: number
    creating: number
    leased: number
    maximum: number
    minimum: number
    total: number
    waiting: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpResultArrayValue.html b/docs/interfaces/_questdb_nodejs-client.QwpResultArrayValue.html index 6f799b4b..ecb482c3 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpResultArrayValue.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpResultArrayValue.html @@ -1,3 +1,3 @@ -QwpResultArrayValue | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultArrayValue

    interface QwpResultArrayValue {
        dimensions: readonly number[];
        values: readonly number[] | readonly bigint[];
    }
    Index

    Properties

    dimensions +QwpResultArrayValue | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultArrayValue

    interface QwpResultArrayValue {
        dimensions: readonly number[];
        values: readonly number[] | readonly bigint[];
    }
    Index

    Properties

    Properties

    dimensions: readonly number[]
    values: readonly number[] | readonly bigint[]
    +

    Properties

    dimensions: readonly number[]
    values: readonly number[] | readonly bigint[]
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpResultBatchMessage.html b/docs/interfaces/_questdb_nodejs-client.QwpResultBatchMessage.html index c992d4ea..295260cb 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpResultBatchMessage.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpResultBatchMessage.html @@ -1,4 +1,4 @@ -QwpResultBatchMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultBatchMessage

    interface QwpResultBatchMessage {
        batchSequence: bigint;
        body: Uint8Array;
        flags: number;
        kind: "result-batch";
        payloadLength: number;
        requestId: bigint;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    batchSequence +QwpResultBatchMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultBatchMessage

    interface QwpResultBatchMessage {
        batchSequence: bigint;
        body: Uint8Array;
        flags: number;
        kind: "result-batch";
        payloadLength: number;
        requestId: bigint;
        tableCount: number;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    batchSequence: bigint
    body: Uint8Array

    Raw or Zstd-compressed delta dictionary and columnar table block; decoded +

    Properties

    batchSequence: bigint
    body: Uint8Array

    Raw or Zstd-compressed delta dictionary and columnar table block; decoded by the batch decoder according to the frame flags.

    -
    flags: number
    kind: "result-batch"
    payloadLength: number
    requestId: bigint
    tableCount: number
    version: number
    +
    flags: number
    kind: "result-batch"
    payloadLength: number
    requestId: bigint
    tableCount: number
    version: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpResultColumn.html b/docs/interfaces/_questdb_nodejs-client.QwpResultColumn.html index 4efc8349..f0520e17 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpResultColumn.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpResultColumn.html @@ -1,6 +1,6 @@ -QwpResultColumn | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultColumn

    interface QwpResultColumn {
        name: string;
        precisionBits?: number;
        scale?: number;
        type: QwpColumnType;
        values: readonly QwpResultValue[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    name +QwpResultColumn | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultColumn

    interface QwpResultColumn {
        name: string;
        precisionBits?: number;
        scale?: number;
        type: QwpColumnType;
        values: readonly QwpResultValue[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    name: string
    precisionBits?: number
    scale?: number
    values: readonly QwpResultValue[]
    +

    Properties

    name: string
    precisionBits?: number
    scale?: number
    values: readonly QwpResultValue[]
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpResultColumnSchema.html b/docs/interfaces/_questdb_nodejs-client.QwpResultColumnSchema.html index 930066e2..dbee9691 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpResultColumnSchema.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpResultColumnSchema.html @@ -1,3 +1,3 @@ -QwpResultColumnSchema | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultColumnSchema

    interface QwpResultColumnSchema {
        name: string;
        type: QwpColumnType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    name +QwpResultColumnSchema | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultColumnSchema

    interface QwpResultColumnSchema {
        name: string;
        type: QwpColumnType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    name: string
    +

    Properties

    name: string
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpResultEndMessage.html b/docs/interfaces/_questdb_nodejs-client.QwpResultEndMessage.html index d7029d66..6d3e27ce 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpResultEndMessage.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpResultEndMessage.html @@ -1,4 +1,4 @@ -QwpResultEndMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultEndMessage

    interface QwpResultEndMessage {
        finalSequence: bigint;
        flags: number;
        kind: "result-end";
        payloadLength: number;
        requestId: bigint;
        tableCount: number;
        totalRows: bigint;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    finalSequence +QwpResultEndMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpResultEndMessage

    interface QwpResultEndMessage {
        finalSequence: bigint;
        flags: number;
        kind: "result-end";
        payloadLength: number;
        requestId: bigint;
        tableCount: number;
        totalRows: bigint;
        version: number;
    }

    Hierarchy (View Summary)

    Index

    Properties

    finalSequence: bigint
    flags: number
    kind: "result-end"
    payloadLength: number
    requestId: bigint
    tableCount: number
    totalRows: bigint
    version: number
    +

    Properties

    finalSequence: bigint
    flags: number
    kind: "result-end"
    payloadLength: number
    requestId: bigint
    tableCount: number
    totalRows: bigint
    version: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpSenderEncodeOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpSenderEncodeOptions.html index 30690417..f6c28ad9 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpSenderEncodeOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpSenderEncodeOptions.html @@ -1,4 +1,4 @@ -QwpSenderEncodeOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderEncodeOptions

    interface QwpSenderEncodeOptions {
        gorilla?: boolean;
        symbolDictionary?: "full" | "delta";
    }

    Hierarchy

    Index

    Properties

    gorilla? +QwpSenderEncodeOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderEncodeOptions

    interface QwpSenderEncodeOptions {
        gorilla?: boolean;
        symbolDictionary?: "full" | "delta";
    }

    Hierarchy

    Index

    Properties

    gorilla?: boolean
    symbolDictionary?: "full" | "delta"

    Connection-scoped deltas are the default; use full to opt out.

    -
    +

    Properties

    gorilla?: boolean
    symbolDictionary?: "full" | "delta"

    Connection-scoped deltas are the default; use full to opt out.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpSenderError.html b/docs/interfaces/_questdb_nodejs-client.QwpSenderError.html index 5c91a01f..ed086323 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpSenderError.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpSenderError.html @@ -1,5 +1,5 @@ QwpSenderError | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderError

    Immutable Java-parity context for an ingress rejection or data loss.

    -
    interface QwpSenderError {
        appliedPolicy: QwpSenderErrorPolicy;
        category: QwpSenderErrorCategory;
        detectedAtMs: number;
        fromFsn?: bigint;
        messageSequence?: bigint;
        quarantinedPath?: string;
        serverMessage?: string;
        serverStatusByte?: number;
        tableName?: string;
        toFsn?: bigint;
    }
    Index

    Properties

    interface QwpSenderError {
        appliedPolicy: QwpSenderErrorPolicy;
        category: QwpSenderErrorCategory;
        detectedAtMs: number;
        fromFsn?: bigint;
        messageSequence?: bigint;
        quarantinedPath?: string;
        serverMessage?: string;
        serverStatusByte?: number;
        tableName?: string;
        toFsn?: bigint;
    }
    Index

    Properties

    appliedPolicy: QwpSenderErrorPolicy
    detectedAtMs: number
    fromFsn?: bigint

    Inclusive stable store-and-forward frame-sequence range.

    -
    messageSequence?: bigint
    quarantinedPath?: string

    Preserved on-disk bytes for a data-loss/quarantine notification.

    -
    serverMessage?: string
    serverStatusByte?: number
    tableName?: string
    toFsn?: bigint
    +

    Properties

    appliedPolicy: QwpSenderErrorPolicy
    detectedAtMs: number
    fromFsn?: bigint

    Inclusive stable store-and-forward frame-sequence range.

    +
    messageSequence?: bigint
    quarantinedPath?: string

    Preserved on-disk bytes for a data-loss/quarantine notification.

    +
    serverMessage?: string
    serverStatusByte?: number
    tableName?: string
    toFsn?: bigint
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpSenderErrorResponseContext.html b/docs/interfaces/_questdb_nodejs-client.QwpSenderErrorResponseContext.html index bb19322a..947d90eb 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpSenderErrorResponseContext.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpSenderErrorResponseContext.html @@ -1,7 +1,7 @@ -QwpSenderErrorResponseContext | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderErrorResponseContext

    interface QwpSenderErrorResponseContext {
        appliedPolicy?: QwpSenderErrorPolicy;
        detectedAtMs?: number;
        fromFsn?: bigint;
        messageSequence?: bigint;
        tableName?: string;
        toFsn?: bigint;
    }
    Index

    Properties

    appliedPolicy? +QwpSenderErrorResponseContext | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderErrorResponseContext

    interface QwpSenderErrorResponseContext {
        appliedPolicy?: QwpSenderErrorPolicy;
        detectedAtMs?: number;
        fromFsn?: bigint;
        messageSequence?: bigint;
        tableName?: string;
        toFsn?: bigint;
    }
    Index

    Properties

    appliedPolicy?: QwpSenderErrorPolicy
    detectedAtMs?: number
    fromFsn?: bigint
    messageSequence?: bigint
    tableName?: string
    toFsn?: bigint
    +

    Properties

    appliedPolicy?: QwpSenderErrorPolicy
    detectedAtMs?: number
    fromFsn?: bigint
    messageSequence?: bigint
    tableName?: string
    toFsn?: bigint
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpSenderMetrics.html b/docs/interfaces/_questdb_nodejs-client.QwpSenderMetrics.html index bd061f4b..8fa46cdf 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpSenderMetrics.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpSenderMetrics.html @@ -1,5 +1,5 @@ QwpSenderMetrics | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderMetrics

    Immutable high-level sender counters plus the active ingress snapshot.

    -
    interface QwpSenderMetrics {
        autoFlushBytes: number;
        closed: boolean;
        closing: boolean;
        connected: boolean;
        deferredRows: number;
        effectiveAutoFlushBytes: number;
        ingress?: QwpIngressMetrics;
        pendingBytes: number;
        pendingRows: number;
        totalFlushes: number;
        totalFlushFailures: number;
        totalRowsPublished: number;
        totalRowsStaged: number;
        totalTransactionsCommitted: number;
    }
    Index

    Properties

    interface QwpSenderMetrics {
        autoFlushBytes: number;
        closed: boolean;
        closing: boolean;
        connected: boolean;
        deferredRows: number;
        effectiveAutoFlushBytes: number;
        ingress?: QwpIngressMetrics;
        pendingBytes: number;
        pendingRows: number;
        totalFlushes: number;
        totalFlushFailures: number;
        totalRowsPublished: number;
        totalRowsStaged: number;
        totalTransactionsCommitted: number;
    }
    Index

    Properties

    autoFlushBytes: number
    closed: boolean
    closing: boolean
    connected: boolean
    deferredRows: number
    effectiveAutoFlushBytes: number
    pendingBytes: number

    Estimated raw column-buffer bytes currently staged.

    -
    pendingRows: number
    totalFlushes: number
    totalFlushFailures: number
    totalRowsPublished: number

    Rows whose encoded frames have entered the ingress session.

    -
    totalRowsStaged: number
    totalTransactionsCommitted: number
    +

    Properties

    autoFlushBytes: number
    closed: boolean
    closing: boolean
    connected: boolean
    deferredRows: number
    effectiveAutoFlushBytes: number
    pendingBytes: number

    Estimated raw column-buffer bytes currently staged.

    +
    pendingRows: number
    totalFlushes: number
    totalFlushFailures: number
    totalRowsPublished: number

    Rows whose encoded frames have entered the ingress session.

    +
    totalRowsStaged: number
    totalTransactionsCommitted: number
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpSenderOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpSenderOptions.html index d2d73b67..e2303a74 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpSenderOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpSenderOptions.html @@ -1,5 +1,5 @@ QwpSenderOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpSenderOptions

    Options for the browser-safe, fluent QWP sender.

    -
    interface QwpSenderOptions {
        autoFlush?: boolean;
        autoFlushBytes?: number;
        autoFlushIntervalMs?: number;
        autoFlushRows?: number;
        awaitDurableAck?: boolean;
        awaitServerAck?: boolean;
        closeFlushTimeoutMs?: number;
        durableAckTimeoutMs?: number;
        encode?: QwpSenderEncodeOptions;
        log?: QwpSenderLogger;
        maxNameLength?: number;
        transactional?: boolean;
    }
    Index

    Properties

    interface QwpSenderOptions {
        autoFlush?: boolean;
        autoFlushBytes?: number;
        autoFlushIntervalMs?: number;
        autoFlushRows?: number;
        awaitDurableAck?: boolean;
        awaitServerAck?: boolean;
        closeFlushTimeoutMs?: number;
        durableAckTimeoutMs?: number;
        encode?: QwpSenderEncodeOptions;
        log?: QwpSenderLogger;
        maxNameLength?: number;
        transactional?: boolean;
    }
    Index

    Properties

    autoFlush?: boolean
    autoFlushBytes?: number

    Soft threshold for estimated buffered column bytes. Zero disables the byte +

    Properties

    autoFlush?: boolean
    autoFlushBytes?: number

    Soft threshold for estimated buffered column bytes. Zero disables the byte trigger. Defaults to zero and is clamped below a connected server's batch cap; exact encoded frames remain subject to the protocol batch limit.

    -
    autoFlushIntervalMs?: number

    Not capped at the host timer ceiling: compared against elapsed time only.

    -
    autoFlushRows?: number
    awaitDurableAck?: boolean

    Wait for durable upload after every successful ingress ACK. When true, +

    autoFlushIntervalMs?: number

    Not capped at the host timer ceiling: compared against elapsed time only.

    +
    autoFlushRows?: number
    awaitDurableAck?: boolean

    Wait for durable upload after every successful ingress ACK. When true, this implies awaitServerAck unless awaitServerAck is explicitly false.

    -
    awaitServerAck?: boolean

    Wait for the server's protocol ACK before flush()/commit() resolves. +

    awaitServerAck?: boolean

    Wait for the server's protocol ACK before flush()/commit() resolves. Defaults to false, matching the Java QWP sender's local-publication boundary. Set this to true for an acknowledgement barrier, or use flushAndGetSequence() followed by waitForAcknowledged().

    -
    closeFlushTimeoutMs?: number

    Maximum time close() spends publishing queued rows and waiting for the +

    closeFlushTimeoutMs?: number

    Maximum time close() spends publishing queued rows and waiting for the server ACK watermark. Zero or a negative value skips the drain. Defaults to 5 seconds. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    durableAckTimeoutMs?: number

    Durable-upload deadline applied after each ingress ACK. Capped at +

    durableAckTimeoutMs?: number

    Durable-upload deadline applied after each ingress ACK. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -

    QWP frame encoding options supported by the high-level sender.

    -
    maxNameLength?: number

    Maximum UTF-8 byte length of table and column names. Defaults to 127.

    -
    transactional?: boolean

    Keep auto-flushed rows in an open server-side transaction. An explicit +

    QWP frame encoding options supported by the high-level sender.

    +
    maxNameLength?: number

    Maximum UTF-8 byte length of table and column names. Defaults to 127.

    +
    transactional?: boolean

    Keep auto-flushed rows in an open server-side transaction. An explicit flush()/commit() closes the transaction. QWP transactions are atomic per table, rather than across every table in a multi-table flush.

    -
    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpSenderSession.html b/docs/interfaces/_questdb_nodejs-client.QwpSenderSession.html index ac61afd6..119bf322 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpSenderSession.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpSenderSession.html @@ -6,7 +6,7 @@ dictionaries, and waitForAcknowledged exposes the ACK watermark. A session that implements only the required members is supported and falls back to sendTables.

    -
    interface QwpSenderSession {
        acknowledgedFrameSequence?: bigint;
        maxBatchSizeBytes?: number;
        metrics?: QwpIngressMetrics;
        publishedFrameSequence?: bigint;
        close(code?: number, reason?: string): Promise<void>;
        publishTables(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): Promise<void>;
        publishTablesDelta(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): Promise<void>;
        sendTables(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): Promise<QwpIngressResponse>;
        sendTablesDelta(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): Promise<QwpIngressResponse>;
        sendTablesDeltaWithPublication(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): QwpIngressSendResult;
        sendTablesWithPublication(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): QwpIngressSendResult;
        waitForAcknowledged(
            targetSequence: bigint,
            timeoutMs?: number,
        ): Promise<void>;
        waitForDurable(
            response: QwpIngressResponse,
            timeoutMs?: number,
        ): Promise<void>;
    }

    Implemented by

    Index

    Properties

    interface QwpSenderSession {
        acknowledgedFrameSequence?: bigint;
        maxBatchSizeBytes?: number;
        metrics?: QwpIngressMetrics;
        publishedFrameSequence?: bigint;
        close(code?: number, reason?: string): Promise<void>;
        publishTables(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): Promise<void>;
        publishTablesDelta(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): Promise<void>;
        sendTables(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): Promise<QwpIngressResponse>;
        sendTablesDelta(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): Promise<QwpIngressResponse>;
        sendTablesDeltaWithPublication(
            tables: readonly QwpTableBuffer[],
            options?: Pick<QwpIngressEncodeOptions, "gorilla" | "deferCommit">,
        ): QwpIngressSendResult;
        sendTablesWithPublication(
            tables: readonly QwpTableBuffer[],
            options?: QwpIngressEncodeOptions,
        ): QwpIngressSendResult;
        waitForAcknowledged(
            targetSequence: bigint,
            timeoutMs?: number,
        ): Promise<void>;
        waitForDurable(
            response: QwpIngressResponse,
            timeoutMs?: number,
        ): Promise<void>;
    }

    Implemented by

    Index

    Properties

    acknowledgedFrameSequence?: bigint
    maxBatchSizeBytes?: number
    publishedFrameSequence?: bigint

    Methods

    +

    Properties

    acknowledgedFrameSequence?: bigint
    maxBatchSizeBytes?: number
    publishedFrameSequence?: bigint

    Methods

    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpServerInfoMessage.html b/docs/interfaces/_questdb_nodejs-client.QwpServerInfoMessage.html index c0766010..394fe32a 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpServerInfoMessage.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpServerInfoMessage.html @@ -1,5 +1,5 @@ QwpServerInfoMessage | QuestDB JavaScript Client - v5.0.0

    Interface QwpServerInfoMessage

    Immutable endpoint metadata from the most recent successful egress bind.

    -
    interface QwpServerInfoMessage {
        capabilities: number;
        clusterId: string;
        compressionCodec: number;
        compressionLevel: number;
        epoch: bigint;
        flags: number;
        kind: "server-info";
        nodeId: string;
        payloadLength: number;
        role: number;
        serverWallNanoseconds: bigint;
        tableCount: number;
        version: number;
        zoneId: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface QwpServerInfoMessage {
        capabilities: number;
        clusterId: string;
        compressionCodec: number;
        compressionLevel: number;
        epoch: bigint;
        flags: number;
        kind: "server-info";
        nodeId: string;
        payloadLength: number;
        role: number;
        serverWallNanoseconds: bigint;
        tableCount: number;
        version: number;
        zoneId: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    capabilities: number
    clusterId: string
    compressionCodec: number
    compressionLevel: number
    epoch: bigint
    flags: number
    kind: "server-info"
    nodeId: string
    payloadLength: number
    role: number
    serverWallNanoseconds: bigint
    tableCount: number
    version: number
    zoneId: string
    +

    Properties

    capabilities: number
    clusterId: string
    compressionCodec: number
    compressionLevel: number
    epoch: bigint
    flags: number
    kind: "server-info"
    nodeId: string
    payloadLength: number
    role: number
    serverWallNanoseconds: bigint
    tableCount: number
    version: number
    zoneId: string
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpSymbolValue.html b/docs/interfaces/_questdb_nodejs-client.QwpSymbolValue.html index 3089c3cd..fc5e2f0e 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpSymbolValue.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpSymbolValue.html @@ -1,3 +1,3 @@ -QwpSymbolValue | QuestDB JavaScript Client - v5.0.0

    Interface QwpSymbolValue

    interface QwpSymbolValue {
        id: number;
        text: string;
    }
    Index

    Properties

    id +QwpSymbolValue | QuestDB JavaScript Client - v5.0.0

    Interface QwpSymbolValue

    interface QwpSymbolValue {
        id: number;
        text: string;
    }
    Index

    Properties

    Properties

    id: number
    text: string
    +

    Properties

    id: number
    text: string
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpUpgradeErrorDetails.html b/docs/interfaces/_questdb_nodejs-client.QwpUpgradeErrorDetails.html index 6131dea1..d88156bc 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpUpgradeErrorDetails.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpUpgradeErrorDetails.html @@ -1,4 +1,4 @@ -QwpUpgradeErrorDetails | QuestDB JavaScript Client - v5.0.0

    Interface QwpUpgradeErrorDetails

    interface QwpUpgradeErrorDetails {
        cause?: unknown;
        closeCode?: number;
        kind: QwpUpgradeErrorKind;
        retryable?: boolean;
        serverRole?: string;
        serverZone?: string;
        statusCode?: number;
        statusMessage?: string;
        timeoutPhase?: QwpUpgradeTimeoutPhase;
        tryNextEndpoint?: boolean;
        url?: string | URL;
    }
    Index

    Properties

    cause? +QwpUpgradeErrorDetails | QuestDB JavaScript Client - v5.0.0

    Interface QwpUpgradeErrorDetails

    interface QwpUpgradeErrorDetails {
        cause?: unknown;
        closeCode?: number;
        kind: QwpUpgradeErrorKind;
        retryable?: boolean;
        serverRole?: string;
        serverZone?: string;
        statusCode?: number;
        statusMessage?: string;
        timeoutPhase?: QwpUpgradeTimeoutPhase;
        tryNextEndpoint?: boolean;
        url?: string | URL;
    }
    Index

    Properties

    cause?: unknown
    closeCode?: number
    retryable?: boolean

    Whether a later retry against the configured endpoint set may recover.

    -
    serverRole?: string
    serverZone?: string
    statusCode?: number
    statusMessage?: string
    timeoutPhase?: QwpUpgradeTimeoutPhase
    tryNextEndpoint?: boolean

    Whether failover code should try another endpoint before surfacing this.

    -
    url?: string | URL
    +

    Properties

    cause?: unknown
    closeCode?: number
    retryable?: boolean

    Whether a later retry against the configured endpoint set may recover.

    +
    serverRole?: string
    serverZone?: string
    statusCode?: number
    statusMessage?: string
    timeoutPhase?: QwpUpgradeTimeoutPhase
    tryNextEndpoint?: boolean

    Whether failover code should try another endpoint before surfacing this.

    +
    url?: string | URL
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpUuidValue.html b/docs/interfaces/_questdb_nodejs-client.QwpUuidValue.html index 6b8d48aa..9ac4f7dd 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpUuidValue.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpUuidValue.html @@ -1,3 +1,3 @@ -QwpUuidValue | QuestDB JavaScript Client - v5.0.0
    interface QwpUuidValue {
        high: bigint;
        low: bigint;
    }
    Index

    Properties

    high +QwpUuidValue | QuestDB JavaScript Client - v5.0.0
    interface QwpUuidValue {
        high: bigint;
        low: bigint;
    }
    Index

    Properties

    Properties

    high: bigint
    low: bigint
    +

    Properties

    high: bigint
    low: bigint
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpWebSocketConnectOptions.html b/docs/interfaces/_questdb_nodejs-client.QwpWebSocketConnectOptions.html index 19bee9f6..ac3dd6ce 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpWebSocketConnectOptions.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpWebSocketConnectOptions.html @@ -1,4 +1,4 @@ -QwpWebSocketConnectOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpWebSocketConnectOptions

    interface QwpWebSocketConnectOptions {
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        protocols?: string | string[];
        sendTimeoutMs?: number;
        url: string | URL;
    }

    Hierarchy (View Summary)

    Index

    Properties

    closeTimeoutMs? +QwpWebSocketConnectOptions | QuestDB JavaScript Client - v5.0.0

    Interface QwpWebSocketConnectOptions

    interface QwpWebSocketConnectOptions {
        closeTimeoutMs?: number;
        connectTimeoutMs?: number;
        failoverUrls?: readonly (string | URL)[];
        protocols?: string | string[];
        sendTimeoutMs?: number;
        url: string | URL;
    }

    Hierarchy (View Summary)

    Index

    Properties

    closeTimeoutMs?: number

    Maximum time allowed for a graceful WebSocket close. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a +

    connectTimeoutMs?: number

    Node TCP/TLS connection deadline, or the complete opening deadline in a browser. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    -
    protocols?: string | string[]
    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. +

    failoverUrls?: readonly (string | URL)[]

    Additional endpoints attempted in order when the preferred endpoint fails.

    +
    protocols?: string | string[]
    sendTimeoutMs?: number

    Maximum time a send may remain queued by the WebSocket. Defaults to 15s. Capped at 2,147,483,647ms (the host timer ceiling); a larger value throws a RangeError.

    -
    url: string | URL
    +
    url: string | URL
    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpWebSocketLike.html b/docs/interfaces/_questdb_nodejs-client.QwpWebSocketLike.html index 6b3606ba..781785c8 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpWebSocketLike.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpWebSocketLike.html @@ -1,4 +1,4 @@ -QwpWebSocketLike | QuestDB JavaScript Client - v5.0.0

    Interface QwpWebSocketLike

    interface QwpWebSocketLike {
        binaryType: string;
        bufferedAmount?: number;
        protocol?: string;
        readyState: number;
        addEventListener(
            type: "open",
            listener: (event: unknown) => void,
            options?: { once?: boolean },
        ): void;
        addEventListener(
            type: "message",
            listener: (event: QwpWebSocketMessageEvent) => void,
        ): void;
        addEventListener(
            type: "error",
            listener: (event: unknown) => void,
            options?: { once?: boolean },
        ): void;
        addEventListener(
            type: "close",
            listener: (event: QwpWebSocketCloseEvent) => void,
            options?: { once?: boolean },
        ): void;
        close(code?: number, reason?: string): void;
        ping(): void;
        removeEventListener(type: "open", listener: (event: unknown) => void): void;
        removeEventListener(
            type: "message",
            listener: (event: QwpWebSocketMessageEvent) => void,
        ): void;
        removeEventListener(
            type: "error",
            listener: (event: unknown) => void,
        ): void;
        removeEventListener(
            type: "close",
            listener: (event: QwpWebSocketCloseEvent) => void,
        ): void;
        send(data: Uint8Array): void;
        sendWithCallback(data: Uint8Array, callback: (error?: Error) => void): void;
        terminate(): void;
    }
    Index

    Properties

    binaryType +QwpWebSocketLike | QuestDB JavaScript Client - v5.0.0

    Interface QwpWebSocketLike

    interface QwpWebSocketLike {
        binaryType: string;
        bufferedAmount?: number;
        protocol?: string;
        readyState: number;
        addEventListener(
            type: "open",
            listener: (event: unknown) => void,
            options?: { once?: boolean },
        ): void;
        addEventListener(
            type: "message",
            listener: (event: QwpWebSocketMessageEvent) => void,
        ): void;
        addEventListener(
            type: "error",
            listener: (event: unknown) => void,
            options?: { once?: boolean },
        ): void;
        addEventListener(
            type: "close",
            listener: (event: QwpWebSocketCloseEvent) => void,
            options?: { once?: boolean },
        ): void;
        close(code?: number, reason?: string): void;
        ping(): void;
        removeEventListener(type: "open", listener: (event: unknown) => void): void;
        removeEventListener(
            type: "message",
            listener: (event: QwpWebSocketMessageEvent) => void,
        ): void;
        removeEventListener(
            type: "error",
            listener: (event: unknown) => void,
        ): void;
        removeEventListener(
            type: "close",
            listener: (event: QwpWebSocketCloseEvent) => void,
        ): void;
        send(data: Uint8Array): void;
        sendWithCallback(data: Uint8Array, callback: (error?: Error) => void): void;
        terminate(): void;
    }
    Index

    Properties

    binaryType: string
    bufferedAmount?: number

    Number of application bytes queued by WHATWG-compatible WebSockets.

    -
    protocol?: string

    WebSocket subprotocol selected by the server, or an empty string.

    -
    readyState: number

    Methods

    +

    Properties

    binaryType: string
    bufferedAmount?: number

    Number of application bytes queued by WHATWG-compatible WebSockets.

    +
    protocol?: string

    WebSocket subprotocol selected by the server, or an empty string.

    +
    readyState: number

    Methods

    diff --git a/docs/interfaces/_questdb_nodejs-client.QwpWriterColumn.html b/docs/interfaces/_questdb_nodejs-client.QwpWriterColumn.html index e00df66e..8cf3c173 100644 --- a/docs/interfaces/_questdb_nodejs-client.QwpWriterColumn.html +++ b/docs/interfaces/_questdb_nodejs-client.QwpWriterColumn.html @@ -1,5 +1,5 @@ QwpWriterColumn | QuestDB JavaScript Client - v5.0.0

    Interface QwpWriterColumn<T, DesignatedTimestamp>

    A reusable, immutable column definition for a compiled QWP table writer.

    -
    interface QwpWriterColumn<T, DesignatedTimestamp extends boolean = false> {
        __qwpWriterInput?: T;
        designatedTimestamp: DesignatedTimestamp;
        kind: QwpWriterColumnKind;
        precisionBits?: number;
        scale?: number;
        unit?: QwpTimestampUnit;
    }

    Type Parameters

    • T
    • DesignatedTimestamp extends boolean = false
    Index

    Properties

    interface QwpWriterColumn<T, DesignatedTimestamp extends boolean = false> {
        __qwpWriterInput?: T;
        designatedTimestamp: DesignatedTimestamp;
        kind: QwpWriterColumnKind;
        precisionBits?: number;
        scale?: number;
        unit?: QwpTimestampUnit;
    }

    Type Parameters

    • T
    • DesignatedTimestamp extends boolean = false
    Index

    Properties

    __qwpWriterInput? designatedTimestamp kind precisionBits? @@ -14,6 +14,6 @@ silently accept anything. A shared property name resolves structurally across bundles, which is what keeps row typing alive for consumers of the published package.

    -
    designatedTimestamp: DesignatedTimestamp
    precisionBits?: number

    GEOHASH precision in bits, fixed for the whole column.

    -
    scale?: number

    DECIMAL scale, fixed for the whole column.

    -
    +
    designatedTimestamp: DesignatedTimestamp
    precisionBits?: number

    GEOHASH precision in bits, fixed for the whole column.

    +
    scale?: number

    DECIMAL scale, fixed for the whole column.

    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.SenderBuffer.html b/docs/interfaces/_questdb_nodejs-client.SenderBuffer.html index 49faf764..44f688c3 100644 --- a/docs/interfaces/_questdb_nodejs-client.SenderBuffer.html +++ b/docs/interfaces/_questdb_nodejs-client.SenderBuffer.html @@ -1,6 +1,6 @@ SenderBuffer | QuestDB JavaScript Client - v5.0.0

    Buffer used by the Sender for data serialization.
    Provides methods for writing different data types into the buffer.

    -
    interface SenderBuffer {
        arrayColumn(name: string, value: unknown[]): SenderBuffer;
        at(timestamp: number | bigint, unit?: TimestampUnit): void;
        atNow(): void;
        booleanColumn(name: string, value: boolean): SenderBuffer;
        currentPosition(): number;
        decimalColumn(
            name: string,
            unscaled: bigint | Int8Array<ArrayBufferLike>,
            scale: number,
        ): SenderBuffer;
        decimalColumnText(name: string, value: string | number): SenderBuffer;
        floatColumn(name: string, value: number): SenderBuffer;
        intColumn(name: string, value: number): SenderBuffer;
        reset(): SenderBuffer;
        stringColumn(name: string, value: string): SenderBuffer;
        symbol(name: string, value: unknown): SenderBuffer;
        table(table: string): SenderBuffer;
        timestampColumn(
            name: string,
            value: number | bigint,
            unit?: TimestampUnit,
        ): SenderBuffer;
        toBufferNew(pos?: number): Buffer<ArrayBufferLike>;
        toBufferView(pos?: number): Buffer;
    }
    Index

    Methods

    interface SenderBuffer {
        arrayColumn(name: string, value: unknown[]): SenderBuffer;
        at(timestamp: number | bigint, unit?: TimestampUnit): void;
        atNow(): void;
        booleanColumn(name: string, value: boolean): SenderBuffer;
        currentPosition(): number;
        decimalColumn(
            name: string,
            unscaled: bigint | Int8Array<ArrayBufferLike>,
            scale: number,
        ): SenderBuffer;
        decimalColumnText(name: string, value: string | number): SenderBuffer;
        floatColumn(name: string, value: number): SenderBuffer;
        intColumn(name: string, value: number | bigint): SenderBuffer;
        reset(): SenderBuffer;
        stringColumn(name: string, value: string): SenderBuffer;
        symbol(name: string, value: unknown): SenderBuffer;
        table(table: string): SenderBuffer;
        timestampColumn(
            name: string,
            value: number | bigint,
            unit?: TimestampUnit,
        ): SenderBuffer;
        toBufferNew(pos?: number): Buffer<ArrayBufferLike>;
        toBufferView(pos?: number): Buffer;
    }
    Index

    Methods

    arrayColumn at atNow booleanColumn @@ -26,7 +26,7 @@
  • or the shape of the array is irregular: the length of sub-arrays are different
  • or the array is not homogeneous: its elements are not all the same type
  • -
    • Closes the row after writing the designated timestamp into the buffer.

      Precision rules:

      • Protocol v2 and higher: @@ -56,17 +56,17 @@

      If the row cannot be closed within max_buf_size. The partial close is rewound, so the same call succeeds once a flush() frees space.

      -
    • Writes a boolean column with its value into the buffer. Use it to insert into BOOLEAN columns.

      Parameters

      • name: string

        Column name.

      • value: boolean

        Column value, accepts only boolean values. A null or undefined value omits the column entirely (stored as NULL).

      Returns SenderBuffer

      Returns with a reference to this buffer.

      -
    • Returns the current position of the buffer. New data will be written into the buffer starting from this position.

      Returns number

      The current write position in the buffer

      -
    • Writes a decimal value into the buffer using its binary format.

      Use it to insert into DECIMAL database columns.

      Parameters

      • name: string

        Column name.

      • unscaled: bigint | Int8Array<ArrayBufferLike>

        The unscaled integer portion of the decimal value.

        @@ -87,7 +87,7 @@
      • scale is not an integer between 0 and 76.
      • unscaled contains invalid bytes.
      -
    • Writes a decimal value into the buffer using its text format.

      Use it to insert into DECIMAL database columns.

      Parameters

      • name: string

        Column name.

      • value: string | number

        The decimal value to write.

        @@ -103,34 +103,35 @@
        • The provided string is not a valid decimal representation.
        -
    • Writes a 64-bit floating point value into the buffer. Use it to insert into DOUBLE or FLOAT database columns.

      Parameters

      • name: string

        Column name.

      • value: number

        Column value, accepts only number values. A null or undefined value omits the column entirely (stored as NULL).

      Returns SenderBuffer

      Returns with a reference to this buffer.

      -
    • Writes a 64-bit signed integer into the buffer. Use it to insert into LONG, INT, SHORT and BYTE columns.

      Parameters

      • name: string

        Column name.

        -
      • value: number

        Column value, accepts only number values. A null or undefined value omits the column entirely (stored as NULL).

        +
      • value: number | bigint

        Column value, accepts integer or BigInt values. LONG is a 64-bit signed integer, which is wider than the safe integer range of number, so pass a BigInt beyond Number.MAX_SAFE_INTEGER to avoid losing precision. A null or undefined value omits the column entirely (stored as NULL).

      Returns SenderBuffer

      Returns with a reference to this buffer.

      -

      Error if the value is not an integer

      -
    • Writes a string column with its value into the buffer. Use it to insert into VARCHAR and STRING columns.

      Parameters

      • name: string

        Column name.

      • value: string

        Column value, accepts only string values. A null or undefined value omits the column entirely (stored as NULL).

      Returns SenderBuffer

      Returns with a reference to this buffer.

      -
    • Writes a symbol name and value into the buffer. Use it to insert into SYMBOL columns.

      Parameters

      • name: string

        Symbol name.

      • value: unknown

        Symbol value, toString() is called to extract the actual symbol value from the parameter. A null or undefined value omits the symbol entirely (stored as NULL).

      Returns SenderBuffer

      Returns with a reference to this buffer.

      -
    • Writes a timestamp column and its value into the buffer.

      Use this method to insert data into TIMESTAMP or TIMESTAMP_NS columns.

      Precision rules:

        @@ -150,18 +151,18 @@
      • 'ms' — milliseconds

    Returns SenderBuffer

    Returns with a reference to this buffer.

    -

    If value is not an integer or BigInt.

    -

    If unit is 'ns' but value is not a BigInt.

    -

    If unit is not one of 'ns', 'us', or 'ms'. This +

    If value is not an integer or BigInt.

    +

    If unit is 'ns' but value is not a BigInt.

    +

    If unit is not one of 'ns', 'us', or 'ms'. This validation runs even when value is null or undefined.

    -
    • Returns a cropped buffer ready to send to the server, or null if there is nothing to send. The returned buffer is a copy of this buffer. It also compacts the buffer.

      Parameters

      • Optionalpos: number

        Optional position parameter

      Returns Buffer<ArrayBufferLike>

      A copy of the buffer ready to send, or null

      -
    • Returns a cropped buffer, or null if there is nothing to send. The returned buffer is backed by this buffer instance, meaning the view can change as the buffer is mutated. Used only in tests to assert the buffer's content.

      Parameters

      • Optionalpos: number

        Optional position parameter

      Returns Buffer

      A view of the buffer

      -
    +
    diff --git a/docs/interfaces/_questdb_nodejs-client.SenderTransport.html b/docs/interfaces/_questdb_nodejs-client.SenderTransport.html index 2be31730..87af0325 100644 --- a/docs/interfaces/_questdb_nodejs-client.SenderTransport.html +++ b/docs/interfaces/_questdb_nodejs-client.SenderTransport.html @@ -1,18 +1,18 @@ SenderTransport | QuestDB JavaScript Client - v5.0.0

    Interface SenderTransport

    Interface for QuestDB transport implementations.
    Defines the contract for different transport protocols (HTTP/HTTPS/TCP/TCPS).

    -
    interface SenderTransport {
        close(): Promise<void>;
        connect(): Promise<boolean>;
        getDefaultAutoFlushRows(): number;
        send(data: Buffer): Promise<boolean>;
    }

    Implemented by

    Index

    Methods

    interface SenderTransport {
        close(): Promise<void>;
        connect(): Promise<boolean>;
        getDefaultAutoFlushRows(): number;
        send(data: Buffer): Promise<boolean>;
    }

    Implemented by

    Index

    Methods

    • Closes the connection to the database server. Should not be called on HTTP transports.

      Returns Promise<void>

      Promise that resolves when the connection is closed

      -
    • Establishes a connection to the database server. Should not be called on HTTP transports.

      Returns Promise<boolean>

      Promise resolving to true if connection is successful

      -
    • Sends the data to the database server.

      Parameters

      • data: Buffer

        Buffer containing the data to send

      Returns Promise<boolean>

      Promise resolving to true if data was sent successfully

      -
    +
    diff --git a/docs/media/QWP.md b/docs/media/QWP.md index 65e6ee7b..240cc9a7 100644 --- a/docs/media/QWP.md +++ b/docs/media/QWP.md @@ -928,7 +928,9 @@ unhandled rejection, and both still reach `onError` and the metrics snapshot. ### Browser ingress Browser applications must use the browser entry point and a same-origin WebSocket -route (directly or through a reverse proxy): +route (directly or through a reverse proxy), unless the server lists the +application's origin in `qwp.browser.allowed.origins`; see +[Third-party browser applications](#third-party-browser-applications): ```typescript import { connectQwpBrowserSender } from "@questdb/browser-client"; @@ -986,6 +988,65 @@ const sender = await connectQwpBrowserSender({ }); ``` +### Third-party browser applications + +A web application served from its own origin connects to QuestDB directly when +the server lists that exact origin, written the way browsers send the `Origin` +header: + +``` +# QuestDB server.conf +qwp.browser.allowed.origins=https://app.example.com +``` + +QuestDB ignores cookies on such a cross-origin upgrade, so session bootstrap +cannot authenticate it. Set `auth` instead: the client sends the credential with +every upgrade as a WebSocket subprotocol, which browser JavaScript can set, +beside the QWP dialect QuestDB selects (`questdb.qwp.v1`, or durable ACK when +requested): + +```typescript +const sender = await connectQwpBrowserSender({ + url: "wss://questdb.example.com:9000/write/v4", + auth: { type: "bearer", token: restToken }, +}); +``` + +`auth` takes the same `bearer` and `basic` credentials as session bootstrap, or a +function returning one. The client calls the function before every initial +connect, reconnect, and failover attempt, so it can return a freshly refreshed +OIDC access token and keep a long-lived session authenticated: + +```typescript +const db = await connectQwpBrowserClient({ + cluster: { + url: "wss://questdb.example.com:9000", + auth: async ({ signal }) => ({ + type: "bearer", + token: await identityProvider.getAccessToken({ signal }), + }), + }, +}); +``` + +The function's `signal` aborts when the attempt is abandoned, and its time counts +against `connectTimeoutMs`. A throw fails the attempt with a `QwpUpgradeError` of +kind `authentication` carrying the thrown error as `cause`, without trying the +remaining endpoints; reconnects retry it with backoff unless the error carries +`retryable: false`. A returned credential that could never be sent, such as a +bearer token with a space or a non-ASCII character, fails without a retry. + +`auth` cannot be combined with `sessionBootstrap`. The credential is +base64url-encoded, not encrypted, so use `wss:`. QuestDB accepts it only from a +listed origin; a page served from QuestDB's own origin must be listed too, or +keep using session bootstrap. QuestDB creates no session for the credential and +runs the connection as the credential's own principal, so `serviceAccount` +assumption is not available on this path. With authentication disabled, a listed origin needs +no credential. QuestDB never selects the credential as the connection's +subprotocol; the client treats a server that does as defective, closes the +connection, and neither retries nor tries another endpoint, because every node +of a cluster normally runs the same build. + ### Transactions and durable acknowledgement Transactional auto-flush keeps automatically emitted frames in an open server-side @@ -1625,8 +1686,8 @@ const db = await connectQwpBrowserClient({ }); ``` -`url`, `failoverUrls`, and `sessionBootstrap` belong to `cluster` in this -unified form and are rejected if repeated under `ingress` or `egress`. +`url`, `failoverUrls`, `sessionBootstrap`, and `auth` belong to `cluster` in +this unified form and are rejected if repeated under `ingress` or `egress`. Side-specific timeouts, WebSocket factories, durable-ACK settings, routing, and compression remain available as explicit overrides. The original split object form with complete `ingress` and `egress` trees remains supported for advanced diff --git a/docs/modules/_questdb_browser-client.html b/docs/modules/_questdb_browser-client.html index dce5bae5..dc453680 100644 --- a/docs/modules/_questdb_browser-client.html +++ b/docs/modules/_questdb_browser-client.html @@ -9,7 +9,9 @@

    Browser JavaScript cannot add an Authorization header to a WebSocket upgrade, +so the client authenticates in one of two ways:

    +
      +
    • Session cookies, for an application served from QuestDB's origin or +through a same-origin reverse proxy. The client authenticates over REST, and +QuestDB sets an HttpOnly session cookie that the browser sends with the +upgrade.
    • +
    • auth, for a third-party web application served from its own origin. +The client sends the credential with every upgrade, in its subprotocol offer.
    • +
    +

    A connection accepts one or the other, not both.

    +

    Authenticate over REST first so QuestDB can set an HttpOnly session cookie. The browser then sends that cookie during the QWP WebSocket upgrade.

    import {
    bootstrapQwpBrowserSession,
    connectQwpBrowserSender,
    } from "@questdb/browser-client";

    await bootstrapQwpBrowserSession({
    url: new URL("/exec", window.location.href),
    authentication: {
    type: "bearer",
    token: oidcOrRestAccessToken,
    },
    // QuestDB Enterprise only; omit to use the authenticated principal.
    serviceAccount: "market_data_writer",
    });

    const sender = await connectQwpBrowserSender({ url: writeUrl });
    @@ -74,9 +88,45 @@

    An application served from its own origin, such as https://app.example.com, +connects to QuestDB directly once the server lists that exact origin:

    +
    # QuestDB server.conf
    qwp.browser.allowed.origins=https://app.example.com +
    + +

    Pass the credential as auth. REST and OIDC tokens use the bearer form, and +{ type: "basic", username, password } is accepted too:

    +
    import { connectQwpBrowserSender } from "@questdb/browser-client";

    const sender = await connectQwpBrowserSender({
    url: "wss://questdb.example.com:9000/write/v4",
    auth: { type: "bearer", token: restToken },
    }); +
    + +

    An OIDC access token expires, so pass a function instead. The client calls it +before every initial connect, reconnect, and failover attempt, so a long-lived +sender or query session keeps working with each refreshed token:

    +
    const sender = await connectQwpBrowserSender({
    url: "wss://questdb.example.com:9000/write/v4",
    auth: async ({ signal }) => ({
    type: "bearer",
    token: await identityProvider.getAccessToken({ signal }),
    }),
    }); +
    + +

    The signal aborts when the connection attempt is abandoned, and time spent in +the function counts against connectTimeoutMs. If the function throws, the +attempt fails with a QwpUpgradeError of kind authentication whose cause is +the thrown error; reconnects retry it with backoff unless that error carries +retryable: false.

    +
      +
    • Use wss:. The credential travels in the upgrade request's +Sec-WebSocket-Protocol header, base64url-encoded but not encrypted.
    • +
    • QuestDB accepts the credential only from a listed origin; a page served from +QuestDB's own origin must be listed too, or keep using session cookies. It +creates no session and ignores cookies on these upgrades, so the connection +runs as the credential's own principal; serviceAccount assumption is not +available this way.
    • +
    • QuestDB never selects the credential as the connection's subprotocol. The +client treats a server that does as defective and closes the connection +without retrying or trying another endpoint.
    • +
    • With authentication disabled, a listed origin needs no credential.
    • +
    • The server must support qwp.browser.allowed.origins. The allowlist covers +only the QWP routes; it does not enable CORS for REST.
    • +

    QWP egress streams typed result batches. A session runs one active query at a time and automatically reconnects and walks configured failover URLs.

    import { connectQwpBrowserEgress } from "@questdb/browser-client";

    const readUrl = new URL("/read/v1", window.location.href);
    readUrl.protocol = window.location.protocol === "https:" ? "wss:" : "ws:";

    const session = await connectQwpBrowserEgress(
    {
    url: readUrl,
    compression: "zstd",
    sessionBootstrap: {
    authentication: { type: "bearer", token: oidcOrRestAccessToken },
    },
    },
    { queryTimeoutMs: 30_000 },
    );

    try {
    const query = await session.query(
    "select timestamp, device, temperature " +
    "from measurements where device = $1",
    {
    // Bind index 0 corresponds to SQL placeholder $1.
    binds: (binds) => binds.setVarchar(0, "sensor-1"),
    // A positive credit window bounds server read-ahead.
    initialCredit: 1024 * 1024,
    },
    );

    for await (const batch of query) {
    for (const row of batch.rows()) {
    console.log(row);
    }
    }

    await query.completion;
    } finally {
    await session.close();
    } @@ -106,4 +156,4 @@

    Returns void

    diff --git a/docs/types/_questdb_nodejs-client.QwpBindSetter.html b/docs/types/_questdb_nodejs-client.QwpBindSetter.html index 962f413e..b9313bae 100644 --- a/docs/types/_questdb_nodejs-client.QwpBindSetter.html +++ b/docs/types/_questdb_nodejs-client.QwpBindSetter.html @@ -1 +1 @@ -QwpBindSetter | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpBindSetter

    QwpBindSetter: (binds: QwpBindValues) => void

    Type declaration

    +QwpBindSetter | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpBindSetter

    QwpBindSetter: (binds: QwpBindValues) => void

    Type declaration

    diff --git a/docs/types/_questdb_nodejs-client.QwpBindType.html b/docs/types/_questdb_nodejs-client.QwpBindType.html index a3885f2b..a22a9d50 100644 --- a/docs/types/_questdb_nodejs-client.QwpBindType.html +++ b/docs/types/_questdb_nodejs-client.QwpBindType.html @@ -1,2 +1,2 @@ QwpBindType | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpBindType

    QwpBindType:
        | typeof BOOLEAN
        | typeof BYTE
        | typeof SHORT
        | typeof INT
        | typeof LONG
        | typeof FLOAT
        | typeof DOUBLE
        | typeof TIMESTAMP
        | typeof DATE
        | typeof UUID
        | typeof LONG256
        | typeof GEOHASH
        | typeof VARCHAR
        | typeof TIMESTAMP_NANOS
        | typeof DECIMAL64
        | typeof DECIMAL128
        | typeof DECIMAL256
        | typeof CHAR

    Phase-1 scalar bind types exposed by the Java reference client.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpColumnType.html b/docs/types/_questdb_nodejs-client.QwpColumnType.html index ac5afb76..18176762 100644 --- a/docs/types/_questdb_nodejs-client.QwpColumnType.html +++ b/docs/types/_questdb_nodejs-client.QwpColumnType.html @@ -1 +1 @@ -QwpColumnType | QuestDB JavaScript Client - v5.0.0
    +QwpColumnType | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpConnectionFactory.html b/docs/types/_questdb_nodejs-client.QwpConnectionFactory.html index 2c50b967..86932532 100644 --- a/docs/types/_questdb_nodejs-client.QwpConnectionFactory.html +++ b/docs/types/_questdb_nodejs-client.QwpConnectionFactory.html @@ -2,4 +2,4 @@ closes, so a factory that is still negotiating can tear its socket down instead of leaving it alive until its own deadline expires. Factories that ignore the parameter remain assignable.

    -

    Type declaration

    +

    Type declaration

    diff --git a/docs/types/_questdb_nodejs-client.QwpDecimalInput.html b/docs/types/_questdb_nodejs-client.QwpDecimalInput.html index 70cb2d1e..c817654d 100644 --- a/docs/types/_questdb_nodejs-client.QwpDecimalInput.html +++ b/docs/types/_questdb_nodejs-client.QwpDecimalInput.html @@ -1,3 +1,3 @@ QwpDecimalInput | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpDecimalInput

    QwpDecimalInput: bigint | number | string | { scale: number; unscaled: bigint }

    DECIMAL input: the unscaled bigint at the column's scale, decimal text (or a number) that is exactly representable at that scale, or the egress record.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpDoubleArrayInput.html b/docs/types/_questdb_nodejs-client.QwpDoubleArrayInput.html index 2903a18e..a9fa61bc 100644 --- a/docs/types/_questdb_nodejs-client.QwpDoubleArrayInput.html +++ b/docs/types/_questdb_nodejs-client.QwpDoubleArrayInput.html @@ -1,2 +1,2 @@ QwpDoubleArrayInput | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpDoubleArrayInput

    QwpDoubleArrayInput:
        | QwpNestedNumberArray
        | { dimensions: readonly number[]; values: readonly number[] }

    DOUBLE array input: nested arrays or a flat shape-and-values record.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpEgressCompression.html b/docs/types/_questdb_nodejs-client.QwpEgressCompression.html index 06836361..33423a10 100644 --- a/docs/types/_questdb_nodejs-client.QwpEgressCompression.html +++ b/docs/types/_questdb_nodejs-client.QwpEgressCompression.html @@ -1 +1 @@ -QwpEgressCompression | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpEgressCompression

    QwpEgressCompression: "raw" | "zstd" | "auto"
    +QwpEgressCompression | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpEgressCompression

    QwpEgressCompression: "raw" | "zstd" | "auto"
    diff --git a/docs/types/_questdb_nodejs-client.QwpEgressMessage.html b/docs/types/_questdb_nodejs-client.QwpEgressMessage.html index b87191e2..b615cac4 100644 --- a/docs/types/_questdb_nodejs-client.QwpEgressMessage.html +++ b/docs/types/_questdb_nodejs-client.QwpEgressMessage.html @@ -1 +1 @@ -QwpEgressMessage | QuestDB JavaScript Client - v5.0.0
    +QwpEgressMessage | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpEgressViewCallbackControl.html b/docs/types/_questdb_nodejs-client.QwpEgressViewCallbackControl.html index 3cdb66a9..de54ad33 100644 --- a/docs/types/_questdb_nodejs-client.QwpEgressViewCallbackControl.html +++ b/docs/types/_questdb_nodejs-client.QwpEgressViewCallbackControl.html @@ -1,2 +1,2 @@ QwpEgressViewCallbackControl | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpEgressViewCallbackControl

    QwpEgressViewCallbackControl: Omit<QwpEgressViewQuery, "completion">

    Query operations that are safe while a reusable batch callback is active.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpExtraOptions.html b/docs/types/_questdb_nodejs-client.QwpExtraOptions.html index 0c9bfd44..2ffba606 100644 --- a/docs/types/_questdb_nodejs-client.QwpExtraOptions.html +++ b/docs/types/_questdb_nodejs-client.QwpExtraOptions.html @@ -1,16 +1,16 @@ -QwpExtraOptions | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpExtraOptions

    type QwpExtraOptions = {
        sender?: QwpSenderOptions;
        session?: QwpIngressSessionOptions;
        udp?: Omit<QwpNodeUdpOptions, "host" | "port">;
        webSocket?: Omit<QwpNodeIngressOptions, "url">;
    }
    Index

    Properties

    sender? +QwpExtraOptions | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpExtraOptions

    type QwpExtraOptions = {
        sender?: QwpSenderOptions;
        session?: QwpIngressSessionOptions;
        udp?: Omit<QwpNodeUdpOptions, "host" | "port">;
        webSocket?: Omit<QwpNodeIngressOptions, "url">;
    }
    Index

    Properties

    High-level buffering and auto-flush options for WS, WSS, and UDP. A log here is used when no top-level logger is supplied; the top-level one wins when both are set.

    -

    WS/WSS ingress ACK, durable-ACK, and reconnect options.

    -
    udp?: Omit<QwpNodeUdpOptions, "host" | "port">

    UDP-only socket overrides. Like every other section here, these are applied +

    WS/WSS ingress ACK, durable-ACK, and reconnect options.

    +
    udp?: Omit<QwpNodeUdpOptions, "host" | "port">

    UDP-only socket overrides. Like every other section here, these are applied after the connect string is parsed and win over the equivalent connect string key -- maxDatagramSize over max_datagram_size, multicastTtl over multicast_ttl.

    -
    webSocket?: Omit<QwpNodeIngressOptions, "url">

    WS/WSS ingress overrides. Values are applied after the connect string has +

    webSocket?: Omit<QwpNodeIngressOptions, "url">

    WS/WSS ingress overrides. Values are applied after the connect string has been fully parsed and validated; typed values win when both forms set the same option.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpGeohashInput.html b/docs/types/_questdb_nodejs-client.QwpGeohashInput.html index 665104c2..c65fc3ef 100644 --- a/docs/types/_questdb_nodejs-client.QwpGeohashInput.html +++ b/docs/types/_questdb_nodejs-client.QwpGeohashInput.html @@ -1,3 +1,3 @@ QwpGeohashInput | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpGeohashInput

    QwpGeohashInput:
        | bigint
        | number
        | string
        | { bits: bigint; precisionBits: number }

    GEOHASH input: the raw bits, base-32 geohash text whose length matches the column precision, or the egress bit record.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpIngressProgressKind.html b/docs/types/_questdb_nodejs-client.QwpIngressProgressKind.html index 3116249d..47710184 100644 --- a/docs/types/_questdb_nodejs-client.QwpIngressProgressKind.html +++ b/docs/types/_questdb_nodejs-client.QwpIngressProgressKind.html @@ -1 +1 @@ -QwpIngressProgressKind | QuestDB JavaScript Client - v5.0.0
    +QwpIngressProgressKind | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpInitialConnectMode.html b/docs/types/_questdb_nodejs-client.QwpInitialConnectMode.html index 6cda5a6a..9ed4ae02 100644 --- a/docs/types/_questdb_nodejs-client.QwpInitialConnectMode.html +++ b/docs/types/_questdb_nodejs-client.QwpInitialConnectMode.html @@ -1 +1 @@ -QwpInitialConnectMode | QuestDB JavaScript Client - v5.0.0
    +QwpInitialConnectMode | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpInt64.html b/docs/types/_questdb_nodejs-client.QwpInt64.html index a3ab002f..77c6adcb 100644 --- a/docs/types/_questdb_nodejs-client.QwpInt64.html +++ b/docs/types/_questdb_nodejs-client.QwpInt64.html @@ -1 +1 @@ -QwpInt64 | QuestDB JavaScript Client - v5.0.0
    QwpInt64: number | bigint
    +QwpInt64 | QuestDB JavaScript Client - v5.0.0
    QwpInt64: number | bigint
    diff --git a/docs/types/_questdb_nodejs-client.QwpIpv4Input.html b/docs/types/_questdb_nodejs-client.QwpIpv4Input.html index 41f81471..dd0df323 100644 --- a/docs/types/_questdb_nodejs-client.QwpIpv4Input.html +++ b/docs/types/_questdb_nodejs-client.QwpIpv4Input.html @@ -1,2 +1,2 @@ QwpIpv4Input | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpIpv4Input

    QwpIpv4Input: string | number

    IPV4 input: dotted-quad text or a signed/unsigned packed 32-bit address.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpLong256Input.html b/docs/types/_questdb_nodejs-client.QwpLong256Input.html index bdf35650..00019f6c 100644 --- a/docs/types/_questdb_nodejs-client.QwpLong256Input.html +++ b/docs/types/_questdb_nodejs-client.QwpLong256Input.html @@ -1,3 +1,3 @@ QwpLong256Input | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpLong256Input

    QwpLong256Input: bigint | string | QwpLong256Words | { words: QwpLong256Words }

    LONG256 input: an unsigned 256-bit bigint, a 0x-prefixed hex string of up to 64 digits, four little-endian words, or the egress word record.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpLong256Words.html b/docs/types/_questdb_nodejs-client.QwpLong256Words.html index 438cba53..804c50c1 100644 --- a/docs/types/_questdb_nodejs-client.QwpLong256Words.html +++ b/docs/types/_questdb_nodejs-client.QwpLong256Words.html @@ -1,2 +1,2 @@ QwpLong256Words | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpLong256Words

    QwpLong256Words: readonly [bigint, bigint, bigint, bigint]

    LONG256 little-endian words; word 0 is least significant.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpLongArrayInput.html b/docs/types/_questdb_nodejs-client.QwpLongArrayInput.html index 8f7b0737..979446d1 100644 --- a/docs/types/_questdb_nodejs-client.QwpLongArrayInput.html +++ b/docs/types/_questdb_nodejs-client.QwpLongArrayInput.html @@ -1,2 +1,2 @@ QwpLongArrayInput | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpLongArrayInput

    QwpLongArrayInput:
        | QwpNestedLongArray
        | { dimensions: readonly number[]; values: readonly (number | bigint)[] }

    LONG array input: nested arrays or a flat shape-and-values record.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpNegotiatedEgressCompression.html b/docs/types/_questdb_nodejs-client.QwpNegotiatedEgressCompression.html index 6e127fd3..4d77938c 100644 --- a/docs/types/_questdb_nodejs-client.QwpNegotiatedEgressCompression.html +++ b/docs/types/_questdb_nodejs-client.QwpNegotiatedEgressCompression.html @@ -1 +1 @@ -QwpNegotiatedEgressCompression | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpNegotiatedEgressCompression

    QwpNegotiatedEgressCompression:
        | { codec: "raw"; level: 0 }
        | { codec: "zstd"; level: number }
        | { codec: "unknown"; contentEncoding: string; level: 0 }
    +QwpNegotiatedEgressCompression | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpNegotiatedEgressCompression

    QwpNegotiatedEgressCompression:
        | { codec: "raw"; level: 0 }
        | { codec: "zstd"; level: number }
        | { codec: "unknown"; contentEncoding: string; level: 0 }
    diff --git a/docs/types/_questdb_nodejs-client.QwpNestedLongArray.html b/docs/types/_questdb_nodejs-client.QwpNestedLongArray.html index 53444b36..8365a0e7 100644 --- a/docs/types/_questdb_nodejs-client.QwpNestedLongArray.html +++ b/docs/types/_questdb_nodejs-client.QwpNestedLongArray.html @@ -1,2 +1,2 @@ QwpNestedLongArray | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpNestedLongArray

    QwpNestedLongArray: readonly (number | bigint | QwpNestedLongArray)[]

    Nested LONG array of uniform shape.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpNestedNumberArray.html b/docs/types/_questdb_nodejs-client.QwpNestedNumberArray.html index 3eb231c8..c2d12938 100644 --- a/docs/types/_questdb_nodejs-client.QwpNestedNumberArray.html +++ b/docs/types/_questdb_nodejs-client.QwpNestedNumberArray.html @@ -1,2 +1,2 @@ QwpNestedNumberArray | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpNestedNumberArray

    QwpNestedNumberArray: readonly (number | QwpNestedNumberArray)[]

    Nested DOUBLE array of uniform shape.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpNodeOrphanDrainEventKind.html b/docs/types/_questdb_nodejs-client.QwpNodeOrphanDrainEventKind.html index 3dcf31ed..7cd8fe93 100644 --- a/docs/types/_questdb_nodejs-client.QwpNodeOrphanDrainEventKind.html +++ b/docs/types/_questdb_nodejs-client.QwpNodeOrphanDrainEventKind.html @@ -1 +1 @@ -QwpNodeOrphanDrainEventKind | QuestDB JavaScript Client - v5.0.0
    +QwpNodeOrphanDrainEventKind | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpQueryCompletion.html b/docs/types/_questdb_nodejs-client.QwpQueryCompletion.html index 986b19f7..7a73d8f6 100644 --- a/docs/types/_questdb_nodejs-client.QwpQueryCompletion.html +++ b/docs/types/_questdb_nodejs-client.QwpQueryCompletion.html @@ -1 +1 @@ -QwpQueryCompletion | QuestDB JavaScript Client - v5.0.0
    +QwpQueryCompletion | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpReconnectEventKind.html b/docs/types/_questdb_nodejs-client.QwpReconnectEventKind.html index f5ce96d2..f63ca567 100644 --- a/docs/types/_questdb_nodejs-client.QwpReconnectEventKind.html +++ b/docs/types/_questdb_nodejs-client.QwpReconnectEventKind.html @@ -1 +1 @@ -QwpReconnectEventKind | QuestDB JavaScript Client - v5.0.0
    +QwpReconnectEventKind | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpResultBatchViewHandler.html b/docs/types/_questdb_nodejs-client.QwpResultBatchViewHandler.html index 3b6d1024..2f4cc51f 100644 --- a/docs/types/_questdb_nodejs-client.QwpResultBatchViewHandler.html +++ b/docs/types/_questdb_nodejs-client.QwpResultBatchViewHandler.html @@ -1,3 +1,3 @@ QwpResultBatchViewHandler | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpResultBatchViewHandler

    QwpResultBatchViewHandler: (
        batch: QwpResultBatchView,
        query: QwpEgressViewCallbackControl,
    ) => void | Promise<void>

    Runs while one reusable batch view is valid. Do not retain the batch, columns, or raw byte slices after the callback settles.

    -

    Type declaration

    +

    Type declaration

    diff --git a/docs/types/_questdb_nodejs-client.QwpResultRowViewCallback.html b/docs/types/_questdb_nodejs-client.QwpResultRowViewCallback.html index 403c79d7..03a7e849 100644 --- a/docs/types/_questdb_nodejs-client.QwpResultRowViewCallback.html +++ b/docs/types/_questdb_nodejs-client.QwpResultRowViewCallback.html @@ -1,2 +1,2 @@ QwpResultRowViewCallback | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpResultRowViewCallback

    QwpResultRowViewCallback: (row: QwpResultRowView) => void

    Callback invoked by QwpResultBatchView.forEachRow().

    -

    Type declaration

    +

    Type declaration

    diff --git a/docs/types/_questdb_nodejs-client.QwpResultValue.html b/docs/types/_questdb_nodejs-client.QwpResultValue.html index 09879884..44e11249 100644 --- a/docs/types/_questdb_nodejs-client.QwpResultValue.html +++ b/docs/types/_questdb_nodejs-client.QwpResultValue.html @@ -1 +1 @@ -QwpResultValue | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpResultValue

    QwpResultValue:
        | boolean
        | number
        | bigint
        | string
        | Uint8Array
        | QwpDecimalValue
        | QwpUuidValue
        | QwpLong256Value
        | QwpGeohashValue
        | QwpResultArrayValue
        | null
    +QwpResultValue | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpResultValue

    QwpResultValue:
        | boolean
        | number
        | bigint
        | string
        | Uint8Array
        | QwpDecimalValue
        | QwpUuidValue
        | QwpLong256Value
        | QwpGeohashValue
        | QwpResultArrayValue
        | null
    diff --git a/docs/types/_questdb_nodejs-client.QwpSenderErrorCategory.html b/docs/types/_questdb_nodejs-client.QwpSenderErrorCategory.html index 6e6671d4..11c1f720 100644 --- a/docs/types/_questdb_nodejs-client.QwpSenderErrorCategory.html +++ b/docs/types/_questdb_nodejs-client.QwpSenderErrorCategory.html @@ -1 +1 @@ -QwpSenderErrorCategory | QuestDB JavaScript Client - v5.0.0
    +QwpSenderErrorCategory | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpSenderErrorPolicy.html b/docs/types/_questdb_nodejs-client.QwpSenderErrorPolicy.html index b5330b58..6e22b745 100644 --- a/docs/types/_questdb_nodejs-client.QwpSenderErrorPolicy.html +++ b/docs/types/_questdb_nodejs-client.QwpSenderErrorPolicy.html @@ -1 +1 @@ -QwpSenderErrorPolicy | QuestDB JavaScript Client - v5.0.0
    +QwpSenderErrorPolicy | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpSenderLogger.html b/docs/types/_questdb_nodejs-client.QwpSenderLogger.html index 3939b8af..e2201eaf 100644 --- a/docs/types/_questdb_nodejs-client.QwpSenderLogger.html +++ b/docs/types/_questdb_nodejs-client.QwpSenderLogger.html @@ -1 +1 @@ -QwpSenderLogger | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpSenderLogger

    QwpSenderLogger: (
        level: "error" | "warn" | "info" | "debug",
        message: string | Error,
    ) => void

    Type declaration

      • (level: "error" | "warn" | "info" | "debug", message: string | Error): void
      • Parameters

        • level: "error" | "warn" | "info" | "debug"
        • message: string | Error

        Returns void

    +QwpSenderLogger | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpSenderLogger

    QwpSenderLogger: (
        level: "error" | "warn" | "info" | "debug",
        message: string | Error,
    ) => void

    Type declaration

      • (level: "error" | "warn" | "info" | "debug", message: string | Error): void
      • Parameters

        • level: "error" | "warn" | "info" | "debug"
        • message: string | Error

        Returns void

    diff --git a/docs/types/_questdb_nodejs-client.QwpSenderSessionFactory.html b/docs/types/_questdb_nodejs-client.QwpSenderSessionFactory.html index 20c0ee41..e052a5be 100644 --- a/docs/types/_questdb_nodejs-client.QwpSenderSessionFactory.html +++ b/docs/types/_questdb_nodejs-client.QwpSenderSessionFactory.html @@ -2,4 +2,4 @@ still negotiating can be torn down instead of outliving the sender by up to its connect/auth deadline. Factories that ignore the parameter remain assignable, matching QwpConnectionFactory.

    -

    Type declaration

    +

    Type declaration

    diff --git a/docs/types/_questdb_nodejs-client.QwpSfBackpressurePolicy.html b/docs/types/_questdb_nodejs-client.QwpSfBackpressurePolicy.html index 926430d3..a853d637 100644 --- a/docs/types/_questdb_nodejs-client.QwpSfBackpressurePolicy.html +++ b/docs/types/_questdb_nodejs-client.QwpSfBackpressurePolicy.html @@ -1 +1 @@ -QwpSfBackpressurePolicy | QuestDB JavaScript Client - v5.0.0
    +QwpSfBackpressurePolicy | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpSfDurability.html b/docs/types/_questdb_nodejs-client.QwpSfDurability.html index 05084500..9ee24e3f 100644 --- a/docs/types/_questdb_nodejs-client.QwpSfDurability.html +++ b/docs/types/_questdb_nodejs-client.QwpSfDurability.html @@ -1 +1 @@ -QwpSfDurability | QuestDB JavaScript Client - v5.0.0
    +QwpSfDurability | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpTarget.html b/docs/types/_questdb_nodejs-client.QwpTarget.html index 9441f044..d8d98154 100644 --- a/docs/types/_questdb_nodejs-client.QwpTarget.html +++ b/docs/types/_questdb_nodejs-client.QwpTarget.html @@ -1,2 +1,2 @@ QwpTarget | QuestDB JavaScript Client - v5.0.0
    QwpTarget: typeof QWP_TARGET[keyof typeof QWP_TARGET]

    Server role accepted by an egress connection. Defaults to any.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpTimestampUnit.html b/docs/types/_questdb_nodejs-client.QwpTimestampUnit.html index b38bf903..92050d9d 100644 --- a/docs/types/_questdb_nodejs-client.QwpTimestampUnit.html +++ b/docs/types/_questdb_nodejs-client.QwpTimestampUnit.html @@ -1 +1 @@ -QwpTimestampUnit | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpTimestampUnit

    QwpTimestampUnit: "ns" | "us" | "ms"
    +QwpTimestampUnit | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpTimestampUnit

    QwpTimestampUnit: "ns" | "us" | "ms"
    diff --git a/docs/types/_questdb_nodejs-client.QwpUpgradeErrorKind.html b/docs/types/_questdb_nodejs-client.QwpUpgradeErrorKind.html index cda2b41b..077ca9a8 100644 --- a/docs/types/_questdb_nodejs-client.QwpUpgradeErrorKind.html +++ b/docs/types/_questdb_nodejs-client.QwpUpgradeErrorKind.html @@ -1 +1 @@ -QwpUpgradeErrorKind | QuestDB JavaScript Client - v5.0.0
    +QwpUpgradeErrorKind | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/types/_questdb_nodejs-client.QwpUpgradeTimeoutPhase.html b/docs/types/_questdb_nodejs-client.QwpUpgradeTimeoutPhase.html index 407e6a94..f157b374 100644 --- a/docs/types/_questdb_nodejs-client.QwpUpgradeTimeoutPhase.html +++ b/docs/types/_questdb_nodejs-client.QwpUpgradeTimeoutPhase.html @@ -1,2 +1,2 @@ QwpUpgradeTimeoutPhase | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpUpgradeTimeoutPhase

    QwpUpgradeTimeoutPhase: typeof QWP_UPGRADE_TIMEOUT_PHASE[keyof typeof QWP_UPGRADE_TIMEOUT_PHASE]

    Opening phase whose Node QWP deadline expired.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpUuidInput.html b/docs/types/_questdb_nodejs-client.QwpUuidInput.html index 7adc6097..a81a23ca 100644 --- a/docs/types/_questdb_nodejs-client.QwpUuidInput.html +++ b/docs/types/_questdb_nodejs-client.QwpUuidInput.html @@ -1,4 +1,4 @@ QwpUuidInput | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpUuidInput

    QwpUuidInput: string | Uint8Array | { high: bigint; low: bigint }

    UUID input: canonical text, 16 canonical (RFC 4122) big-endian bytes, or the egress limb pair. All three forms describe the same UUID; the byte form is what uuid.parse() and java.util.UUID produce, not pre-encoded wire bytes.

    -
    +
    diff --git a/docs/types/_questdb_nodejs-client.QwpWriterColumnKind.html b/docs/types/_questdb_nodejs-client.QwpWriterColumnKind.html index ec58560c..c853881e 100644 --- a/docs/types/_questdb_nodejs-client.QwpWriterColumnKind.html +++ b/docs/types/_questdb_nodejs-client.QwpWriterColumnKind.html @@ -1 +1 @@ -QwpWriterColumnKind | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpWriterColumnKind

    QwpWriterColumnKind:
        | "symbol"
        | "varchar"
        | "bool"
        | "byte"
        | "short"
        | "int32"
        | "int64"
        | "float32"
        | "float64"
        | "timestamp"
        | "date"
        | "char"
        | "binary"
        | "uuid"
        | "long256"
        | "ipv4"
        | "geohash"
        | "decimal64"
        | "decimal128"
        | "decimal256"
        | "doubleArray"
        | "longArray"
    +QwpWriterColumnKind | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpWriterColumnKind

    QwpWriterColumnKind:
        | "symbol"
        | "varchar"
        | "bool"
        | "byte"
        | "short"
        | "int32"
        | "int64"
        | "float32"
        | "float64"
        | "timestamp"
        | "date"
        | "char"
        | "binary"
        | "uuid"
        | "long256"
        | "ipv4"
        | "geohash"
        | "decimal64"
        | "decimal128"
        | "decimal256"
        | "doubleArray"
        | "longArray"
    diff --git a/docs/types/_questdb_nodejs-client.QwpWriterRow.html b/docs/types/_questdb_nodejs-client.QwpWriterRow.html index 1b6860ca..771d1cbe 100644 --- a/docs/types/_questdb_nodejs-client.QwpWriterRow.html +++ b/docs/types/_questdb_nodejs-client.QwpWriterRow.html @@ -1,2 +1,2 @@ QwpWriterRow | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpWriterRow<Schema>

    QwpWriterRow: {
        [Key in QwpDesignatedTimestampKey<Schema>]-?: QwpWriterColumnInput<
            Schema[Key],
        >
    } & {
        [Key in QwpRegularColumnKey<Schema>]?:
            | QwpWriterColumnInput<Schema[Key]>
            | null
    }

    The object accepted by a table writer compiled from Schema.

    -

    Type Parameters

    +

    Type Parameters

    diff --git a/docs/types/_questdb_nodejs-client.QwpWriterSchema.html b/docs/types/_questdb_nodejs-client.QwpWriterSchema.html index 2f7885af..1865d4d8 100644 --- a/docs/types/_questdb_nodejs-client.QwpWriterSchema.html +++ b/docs/types/_questdb_nodejs-client.QwpWriterSchema.html @@ -1 +1 @@ -QwpWriterSchema | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpWriterSchema

    QwpWriterSchema: Readonly<Record<string, QwpWriterColumn<unknown, boolean>>>
    +QwpWriterSchema | QuestDB JavaScript Client - v5.0.0

    Type Alias QwpWriterSchema

    QwpWriterSchema: Readonly<Record<string, QwpWriterColumn<unknown, boolean>>>
    diff --git a/docs/types/_questdb_nodejs-client.TimestampUnit.html b/docs/types/_questdb_nodejs-client.TimestampUnit.html index 1716c3bb..78127862 100644 --- a/docs/types/_questdb_nodejs-client.TimestampUnit.html +++ b/docs/types/_questdb_nodejs-client.TimestampUnit.html @@ -1,2 +1,2 @@ TimestampUnit | QuestDB JavaScript Client - v5.0.0

    Type Alias TimestampUnit

    TimestampUnit: "ns" | "us" | "ms"

    Supported timestamp units for QuestDB operations.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_COLUMN_TYPE.html b/docs/variables/_questdb_browser-client.QWP_COLUMN_TYPE.html index 16adc617..389bf016 100644 --- a/docs/variables/_questdb_browser-client.QWP_COLUMN_TYPE.html +++ b/docs/variables/_questdb_browser-client.QWP_COLUMN_TYPE.html @@ -1 +1 @@ -QWP_COLUMN_TYPE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_COLUMN_TYPEConst

    QWP_COLUMN_TYPE: {
        BINARY: 23;
        BOOLEAN: 1;
        BYTE: 2;
        CHAR: 22;
        DATE: 11;
        DECIMAL128: 20;
        DECIMAL256: 21;
        DECIMAL64: 19;
        DOUBLE: 7;
        DOUBLE_ARRAY: 17;
        FLOAT: 6;
        GEOHASH: 14;
        INT: 4;
        IPV4: 24;
        LONG: 5;
        LONG_ARRAY: 18;
        LONG256: 13;
        SHORT: 3;
        SYMBOL: 9;
        TIMESTAMP: 10;
        TIMESTAMP_NANOS: 16;
        UUID: 12;
        VARCHAR: 15;
    } = ...

    Type declaration

    • ReadonlyBINARY: 23
    • ReadonlyBOOLEAN: 1
    • ReadonlyBYTE: 2
    • ReadonlyCHAR: 22
    • ReadonlyDATE: 11
    • ReadonlyDECIMAL128: 20
    • ReadonlyDECIMAL256: 21
    • ReadonlyDECIMAL64: 19
    • ReadonlyDOUBLE: 7
    • ReadonlyDOUBLE_ARRAY: 17
    • ReadonlyFLOAT: 6
    • ReadonlyGEOHASH: 14
    • ReadonlyINT: 4
    • ReadonlyIPV4: 24
    • ReadonlyLONG: 5
    • ReadonlyLONG_ARRAY: 18
    • ReadonlyLONG256: 13
    • ReadonlySHORT: 3
    • ReadonlySYMBOL: 9
    • ReadonlyTIMESTAMP: 10
    • ReadonlyTIMESTAMP_NANOS: 16
    • ReadonlyUUID: 12
    • ReadonlyVARCHAR: 15
    +QWP_COLUMN_TYPE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_COLUMN_TYPEConst

    QWP_COLUMN_TYPE: {
        BINARY: 23;
        BOOLEAN: 1;
        BYTE: 2;
        CHAR: 22;
        DATE: 11;
        DECIMAL128: 20;
        DECIMAL256: 21;
        DECIMAL64: 19;
        DOUBLE: 7;
        DOUBLE_ARRAY: 17;
        FLOAT: 6;
        GEOHASH: 14;
        INT: 4;
        IPV4: 24;
        LONG: 5;
        LONG_ARRAY: 18;
        LONG256: 13;
        SHORT: 3;
        SYMBOL: 9;
        TIMESTAMP: 10;
        TIMESTAMP_NANOS: 16;
        UUID: 12;
        VARCHAR: 15;
    } = ...

    Type declaration

    • ReadonlyBINARY: 23
    • ReadonlyBOOLEAN: 1
    • ReadonlyBYTE: 2
    • ReadonlyCHAR: 22
    • ReadonlyDATE: 11
    • ReadonlyDECIMAL128: 20
    • ReadonlyDECIMAL256: 21
    • ReadonlyDECIMAL64: 19
    • ReadonlyDOUBLE: 7
    • ReadonlyDOUBLE_ARRAY: 17
    • ReadonlyFLOAT: 6
    • ReadonlyGEOHASH: 14
    • ReadonlyINT: 4
    • ReadonlyIPV4: 24
    • ReadonlyLONG: 5
    • ReadonlyLONG_ARRAY: 18
    • ReadonlyLONG256: 13
    • ReadonlySHORT: 3
    • ReadonlySYMBOL: 9
    • ReadonlyTIMESTAMP: 10
    • ReadonlyTIMESTAMP_NANOS: 16
    • ReadonlyUUID: 12
    • ReadonlyVARCHAR: 15
    diff --git a/docs/variables/_questdb_browser-client.QWP_COMPRESSION_CODEC.html b/docs/variables/_questdb_browser-client.QWP_COMPRESSION_CODEC.html index 07550d94..6d88e497 100644 --- a/docs/variables/_questdb_browser-client.QWP_COMPRESSION_CODEC.html +++ b/docs/variables/_questdb_browser-client.QWP_COMPRESSION_CODEC.html @@ -1 +1 @@ -QWP_COMPRESSION_CODEC | QuestDB JavaScript Client - v5.0.0

    Variable QWP_COMPRESSION_CODECConst

    QWP_COMPRESSION_CODEC: { RAW: 0; ZSTD: 1 } = ...

    Type declaration

    • ReadonlyRAW: 0
    • ReadonlyZSTD: 1
    +QWP_COMPRESSION_CODEC | QuestDB JavaScript Client - v5.0.0

    Variable QWP_COMPRESSION_CODECConst

    QWP_COMPRESSION_CODEC: { RAW: 0; ZSTD: 1 } = ...

    Type declaration

    • ReadonlyRAW: 0
    • ReadonlyZSTD: 1
    diff --git a/docs/variables/_questdb_browser-client.QWP_DECIMAL_MAX_SCALE.html b/docs/variables/_questdb_browser-client.QWP_DECIMAL_MAX_SCALE.html index 419a9f4f..89a28b71 100644 --- a/docs/variables/_questdb_browser-client.QWP_DECIMAL_MAX_SCALE.html +++ b/docs/variables/_questdb_browser-client.QWP_DECIMAL_MAX_SCALE.html @@ -1,2 +1,2 @@ QWP_DECIMAL_MAX_SCALE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_DECIMAL_MAX_SCALEConst

    QWP_DECIMAL_MAX_SCALE: { decimal128: 38; decimal256: 76; decimal64: 18 } = ...

    Maximum DECIMAL scale of each fixed-width decimal column type.

    -

    Type declaration

    • Readonlydecimal128: 38
    • Readonlydecimal256: 76
    • Readonlydecimal64: 18
    +

    Type declaration

    • Readonlydecimal128: 38
    • Readonlydecimal256: 76
    • Readonlydecimal64: 18
    diff --git a/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE.html b/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE.html index 035cdb4e..03bc97ff 100644 --- a/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE.html +++ b/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE.html @@ -1,2 +1,2 @@ QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZEConst

    QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE: 4

    Default decoded result-buffer pool depth, matching the Java client.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_INITIAL_CREDIT.html b/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_INITIAL_CREDIT.html index 91048eab..270be0d0 100644 --- a/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_INITIAL_CREDIT.html +++ b/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_INITIAL_CREDIT.html @@ -1,2 +1,2 @@ QWP_DEFAULT_EGRESS_INITIAL_CREDIT | QuestDB JavaScript Client - v5.0.0

    Variable QWP_DEFAULT_EGRESS_INITIAL_CREDITConst

    QWP_DEFAULT_EGRESS_INITIAL_CREDIT: 0

    Default send-ahead credit used by Java and TypeScript: zero is unbounded.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS.html b/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS.html index 7526a090..6dc65d1f 100644 --- a/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS.html +++ b/docs/variables/_questdb_browser-client.QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS.html @@ -1,2 +1,2 @@ QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS | QuestDB JavaScript Client - v5.0.0

    Variable QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MSConst

    QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS: 5000 = 5_000

    Default wait for the initial or reconnected SERVER_INFO frame.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL.html b/docs/variables/_questdb_browser-client.QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL.html index ec98aaf9..2cf50bc5 100644 --- a/docs/variables/_questdb_browser-client.QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL.html +++ b/docs/variables/_questdb_browser-client.QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL.html @@ -1,3 +1,3 @@ QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_DURABLE_ACK_WEBSOCKET_PROTOCOLConst

    QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL: "questdb.qwp.durable-ack.v1"

    Browser-visible WebSocket subprotocol used to request and confirm durable ingress acknowledgements. Browsers cannot set or inspect X-QWP-* headers.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_EGRESS_CAPABILITY.html b/docs/variables/_questdb_browser-client.QWP_EGRESS_CAPABILITY.html index 2685ef13..ae2e5a8e 100644 --- a/docs/variables/_questdb_browser-client.QWP_EGRESS_CAPABILITY.html +++ b/docs/variables/_questdb_browser-client.QWP_EGRESS_CAPABILITY.html @@ -1 +1 @@ -QWP_EGRESS_CAPABILITY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_CAPABILITYConst

    QWP_EGRESS_CAPABILITY: { COMPRESSION: 4; QUERY_FLAGS: 2; ZONE: 1 } = ...

    Type declaration

    • ReadonlyCOMPRESSION: 4
    • ReadonlyQUERY_FLAGS: 2
    • ReadonlyZONE: 1
    +QWP_EGRESS_CAPABILITY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_CAPABILITYConst

    QWP_EGRESS_CAPABILITY: { COMPRESSION: 4; QUERY_FLAGS: 2; ZONE: 1 } = ...

    Type declaration

    • ReadonlyCOMPRESSION: 4
    • ReadonlyQUERY_FLAGS: 2
    • ReadonlyZONE: 1
    diff --git a/docs/variables/_questdb_browser-client.QWP_EGRESS_MESSAGE.html b/docs/variables/_questdb_browser-client.QWP_EGRESS_MESSAGE.html index d4f5b026..431f86dd 100644 --- a/docs/variables/_questdb_browser-client.QWP_EGRESS_MESSAGE.html +++ b/docs/variables/_questdb_browser-client.QWP_EGRESS_MESSAGE.html @@ -1 +1 @@ -QWP_EGRESS_MESSAGE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_MESSAGEConst

    QWP_EGRESS_MESSAGE: {
        CACHE_RESET: 23;
        CANCEL: 20;
        CREDIT: 21;
        EXEC_DONE: 22;
        QUERY_ERROR: 19;
        QUERY_REQUEST: 16;
        RESULT_BATCH: 17;
        RESULT_END: 18;
        SERVER_INFO: 24;
    } = ...

    Type declaration

    • ReadonlyCACHE_RESET: 23
    • ReadonlyCANCEL: 20
    • ReadonlyCREDIT: 21
    • ReadonlyEXEC_DONE: 22
    • ReadonlyQUERY_ERROR: 19
    • ReadonlyQUERY_REQUEST: 16
    • ReadonlyRESULT_BATCH: 17
    • ReadonlyRESULT_END: 18
    • ReadonlySERVER_INFO: 24
    +QWP_EGRESS_MESSAGE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_MESSAGEConst

    QWP_EGRESS_MESSAGE: {
        CACHE_RESET: 23;
        CANCEL: 20;
        CREDIT: 21;
        EXEC_DONE: 22;
        QUERY_ERROR: 19;
        QUERY_REQUEST: 16;
        RESULT_BATCH: 17;
        RESULT_END: 18;
        SERVER_INFO: 24;
    } = ...

    Type declaration

    • ReadonlyCACHE_RESET: 23
    • ReadonlyCANCEL: 20
    • ReadonlyCREDIT: 21
    • ReadonlyEXEC_DONE: 22
    • ReadonlyQUERY_ERROR: 19
    • ReadonlyQUERY_REQUEST: 16
    • ReadonlyRESULT_BATCH: 17
    • ReadonlyRESULT_END: 18
    • ReadonlySERVER_INFO: 24
    diff --git a/docs/variables/_questdb_browser-client.QWP_EGRESS_PATH.html b/docs/variables/_questdb_browser-client.QWP_EGRESS_PATH.html index b8d2ff58..7c7a39c5 100644 --- a/docs/variables/_questdb_browser-client.QWP_EGRESS_PATH.html +++ b/docs/variables/_questdb_browser-client.QWP_EGRESS_PATH.html @@ -1 +1 @@ -QWP_EGRESS_PATH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_PATHConst

    QWP_EGRESS_PATH: "/read/v1"
    +QWP_EGRESS_PATH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_PATHConst

    QWP_EGRESS_PATH: "/read/v1"
    diff --git a/docs/variables/_questdb_browser-client.QWP_ENCODING_GORILLA.html b/docs/variables/_questdb_browser-client.QWP_ENCODING_GORILLA.html index 5b424996..9fb0030c 100644 --- a/docs/variables/_questdb_browser-client.QWP_ENCODING_GORILLA.html +++ b/docs/variables/_questdb_browser-client.QWP_ENCODING_GORILLA.html @@ -1 +1 @@ -QWP_ENCODING_GORILLA | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ENCODING_GORILLAConst

    QWP_ENCODING_GORILLA: 1 = 0x01
    +QWP_ENCODING_GORILLA | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ENCODING_GORILLAConst

    QWP_ENCODING_GORILLA: 1 = 0x01
    diff --git a/docs/variables/_questdb_browser-client.QWP_ENCODING_UNCOMPRESSED.html b/docs/variables/_questdb_browser-client.QWP_ENCODING_UNCOMPRESSED.html index 5eca3f24..7fde1930 100644 --- a/docs/variables/_questdb_browser-client.QWP_ENCODING_UNCOMPRESSED.html +++ b/docs/variables/_questdb_browser-client.QWP_ENCODING_UNCOMPRESSED.html @@ -1 +1 @@ -QWP_ENCODING_UNCOMPRESSED | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ENCODING_UNCOMPRESSEDConst

    QWP_ENCODING_UNCOMPRESSED: 0 = 0x00
    +QWP_ENCODING_UNCOMPRESSED | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ENCODING_UNCOMPRESSEDConst

    QWP_ENCODING_UNCOMPRESSED: 0 = 0x00
    diff --git a/docs/variables/_questdb_browser-client.QWP_FLAG_DEFER_COMMIT.html b/docs/variables/_questdb_browser-client.QWP_FLAG_DEFER_COMMIT.html index 8083e8ae..6e0ab38a 100644 --- a/docs/variables/_questdb_browser-client.QWP_FLAG_DEFER_COMMIT.html +++ b/docs/variables/_questdb_browser-client.QWP_FLAG_DEFER_COMMIT.html @@ -1 +1 @@ -QWP_FLAG_DEFER_COMMIT | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_DEFER_COMMITConst

    QWP_FLAG_DEFER_COMMIT: 1 = 0x01
    +QWP_FLAG_DEFER_COMMIT | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_DEFER_COMMITConst

    QWP_FLAG_DEFER_COMMIT: 1 = 0x01
    diff --git a/docs/variables/_questdb_browser-client.QWP_FLAG_DELTA_SYMBOL_DICTIONARY.html b/docs/variables/_questdb_browser-client.QWP_FLAG_DELTA_SYMBOL_DICTIONARY.html index a50c4d40..7b103e12 100644 --- a/docs/variables/_questdb_browser-client.QWP_FLAG_DELTA_SYMBOL_DICTIONARY.html +++ b/docs/variables/_questdb_browser-client.QWP_FLAG_DELTA_SYMBOL_DICTIONARY.html @@ -1 +1 @@ -QWP_FLAG_DELTA_SYMBOL_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_DELTA_SYMBOL_DICTIONARYConst

    QWP_FLAG_DELTA_SYMBOL_DICTIONARY: 8 = 0x08
    +QWP_FLAG_DELTA_SYMBOL_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_DELTA_SYMBOL_DICTIONARYConst

    QWP_FLAG_DELTA_SYMBOL_DICTIONARY: 8 = 0x08
    diff --git a/docs/variables/_questdb_browser-client.QWP_FLAG_DURABLE_ACK_POLL.html b/docs/variables/_questdb_browser-client.QWP_FLAG_DURABLE_ACK_POLL.html index 70fe9b53..c6860c9d 100644 --- a/docs/variables/_questdb_browser-client.QWP_FLAG_DURABLE_ACK_POLL.html +++ b/docs/variables/_questdb_browser-client.QWP_FLAG_DURABLE_ACK_POLL.html @@ -1,2 +1,2 @@ QWP_FLAG_DURABLE_ACK_POLL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_DURABLE_ACK_POLLConst

    QWP_FLAG_DURABLE_ACK_POLL: 2 = 0x02

    Table-less ingress control frame that polls negotiated durable-ACK progress.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_FLAG_GORILLA.html b/docs/variables/_questdb_browser-client.QWP_FLAG_GORILLA.html index e565fac4..07329b57 100644 --- a/docs/variables/_questdb_browser-client.QWP_FLAG_GORILLA.html +++ b/docs/variables/_questdb_browser-client.QWP_FLAG_GORILLA.html @@ -1 +1 @@ -QWP_FLAG_GORILLA | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_GORILLAConst

    QWP_FLAG_GORILLA: 4 = 0x04
    +QWP_FLAG_GORILLA | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_GORILLAConst

    QWP_FLAG_GORILLA: 4 = 0x04
    diff --git a/docs/variables/_questdb_browser-client.QWP_FLAG_ZSTD.html b/docs/variables/_questdb_browser-client.QWP_FLAG_ZSTD.html index f2c5427c..08f3b598 100644 --- a/docs/variables/_questdb_browser-client.QWP_FLAG_ZSTD.html +++ b/docs/variables/_questdb_browser-client.QWP_FLAG_ZSTD.html @@ -1 +1 @@ -QWP_FLAG_ZSTD | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_ZSTDConst

    QWP_FLAG_ZSTD: 16 = 0x10
    +QWP_FLAG_ZSTD | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_ZSTDConst

    QWP_FLAG_ZSTD: 16 = 0x10
    diff --git a/docs/variables/_questdb_browser-client.QWP_HEADER_SIZE.html b/docs/variables/_questdb_browser-client.QWP_HEADER_SIZE.html index a77fb185..d806bf53 100644 --- a/docs/variables/_questdb_browser-client.QWP_HEADER_SIZE.html +++ b/docs/variables/_questdb_browser-client.QWP_HEADER_SIZE.html @@ -1 +1 @@ -QWP_HEADER_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_HEADER_SIZEConst

    QWP_HEADER_SIZE: 12
    +QWP_HEADER_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_HEADER_SIZEConst

    QWP_HEADER_SIZE: 12
    diff --git a/docs/variables/_questdb_browser-client.QWP_INGRESS_PATH.html b/docs/variables/_questdb_browser-client.QWP_INGRESS_PATH.html index 4b46ddf8..807dc41d 100644 --- a/docs/variables/_questdb_browser-client.QWP_INGRESS_PATH.html +++ b/docs/variables/_questdb_browser-client.QWP_INGRESS_PATH.html @@ -1 +1 @@ -QWP_INGRESS_PATH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_INGRESS_PATHConst

    QWP_INGRESS_PATH: "/write/v4"
    +QWP_INGRESS_PATH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_INGRESS_PATHConst

    QWP_INGRESS_PATH: "/write/v4"
    diff --git a/docs/variables/_questdb_browser-client.QWP_INGRESS_PROGRESS_KIND.html b/docs/variables/_questdb_browser-client.QWP_INGRESS_PROGRESS_KIND.html index 23f0fdd9..aef3da1b 100644 --- a/docs/variables/_questdb_browser-client.QWP_INGRESS_PROGRESS_KIND.html +++ b/docs/variables/_questdb_browser-client.QWP_INGRESS_PROGRESS_KIND.html @@ -1 +1 @@ -QWP_INGRESS_PROGRESS_KIND | QuestDB JavaScript Client - v5.0.0

    Variable QWP_INGRESS_PROGRESS_KINDConst

    QWP_INGRESS_PROGRESS_KIND: {
        ACKNOWLEDGED: "acknowledged";
        DURABLE_ACKNOWLEDGED: "durable-acknowledged";
        PUBLISHED: "published";
    } = ...

    Type declaration

    • ReadonlyACKNOWLEDGED: "acknowledged"
    • ReadonlyDURABLE_ACKNOWLEDGED: "durable-acknowledged"
    • ReadonlyPUBLISHED: "published"
    +QWP_INGRESS_PROGRESS_KIND | QuestDB JavaScript Client - v5.0.0

    Variable QWP_INGRESS_PROGRESS_KINDConst

    QWP_INGRESS_PROGRESS_KIND: {
        ACKNOWLEDGED: "acknowledged";
        DURABLE_ACKNOWLEDGED: "durable-acknowledged";
        PUBLISHED: "published";
    } = ...

    Type declaration

    • ReadonlyACKNOWLEDGED: "acknowledged"
    • ReadonlyDURABLE_ACKNOWLEDGED: "durable-acknowledged"
    • ReadonlyPUBLISHED: "published"
    diff --git a/docs/variables/_questdb_browser-client.QWP_INGRESS_SERVER_INFO_CAPABILITY.html b/docs/variables/_questdb_browser-client.QWP_INGRESS_SERVER_INFO_CAPABILITY.html index 6a672025..a9903f6b 100644 --- a/docs/variables/_questdb_browser-client.QWP_INGRESS_SERVER_INFO_CAPABILITY.html +++ b/docs/variables/_questdb_browser-client.QWP_INGRESS_SERVER_INFO_CAPABILITY.html @@ -6,4 +6,4 @@ connection when it offered a subprotocol and the 101 names none. The server therefore echoes the subprotocol whenever it was offered -- confirming only that it speaks the browser negotiation -- and reports the capability here.

    -

    Type declaration

    • ReadonlyDURABLE_ACK: 1
    +

    Type declaration

    • ReadonlyDURABLE_ACK: 1
    diff --git a/docs/variables/_questdb_browser-client.QWP_INITIAL_CONNECT_MODE.html b/docs/variables/_questdb_browser-client.QWP_INITIAL_CONNECT_MODE.html index bc7fa687..3d18cbf9 100644 --- a/docs/variables/_questdb_browser-client.QWP_INITIAL_CONNECT_MODE.html +++ b/docs/variables/_questdb_browser-client.QWP_INITIAL_CONNECT_MODE.html @@ -4,4 +4,4 @@

    Type declaration

    • ReadonlyASYNC: "async"

      Return immediately and connect on the background replay loop.

    • ReadonlyOFF: "off"

      Try once on the caller and fail immediately.

    • ReadonlySYNC: "sync"

      Retry on the caller within the configured reconnect budget.

      -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAGIC.html b/docs/variables/_questdb_browser-client.QWP_MAGIC.html index aab35425..ec34eacd 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAGIC.html +++ b/docs/variables/_questdb_browser-client.QWP_MAGIC.html @@ -1,2 +1,2 @@ QWP_MAGIC | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAGICConst

    QWP_MAGIC: 827348817 = 0x31505751

    ASCII QWP1, represented as its little-endian uint32 value.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_ARRAY_DIMENSIONS.html b/docs/variables/_questdb_browser-client.QWP_MAX_ARRAY_DIMENSIONS.html index 97e18e11..ac90dd05 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_ARRAY_DIMENSIONS.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_ARRAY_DIMENSIONS.html @@ -1,2 +1,2 @@ QWP_MAX_ARRAY_DIMENSIONS | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_ARRAY_DIMENSIONSConst

    QWP_MAX_ARRAY_DIMENSIONS: 32

    Maximum array rank accepted by QuestDB's QWP ingress decoder.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_ARRAY_DIMENSION_LENGTH.html b/docs/variables/_questdb_browser-client.QWP_MAX_ARRAY_DIMENSION_LENGTH.html index a5f09cfb..51899744 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_ARRAY_DIMENSION_LENGTH.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_ARRAY_DIMENSION_LENGTH.html @@ -6,4 +6,4 @@ so neither the batch byte cap nor the row cap contains it. The frame is published, the server rejects the whole batch, and the rows are lost; the axis is therefore bounded before it is staged.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_BATCH_ROWS_UPPER_BOUND.html b/docs/variables/_questdb_browser-client.QWP_MAX_BATCH_ROWS_UPPER_BOUND.html index b3d55b50..52787c83 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_BATCH_ROWS_UPPER_BOUND.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_BATCH_ROWS_UPPER_BOUND.html @@ -1,2 +1,2 @@ QWP_MAX_BATCH_ROWS_UPPER_BOUND | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_BATCH_ROWS_UPPER_BOUNDConst

    QWP_MAX_BATCH_ROWS_UPPER_BOUND: 1048576 = 1_048_576

    Largest client-requested egress RESULT_BATCH row cap.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_CELLS_PER_BATCH.html b/docs/variables/_questdb_browser-client.QWP_MAX_CELLS_PER_BATCH.html index 0cfe8f54..8305f2ff 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_CELLS_PER_BATCH.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_CELLS_PER_BATCH.html @@ -10,4 +10,4 @@

    32Mi cells is roughly 512 MB decoded. That is far above any plausible result -- the widest supported table at 16k rows, or a full 1,048,576-row batch at 32 columns -- and far below what the caps alone would permit.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_COLUMNS_PER_TABLE.html b/docs/variables/_questdb_browser-client.QWP_MAX_COLUMNS_PER_TABLE.html index 832840ba..00652bc0 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_COLUMNS_PER_TABLE.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_COLUMNS_PER_TABLE.html @@ -1 +1 @@ -QWP_MAX_COLUMNS_PER_TABLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_COLUMNS_PER_TABLEConst

    QWP_MAX_COLUMNS_PER_TABLE: 2048
    +QWP_MAX_COLUMNS_PER_TABLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_COLUMNS_PER_TABLEConst

    QWP_MAX_COLUMNS_PER_TABLE: 2048
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_COLUMN_NAME_LENGTH.html b/docs/variables/_questdb_browser-client.QWP_MAX_COLUMN_NAME_LENGTH.html index fd5a5df0..f67cac99 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_COLUMN_NAME_LENGTH.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_COLUMN_NAME_LENGTH.html @@ -1,2 +1,2 @@ QWP_MAX_COLUMN_NAME_LENGTH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_COLUMN_NAME_LENGTHConst

    QWP_MAX_COLUMN_NAME_LENGTH: 127

    Default QWP ingress identifier limits, in UTF-8 wire bytes.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_IDENTIFIER_BYTES.html b/docs/variables/_questdb_browser-client.QWP_MAX_IDENTIFIER_BYTES.html index 99357298..617153cc 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_IDENTIFIER_BYTES.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_IDENTIFIER_BYTES.html @@ -3,4 +3,4 @@ 127-UTF-16-code-unit metadata limit. One code unit takes at most three UTF-8 bytes, so query decoding accepts that larger representation even though QWP ingress enforces its 127-byte protocol limit.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_ROWS_PER_TABLE.html b/docs/variables/_questdb_browser-client.QWP_MAX_ROWS_PER_TABLE.html index 9317c1e9..50125601 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_ROWS_PER_TABLE.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_ROWS_PER_TABLE.html @@ -1 +1 @@ -QWP_MAX_ROWS_PER_TABLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_ROWS_PER_TABLEConst

    QWP_MAX_ROWS_PER_TABLE: 1000000 = 1_000_000
    +QWP_MAX_ROWS_PER_TABLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_ROWS_PER_TABLEConst

    QWP_MAX_ROWS_PER_TABLE: 1000000 = 1_000_000
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_SYMBOL_DICTIONARY_SIZE.html b/docs/variables/_questdb_browser-client.QWP_MAX_SYMBOL_DICTIONARY_SIZE.html index a307acd6..11179d55 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_SYMBOL_DICTIONARY_SIZE.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_SYMBOL_DICTIONARY_SIZE.html @@ -1 +1 @@ -QWP_MAX_SYMBOL_DICTIONARY_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_SYMBOL_DICTIONARY_SIZEConst

    QWP_MAX_SYMBOL_DICTIONARY_SIZE: 2000000 = 2_000_000
    +QWP_MAX_SYMBOL_DICTIONARY_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_SYMBOL_DICTIONARY_SIZEConst

    QWP_MAX_SYMBOL_DICTIONARY_SIZE: 2000000 = 2_000_000
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_TABLES_PER_FRAME.html b/docs/variables/_questdb_browser-client.QWP_MAX_TABLES_PER_FRAME.html index 6862f9ca..650cb96d 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_TABLES_PER_FRAME.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_TABLES_PER_FRAME.html @@ -1,2 +1,2 @@ QWP_MAX_TABLES_PER_FRAME | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_TABLES_PER_FRAMEConst

    QWP_MAX_TABLES_PER_FRAME: 65535 = 0xffff

    Maximum table count representable by the ingress frame's uint16 header.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_TABLE_NAME_LENGTH.html b/docs/variables/_questdb_browser-client.QWP_MAX_TABLE_NAME_LENGTH.html index 737c4e54..148ea8c1 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_TABLE_NAME_LENGTH.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_TABLE_NAME_LENGTH.html @@ -1 +1 @@ -QWP_MAX_TABLE_NAME_LENGTH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_TABLE_NAME_LENGTHConst

    QWP_MAX_TABLE_NAME_LENGTH: 127
    +QWP_MAX_TABLE_NAME_LENGTH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_TABLE_NAME_LENGTHConst

    QWP_MAX_TABLE_NAME_LENGTH: 127
    diff --git a/docs/variables/_questdb_browser-client.QWP_MAX_ZSTD_DECOMPRESSED_SIZE.html b/docs/variables/_questdb_browser-client.QWP_MAX_ZSTD_DECOMPRESSED_SIZE.html index e70ddc0c..ebe3104a 100644 --- a/docs/variables/_questdb_browser-client.QWP_MAX_ZSTD_DECOMPRESSED_SIZE.html +++ b/docs/variables/_questdb_browser-client.QWP_MAX_ZSTD_DECOMPRESSED_SIZE.html @@ -1,2 +1,2 @@ QWP_MAX_ZSTD_DECOMPRESSED_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_ZSTD_DECOMPRESSED_SIZEConst

    QWP_MAX_ZSTD_DECOMPRESSED_SIZE: number = ...

    Matches the Java client's per-connection decompression safety cap.

    -
    +
    diff --git a/docs/variables/_questdb_browser-client.QWP_QUERY_FLAG_RESET_DICTIONARY.html b/docs/variables/_questdb_browser-client.QWP_QUERY_FLAG_RESET_DICTIONARY.html index 785a4fa5..28450978 100644 --- a/docs/variables/_questdb_browser-client.QWP_QUERY_FLAG_RESET_DICTIONARY.html +++ b/docs/variables/_questdb_browser-client.QWP_QUERY_FLAG_RESET_DICTIONARY.html @@ -1 +1 @@ -QWP_QUERY_FLAG_RESET_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_QUERY_FLAG_RESET_DICTIONARYConst

    QWP_QUERY_FLAG_RESET_DICTIONARY: 1 = 0x01
    +QWP_QUERY_FLAG_RESET_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_QUERY_FLAG_RESET_DICTIONARYConst

    QWP_QUERY_FLAG_RESET_DICTIONARY: 1 = 0x01
    diff --git a/docs/variables/_questdb_browser-client.QWP_RECONNECT_EVENT_KIND.html b/docs/variables/_questdb_browser-client.QWP_RECONNECT_EVENT_KIND.html index 4c9edff0..97f21159 100644 --- a/docs/variables/_questdb_browser-client.QWP_RECONNECT_EVENT_KIND.html +++ b/docs/variables/_questdb_browser-client.QWP_RECONNECT_EVENT_KIND.html @@ -1,4 +1,4 @@ QWP_RECONNECT_EVENT_KIND | QuestDB JavaScript Client - v5.0.0

    Variable QWP_RECONNECT_EVENT_KINDConst

    QWP_RECONNECT_EVENT_KIND: {
        ATTEMPT_FAILED: "attempt-failed";
        CONNECTED: "connected";
        DURABLE_ACK_PERSISTENT_FAILURE: "durable-ack-persistent-failure";
        DURABLE_ACK_UNAVAILABLE: "durable-ack-unavailable";
        FAILED_OVER: "failed-over";
        PRIMARY_UNAVAILABLE: "primary-unavailable";
        RECONNECTED: "reconnected";
        RECONNECTING: "reconnecting";
    } = ...

    Type declaration

    • ReadonlyATTEMPT_FAILED: "attempt-failed"
    • ReadonlyCONNECTED: "connected"
    • ReadonlyDURABLE_ACK_PERSISTENT_FAILURE: "durable-ack-persistent-failure"

      An orphan exhausted its consecutive durable-ACK mismatch budget.

    • ReadonlyDURABLE_ACK_UNAVAILABLE: "durable-ack-unavailable"

      An unbounded SF loop is waiting for durable-ACK-capable endpoints.

    • ReadonlyFAILED_OVER: "failed-over"
    • ReadonlyPRIMARY_UNAVAILABLE: "primary-unavailable"

      Every reachable ingress endpoint is temporarily unable to be primary.

      -
    • ReadonlyRECONNECTED: "reconnected"
    • ReadonlyRECONNECTING: "reconnecting"
    +
  • ReadonlyRECONNECTED: "reconnected"
  • ReadonlyRECONNECTING: "reconnecting"
  • diff --git a/docs/variables/_questdb_browser-client.QWP_RESET_MASK_DICTIONARY.html b/docs/variables/_questdb_browser-client.QWP_RESET_MASK_DICTIONARY.html index bd788bf5..5952b91e 100644 --- a/docs/variables/_questdb_browser-client.QWP_RESET_MASK_DICTIONARY.html +++ b/docs/variables/_questdb_browser-client.QWP_RESET_MASK_DICTIONARY.html @@ -1 +1 @@ -QWP_RESET_MASK_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_RESET_MASK_DICTIONARYConst

    QWP_RESET_MASK_DICTIONARY: 1 = 0x01
    +QWP_RESET_MASK_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_RESET_MASK_DICTIONARYConst

    QWP_RESET_MASK_DICTIONARY: 1 = 0x01
    diff --git a/docs/variables/_questdb_browser-client.QWP_SENDER_ERROR_CATEGORY.html b/docs/variables/_questdb_browser-client.QWP_SENDER_ERROR_CATEGORY.html index b45f4a09..7b20e5ff 100644 --- a/docs/variables/_questdb_browser-client.QWP_SENDER_ERROR_CATEGORY.html +++ b/docs/variables/_questdb_browser-client.QWP_SENDER_ERROR_CATEGORY.html @@ -1 +1 @@ -QWP_SENDER_ERROR_CATEGORY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SENDER_ERROR_CATEGORYConst

    QWP_SENDER_ERROR_CATEGORY: {
        CANCELLED: "cancelled";
        DATA_LOSS: "data-loss";
        DICTIONARY_GAP: "dictionary-gap";
        INTERNAL_ERROR: "internal-error";
        LIMIT_EXCEEDED: "limit-exceeded";
        NOT_WRITABLE: "not-writable";
        PARSE_ERROR: "parse-error";
        PROTOCOL_VIOLATION: "protocol-violation";
        SCHEMA_MISMATCH: "schema-mismatch";
        SECURITY_ERROR: "security-error";
        UNKNOWN: "unknown";
        WRITE_ERROR: "write-error";
    } = ...

    Type declaration

    • ReadonlyCANCELLED: "cancelled"
    • ReadonlyDATA_LOSS: "data-loss"
    • ReadonlyDICTIONARY_GAP: "dictionary-gap"
    • ReadonlyINTERNAL_ERROR: "internal-error"
    • ReadonlyLIMIT_EXCEEDED: "limit-exceeded"
    • ReadonlyNOT_WRITABLE: "not-writable"
    • ReadonlyPARSE_ERROR: "parse-error"
    • ReadonlyPROTOCOL_VIOLATION: "protocol-violation"
    • ReadonlySCHEMA_MISMATCH: "schema-mismatch"
    • ReadonlySECURITY_ERROR: "security-error"
    • ReadonlyUNKNOWN: "unknown"
    • ReadonlyWRITE_ERROR: "write-error"
    +QWP_SENDER_ERROR_CATEGORY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SENDER_ERROR_CATEGORYConst

    QWP_SENDER_ERROR_CATEGORY: {
        CANCELLED: "cancelled";
        DATA_LOSS: "data-loss";
        DICTIONARY_GAP: "dictionary-gap";
        INTERNAL_ERROR: "internal-error";
        LIMIT_EXCEEDED: "limit-exceeded";
        NOT_WRITABLE: "not-writable";
        PARSE_ERROR: "parse-error";
        PROTOCOL_VIOLATION: "protocol-violation";
        SCHEMA_MISMATCH: "schema-mismatch";
        SECURITY_ERROR: "security-error";
        UNKNOWN: "unknown";
        WRITE_ERROR: "write-error";
    } = ...

    Type declaration

    • ReadonlyCANCELLED: "cancelled"
    • ReadonlyDATA_LOSS: "data-loss"
    • ReadonlyDICTIONARY_GAP: "dictionary-gap"
    • ReadonlyINTERNAL_ERROR: "internal-error"
    • ReadonlyLIMIT_EXCEEDED: "limit-exceeded"
    • ReadonlyNOT_WRITABLE: "not-writable"
    • ReadonlyPARSE_ERROR: "parse-error"
    • ReadonlyPROTOCOL_VIOLATION: "protocol-violation"
    • ReadonlySCHEMA_MISMATCH: "schema-mismatch"
    • ReadonlySECURITY_ERROR: "security-error"
    • ReadonlyUNKNOWN: "unknown"
    • ReadonlyWRITE_ERROR: "write-error"
    diff --git a/docs/variables/_questdb_browser-client.QWP_SENDER_ERROR_POLICY.html b/docs/variables/_questdb_browser-client.QWP_SENDER_ERROR_POLICY.html index 31532ea2..6994da5d 100644 --- a/docs/variables/_questdb_browser-client.QWP_SENDER_ERROR_POLICY.html +++ b/docs/variables/_questdb_browser-client.QWP_SENDER_ERROR_POLICY.html @@ -1 +1 @@ -QWP_SENDER_ERROR_POLICY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SENDER_ERROR_POLICYConst

    QWP_SENDER_ERROR_POLICY: {
        ABANDONED: "abandoned";
        RETRIABLE: "retriable";
        RETRIABLE_OTHER: "retriable-other";
        TERMINAL: "terminal";
    } = ...

    Type declaration

    • ReadonlyABANDONED: "abandoned"
    • ReadonlyRETRIABLE: "retriable"
    • ReadonlyRETRIABLE_OTHER: "retriable-other"
    • ReadonlyTERMINAL: "terminal"
    +QWP_SENDER_ERROR_POLICY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SENDER_ERROR_POLICYConst

    QWP_SENDER_ERROR_POLICY: {
        ABANDONED: "abandoned";
        RETRIABLE: "retriable";
        RETRIABLE_OTHER: "retriable-other";
        TERMINAL: "terminal";
    } = ...

    Type declaration

    • ReadonlyABANDONED: "abandoned"
    • ReadonlyRETRIABLE: "retriable"
    • ReadonlyRETRIABLE_OTHER: "retriable-other"
    • ReadonlyTERMINAL: "terminal"
    diff --git a/docs/variables/_questdb_browser-client.QWP_SERVER_ROLE.html b/docs/variables/_questdb_browser-client.QWP_SERVER_ROLE.html index f328f4a3..ac64977b 100644 --- a/docs/variables/_questdb_browser-client.QWP_SERVER_ROLE.html +++ b/docs/variables/_questdb_browser-client.QWP_SERVER_ROLE.html @@ -1 +1 @@ -QWP_SERVER_ROLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SERVER_ROLEConst

    QWP_SERVER_ROLE: { PRIMARY: 1; PRIMARY_CATCHUP: 3; REPLICA: 2; STANDALONE: 0 } = ...

    Type declaration

    • ReadonlyPRIMARY: 1
    • ReadonlyPRIMARY_CATCHUP: 3
    • ReadonlyREPLICA: 2
    • ReadonlySTANDALONE: 0
    +QWP_SERVER_ROLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SERVER_ROLEConst

    QWP_SERVER_ROLE: { PRIMARY: 1; PRIMARY_CATCHUP: 3; REPLICA: 2; STANDALONE: 0 } = ...

    Type declaration

    • ReadonlyPRIMARY: 1
    • ReadonlyPRIMARY_CATCHUP: 3
    • ReadonlyREPLICA: 2
    • ReadonlySTANDALONE: 0
    diff --git a/docs/variables/_questdb_browser-client.QWP_STATUS.html b/docs/variables/_questdb_browser-client.QWP_STATUS.html index 0e03ee96..b1aa0594 100644 --- a/docs/variables/_questdb_browser-client.QWP_STATUS.html +++ b/docs/variables/_questdb_browser-client.QWP_STATUS.html @@ -1 +1 @@ -QWP_STATUS | QuestDB JavaScript Client - v5.0.0

    Variable QWP_STATUSConst

    QWP_STATUS: {
        CANCELLED: 10;
        DICTIONARY_GAP: 13;
        DURABLE_ACK: 2;
        INTERNAL_ERROR: 6;
        LIMIT_EXCEEDED: 11;
        NOT_WRITABLE: 12;
        OK: 0;
        PARSE_ERROR: 5;
        SCHEMA_MISMATCH: 3;
        SECURITY_ERROR: 8;
        SERVER_INFO: 1;
        WRITE_ERROR: 9;
    } = ...

    Type declaration

    • ReadonlyCANCELLED: 10
    • ReadonlyDICTIONARY_GAP: 13
    • ReadonlyDURABLE_ACK: 2
    • ReadonlyINTERNAL_ERROR: 6
    • ReadonlyLIMIT_EXCEEDED: 11
    • ReadonlyNOT_WRITABLE: 12
    • ReadonlyOK: 0
    • ReadonlyPARSE_ERROR: 5
    • ReadonlySCHEMA_MISMATCH: 3
    • ReadonlySECURITY_ERROR: 8
    • ReadonlySERVER_INFO: 1
    • ReadonlyWRITE_ERROR: 9
    +QWP_STATUS | QuestDB JavaScript Client - v5.0.0

    Variable QWP_STATUSConst

    QWP_STATUS: {
        CANCELLED: 10;
        DICTIONARY_GAP: 13;
        DURABLE_ACK: 2;
        INTERNAL_ERROR: 6;
        LIMIT_EXCEEDED: 11;
        NOT_WRITABLE: 12;
        OK: 0;
        PARSE_ERROR: 5;
        SCHEMA_MISMATCH: 3;
        SECURITY_ERROR: 8;
        SERVER_INFO: 1;
        WRITE_ERROR: 9;
    } = ...

    Type declaration

    • ReadonlyCANCELLED: 10
    • ReadonlyDICTIONARY_GAP: 13
    • ReadonlyDURABLE_ACK: 2
    • ReadonlyINTERNAL_ERROR: 6
    • ReadonlyLIMIT_EXCEEDED: 11
    • ReadonlyNOT_WRITABLE: 12
    • ReadonlyOK: 0
    • ReadonlyPARSE_ERROR: 5
    • ReadonlySCHEMA_MISMATCH: 3
    • ReadonlySECURITY_ERROR: 8
    • ReadonlySERVER_INFO: 1
    • ReadonlyWRITE_ERROR: 9
    diff --git a/docs/variables/_questdb_browser-client.QWP_TARGET.html b/docs/variables/_questdb_browser-client.QWP_TARGET.html index e10b4ef3..34c58296 100644 --- a/docs/variables/_questdb_browser-client.QWP_TARGET.html +++ b/docs/variables/_questdb_browser-client.QWP_TARGET.html @@ -1 +1 @@ -QWP_TARGET | QuestDB JavaScript Client - v5.0.0

    Variable QWP_TARGETConst

    QWP_TARGET: { ANY: "any"; PRIMARY: "primary"; REPLICA: "replica" } = ...

    Type declaration

    • ReadonlyANY: "any"
    • ReadonlyPRIMARY: "primary"
    • ReadonlyREPLICA: "replica"
    +QWP_TARGET | QuestDB JavaScript Client - v5.0.0

    Variable QWP_TARGETConst

    QWP_TARGET: { ANY: "any"; PRIMARY: "primary"; REPLICA: "replica" } = ...

    Type declaration

    • ReadonlyANY: "any"
    • ReadonlyPRIMARY: "primary"
    • ReadonlyREPLICA: "replica"
    diff --git a/docs/variables/_questdb_browser-client.QWP_UPGRADE_ERROR_KIND.html b/docs/variables/_questdb_browser-client.QWP_UPGRADE_ERROR_KIND.html index 5715414a..60a608f2 100644 --- a/docs/variables/_questdb_browser-client.QWP_UPGRADE_ERROR_KIND.html +++ b/docs/variables/_questdb_browser-client.QWP_UPGRADE_ERROR_KIND.html @@ -1,2 +1,2 @@ QWP_UPGRADE_ERROR_KIND | QuestDB JavaScript Client - v5.0.0

    Variable QWP_UPGRADE_ERROR_KINDConst

    QWP_UPGRADE_ERROR_KIND: {
        AUTHENTICATION: "authentication";
        CAPABILITY_MISMATCH: "capability-mismatch";
        HTTP_REJECTED: "http-rejected";
        OPAQUE: "opaque";
        ROLE_REJECTED: "role-rejected";
        TIMEOUT: "timeout";
        TRANSPORT: "transport";
        VERSION_MISMATCH: "version-mismatch";
    } = ...

    Type declaration

    • ReadonlyAUTHENTICATION: "authentication"
    • ReadonlyCAPABILITY_MISMATCH: "capability-mismatch"
    • ReadonlyHTTP_REJECTED: "http-rejected"
    • ReadonlyOPAQUE: "opaque"

      Browser WebSocket APIs do not expose the rejected HTTP upgrade.

      -
    • ReadonlyROLE_REJECTED: "role-rejected"
    • ReadonlyTIMEOUT: "timeout"
    • ReadonlyTRANSPORT: "transport"
    • ReadonlyVERSION_MISMATCH: "version-mismatch"
    +
  • ReadonlyROLE_REJECTED: "role-rejected"
  • ReadonlyTIMEOUT: "timeout"
  • ReadonlyTRANSPORT: "transport"
  • ReadonlyVERSION_MISMATCH: "version-mismatch"
  • diff --git a/docs/variables/_questdb_browser-client.QWP_UPGRADE_TIMEOUT_PHASE.html b/docs/variables/_questdb_browser-client.QWP_UPGRADE_TIMEOUT_PHASE.html index a4a38be0..13b45481 100644 --- a/docs/variables/_questdb_browser-client.QWP_UPGRADE_TIMEOUT_PHASE.html +++ b/docs/variables/_questdb_browser-client.QWP_UPGRADE_TIMEOUT_PHASE.html @@ -1 +1 @@ -QWP_UPGRADE_TIMEOUT_PHASE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_UPGRADE_TIMEOUT_PHASEConst

    QWP_UPGRADE_TIMEOUT_PHASE: {
        AUTHENTICATION: "authentication";
        CONNECT: "connect";
    } = ...

    Type declaration

    • ReadonlyAUTHENTICATION: "authentication"
    • ReadonlyCONNECT: "connect"
    +QWP_UPGRADE_TIMEOUT_PHASE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_UPGRADE_TIMEOUT_PHASEConst

    QWP_UPGRADE_TIMEOUT_PHASE: {
        AUTHENTICATION: "authentication";
        CONNECT: "connect";
    } = ...

    Type declaration

    • ReadonlyAUTHENTICATION: "authentication"
    • ReadonlyCONNECT: "connect"
    diff --git a/docs/variables/_questdb_browser-client.QWP_VERSION.html b/docs/variables/_questdb_browser-client.QWP_VERSION.html index 697f7e56..8b5a09d4 100644 --- a/docs/variables/_questdb_browser-client.QWP_VERSION.html +++ b/docs/variables/_questdb_browser-client.QWP_VERSION.html @@ -1 +1 @@ -QWP_VERSION | QuestDB JavaScript Client - v5.0.0
    +QWP_VERSION | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/variables/_questdb_browser-client.QWP_ZSTD_MAX_COMPRESSION_LEVEL.html b/docs/variables/_questdb_browser-client.QWP_ZSTD_MAX_COMPRESSION_LEVEL.html index 9fcb3015..7b84406d 100644 --- a/docs/variables/_questdb_browser-client.QWP_ZSTD_MAX_COMPRESSION_LEVEL.html +++ b/docs/variables/_questdb_browser-client.QWP_ZSTD_MAX_COMPRESSION_LEVEL.html @@ -1 +1 @@ -QWP_ZSTD_MAX_COMPRESSION_LEVEL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ZSTD_MAX_COMPRESSION_LEVELConst

    QWP_ZSTD_MAX_COMPRESSION_LEVEL: 22
    +QWP_ZSTD_MAX_COMPRESSION_LEVEL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ZSTD_MAX_COMPRESSION_LEVELConst

    QWP_ZSTD_MAX_COMPRESSION_LEVEL: 22
    diff --git a/docs/variables/_questdb_browser-client.QWP_ZSTD_MIN_COMPRESSION_LEVEL.html b/docs/variables/_questdb_browser-client.QWP_ZSTD_MIN_COMPRESSION_LEVEL.html index 5da2ac61..140270d7 100644 --- a/docs/variables/_questdb_browser-client.QWP_ZSTD_MIN_COMPRESSION_LEVEL.html +++ b/docs/variables/_questdb_browser-client.QWP_ZSTD_MIN_COMPRESSION_LEVEL.html @@ -1 +1 @@ -QWP_ZSTD_MIN_COMPRESSION_LEVEL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ZSTD_MIN_COMPRESSION_LEVELConst

    QWP_ZSTD_MIN_COMPRESSION_LEVEL: 1
    +QWP_ZSTD_MIN_COMPRESSION_LEVEL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ZSTD_MIN_COMPRESSION_LEVELConst

    QWP_ZSTD_MIN_COMPRESSION_LEVEL: 1
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_COLUMN_TYPE.html b/docs/variables/_questdb_nodejs-client.QWP_COLUMN_TYPE.html index 20ecca83..de6d5b19 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_COLUMN_TYPE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_COLUMN_TYPE.html @@ -1 +1 @@ -QWP_COLUMN_TYPE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_COLUMN_TYPEConst

    QWP_COLUMN_TYPE: {
        BINARY: 23;
        BOOLEAN: 1;
        BYTE: 2;
        CHAR: 22;
        DATE: 11;
        DECIMAL128: 20;
        DECIMAL256: 21;
        DECIMAL64: 19;
        DOUBLE: 7;
        DOUBLE_ARRAY: 17;
        FLOAT: 6;
        GEOHASH: 14;
        INT: 4;
        IPV4: 24;
        LONG: 5;
        LONG_ARRAY: 18;
        LONG256: 13;
        SHORT: 3;
        SYMBOL: 9;
        TIMESTAMP: 10;
        TIMESTAMP_NANOS: 16;
        UUID: 12;
        VARCHAR: 15;
    } = ...

    Type declaration

    • ReadonlyBINARY: 23
    • ReadonlyBOOLEAN: 1
    • ReadonlyBYTE: 2
    • ReadonlyCHAR: 22
    • ReadonlyDATE: 11
    • ReadonlyDECIMAL128: 20
    • ReadonlyDECIMAL256: 21
    • ReadonlyDECIMAL64: 19
    • ReadonlyDOUBLE: 7
    • ReadonlyDOUBLE_ARRAY: 17
    • ReadonlyFLOAT: 6
    • ReadonlyGEOHASH: 14
    • ReadonlyINT: 4
    • ReadonlyIPV4: 24
    • ReadonlyLONG: 5
    • ReadonlyLONG_ARRAY: 18
    • ReadonlyLONG256: 13
    • ReadonlySHORT: 3
    • ReadonlySYMBOL: 9
    • ReadonlyTIMESTAMP: 10
    • ReadonlyTIMESTAMP_NANOS: 16
    • ReadonlyUUID: 12
    • ReadonlyVARCHAR: 15
    +QWP_COLUMN_TYPE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_COLUMN_TYPEConst

    QWP_COLUMN_TYPE: {
        BINARY: 23;
        BOOLEAN: 1;
        BYTE: 2;
        CHAR: 22;
        DATE: 11;
        DECIMAL128: 20;
        DECIMAL256: 21;
        DECIMAL64: 19;
        DOUBLE: 7;
        DOUBLE_ARRAY: 17;
        FLOAT: 6;
        GEOHASH: 14;
        INT: 4;
        IPV4: 24;
        LONG: 5;
        LONG_ARRAY: 18;
        LONG256: 13;
        SHORT: 3;
        SYMBOL: 9;
        TIMESTAMP: 10;
        TIMESTAMP_NANOS: 16;
        UUID: 12;
        VARCHAR: 15;
    } = ...

    Type declaration

    • ReadonlyBINARY: 23
    • ReadonlyBOOLEAN: 1
    • ReadonlyBYTE: 2
    • ReadonlyCHAR: 22
    • ReadonlyDATE: 11
    • ReadonlyDECIMAL128: 20
    • ReadonlyDECIMAL256: 21
    • ReadonlyDECIMAL64: 19
    • ReadonlyDOUBLE: 7
    • ReadonlyDOUBLE_ARRAY: 17
    • ReadonlyFLOAT: 6
    • ReadonlyGEOHASH: 14
    • ReadonlyINT: 4
    • ReadonlyIPV4: 24
    • ReadonlyLONG: 5
    • ReadonlyLONG_ARRAY: 18
    • ReadonlyLONG256: 13
    • ReadonlySHORT: 3
    • ReadonlySYMBOL: 9
    • ReadonlyTIMESTAMP: 10
    • ReadonlyTIMESTAMP_NANOS: 16
    • ReadonlyUUID: 12
    • ReadonlyVARCHAR: 15
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_COMPRESSION_CODEC.html b/docs/variables/_questdb_nodejs-client.QWP_COMPRESSION_CODEC.html index b1ee5fc5..f13af9cc 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_COMPRESSION_CODEC.html +++ b/docs/variables/_questdb_nodejs-client.QWP_COMPRESSION_CODEC.html @@ -1 +1 @@ -QWP_COMPRESSION_CODEC | QuestDB JavaScript Client - v5.0.0

    Variable QWP_COMPRESSION_CODECConst

    QWP_COMPRESSION_CODEC: { RAW: 0; ZSTD: 1 } = ...

    Type declaration

    • ReadonlyRAW: 0
    • ReadonlyZSTD: 1
    +QWP_COMPRESSION_CODEC | QuestDB JavaScript Client - v5.0.0

    Variable QWP_COMPRESSION_CODECConst

    QWP_COMPRESSION_CODEC: { RAW: 0; ZSTD: 1 } = ...

    Type declaration

    • ReadonlyRAW: 0
    • ReadonlyZSTD: 1
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_DECIMAL_MAX_SCALE.html b/docs/variables/_questdb_nodejs-client.QWP_DECIMAL_MAX_SCALE.html index 0104e329..9ed53690 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_DECIMAL_MAX_SCALE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_DECIMAL_MAX_SCALE.html @@ -1,2 +1,2 @@ QWP_DECIMAL_MAX_SCALE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_DECIMAL_MAX_SCALEConst

    QWP_DECIMAL_MAX_SCALE: { decimal128: 38; decimal256: 76; decimal64: 18 } = ...

    Maximum DECIMAL scale of each fixed-width decimal column type.

    -

    Type declaration

    • Readonlydecimal128: 38
    • Readonlydecimal256: 76
    • Readonlydecimal64: 18
    +

    Type declaration

    • Readonlydecimal128: 38
    • Readonlydecimal256: 76
    • Readonlydecimal64: 18
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE.html b/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE.html index 411a51f3..2101cf4e 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE.html @@ -1,2 +1,2 @@ QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZEConst

    QWP_DEFAULT_EGRESS_BUFFER_POOL_SIZE: 4

    Default decoded result-buffer pool depth, matching the Java client.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_INITIAL_CREDIT.html b/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_INITIAL_CREDIT.html index 7b60d3cb..e43fc7c3 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_INITIAL_CREDIT.html +++ b/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_INITIAL_CREDIT.html @@ -1,2 +1,2 @@ QWP_DEFAULT_EGRESS_INITIAL_CREDIT | QuestDB JavaScript Client - v5.0.0

    Variable QWP_DEFAULT_EGRESS_INITIAL_CREDITConst

    QWP_DEFAULT_EGRESS_INITIAL_CREDIT: 0

    Default send-ahead credit used by Java and TypeScript: zero is unbounded.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS.html b/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS.html index bd306e35..55ea12e8 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS.html +++ b/docs/variables/_questdb_nodejs-client.QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS.html @@ -1,2 +1,2 @@ QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS | QuestDB JavaScript Client - v5.0.0

    Variable QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MSConst

    QWP_DEFAULT_EGRESS_SERVER_INFO_TIMEOUT_MS: 5000 = 5_000

    Default wait for the initial or reconnected SERVER_INFO frame.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL.html b/docs/variables/_questdb_nodejs-client.QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL.html index 56405e7a..d779e099 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL.html +++ b/docs/variables/_questdb_nodejs-client.QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL.html @@ -1,3 +1,3 @@ QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_DURABLE_ACK_WEBSOCKET_PROTOCOLConst

    QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL: "questdb.qwp.durable-ack.v1"

    Browser-visible WebSocket subprotocol used to request and confirm durable ingress acknowledgements. Browsers cannot set or inspect X-QWP-* headers.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_EGRESS_CAPABILITY.html b/docs/variables/_questdb_nodejs-client.QWP_EGRESS_CAPABILITY.html index 0c5f8dbe..00f62b56 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_EGRESS_CAPABILITY.html +++ b/docs/variables/_questdb_nodejs-client.QWP_EGRESS_CAPABILITY.html @@ -1 +1 @@ -QWP_EGRESS_CAPABILITY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_CAPABILITYConst

    QWP_EGRESS_CAPABILITY: { COMPRESSION: 4; QUERY_FLAGS: 2; ZONE: 1 } = ...

    Type declaration

    • ReadonlyCOMPRESSION: 4
    • ReadonlyQUERY_FLAGS: 2
    • ReadonlyZONE: 1
    +QWP_EGRESS_CAPABILITY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_CAPABILITYConst

    QWP_EGRESS_CAPABILITY: { COMPRESSION: 4; QUERY_FLAGS: 2; ZONE: 1 } = ...

    Type declaration

    • ReadonlyCOMPRESSION: 4
    • ReadonlyQUERY_FLAGS: 2
    • ReadonlyZONE: 1
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_EGRESS_MESSAGE.html b/docs/variables/_questdb_nodejs-client.QWP_EGRESS_MESSAGE.html index 6512c03b..9c6f6994 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_EGRESS_MESSAGE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_EGRESS_MESSAGE.html @@ -1 +1 @@ -QWP_EGRESS_MESSAGE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_MESSAGEConst

    QWP_EGRESS_MESSAGE: {
        CACHE_RESET: 23;
        CANCEL: 20;
        CREDIT: 21;
        EXEC_DONE: 22;
        QUERY_ERROR: 19;
        QUERY_REQUEST: 16;
        RESULT_BATCH: 17;
        RESULT_END: 18;
        SERVER_INFO: 24;
    } = ...

    Type declaration

    • ReadonlyCACHE_RESET: 23
    • ReadonlyCANCEL: 20
    • ReadonlyCREDIT: 21
    • ReadonlyEXEC_DONE: 22
    • ReadonlyQUERY_ERROR: 19
    • ReadonlyQUERY_REQUEST: 16
    • ReadonlyRESULT_BATCH: 17
    • ReadonlyRESULT_END: 18
    • ReadonlySERVER_INFO: 24
    +QWP_EGRESS_MESSAGE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_MESSAGEConst

    QWP_EGRESS_MESSAGE: {
        CACHE_RESET: 23;
        CANCEL: 20;
        CREDIT: 21;
        EXEC_DONE: 22;
        QUERY_ERROR: 19;
        QUERY_REQUEST: 16;
        RESULT_BATCH: 17;
        RESULT_END: 18;
        SERVER_INFO: 24;
    } = ...

    Type declaration

    • ReadonlyCACHE_RESET: 23
    • ReadonlyCANCEL: 20
    • ReadonlyCREDIT: 21
    • ReadonlyEXEC_DONE: 22
    • ReadonlyQUERY_ERROR: 19
    • ReadonlyQUERY_REQUEST: 16
    • ReadonlyRESULT_BATCH: 17
    • ReadonlyRESULT_END: 18
    • ReadonlySERVER_INFO: 24
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_EGRESS_PATH.html b/docs/variables/_questdb_nodejs-client.QWP_EGRESS_PATH.html index d72602d8..0603a6bb 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_EGRESS_PATH.html +++ b/docs/variables/_questdb_nodejs-client.QWP_EGRESS_PATH.html @@ -1 +1 @@ -QWP_EGRESS_PATH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_PATHConst

    QWP_EGRESS_PATH: "/read/v1"
    +QWP_EGRESS_PATH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_EGRESS_PATHConst

    QWP_EGRESS_PATH: "/read/v1"
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_ENCODING_GORILLA.html b/docs/variables/_questdb_nodejs-client.QWP_ENCODING_GORILLA.html index 10345dff..b246429d 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_ENCODING_GORILLA.html +++ b/docs/variables/_questdb_nodejs-client.QWP_ENCODING_GORILLA.html @@ -1 +1 @@ -QWP_ENCODING_GORILLA | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ENCODING_GORILLAConst

    QWP_ENCODING_GORILLA: 1 = 0x01
    +QWP_ENCODING_GORILLA | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ENCODING_GORILLAConst

    QWP_ENCODING_GORILLA: 1 = 0x01
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_ENCODING_UNCOMPRESSED.html b/docs/variables/_questdb_nodejs-client.QWP_ENCODING_UNCOMPRESSED.html index 8e1421b2..40aa0776 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_ENCODING_UNCOMPRESSED.html +++ b/docs/variables/_questdb_nodejs-client.QWP_ENCODING_UNCOMPRESSED.html @@ -1 +1 @@ -QWP_ENCODING_UNCOMPRESSED | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ENCODING_UNCOMPRESSEDConst

    QWP_ENCODING_UNCOMPRESSED: 0 = 0x00
    +QWP_ENCODING_UNCOMPRESSED | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ENCODING_UNCOMPRESSEDConst

    QWP_ENCODING_UNCOMPRESSED: 0 = 0x00
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_FLAG_DEFER_COMMIT.html b/docs/variables/_questdb_nodejs-client.QWP_FLAG_DEFER_COMMIT.html index fd4a0669..a0fc9239 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_FLAG_DEFER_COMMIT.html +++ b/docs/variables/_questdb_nodejs-client.QWP_FLAG_DEFER_COMMIT.html @@ -1 +1 @@ -QWP_FLAG_DEFER_COMMIT | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_DEFER_COMMITConst

    QWP_FLAG_DEFER_COMMIT: 1 = 0x01
    +QWP_FLAG_DEFER_COMMIT | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_DEFER_COMMITConst

    QWP_FLAG_DEFER_COMMIT: 1 = 0x01
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_FLAG_DELTA_SYMBOL_DICTIONARY.html b/docs/variables/_questdb_nodejs-client.QWP_FLAG_DELTA_SYMBOL_DICTIONARY.html index 8f416cbc..dfb601d9 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_FLAG_DELTA_SYMBOL_DICTIONARY.html +++ b/docs/variables/_questdb_nodejs-client.QWP_FLAG_DELTA_SYMBOL_DICTIONARY.html @@ -1 +1 @@ -QWP_FLAG_DELTA_SYMBOL_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_DELTA_SYMBOL_DICTIONARYConst

    QWP_FLAG_DELTA_SYMBOL_DICTIONARY: 8 = 0x08
    +QWP_FLAG_DELTA_SYMBOL_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_DELTA_SYMBOL_DICTIONARYConst

    QWP_FLAG_DELTA_SYMBOL_DICTIONARY: 8 = 0x08
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_FLAG_DURABLE_ACK_POLL.html b/docs/variables/_questdb_nodejs-client.QWP_FLAG_DURABLE_ACK_POLL.html index c84935c5..eccada1c 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_FLAG_DURABLE_ACK_POLL.html +++ b/docs/variables/_questdb_nodejs-client.QWP_FLAG_DURABLE_ACK_POLL.html @@ -1,2 +1,2 @@ QWP_FLAG_DURABLE_ACK_POLL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_DURABLE_ACK_POLLConst

    QWP_FLAG_DURABLE_ACK_POLL: 2 = 0x02

    Table-less ingress control frame that polls negotiated durable-ACK progress.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_FLAG_GORILLA.html b/docs/variables/_questdb_nodejs-client.QWP_FLAG_GORILLA.html index 9b07e71d..959e8493 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_FLAG_GORILLA.html +++ b/docs/variables/_questdb_nodejs-client.QWP_FLAG_GORILLA.html @@ -1 +1 @@ -QWP_FLAG_GORILLA | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_GORILLAConst

    QWP_FLAG_GORILLA: 4 = 0x04
    +QWP_FLAG_GORILLA | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_GORILLAConst

    QWP_FLAG_GORILLA: 4 = 0x04
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_FLAG_ZSTD.html b/docs/variables/_questdb_nodejs-client.QWP_FLAG_ZSTD.html index 629112a8..ff1c2b1a 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_FLAG_ZSTD.html +++ b/docs/variables/_questdb_nodejs-client.QWP_FLAG_ZSTD.html @@ -1 +1 @@ -QWP_FLAG_ZSTD | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_ZSTDConst

    QWP_FLAG_ZSTD: 16 = 0x10
    +QWP_FLAG_ZSTD | QuestDB JavaScript Client - v5.0.0

    Variable QWP_FLAG_ZSTDConst

    QWP_FLAG_ZSTD: 16 = 0x10
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_HEADER_SIZE.html b/docs/variables/_questdb_nodejs-client.QWP_HEADER_SIZE.html index a7909318..b3924157 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_HEADER_SIZE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_HEADER_SIZE.html @@ -1 +1 @@ -QWP_HEADER_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_HEADER_SIZEConst

    QWP_HEADER_SIZE: 12
    +QWP_HEADER_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_HEADER_SIZEConst

    QWP_HEADER_SIZE: 12
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_INGRESS_PATH.html b/docs/variables/_questdb_nodejs-client.QWP_INGRESS_PATH.html index d519c6bc..d7e43e11 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_INGRESS_PATH.html +++ b/docs/variables/_questdb_nodejs-client.QWP_INGRESS_PATH.html @@ -1 +1 @@ -QWP_INGRESS_PATH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_INGRESS_PATHConst

    QWP_INGRESS_PATH: "/write/v4"
    +QWP_INGRESS_PATH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_INGRESS_PATHConst

    QWP_INGRESS_PATH: "/write/v4"
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_INGRESS_PROGRESS_KIND.html b/docs/variables/_questdb_nodejs-client.QWP_INGRESS_PROGRESS_KIND.html index e33963c2..5691550c 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_INGRESS_PROGRESS_KIND.html +++ b/docs/variables/_questdb_nodejs-client.QWP_INGRESS_PROGRESS_KIND.html @@ -1 +1 @@ -QWP_INGRESS_PROGRESS_KIND | QuestDB JavaScript Client - v5.0.0

    Variable QWP_INGRESS_PROGRESS_KINDConst

    QWP_INGRESS_PROGRESS_KIND: {
        ACKNOWLEDGED: "acknowledged";
        DURABLE_ACKNOWLEDGED: "durable-acknowledged";
        PUBLISHED: "published";
    } = ...

    Type declaration

    • ReadonlyACKNOWLEDGED: "acknowledged"
    • ReadonlyDURABLE_ACKNOWLEDGED: "durable-acknowledged"
    • ReadonlyPUBLISHED: "published"
    +QWP_INGRESS_PROGRESS_KIND | QuestDB JavaScript Client - v5.0.0

    Variable QWP_INGRESS_PROGRESS_KINDConst

    QWP_INGRESS_PROGRESS_KIND: {
        ACKNOWLEDGED: "acknowledged";
        DURABLE_ACKNOWLEDGED: "durable-acknowledged";
        PUBLISHED: "published";
    } = ...

    Type declaration

    • ReadonlyACKNOWLEDGED: "acknowledged"
    • ReadonlyDURABLE_ACKNOWLEDGED: "durable-acknowledged"
    • ReadonlyPUBLISHED: "published"
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_INGRESS_SERVER_INFO_CAPABILITY.html b/docs/variables/_questdb_nodejs-client.QWP_INGRESS_SERVER_INFO_CAPABILITY.html index 13e423e0..0a0e2159 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_INGRESS_SERVER_INFO_CAPABILITY.html +++ b/docs/variables/_questdb_nodejs-client.QWP_INGRESS_SERVER_INFO_CAPABILITY.html @@ -6,4 +6,4 @@ connection when it offered a subprotocol and the 101 names none. The server therefore echoes the subprotocol whenever it was offered -- confirming only that it speaks the browser negotiation -- and reports the capability here.

    -

    Type declaration

    • ReadonlyDURABLE_ACK: 1
    +

    Type declaration

    • ReadonlyDURABLE_ACK: 1
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_INITIAL_CONNECT_MODE.html b/docs/variables/_questdb_nodejs-client.QWP_INITIAL_CONNECT_MODE.html index a359f10e..7380b97f 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_INITIAL_CONNECT_MODE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_INITIAL_CONNECT_MODE.html @@ -4,4 +4,4 @@

    Type declaration

    • ReadonlyASYNC: "async"

      Return immediately and connect on the background replay loop.

    • ReadonlyOFF: "off"

      Try once on the caller and fail immediately.

    • ReadonlySYNC: "sync"

      Retry on the caller within the configured reconnect budget.

      -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAGIC.html b/docs/variables/_questdb_nodejs-client.QWP_MAGIC.html index 012ca03f..1032595f 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAGIC.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAGIC.html @@ -1,2 +1,2 @@ QWP_MAGIC | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAGICConst

    QWP_MAGIC: 827348817 = 0x31505751

    ASCII QWP1, represented as its little-endian uint32 value.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_ARRAY_DIMENSIONS.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_ARRAY_DIMENSIONS.html index 1cf4f190..873cc3bf 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_ARRAY_DIMENSIONS.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_ARRAY_DIMENSIONS.html @@ -1,2 +1,2 @@ QWP_MAX_ARRAY_DIMENSIONS | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_ARRAY_DIMENSIONSConst

    QWP_MAX_ARRAY_DIMENSIONS: 32

    Maximum array rank accepted by QuestDB's QWP ingress decoder.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_ARRAY_DIMENSION_LENGTH.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_ARRAY_DIMENSION_LENGTH.html index a52c3ded..1eb40326 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_ARRAY_DIMENSION_LENGTH.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_ARRAY_DIMENSION_LENGTH.html @@ -6,4 +6,4 @@ so neither the batch byte cap nor the row cap contains it. The frame is published, the server rejects the whole batch, and the rows are lost; the axis is therefore bounded before it is staged.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_BATCH_ROWS_UPPER_BOUND.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_BATCH_ROWS_UPPER_BOUND.html index 32d5fc91..a51af91f 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_BATCH_ROWS_UPPER_BOUND.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_BATCH_ROWS_UPPER_BOUND.html @@ -1,2 +1,2 @@ QWP_MAX_BATCH_ROWS_UPPER_BOUND | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_BATCH_ROWS_UPPER_BOUNDConst

    QWP_MAX_BATCH_ROWS_UPPER_BOUND: 1048576 = 1_048_576

    Largest client-requested egress RESULT_BATCH row cap.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_CELLS_PER_BATCH.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_CELLS_PER_BATCH.html index 3138cc59..a33dbf47 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_CELLS_PER_BATCH.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_CELLS_PER_BATCH.html @@ -10,4 +10,4 @@

    32Mi cells is roughly 512 MB decoded. That is far above any plausible result -- the widest supported table at 16k rows, or a full 1,048,576-row batch at 32 columns -- and far below what the caps alone would permit.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_COLUMNS_PER_TABLE.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_COLUMNS_PER_TABLE.html index 5e24cd93..87bd1df2 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_COLUMNS_PER_TABLE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_COLUMNS_PER_TABLE.html @@ -1 +1 @@ -QWP_MAX_COLUMNS_PER_TABLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_COLUMNS_PER_TABLEConst

    QWP_MAX_COLUMNS_PER_TABLE: 2048
    +QWP_MAX_COLUMNS_PER_TABLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_COLUMNS_PER_TABLEConst

    QWP_MAX_COLUMNS_PER_TABLE: 2048
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_COLUMN_NAME_LENGTH.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_COLUMN_NAME_LENGTH.html index ea309680..381c51f9 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_COLUMN_NAME_LENGTH.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_COLUMN_NAME_LENGTH.html @@ -1,2 +1,2 @@ QWP_MAX_COLUMN_NAME_LENGTH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_COLUMN_NAME_LENGTHConst

    QWP_MAX_COLUMN_NAME_LENGTH: 127

    Default QWP ingress identifier limits, in UTF-8 wire bytes.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_IDENTIFIER_BYTES.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_IDENTIFIER_BYTES.html index 9b39db56..48691c1b 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_IDENTIFIER_BYTES.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_IDENTIFIER_BYTES.html @@ -3,4 +3,4 @@ 127-UTF-16-code-unit metadata limit. One code unit takes at most three UTF-8 bytes, so query decoding accepts that larger representation even though QWP ingress enforces its 127-byte protocol limit.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_ROWS_PER_TABLE.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_ROWS_PER_TABLE.html index 7a0877eb..77065755 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_ROWS_PER_TABLE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_ROWS_PER_TABLE.html @@ -1 +1 @@ -QWP_MAX_ROWS_PER_TABLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_ROWS_PER_TABLEConst

    QWP_MAX_ROWS_PER_TABLE: 1000000 = 1_000_000
    +QWP_MAX_ROWS_PER_TABLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_ROWS_PER_TABLEConst

    QWP_MAX_ROWS_PER_TABLE: 1000000 = 1_000_000
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_SYMBOL_DICTIONARY_SIZE.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_SYMBOL_DICTIONARY_SIZE.html index 2904da37..5bc0cc71 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_SYMBOL_DICTIONARY_SIZE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_SYMBOL_DICTIONARY_SIZE.html @@ -1 +1 @@ -QWP_MAX_SYMBOL_DICTIONARY_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_SYMBOL_DICTIONARY_SIZEConst

    QWP_MAX_SYMBOL_DICTIONARY_SIZE: 2000000 = 2_000_000
    +QWP_MAX_SYMBOL_DICTIONARY_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_SYMBOL_DICTIONARY_SIZEConst

    QWP_MAX_SYMBOL_DICTIONARY_SIZE: 2000000 = 2_000_000
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_TABLES_PER_FRAME.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_TABLES_PER_FRAME.html index 9c39659d..72a56454 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_TABLES_PER_FRAME.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_TABLES_PER_FRAME.html @@ -1,2 +1,2 @@ QWP_MAX_TABLES_PER_FRAME | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_TABLES_PER_FRAMEConst

    QWP_MAX_TABLES_PER_FRAME: 65535 = 0xffff

    Maximum table count representable by the ingress frame's uint16 header.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_TABLE_NAME_LENGTH.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_TABLE_NAME_LENGTH.html index 4b725e42..8a5b1b41 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_TABLE_NAME_LENGTH.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_TABLE_NAME_LENGTH.html @@ -1 +1 @@ -QWP_MAX_TABLE_NAME_LENGTH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_TABLE_NAME_LENGTHConst

    QWP_MAX_TABLE_NAME_LENGTH: 127
    +QWP_MAX_TABLE_NAME_LENGTH | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_TABLE_NAME_LENGTHConst

    QWP_MAX_TABLE_NAME_LENGTH: 127
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_MAX_ZSTD_DECOMPRESSED_SIZE.html b/docs/variables/_questdb_nodejs-client.QWP_MAX_ZSTD_DECOMPRESSED_SIZE.html index a47116be..8cf25339 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_MAX_ZSTD_DECOMPRESSED_SIZE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_MAX_ZSTD_DECOMPRESSED_SIZE.html @@ -1,2 +1,2 @@ QWP_MAX_ZSTD_DECOMPRESSED_SIZE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_MAX_ZSTD_DECOMPRESSED_SIZEConst

    QWP_MAX_ZSTD_DECOMPRESSED_SIZE: number = ...

    Matches the Java client's per-connection decompression safety cap.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_ORPHAN_DRAIN_EVENT_KIND.html b/docs/variables/_questdb_nodejs-client.QWP_ORPHAN_DRAIN_EVENT_KIND.html index ccaba126..3a0ee6d7 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_ORPHAN_DRAIN_EVENT_KIND.html +++ b/docs/variables/_questdb_nodejs-client.QWP_ORPHAN_DRAIN_EVENT_KIND.html @@ -1,2 +1,2 @@ QWP_ORPHAN_DRAIN_EVENT_KIND | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ORPHAN_DRAIN_EVENT_KINDConst

    QWP_ORPHAN_DRAIN_EVENT_KIND: {
        DISCOVERED: "discovered";
        DRAINED: "drained";
        DURABLE_ACK_PERSISTENT_FAILURE: "durable-ack-persistent-failure";
        DURABLE_ACK_UNAVAILABLE: "durable-ack-unavailable";
        FAILED: "failed";
        LOCKED: "locked";
        PRIMARY_UNAVAILABLE: "primary-unavailable";
        RETRYING: "retrying";
        SCAN_FAILED: "scan-failed";
        STARTED: "started";
    } = ...

    Type declaration

    • ReadonlyDISCOVERED: "discovered"
    • ReadonlyDRAINED: "drained"
    • ReadonlyDURABLE_ACK_PERSISTENT_FAILURE: "durable-ack-persistent-failure"
    • ReadonlyDURABLE_ACK_UNAVAILABLE: "durable-ack-unavailable"
    • ReadonlyFAILED: "failed"
    • ReadonlyLOCKED: "locked"
    • ReadonlyPRIMARY_UNAVAILABLE: "primary-unavailable"
    • ReadonlyRETRYING: "retrying"

      The attempt or terminal-marker write failed and will be retried.

      -
    • ReadonlySCAN_FAILED: "scan-failed"
    • ReadonlySTARTED: "started"
    +
  • ReadonlySCAN_FAILED: "scan-failed"
  • ReadonlySTARTED: "started"
  • diff --git a/docs/variables/_questdb_nodejs-client.QWP_ORPHAN_FAILED_SENTINEL.html b/docs/variables/_questdb_nodejs-client.QWP_ORPHAN_FAILED_SENTINEL.html index 46709887..b48720c6 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_ORPHAN_FAILED_SENTINEL.html +++ b/docs/variables/_questdb_nodejs-client.QWP_ORPHAN_FAILED_SENTINEL.html @@ -1,2 +1,2 @@ QWP_ORPHAN_FAILED_SENTINEL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ORPHAN_FAILED_SENTINELConst

    QWP_ORPHAN_FAILED_SENTINEL: ".failed"

    Java-compatible marker that excludes a failed slot from automatic drain.

    -
    +
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_QUERY_FLAG_RESET_DICTIONARY.html b/docs/variables/_questdb_nodejs-client.QWP_QUERY_FLAG_RESET_DICTIONARY.html index ac0275bb..2695a0db 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_QUERY_FLAG_RESET_DICTIONARY.html +++ b/docs/variables/_questdb_nodejs-client.QWP_QUERY_FLAG_RESET_DICTIONARY.html @@ -1 +1 @@ -QWP_QUERY_FLAG_RESET_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_QUERY_FLAG_RESET_DICTIONARYConst

    QWP_QUERY_FLAG_RESET_DICTIONARY: 1 = 0x01
    +QWP_QUERY_FLAG_RESET_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_QUERY_FLAG_RESET_DICTIONARYConst

    QWP_QUERY_FLAG_RESET_DICTIONARY: 1 = 0x01
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_RECONNECT_EVENT_KIND.html b/docs/variables/_questdb_nodejs-client.QWP_RECONNECT_EVENT_KIND.html index 97619223..08780af2 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_RECONNECT_EVENT_KIND.html +++ b/docs/variables/_questdb_nodejs-client.QWP_RECONNECT_EVENT_KIND.html @@ -1,4 +1,4 @@ QWP_RECONNECT_EVENT_KIND | QuestDB JavaScript Client - v5.0.0

    Variable QWP_RECONNECT_EVENT_KINDConst

    QWP_RECONNECT_EVENT_KIND: {
        ATTEMPT_FAILED: "attempt-failed";
        CONNECTED: "connected";
        DURABLE_ACK_PERSISTENT_FAILURE: "durable-ack-persistent-failure";
        DURABLE_ACK_UNAVAILABLE: "durable-ack-unavailable";
        FAILED_OVER: "failed-over";
        PRIMARY_UNAVAILABLE: "primary-unavailable";
        RECONNECTED: "reconnected";
        RECONNECTING: "reconnecting";
    } = ...

    Type declaration

    • ReadonlyATTEMPT_FAILED: "attempt-failed"
    • ReadonlyCONNECTED: "connected"
    • ReadonlyDURABLE_ACK_PERSISTENT_FAILURE: "durable-ack-persistent-failure"

      An orphan exhausted its consecutive durable-ACK mismatch budget.

    • ReadonlyDURABLE_ACK_UNAVAILABLE: "durable-ack-unavailable"

      An unbounded SF loop is waiting for durable-ACK-capable endpoints.

    • ReadonlyFAILED_OVER: "failed-over"
    • ReadonlyPRIMARY_UNAVAILABLE: "primary-unavailable"

      Every reachable ingress endpoint is temporarily unable to be primary.

      -
    • ReadonlyRECONNECTED: "reconnected"
    • ReadonlyRECONNECTING: "reconnecting"
    +
  • ReadonlyRECONNECTED: "reconnected"
  • ReadonlyRECONNECTING: "reconnecting"
  • diff --git a/docs/variables/_questdb_nodejs-client.QWP_RESET_MASK_DICTIONARY.html b/docs/variables/_questdb_nodejs-client.QWP_RESET_MASK_DICTIONARY.html index 25c5e271..87063b74 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_RESET_MASK_DICTIONARY.html +++ b/docs/variables/_questdb_nodejs-client.QWP_RESET_MASK_DICTIONARY.html @@ -1 +1 @@ -QWP_RESET_MASK_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_RESET_MASK_DICTIONARYConst

    QWP_RESET_MASK_DICTIONARY: 1 = 0x01
    +QWP_RESET_MASK_DICTIONARY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_RESET_MASK_DICTIONARYConst

    QWP_RESET_MASK_DICTIONARY: 1 = 0x01
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_SENDER_ERROR_CATEGORY.html b/docs/variables/_questdb_nodejs-client.QWP_SENDER_ERROR_CATEGORY.html index 481c877a..c651f10a 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_SENDER_ERROR_CATEGORY.html +++ b/docs/variables/_questdb_nodejs-client.QWP_SENDER_ERROR_CATEGORY.html @@ -1 +1 @@ -QWP_SENDER_ERROR_CATEGORY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SENDER_ERROR_CATEGORYConst

    QWP_SENDER_ERROR_CATEGORY: {
        CANCELLED: "cancelled";
        DATA_LOSS: "data-loss";
        DICTIONARY_GAP: "dictionary-gap";
        INTERNAL_ERROR: "internal-error";
        LIMIT_EXCEEDED: "limit-exceeded";
        NOT_WRITABLE: "not-writable";
        PARSE_ERROR: "parse-error";
        PROTOCOL_VIOLATION: "protocol-violation";
        SCHEMA_MISMATCH: "schema-mismatch";
        SECURITY_ERROR: "security-error";
        UNKNOWN: "unknown";
        WRITE_ERROR: "write-error";
    } = ...

    Type declaration

    • ReadonlyCANCELLED: "cancelled"
    • ReadonlyDATA_LOSS: "data-loss"
    • ReadonlyDICTIONARY_GAP: "dictionary-gap"
    • ReadonlyINTERNAL_ERROR: "internal-error"
    • ReadonlyLIMIT_EXCEEDED: "limit-exceeded"
    • ReadonlyNOT_WRITABLE: "not-writable"
    • ReadonlyPARSE_ERROR: "parse-error"
    • ReadonlyPROTOCOL_VIOLATION: "protocol-violation"
    • ReadonlySCHEMA_MISMATCH: "schema-mismatch"
    • ReadonlySECURITY_ERROR: "security-error"
    • ReadonlyUNKNOWN: "unknown"
    • ReadonlyWRITE_ERROR: "write-error"
    +QWP_SENDER_ERROR_CATEGORY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SENDER_ERROR_CATEGORYConst

    QWP_SENDER_ERROR_CATEGORY: {
        CANCELLED: "cancelled";
        DATA_LOSS: "data-loss";
        DICTIONARY_GAP: "dictionary-gap";
        INTERNAL_ERROR: "internal-error";
        LIMIT_EXCEEDED: "limit-exceeded";
        NOT_WRITABLE: "not-writable";
        PARSE_ERROR: "parse-error";
        PROTOCOL_VIOLATION: "protocol-violation";
        SCHEMA_MISMATCH: "schema-mismatch";
        SECURITY_ERROR: "security-error";
        UNKNOWN: "unknown";
        WRITE_ERROR: "write-error";
    } = ...

    Type declaration

    • ReadonlyCANCELLED: "cancelled"
    • ReadonlyDATA_LOSS: "data-loss"
    • ReadonlyDICTIONARY_GAP: "dictionary-gap"
    • ReadonlyINTERNAL_ERROR: "internal-error"
    • ReadonlyLIMIT_EXCEEDED: "limit-exceeded"
    • ReadonlyNOT_WRITABLE: "not-writable"
    • ReadonlyPARSE_ERROR: "parse-error"
    • ReadonlyPROTOCOL_VIOLATION: "protocol-violation"
    • ReadonlySCHEMA_MISMATCH: "schema-mismatch"
    • ReadonlySECURITY_ERROR: "security-error"
    • ReadonlyUNKNOWN: "unknown"
    • ReadonlyWRITE_ERROR: "write-error"
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_SENDER_ERROR_POLICY.html b/docs/variables/_questdb_nodejs-client.QWP_SENDER_ERROR_POLICY.html index 0d38e863..4c88bcbc 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_SENDER_ERROR_POLICY.html +++ b/docs/variables/_questdb_nodejs-client.QWP_SENDER_ERROR_POLICY.html @@ -1 +1 @@ -QWP_SENDER_ERROR_POLICY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SENDER_ERROR_POLICYConst

    QWP_SENDER_ERROR_POLICY: {
        ABANDONED: "abandoned";
        RETRIABLE: "retriable";
        RETRIABLE_OTHER: "retriable-other";
        TERMINAL: "terminal";
    } = ...

    Type declaration

    • ReadonlyABANDONED: "abandoned"
    • ReadonlyRETRIABLE: "retriable"
    • ReadonlyRETRIABLE_OTHER: "retriable-other"
    • ReadonlyTERMINAL: "terminal"
    +QWP_SENDER_ERROR_POLICY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SENDER_ERROR_POLICYConst

    QWP_SENDER_ERROR_POLICY: {
        ABANDONED: "abandoned";
        RETRIABLE: "retriable";
        RETRIABLE_OTHER: "retriable-other";
        TERMINAL: "terminal";
    } = ...

    Type declaration

    • ReadonlyABANDONED: "abandoned"
    • ReadonlyRETRIABLE: "retriable"
    • ReadonlyRETRIABLE_OTHER: "retriable-other"
    • ReadonlyTERMINAL: "terminal"
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_SERVER_ROLE.html b/docs/variables/_questdb_nodejs-client.QWP_SERVER_ROLE.html index 03d0e6e8..bf1a9d2a 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_SERVER_ROLE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_SERVER_ROLE.html @@ -1 +1 @@ -QWP_SERVER_ROLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SERVER_ROLEConst

    QWP_SERVER_ROLE: { PRIMARY: 1; PRIMARY_CATCHUP: 3; REPLICA: 2; STANDALONE: 0 } = ...

    Type declaration

    • ReadonlyPRIMARY: 1
    • ReadonlyPRIMARY_CATCHUP: 3
    • ReadonlyREPLICA: 2
    • ReadonlySTANDALONE: 0
    +QWP_SERVER_ROLE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SERVER_ROLEConst

    QWP_SERVER_ROLE: { PRIMARY: 1; PRIMARY_CATCHUP: 3; REPLICA: 2; STANDALONE: 0 } = ...

    Type declaration

    • ReadonlyPRIMARY: 1
    • ReadonlyPRIMARY_CATCHUP: 3
    • ReadonlyREPLICA: 2
    • ReadonlySTANDALONE: 0
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_SF_BACKPRESSURE_POLICY.html b/docs/variables/_questdb_nodejs-client.QWP_SF_BACKPRESSURE_POLICY.html index 12b0a42e..54192c53 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_SF_BACKPRESSURE_POLICY.html +++ b/docs/variables/_questdb_nodejs-client.QWP_SF_BACKPRESSURE_POLICY.html @@ -1 +1 @@ -QWP_SF_BACKPRESSURE_POLICY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SF_BACKPRESSURE_POLICYConst

    QWP_SF_BACKPRESSURE_POLICY: { ERROR: "error"; WAIT: "wait" } = ...

    Type declaration

    • ReadonlyERROR: "error"
    • ReadonlyWAIT: "wait"
    +QWP_SF_BACKPRESSURE_POLICY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SF_BACKPRESSURE_POLICYConst

    QWP_SF_BACKPRESSURE_POLICY: { ERROR: "error"; WAIT: "wait" } = ...

    Type declaration

    • ReadonlyERROR: "error"
    • ReadonlyWAIT: "wait"
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_SF_DURABILITY.html b/docs/variables/_questdb_nodejs-client.QWP_SF_DURABILITY.html index fa19ba27..c44f9fd4 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_SF_DURABILITY.html +++ b/docs/variables/_questdb_nodejs-client.QWP_SF_DURABILITY.html @@ -1 +1 @@ -QWP_SF_DURABILITY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SF_DURABILITYConst

    QWP_SF_DURABILITY: { APPEND: "append"; MEMORY: "memory"; PERIODIC: "periodic" } = ...

    Type declaration

    • ReadonlyAPPEND: "append"
    • ReadonlyMEMORY: "memory"
    • ReadonlyPERIODIC: "periodic"
    +QWP_SF_DURABILITY | QuestDB JavaScript Client - v5.0.0

    Variable QWP_SF_DURABILITYConst

    QWP_SF_DURABILITY: { APPEND: "append"; MEMORY: "memory"; PERIODIC: "periodic" } = ...

    Type declaration

    • ReadonlyAPPEND: "append"
    • ReadonlyMEMORY: "memory"
    • ReadonlyPERIODIC: "periodic"
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_STATUS.html b/docs/variables/_questdb_nodejs-client.QWP_STATUS.html index 0317f203..2654eadc 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_STATUS.html +++ b/docs/variables/_questdb_nodejs-client.QWP_STATUS.html @@ -1 +1 @@ -QWP_STATUS | QuestDB JavaScript Client - v5.0.0

    Variable QWP_STATUSConst

    QWP_STATUS: {
        CANCELLED: 10;
        DICTIONARY_GAP: 13;
        DURABLE_ACK: 2;
        INTERNAL_ERROR: 6;
        LIMIT_EXCEEDED: 11;
        NOT_WRITABLE: 12;
        OK: 0;
        PARSE_ERROR: 5;
        SCHEMA_MISMATCH: 3;
        SECURITY_ERROR: 8;
        SERVER_INFO: 1;
        WRITE_ERROR: 9;
    } = ...

    Type declaration

    • ReadonlyCANCELLED: 10
    • ReadonlyDICTIONARY_GAP: 13
    • ReadonlyDURABLE_ACK: 2
    • ReadonlyINTERNAL_ERROR: 6
    • ReadonlyLIMIT_EXCEEDED: 11
    • ReadonlyNOT_WRITABLE: 12
    • ReadonlyOK: 0
    • ReadonlyPARSE_ERROR: 5
    • ReadonlySCHEMA_MISMATCH: 3
    • ReadonlySECURITY_ERROR: 8
    • ReadonlySERVER_INFO: 1
    • ReadonlyWRITE_ERROR: 9
    +QWP_STATUS | QuestDB JavaScript Client - v5.0.0

    Variable QWP_STATUSConst

    QWP_STATUS: {
        CANCELLED: 10;
        DICTIONARY_GAP: 13;
        DURABLE_ACK: 2;
        INTERNAL_ERROR: 6;
        LIMIT_EXCEEDED: 11;
        NOT_WRITABLE: 12;
        OK: 0;
        PARSE_ERROR: 5;
        SCHEMA_MISMATCH: 3;
        SECURITY_ERROR: 8;
        SERVER_INFO: 1;
        WRITE_ERROR: 9;
    } = ...

    Type declaration

    • ReadonlyCANCELLED: 10
    • ReadonlyDICTIONARY_GAP: 13
    • ReadonlyDURABLE_ACK: 2
    • ReadonlyINTERNAL_ERROR: 6
    • ReadonlyLIMIT_EXCEEDED: 11
    • ReadonlyNOT_WRITABLE: 12
    • ReadonlyOK: 0
    • ReadonlyPARSE_ERROR: 5
    • ReadonlySCHEMA_MISMATCH: 3
    • ReadonlySECURITY_ERROR: 8
    • ReadonlySERVER_INFO: 1
    • ReadonlyWRITE_ERROR: 9
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_TARGET.html b/docs/variables/_questdb_nodejs-client.QWP_TARGET.html index 8b14c9ce..28e00b83 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_TARGET.html +++ b/docs/variables/_questdb_nodejs-client.QWP_TARGET.html @@ -1 +1 @@ -QWP_TARGET | QuestDB JavaScript Client - v5.0.0

    Variable QWP_TARGETConst

    QWP_TARGET: { ANY: "any"; PRIMARY: "primary"; REPLICA: "replica" } = ...

    Type declaration

    • ReadonlyANY: "any"
    • ReadonlyPRIMARY: "primary"
    • ReadonlyREPLICA: "replica"
    +QWP_TARGET | QuestDB JavaScript Client - v5.0.0

    Variable QWP_TARGETConst

    QWP_TARGET: { ANY: "any"; PRIMARY: "primary"; REPLICA: "replica" } = ...

    Type declaration

    • ReadonlyANY: "any"
    • ReadonlyPRIMARY: "primary"
    • ReadonlyREPLICA: "replica"
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_UPGRADE_ERROR_KIND.html b/docs/variables/_questdb_nodejs-client.QWP_UPGRADE_ERROR_KIND.html index 382d8a3b..bd0a2b58 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_UPGRADE_ERROR_KIND.html +++ b/docs/variables/_questdb_nodejs-client.QWP_UPGRADE_ERROR_KIND.html @@ -1,2 +1,2 @@ QWP_UPGRADE_ERROR_KIND | QuestDB JavaScript Client - v5.0.0

    Variable QWP_UPGRADE_ERROR_KINDConst

    QWP_UPGRADE_ERROR_KIND: {
        AUTHENTICATION: "authentication";
        CAPABILITY_MISMATCH: "capability-mismatch";
        HTTP_REJECTED: "http-rejected";
        OPAQUE: "opaque";
        ROLE_REJECTED: "role-rejected";
        TIMEOUT: "timeout";
        TRANSPORT: "transport";
        VERSION_MISMATCH: "version-mismatch";
    } = ...

    Type declaration

    • ReadonlyAUTHENTICATION: "authentication"
    • ReadonlyCAPABILITY_MISMATCH: "capability-mismatch"
    • ReadonlyHTTP_REJECTED: "http-rejected"
    • ReadonlyOPAQUE: "opaque"

      Browser WebSocket APIs do not expose the rejected HTTP upgrade.

      -
    • ReadonlyROLE_REJECTED: "role-rejected"
    • ReadonlyTIMEOUT: "timeout"
    • ReadonlyTRANSPORT: "transport"
    • ReadonlyVERSION_MISMATCH: "version-mismatch"
    +
  • ReadonlyROLE_REJECTED: "role-rejected"
  • ReadonlyTIMEOUT: "timeout"
  • ReadonlyTRANSPORT: "transport"
  • ReadonlyVERSION_MISMATCH: "version-mismatch"
  • diff --git a/docs/variables/_questdb_nodejs-client.QWP_UPGRADE_TIMEOUT_PHASE.html b/docs/variables/_questdb_nodejs-client.QWP_UPGRADE_TIMEOUT_PHASE.html index bc30a4b4..eb5654ee 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_UPGRADE_TIMEOUT_PHASE.html +++ b/docs/variables/_questdb_nodejs-client.QWP_UPGRADE_TIMEOUT_PHASE.html @@ -1 +1 @@ -QWP_UPGRADE_TIMEOUT_PHASE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_UPGRADE_TIMEOUT_PHASEConst

    QWP_UPGRADE_TIMEOUT_PHASE: {
        AUTHENTICATION: "authentication";
        CONNECT: "connect";
    } = ...

    Type declaration

    • ReadonlyAUTHENTICATION: "authentication"
    • ReadonlyCONNECT: "connect"
    +QWP_UPGRADE_TIMEOUT_PHASE | QuestDB JavaScript Client - v5.0.0

    Variable QWP_UPGRADE_TIMEOUT_PHASEConst

    QWP_UPGRADE_TIMEOUT_PHASE: {
        AUTHENTICATION: "authentication";
        CONNECT: "connect";
    } = ...

    Type declaration

    • ReadonlyAUTHENTICATION: "authentication"
    • ReadonlyCONNECT: "connect"
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_VERSION.html b/docs/variables/_questdb_nodejs-client.QWP_VERSION.html index 73c0a6b6..8b4e2074 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_VERSION.html +++ b/docs/variables/_questdb_nodejs-client.QWP_VERSION.html @@ -1 +1 @@ -QWP_VERSION | QuestDB JavaScript Client - v5.0.0
    +QWP_VERSION | QuestDB JavaScript Client - v5.0.0
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_ZSTD_MAX_COMPRESSION_LEVEL.html b/docs/variables/_questdb_nodejs-client.QWP_ZSTD_MAX_COMPRESSION_LEVEL.html index 53c01c2c..1f321d8e 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_ZSTD_MAX_COMPRESSION_LEVEL.html +++ b/docs/variables/_questdb_nodejs-client.QWP_ZSTD_MAX_COMPRESSION_LEVEL.html @@ -1 +1 @@ -QWP_ZSTD_MAX_COMPRESSION_LEVEL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ZSTD_MAX_COMPRESSION_LEVELConst

    QWP_ZSTD_MAX_COMPRESSION_LEVEL: 22
    +QWP_ZSTD_MAX_COMPRESSION_LEVEL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ZSTD_MAX_COMPRESSION_LEVELConst

    QWP_ZSTD_MAX_COMPRESSION_LEVEL: 22
    diff --git a/docs/variables/_questdb_nodejs-client.QWP_ZSTD_MIN_COMPRESSION_LEVEL.html b/docs/variables/_questdb_nodejs-client.QWP_ZSTD_MIN_COMPRESSION_LEVEL.html index 785253b0..eec01ec5 100644 --- a/docs/variables/_questdb_nodejs-client.QWP_ZSTD_MIN_COMPRESSION_LEVEL.html +++ b/docs/variables/_questdb_nodejs-client.QWP_ZSTD_MIN_COMPRESSION_LEVEL.html @@ -1 +1 @@ -QWP_ZSTD_MIN_COMPRESSION_LEVEL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ZSTD_MIN_COMPRESSION_LEVELConst

    QWP_ZSTD_MIN_COMPRESSION_LEVEL: 1
    +QWP_ZSTD_MIN_COMPRESSION_LEVEL | QuestDB JavaScript Client - v5.0.0

    Variable QWP_ZSTD_MIN_COMPRESSION_LEVELConst

    QWP_ZSTD_MIN_COMPRESSION_LEVEL: 1
    diff --git a/packages/browser-client/README.md b/packages/browser-client/README.md index 27e4f026..6fe822c9 100644 --- a/packages/browser-client/README.md +++ b/packages/browser-client/README.md @@ -13,7 +13,9 @@ no additional public import paths. - Streaming queries with typed bind variables and result batches - Automatic batching, reconnect, failover, and acknowledgement tracking - Transactional ingestion and durable acknowledgement negotiation -- REST, OIDC, and Basic authentication through HttpOnly session cookies +- REST, OIDC, and Basic authentication, either through HttpOnly session + cookies or, for third-party web applications, sent with each WebSocket + upgrade - ESM, CommonJS, and bundled TypeScript declarations - No Node.js built-ins, Node.js typings, `ws`, or `undici` @@ -52,7 +54,9 @@ import { connectQwpBrowserSender } from "@questdb/browser-client"; Serve QuestDB's QWP route from the application's origin, either directly or through a reverse proxy. The browser will then apply the page's normal cookie, -origin, and TLS rules to the WebSocket connection. +origin, and TLS rules to the WebSocket connection. An application served from +another origin connects directly instead; see +[Third-party web applications](#third-party-web-applications). ```typescript import { connectQwpBrowserSender } from "@questdb/browser-client"; @@ -161,7 +165,20 @@ addresses, geohashes, binary values, and arrays. ## Authentication -Browser JavaScript cannot add an `Authorization` header to a WebSocket upgrade. +Browser JavaScript cannot add an `Authorization` header to a WebSocket upgrade, +so the client authenticates in one of two ways: + +- **Session cookies**, for an application served from QuestDB's origin or + through a same-origin reverse proxy. The client authenticates over REST, and + QuestDB sets an HttpOnly session cookie that the browser sends with the + upgrade. +- **`auth`**, for a third-party web application served from its own origin. + The client sends the credential with every upgrade, in its subprotocol offer. + +A connection accepts one or the other, not both. + +### Session cookies + Authenticate over REST first so QuestDB can set an HttpOnly session cookie. The browser then sends that cookie during the QWP WebSocket upgrade. @@ -205,9 +222,65 @@ not run an interactive OIDC flow; the application obtains access tokens from its identity provider. The bootstrap request uses credentials. Prefer serving `/exec`, `/write/v4`, -and `/read/v1` from the application's origin. Cross-origin deployments require -credentialed CORS and cookie attributes that permit the browser to store and -send the session cookie. JavaScript never reads the HttpOnly cookie. +and `/read/v1` from the application's origin. JavaScript never reads the +HttpOnly cookie. An application on another origin should use `auth` instead: +QuestDB ignores cookies on a cross-origin QWP upgrade. + +### Third-party web applications + +An application served from its own origin, such as `https://app.example.com`, +connects to QuestDB directly once the server lists that exact origin: + +``` +# QuestDB server.conf +qwp.browser.allowed.origins=https://app.example.com +``` + +Pass the credential as `auth`. REST and OIDC tokens use the `bearer` form, and +`{ type: "basic", username, password }` is accepted too: + +```typescript +import { connectQwpBrowserSender } from "@questdb/browser-client"; + +const sender = await connectQwpBrowserSender({ + url: "wss://questdb.example.com:9000/write/v4", + auth: { type: "bearer", token: restToken }, +}); +``` + +An OIDC access token expires, so pass a function instead. The client calls it +before every initial connect, reconnect, and failover attempt, so a long-lived +sender or query session keeps working with each refreshed token: + +```typescript +const sender = await connectQwpBrowserSender({ + url: "wss://questdb.example.com:9000/write/v4", + auth: async ({ signal }) => ({ + type: "bearer", + token: await identityProvider.getAccessToken({ signal }), + }), +}); +``` + +The `signal` aborts when the connection attempt is abandoned, and time spent in +the function counts against `connectTimeoutMs`. If the function throws, the +attempt fails with a `QwpUpgradeError` of kind `authentication` whose `cause` is +the thrown error; reconnects retry it with backoff unless that error carries +`retryable: false`. + +- Use `wss:`. The credential travels in the upgrade request's + `Sec-WebSocket-Protocol` header, base64url-encoded but not encrypted. +- QuestDB accepts the credential only from a listed origin; a page served from + QuestDB's own origin must be listed too, or keep using session cookies. It + creates no session and ignores cookies on these upgrades, so the connection + runs as the credential's own principal; `serviceAccount` assumption is not + available this way. +- QuestDB never selects the credential as the connection's subprotocol. The + client treats a server that does as defective and closes the connection + without retrying or trying another endpoint. +- With authentication disabled, a listed origin needs no credential. +- The server must support `qwp.browser.allowed.origins`. The allowlist covers + only the QWP routes; it does not enable CORS for REST. ## Stream query results diff --git a/packages/browser-client/src/index.ts b/packages/browser-client/src/index.ts index 0459f9dc..cd816498 100644 --- a/packages/browser-client/src/index.ts +++ b/packages/browser-client/src/index.ts @@ -21,13 +21,17 @@ import { QWP_MAX_TIMER_DELAY_MS, } from "../../client-core/src/_qwp/_internal/timer-bounds"; import { - addQwpDurableAckWebSocketProtocol, decodeQwpIngressServerInfo, encodeQwpAcceptEncoding, isQwpDurableAckWebSocketProtocol, QwpEgressCompression, QWP_VERSION, } from "../../client-core/src/_qwp/_core"; +import { + isQwpAuthorizationWebSocketProtocol, + QWP_AUTHORIZATION_WEBSOCKET_PROTOCOL_PREFIX, + qwpBrowserWebSocketProtocols, +} from "../../client-core/src/_qwp/_core/durable-ack"; import { QwpBinaryConnection, QwpConnectionFactory, @@ -55,6 +59,12 @@ import { export type { QwpWebSocketLike } from "../../client-core/src/_qwp/_internal/websocket-connection"; +/** + * A browser credential: HTTP Basic, or a QuestDB REST token or OIDC access + * token sent as a Bearer token. `sessionBootstrap` exchanges it over REST for + * QuestDB's HttpOnly session cookies; `auth` sends it with every QWP WebSocket + * upgrade instead. + */ export type QwpBrowserSessionAuthentication = | { /** HTTP Basic authentication. */ @@ -68,6 +78,36 @@ export type QwpBrowserSessionAuthentication = token: string; }; +/** Describes the connection attempt a {@link QwpBrowserAuthProvider} serves. */ +export interface QwpBrowserAuthContext { + /** + * Aborted when the attempt is abandoned, because its `connectTimeoutMs` + * deadline expired or its session closed. Pass it to a token refresh so the + * refresh is cancelled together with the attempt. + */ + readonly signal: AbortSignal; +} + +/** + * Supplies the credential for one QWP WebSocket connection attempt. + * + * The client calls it before every initial connect, reconnect, and failover + * attempt, and keeps nothing it returns. A provider that returns the current + * OIDC access token, refreshing it when it is about to expire, therefore keeps + * a long-lived sender or query session authenticated across token expiry. + * Time spent here counts against `connectTimeoutMs`. + * + * A provider that throws fails the attempt with a {@link QwpUpgradeError} of + * kind `authentication` whose `cause` is the thrown value, without trying the + * remaining endpoints. Reconnects retry it with backoff unless the thrown value + * carries `retryable: false`. + */ +export type QwpBrowserAuthProvider = ( + context: QwpBrowserAuthContext, +) => + | QwpBrowserSessionAuthentication + | PromiseLike; + export type QwpBrowserFetch = ( input: string | URL, init?: RequestInit, @@ -156,68 +196,233 @@ async function readBoundedBootstrapErrorBody( return new TextDecoder().decode(bytes.subarray(0, length)); } +/** + * Validates a credential. `label` prefixes errors about one of its fields and + * `subject` names the whole credential; no error quotes the credential itself. + */ function validateAuthentication( authentication: QwpBrowserSessionAuthentication, + label = "browser session", + subject = "browser session authentication", ): void { + if (typeof authentication !== "object" || authentication === null) { + throw new TypeError( + `${subject} must be a { type: "basic" } or { type: "bearer" } object`, + ); + } if (authentication.type === "basic") { if (!authentication.username) { - throw new TypeError("browser session username cannot be empty"); + throw new TypeError(`${label} username cannot be empty`); } if (authentication.username.includes(":")) { - throw new TypeError("browser session username cannot contain ':'"); + throw new TypeError(`${label} username cannot contain ':'`); } if (/\r|\n/.test(authentication.username + authentication.password)) { - throw new TypeError( - "browser session credentials cannot contain CR or LF", - ); + throw new TypeError(`${label} credentials cannot contain CR or LF`); } return; } if (authentication.type === "bearer") { if (!authentication.token) { - throw new TypeError("browser session bearer token cannot be empty"); + throw new TypeError(`${label} bearer token cannot be empty`); } if (/\r|\n/.test(authentication.token)) { - throw new TypeError( - "browser session bearer token cannot contain CR or LF", - ); + throw new TypeError(`${label} bearer token cannot contain CR or LF`); } return; } throw new TypeError( - `unsupported browser session authentication type '${String((authentication as { type?: unknown }).type)}'`, + `unsupported ${subject} type '${String((authentication as { type?: unknown }).type)}'`, ); } -function encodeBase64Utf8(value: string): string { - const alphabet = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - const bytes = new TextEncoder().encode(value); +const BASE64_ALPHABET = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +const BASE64URL_ALPHABET = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + +function encodeBase64( + bytes: Uint8Array, + alphabet: string, + padding: string, +): string { let result = ""; for (let index = 0; index < bytes.length; index += 3) { const first = bytes[index]; - const second = bytes[index + 1]; - const third = bytes[index + 2]; + const second: number | undefined = bytes[index + 1]; + const third: number | undefined = bytes[index + 2]; result += alphabet[first >>> 2]; result += alphabet[((first & 0x03) << 4) | ((second ?? 0) >>> 4)]; result += second === undefined - ? "=" + ? padding : alphabet[((second & 0x0f) << 2) | ((third ?? 0) >>> 6)]; - result += third === undefined ? "=" : alphabet[third & 0x3f]; + result += third === undefined ? padding : alphabet[third & 0x3f]; } return result; } +/** Standard padded base64, the encoding HTTP Basic credentials use. */ +function encodeBase64Utf8(value: string): string { + return encodeBase64(new TextEncoder().encode(value), BASE64_ALPHABET, "="); +} + +/** + * Unpadded base64url. Standard base64 emits `+`, `/`, and `=`, none of which + * may appear in a WebSocket subprotocol, so a browser refuses to offer a + * credential encoded that way and QuestDB refuses to decode one. + */ +function encodeBase64UrlUtf8(value: string): string { + return encodeBase64(new TextEncoder().encode(value), BASE64URL_ALPHABET, ""); +} + function authorizationHeader( authentication: QwpBrowserSessionAuthentication, + label?: string, + subject?: string, ): string { - validateAuthentication(authentication); + validateAuthentication(authentication, label, subject); return authentication.type === "basic" ? `Basic ${encodeBase64Utf8(`${authentication.username}:${authentication.password}`)}` : `Bearer ${authentication.token}`; } +const QWP_BROWSER_AUTH_LABEL = "browser auth"; + +/** + * The subprotocol that carries `authentication` through a WebSocket upgrade: + * its HTTP `Authorization` value, base64url-encoded without padding. + * + * QuestDB decodes that value only when it is printable ASCII that neither + * starts nor ends with a space. A Basic value always is, because the username + * and password travel inside its own base64. A bearer token is spliced in + * verbatim, so one with a space, a control character, or a non-ASCII + * character is refused here, where the error can say why, rather than sent + * to a 401 the browser never shows. + */ +function browserCredentialProtocol( + authentication: QwpBrowserSessionAuthentication, +): string { + const authorization = authorizationHeader( + authentication, + QWP_BROWSER_AUTH_LABEL, + `${QWP_BROWSER_AUTH_LABEL} credential`, + ); + if ( + authentication.type === "bearer" && + !/^[\x21-\x7e]+$/.test(authentication.token) + ) { + throw new TypeError( + `${QWP_BROWSER_AUTH_LABEL} bearer token must contain only visible ASCII characters`, + ); + } + return ( + QWP_AUTHORIZATION_WEBSOCKET_PROTOCOL_PREFIX + + encodeBase64UrlUtf8(authorization) + ); +} + +function protocolList( + protocols: string | readonly string[] | undefined, +): readonly string[] { + if (protocols === undefined) return []; + return typeof protocols === "string" ? [protocols] : protocols; +} + +/** + * Rejects an `auth` configuration that could never authenticate. + * + * Runs when a public entry point accepts the options, so the mistake surfaces + * there, and again before every connection attempt, where it is marked + * non-retryable: no retry can fix an option. + */ +function validateBrowserAuthOptions(options: { + auth?: QwpBrowserSessionAuthentication | QwpBrowserAuthProvider; + sessionBootstrap?: QwpBrowserSessionBootstrapConfig; + protocols?: string | readonly string[]; +}): void { + const { auth } = options; + if (auth === undefined) return; + // One or the other decides how the upgrade authenticates. QuestDB ignores + // the session cookie on an upgrade that offers a credential, so a bootstrap + // alongside `auth` would only issue cookies nothing uses. + if (options.sessionBootstrap) { + throw new TypeError( + "auth cannot be combined with sessionBootstrap; configure exactly one of them", + ); + } + if (typeof auth !== "function") browserCredentialProtocol(auth); + // A second credential makes QuestDB refuse the whole offer. + if ( + protocolList(options.protocols).some(isQwpAuthorizationWebSocketProtocol) + ) { + throw new TypeError( + `protocols cannot contain a ${QWP_AUTHORIZATION_WEBSOCKET_PROTOCOL_PREFIX}* credential when auth is set`, + ); + } +} + +/** Resolves `auth` for one connection attempt into its credential subprotocol. */ +async function resolveBrowserCredentialProtocol( + auth: QwpBrowserSessionAuthentication | QwpBrowserAuthProvider, + endpoint: string | URL, + signal: AbortSignal, +): Promise { + if (typeof auth !== "function") return browserCredentialProtocol(auth); + let authentication: QwpBrowserSessionAuthentication; + try { + authentication = await auth({ signal }); + } catch (error) { + // The credential does not depend on the endpoint, so the next one would + // fail the same way: stop the sweep and leave the retry to reconnect + // backoff. A provider that knows retrying cannot help says so the way the + // rest of the client does, with `retryable: false`. + throw new QwpUpgradeError("QWP browser auth provider failed", { + kind: QWP_UPGRADE_ERROR_KIND.AUTHENTICATION, + retryable: + (error as { retryable?: unknown } | null | undefined)?.retryable !== + false, + tryNextEndpoint: false, + url: endpoint, + cause: error, + }); + } + try { + return browserCredentialProtocol(authentication); + } catch (error) { + throw new QwpUpgradeError( + `QWP browser auth provider returned an invalid credential: ${(error as Error).message}`, + { + kind: QWP_UPGRADE_ERROR_KIND.AUTHENTICATION, + retryable: false, + tryNextEndpoint: false, + url: endpoint, + cause: error, + }, + ); + } +} + +/** + * A server that selects the credential subprotocol has copied the secret into + * its 101 response, where proxies and response logging can record it. QuestDB + * never does: it selects `questdb.qwp.v1` or durable ACK. This is therefore a + * server defect, not a negotiation outcome, and since every node of a cluster + * normally runs the same build, walking the endpoint list or retrying would + * only repeat the exposure. + */ +function credentialEchoError(endpoint: string | URL): QwpUpgradeError { + return new QwpUpgradeError( + "QWP server selected the browser credential as its WebSocket subprotocol, echoing the credential in its upgrade response; this is a server defect", + { + kind: QWP_UPGRADE_ERROR_KIND.CAPABILITY_MISMATCH, + retryable: false, + tryNextEndpoint: false, + url: endpoint, + }, + ); +} + /** * The endpoint as text with any userinfo removed, for an error message. * @@ -356,8 +561,25 @@ export interface QwpBrowserWebSocketOptions extends QwpWebSocketConnectOptions { /** * Authenticates over REST before every WebSocket connection attempt so the * browser can attach QuestDB's HttpOnly session cookies to the upgrade. + * Cannot be combined with `auth`. */ sessionBootstrap?: QwpBrowserSessionBootstrapConfig; + /** + * Authenticates every WebSocket upgrade with a credential carried in its + * subprotocol offer instead of a session cookie. This is how a web + * application served from another origin, which QuestDB lists in + * `qwp.browser.allowed.origins`, connects. Pass a fixed credential, or a + * {@link QwpBrowserAuthProvider} the client calls before every connect, + * reconnect, and failover attempt, for example to supply a refreshed OIDC + * access token. + * + * QuestDB accepts the credential only from a listed origin: a page served + * from QuestDB's own origin must be listed too, or keep using + * `sessionBootstrap`. It creates no session for the credential and ignores + * cookies on the upgrade. Use `wss:`: the credential travels in the opening + * HTTP request. Cannot be combined with `sessionBootstrap`. + */ + auth?: QwpBrowserSessionAuthentication | QwpBrowserAuthProvider; /** Test or framework hook; defaults to the browser's global WebSocket. */ webSocketFactory?: ( url: string | URL, @@ -389,8 +611,16 @@ export interface QwpBrowserClusterOptions extends QwpWebSocketConnectOptions { /** * Authenticates before every connection attempt. When `url` is omitted from * this bootstrap, its REST endpoint follows the active cluster endpoint. + * Cannot be combined with `auth`. */ sessionBootstrap?: QwpBrowserSessionBootstrapConfig; + /** + * Credential sent with every ingress and egress WebSocket upgrade; see + * {@link QwpBrowserWebSocketOptions.auth}. A provider is called before every + * connection attempt of either side. Cannot be combined with + * `sessionBootstrap`. + */ + auth?: QwpBrowserSessionAuthentication | QwpBrowserAuthProvider; /** Shared test or framework hook; either side may override it. */ webSocketFactory?: ( url: string | URL, @@ -496,14 +726,16 @@ function composeBrowserAbortSignals( * Opens a QWP-capable browser WebSocket. * * Browsers cannot set Authorization or X-QWP-* upgrade headers. QuestDB accepts - * browser upgrades when Origin and Host have the same authority, so serve the - * app from the QuestDB origin or route QWP through a same-origin reverse proxy. - * When authentication is enabled, pass sessionBootstrap or call - * bootstrapQwpBrowserSession first so the browser can attach qdb_session. + * browser upgrades when Origin and Host have the same authority, or when the + * server lists the Origin in `qwp.browser.allowed.origins`. When + * authentication is enabled, a same-origin app can pass sessionBootstrap or + * call bootstrapQwpBrowserSession first so the browser can attach + * qdb_session; an app on a listed origin passes `auth` instead. */ export function connectQwpBrowserWebSocket( options: QwpBrowserWebSocketOptions, ): Promise { + validateBrowserAuthOptions(options); return createQwpFailoverConnectionFactory( options.url, options.failoverUrls, @@ -516,6 +748,7 @@ export function connectQwpBrowserWebSocket( export function createQwpBrowserConnectionFactory( options: QwpBrowserWebSocketOptions, ): QwpConnectionFactory { + validateBrowserAuthOptions(options); return createQwpFailoverConnectionFactory( options.url, options.failoverUrls, @@ -528,7 +761,7 @@ async function connectQwpBrowserEndpoint( options: QwpBrowserWebSocketOptions, endpoint: string | URL, requestEndpoint: string | URL, - protocols: string | string[] | undefined, + requestDurableAck: boolean, signal: AbortSignal | undefined, completeHandshake: ( selectedProtocol: string | undefined, @@ -538,6 +771,11 @@ async function connectQwpBrowserEndpoint( ) => Promise = async (connection) => connection, ): Promise { validateQwpWebSocketTimeouts(options); + try { + validateBrowserAuthOptions(options); + } catch (error) { + throw error instanceof Error ? qwpNonRetryable(error) : error; + } const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_BROWSER_CONNECT_TIMEOUT_MS; const openingAbort = new AbortController(); @@ -581,7 +819,15 @@ async function connectQwpBrowserEndpoint( } const opening = (async (): Promise => { - if (options.sessionBootstrap) { + let credentialProtocol: string | undefined; + if (options.auth !== undefined) { + if (openingAbort.signal.aborted) throw new QwpSendClosedError(); + credentialProtocol = await resolveBrowserCredentialProtocol( + options.auth, + endpoint, + openingAbort.signal, + ); + } else if (options.sessionBootstrap) { const bootstrapAbort = composeBrowserAbortSignals([ openingAbort.signal, options.sessionBootstrap.signal, @@ -613,14 +859,28 @@ async function connectQwpBrowserEndpoint( } return new WebSocketConstructor(url, protocols); }); - const socket = factory(requestEndpoint, protocols); + const socket = factory( + requestEndpoint, + qwpBrowserWebSocketProtocols( + options.protocols, + requestDurableAck, + credentialProtocol, + ), + ); openedConnection = await openQwpWebSocket(socket, { signal: openingAbort.signal, url: endpoint, connectTimeoutMs, sendTimeoutMs: options.sendTimeoutMs, closeTimeoutMs: options.closeTimeoutMs, - completeHandshake: () => completeHandshake(socket.protocol), + completeHandshake: () => { + // Checked whoever put the credential in the offer, and before the + // selection is read for anything else. + if (isQwpAuthorizationWebSocketProtocol(socket.protocol)) { + throw credentialEchoError(endpoint); + } + return completeHandshake(socket.protocol); + }, opaqueErrors: true, }); return finishOpening(openedConnection); @@ -692,14 +952,11 @@ function connectQwpBrowserRawEndpoint( const requestEndpoint = requestDurableAck ? browserNegotiationUrl(endpoint, QWP_BROWSER_HANDSHAKE_PARAM, "v1") : endpoint; - const protocols = requestDurableAck - ? addQwpDurableAckWebSocketProtocol(options.protocols) - : options.protocols; return connectQwpBrowserEndpoint( options, endpoint, requestEndpoint, - protocols, + requestDurableAck, signal, (selectedProtocol) => browserIngressHandshake(options, endpoint, selectedProtocol), @@ -864,9 +1121,7 @@ async function connectQwpBrowserIngressEndpoint( options, endpoint, browserNegotiationUrl(endpoint, QWP_BROWSER_HANDSHAKE_PARAM, "v1"), - options.requestDurableAck - ? addQwpDurableAckWebSocketProtocol(options.protocols) - : options.protocols, + options.requestDurableAck === true, signal, (selectedProtocol) => browserIngressHandshake(options, endpoint, selectedProtocol), @@ -914,11 +1169,13 @@ function connectQwpBrowserEgressEndpoint( String(maxBatchRows), ); } + // Never durable ACK, which only ingress negotiates: an egress upgrade whose + // only dialect is durable ACK selects nothing, and a browser fails that. return connectQwpBrowserEndpoint( options, endpoint, requestEndpoint, - options.protocols, + false, signal, () => ({ qwpVersion: QWP_VERSION, @@ -969,6 +1226,9 @@ export function createQwpBrowserSender( "awaitDurableAck cannot be combined with requestDurableAck=false", ); } + // The sender connects lazily; without this a bad `auth` would surface only + // from the first connect() or flush(). + validateBrowserAuthOptions(options); return new QwpSender( (signal) => connectQwpBrowserIngress( @@ -1002,6 +1262,7 @@ export async function connectQwpBrowserEgress( /** Cancels an opening connection during pooled-client shutdown. */ signal?: AbortSignal, ): Promise { + validateBrowserAuthOptions(options); return QwpEgressSession.connect( createQwpEgressFailoverConnectionFactory( options.url, @@ -1027,6 +1288,7 @@ const CLUSTER_OWNED_BROWSER_OPTION_NAMES = [ "url", "failoverUrls", "sessionBootstrap", + "auth", ] as const; function assertNoBrowserClusterOptionConflicts( @@ -1098,6 +1360,10 @@ function resolveQwpBrowserClientOptions( // would hand this client's session credentials and rows. assertUniformQwpEndpointScheme(ingress.url, ingress.failoverUrls); assertUniformQwpEndpointScheme(egress.url, egress.failoverUrls); + // After the merge: a side's own `protocols` override meets the shared + // `auth` only here. + validateBrowserAuthOptions(ingress); + validateBrowserAuthOptions(egress); return { ingress, egress, @@ -1113,6 +1379,8 @@ function resolveQwpBrowserClientOptions( ); } const split = options as QwpBrowserSplitClientOptions; + validateBrowserAuthOptions(split.ingress); + validateBrowserAuthOptions(split.egress); return { ingress: split.ingress, egress: split.egress, diff --git a/packages/client-core/src/_qwp/_core/durable-ack.ts b/packages/client-core/src/_qwp/_core/durable-ack.ts index 0aba5f8e..9af8ae13 100644 --- a/packages/client-core/src/_qwp/_core/durable-ack.ts +++ b/packages/client-core/src/_qwp/_core/durable-ack.ts @@ -4,6 +4,22 @@ */ export const QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL = "questdb.qwp.durable-ack.v1"; +/** + * @internal Browser-visible QWP dialect. QuestDB selects it on both `/write/v4` + * and `/read/v1` when a browser offers it, except that ingress selects durable + * ACK instead when that was offered too. + */ +export const QWP_V1_WEBSOCKET_PROTOCOL = "questdb.qwp.v1"; + +/** + * @internal Prefix of the subprotocol that carries a browser credential. The + * rest of the token is the unpadded base64url encoding of an HTTP + * `Authorization` value: `=`, `+`, and `/` are not HTTP token characters, and a + * subprotocol must be a token. + */ +export const QWP_AUTHORIZATION_WEBSOCKET_PROTOCOL_PREFIX = + "questdb.qwp.authorization."; + /** Adds the durable-ACK capability token without mutating user options. */ export function addQwpDurableAckWebSocketProtocol( protocols: string | readonly string[] | undefined, @@ -25,3 +41,49 @@ export function isQwpDurableAckWebSocketProtocol( ): boolean { return protocol === QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL; } + +/** @internal True for a subprotocol token that carries a browser credential. */ +export function isQwpAuthorizationWebSocketProtocol( + protocol: string | undefined, +): boolean { + return ( + protocol !== undefined && + protocol.startsWith(QWP_AUTHORIZATION_WEBSOCKET_PROTOCOL_PREFIX) + ); +} + +/** + * @internal Builds the subprotocol offer of a browser upgrade without mutating + * the caller's list. + * + * Without a credential this is the offer browsers have always made: the + * caller's protocols, plus durable ACK when requested. A credential cannot be + * offered on its own. QuestDB accepts it only on an upgrade whose 101 response + * will select a QWP dialect, and never selects the credential itself, so an + * offer without one is refused -- and a browser fails every handshake whose + * response selects none of its offers anyway. The dialect is durable ACK when + * requested, which ingress selects in preference, and otherwise + * `questdb.qwp.v1`, the only one egress selects. + */ +export function qwpBrowserWebSocketProtocols( + protocols: string | readonly string[] | undefined, + requestDurableAck: boolean, + credentialProtocol?: string, +): string | string[] | undefined { + if (credentialProtocol === undefined) { + if (requestDurableAck) return addQwpDurableAckWebSocketProtocol(protocols); + return typeof protocols === "object" ? [...protocols] : protocols; + } + const dialect = requestDurableAck + ? QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL + : QWP_V1_WEBSOCKET_PROTOCOL; + const offer = + protocols === undefined + ? [] + : typeof protocols === "string" + ? [protocols] + : [...protocols]; + if (!offer.includes(dialect)) offer.push(dialect); + offer.push(credentialProtocol); + return offer; +} diff --git a/packages/client-core/src/_qwp/_core/index.ts b/packages/client-core/src/_qwp/_core/index.ts index e346270a..6e1e377f 100644 --- a/packages/client-core/src/_qwp/_core/index.ts +++ b/packages/client-core/src/_qwp/_core/index.ts @@ -2,7 +2,13 @@ export * from "./bytes"; export * from "./binds"; export * from "./compression"; export * from "./constants"; -export * from "./durable-ack"; +// Named, unlike its neighbours: the credential subprotocol helpers in this +// module are browser-adapter internals, not public API of either package. +export { + addQwpDurableAckWebSocketProtocol, + isQwpDurableAckWebSocketProtocol, + QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL, +} from "./durable-ack"; export * from "./egress"; export * from "./errors"; export * from "./frame"; diff --git a/test/dist-types/public-api-types.ts b/test/dist-types/public-api-types.ts index ef62c5bd..e2bd97c3 100644 --- a/test/dist-types/public-api-types.ts +++ b/test/dist-types/public-api-types.ts @@ -140,6 +140,8 @@ export type { QwpBinaryConnection as BrowserQwpBinaryConnection, QwpBindSetter as BrowserQwpBindSetter, QwpBindType as BrowserQwpBindType, + QwpBrowserAuthContext, + QwpBrowserAuthProvider, QwpBrowserClientEgressOptions, QwpBrowserClientIngressOptions, QwpBrowserClientOptions, diff --git a/test/qwp/browser.e2e.ts b/test/qwp/browser.e2e.ts index 91858f60..9a3645a0 100644 --- a/test/qwp/browser.e2e.ts +++ b/test/qwp/browser.e2e.ts @@ -136,6 +136,29 @@ function browserResultEnd( return encodeQwpFrame(payload.toUint8Array()); } +const QWP_V1_PROTOCOL = "questdb.qwp.v1"; +const CREDENTIAL_PREFIX = "questdb.qwp.authorization."; + +/** + * Decodes the credentials in a subprotocol offer by QuestDB's rules -- + * unpadded canonical base64url of printable ASCII that neither starts nor ends + * with a space -- and returns their Authorization values. + */ +function offeredAuthorizations(protocols: ReadonlySet): string[] { + return [...protocols] + .filter((protocol) => protocol.startsWith(CREDENTIAL_PREFIX)) + .map((protocol) => { + const encoded = protocol.slice(CREDENTIAL_PREFIX.length); + expect(encoded).toMatch(/^[A-Za-z0-9_-]+$/); + expect(encoded.length % 4).not.toBe(1); + const decoded = Buffer.from(encoded, "base64url"); + expect(decoded.toString("base64url")).toBe(encoded); + const value = decoded.toString("latin1"); + expect(value).toMatch(/^[\x21-\x7e](?:[\x20-\x7e]*[\x21-\x7e])?$/); + return value; + }); +} + function browserCancelled(requestId: bigint): Uint8Array { const message = new TextEncoder().encode("cancelled by client deadline"); const payload = new QwpByteWriter(); @@ -294,6 +317,174 @@ describe("QWP in a real browser", () => { } }); + it("authenticates a cross-origin page through the credential subprotocol", async () => { + // The page is served from another port, so every upgrade below is a + // cross-origin one: the third-party application this path exists for. + // A JWT-sized token checks that the browser accepts a long subprotocol. + const token = `eyJ${"a".repeat(1_200)}.eyJ${"b".repeat(600)}.${"c".repeat(342)}`; + const upgrades: { + path: string; + origin?: string; + authorizations: string[]; + selected: string | false; + }[] = []; + const server = new WebSocketServer({ + host: "127.0.0.1", + port: 0, + // QuestDB's selection: durable ACK when offered on ingress, otherwise + // questdb.qwp.v1, never the credential. + handleProtocols: (protocols, request) => { + const path = new URL(request.url!, "http://localhost").pathname; + const selected = + path.endsWith("/write/v4") && + protocols.has(QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL) + ? QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL + : protocols.has(QWP_V1_PROTOCOL) + ? QWP_V1_PROTOCOL + : false; + upgrades.push({ + path, + origin: request.headers.origin, + authorizations: offeredAuthorizations(protocols), + selected, + }); + return selected; + }, + }); + server.on("connection", (socket, request) => { + socket.send( + request.url!.startsWith("/read/v1") + ? browserServerInfo() + : browserIngressServerInfo(1_048_576, true), + ); + }); + await waitForWebSocketServer(server); + const address = server.address() as AddressInfo; + const page = await browser.newPage(); + try { + await page.goto(assetUrl); + const result = await page.evaluate( + async ({ moduleUrl, url, token }) => { + const importModule = new Function("url", "return import(url)") as ( + url: string, + ) => Promise>; + const qwp = await importModule(moduleUrl); + let providerCalls = 0; + let signalsAreAbortSignals = true; + const client = await qwp.connectQwpBrowserClient({ + cluster: { + url, + auth: async ({ signal }: { signal: AbortSignal }) => { + providerCalls++; + signalsAreAbortSignals &&= signal instanceof AbortSignal; + return { type: "bearer", token }; + }, + }, + ingress: { requestDurableAck: true }, + }); + try { + return { providerCalls, signalsAreAbortSignals }; + } finally { + await client.close(); + } + }, + { + moduleUrl: assetUrl, + url: `ws://127.0.0.1:${address.port}`, + token, + }, + ); + + expect(result).toEqual({ + providerCalls: 2, + signalsAreAbortSignals: true, + }); + const pageOrigin = new URL(assetUrl).origin; + expect( + upgrades.sort((left, right) => left.path.localeCompare(right.path)), + ).toEqual([ + { + path: "/read/v1", + origin: pageOrigin, + authorizations: [`Bearer ${token}`], + selected: QWP_V1_PROTOCOL, + }, + { + path: "/write/v4", + origin: pageOrigin, + authorizations: [`Bearer ${token}`], + selected: QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL, + }, + ]); + } finally { + await page.close(); + await closeWebSocketServer(server); + } + }); + + it("refuses a server that echoes the credential, in a real browser", async () => { + // The credential is in the offer, so a browser accepts a 101 that selects + // it; only the client's own check stands between that and an open session. + const server = new WebSocketServer({ + host: "127.0.0.1", + port: 0, + handleProtocols: (protocols) => + [...protocols].find((protocol) => + protocol.startsWith(CREDENTIAL_PREFIX), + ) ?? false, + }); + let connections = 0; + server.on("connection", (socket) => { + connections++; + socket.send(browserServerInfo()); + }); + await waitForWebSocketServer(server); + const address = server.address() as AddressInfo; + const page = await browser.newPage(); + try { + await page.goto(assetUrl); + const result = await page.evaluate( + async ({ moduleUrl, url }) => { + const importModule = new Function("url", "return import(url)") as ( + url: string, + ) => Promise>; + const qwp = await importModule(moduleUrl); + try { + const session = await qwp.connectQwpBrowserEgress({ + url, + auth: { type: "bearer", token: "echoed-secret" }, + }); + await session.close(); + return { connected: true }; + } catch (error) { + const failure = error as Record; + return { + name: failure.name, + kind: failure.kind, + retryable: failure.retryable, + tryNextEndpoint: failure.tryNextEndpoint, + }; + } + }, + { + moduleUrl: assetUrl, + url: `ws://127.0.0.1:${address.port}/read/v1`, + }, + ); + + expect(connections).toBe(1); + expect(result).toEqual({ + name: "QwpUpgradeError", + kind: "capability-mismatch", + retryable: false, + tryNextEndpoint: false, + }); + } finally { + await page.close(); + await closeWebSocketServer(server); + } + }); + it("walks failoverUrls when the preferred endpoint refuses, in a real browser", async () => { // A browser never sees the HTTP response, so a refused connection surfaces // as a bare error event that openQwpWebSocket classifies `opaque` with diff --git a/test/qwp/core.test.ts b/test/qwp/core.test.ts index a0964747..be1340f9 100644 --- a/test/qwp/core.test.ts +++ b/test/qwp/core.test.ts @@ -47,6 +47,12 @@ import { writeQwpFrameHeader, writeQwpVarint, } from "../../packages/client-core/src/qwp"; +import { + isQwpAuthorizationWebSocketProtocol, + QWP_AUTHORIZATION_WEBSOCKET_PROTOCOL_PREFIX, + QWP_V1_WEBSOCKET_PROTOCOL, + qwpBrowserWebSocketProtocols, +} from "../../packages/client-core/src/_qwp/_core/durable-ack"; import { decodeUtf8, encodeUtf8, @@ -252,6 +258,71 @@ describe("QWP browser durable-ACK negotiation", () => { ).toEqual(["application.v1", QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL]); }); + it("keeps the offer unchanged when no credential is offered", () => { + // A browser fails a handshake whose response selects none of its offers, + // so adding questdb.qwp.v1 here would break every server that predates it. + expect(qwpBrowserWebSocketProtocols(undefined, false)).toBeUndefined(); + expect(qwpBrowserWebSocketProtocols("application.v1", false)).toBe( + "application.v1", + ); + const protocols = ["application.v1"]; + const offer = qwpBrowserWebSocketProtocols(protocols, false); + expect(offer).toEqual(["application.v1"]); + expect(offer).not.toBe(protocols); + expect(qwpBrowserWebSocketProtocols(undefined, true)).toBe( + QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL, + ); + }); + + it("pairs a credential with exactly one dialect the server selects", () => { + const credential = `${QWP_AUTHORIZATION_WEBSOCKET_PROTOCOL_PREFIX}QmVhcmVyIHQ`; + expect(qwpBrowserWebSocketProtocols(undefined, false, credential)).toEqual([ + QWP_V1_WEBSOCKET_PROTOCOL, + credential, + ]); + // Ingress selects durable ACK in preference, and the credential gate + // accepts it as the dialect, so it replaces questdb.qwp.v1. + expect(qwpBrowserWebSocketProtocols(undefined, true, credential)).toEqual([ + QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL, + credential, + ]); + const protocols = ["application.v1", QWP_V1_WEBSOCKET_PROTOCOL]; + expect(qwpBrowserWebSocketProtocols(protocols, false, credential)).toEqual([ + "application.v1", + QWP_V1_WEBSOCKET_PROTOCOL, + credential, + ]); + expect(protocols).toEqual(["application.v1", QWP_V1_WEBSOCKET_PROTOCOL]); + expect( + qwpBrowserWebSocketProtocols("application.v1", false, credential), + ).toEqual(["application.v1", QWP_V1_WEBSOCKET_PROTOCOL, credential]); + }); + + it("recognizes credential subprotocols by their prefix alone", () => { + expect( + isQwpAuthorizationWebSocketProtocol( + `${QWP_AUTHORIZATION_WEBSOCKET_PROTOCOL_PREFIX}QmVhcmVyIHQ`, + ), + ).toBe(true); + expect( + isQwpAuthorizationWebSocketProtocol( + QWP_AUTHORIZATION_WEBSOCKET_PROTOCOL_PREFIX, + ), + ).toBe(true); + for (const protocol of [ + undefined, + "", + QWP_V1_WEBSOCKET_PROTOCOL, + QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL, + "questdb.qwp.authorization", + "x-questdb.qwp.authorization.QmVhcmVyIHQ", + ]) { + expect(isQwpAuthorizationWebSocketProtocol(protocol), protocol).toBe( + false, + ); + } + }); + it("encodes a side-effect-free table-less durable progress poll", () => { expect(decodeQwpFrame(encodeQwpDurableAckPollFrame())).toMatchObject({ flags: QWP_FLAG_DURABLE_ACK_POLL, diff --git a/test/qwp/public-api-contract.ts b/test/qwp/public-api-contract.ts index 367a85a7..ac8fa160 100644 --- a/test/qwp/public-api-contract.ts +++ b/test/qwp/public-api-contract.ts @@ -33,6 +33,8 @@ import { connectQwpBrowserSender, } from "../../packages/browser-client/src"; import type { + QwpBrowserAuthContext, + QwpBrowserAuthProvider, QwpBrowserClusterOptions, QwpBrowserClientEgressOptions, QwpBrowserClientIngressOptions, @@ -271,6 +273,37 @@ const browserClusterOptionsContract: QwpBrowserClusterOptions = { }, }; +// A provider may return the credential directly or through a promise, and may +// ignore its context; the signal is always an AbortSignal. +const browserAuthProviderContract: QwpBrowserAuthProvider = async ( + context: QwpBrowserAuthContext, +) => { + const signal: AbortSignal = context.signal; + void signal; + return { type: "bearer", token: "oidc-access-token" }; +}; + +const browserAuthOptionsContracts: readonly QwpBrowserWebSocketOptions[] = [ + { + url: "wss://node-1.example/write/v4", + auth: { type: "bearer", token: "rest-token" }, + }, + { + url: "wss://node-1.example/write/v4", + auth: { type: "basic", username: "admin", password: "quest" }, + }, + { url: "wss://node-1.example/write/v4", auth: browserAuthProviderContract }, + { + url: "wss://node-1.example/write/v4", + auth: () => ({ type: "bearer", token: "rest-token" }), + }, +]; + +const browserClusterAuthContract: QwpBrowserClusterOptions = { + url: "wss://node-1.example/qdb", + auth: browserAuthProviderContract, +}; + const browserIngressOverridesContract: QwpBrowserClientIngressOptions = { requestDurableAck: true, ingressNegotiationTimeoutMs: 1_000, @@ -550,6 +583,8 @@ void egressSessionOptionsContract; void fixedConnectionIngressContract; void fixedConnectionEgressContract; void browserEgressOptionsContract; +void browserAuthOptionsContracts; +void browserClusterAuthContract; void nodeEgressOptionsContract; void rootExtraOptionsContract; void senderSequenceContract; diff --git a/test/qwp/session.test.ts b/test/qwp/session.test.ts index 383b7542..5f557f86 100644 --- a/test/qwp/session.test.ts +++ b/test/qwp/session.test.ts @@ -2344,6 +2344,644 @@ describe("QWP WebSocket adapters", () => { }); }); +// Literal wire strings rather than the client's constants: these pin the +// contract QuestDB implements, which a renamed constant must not move. +const QWP_V1_PROTOCOL = "questdb.qwp.v1"; +const CREDENTIAL_PREFIX = "questdb.qwp.authorization."; + +function offeredProtocols( + protocols: string | string[] | undefined, +): readonly string[] { + if (protocols === undefined) return []; + return typeof protocols === "string" ? [protocols] : protocols; +} + +/** + * Decodes a credential offer by QuestDB's rules and returns the Authorization + * value: exactly one credential, unpadded canonical base64url, decoding to + * printable ASCII that neither starts nor ends with a space. + */ +function decodeBrowserCredential( + protocols: string | string[] | undefined, +): string { + const credentials = offeredProtocols(protocols).filter((protocol) => + protocol.startsWith(CREDENTIAL_PREFIX), + ); + expect(credentials).toHaveLength(1); + const encoded = credentials[0].slice(CREDENTIAL_PREFIX.length); + expect(encoded).toMatch(/^[A-Za-z0-9_-]+$/); + expect(encoded.length % 4).not.toBe(1); + const decoded = Buffer.from(encoded, "base64url"); + expect(decoded.toString("base64url")).toBe(encoded); + const value = decoded.toString("latin1"); + expect(value).toMatch(/^[\x21-\x7e](?:[\x20-\x7e]*[\x21-\x7e])?$/); + return value; +} + +/** + * A socket that answers a browser upgrade the way QuestDB does: it selects + * durable ACK when offered, otherwise questdb.qwp.v1, never the credential, + * and then sends the SERVER_INFO its endpoint begins with. + */ +function questDbBrowserSocket( + url: string | URL, + protocols: string | string[] | undefined, +): FakeWebSocket { + const offer = offeredProtocols(protocols); + const socket = new FakeWebSocket(); + socket.protocol = offer.includes(QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL) + ? QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL + : offer.includes(QWP_V1_PROTOCOL) + ? QWP_V1_PROTOCOL + : ""; + const egress = new URL(url).pathname.endsWith("/read/v1"); + queueMicrotask(() => { + socket.open(); + socket.message( + egress + ? serverInfoFrame() + : ingressServerInfo( + 1_048_576, + socket.protocol === QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL, + ), + ); + }); + return socket; +} + +describe("QWP browser credential authentication", () => { + it("offers questdb.qwp.v1 and an unpadded base64url credential on ingress", async () => { + const token = "q~t1?Zx"; + // Standard base64 of this value needs all three characters a subprotocol + // cannot carry, so the offer below proves the URL-safe unpadded form. + expect(Buffer.from(`Bearer ${token}`).toString("base64")).toBe( + "QmVhcmVyIHF+dDE/Wng=", + ); + let requestUrl: URL | undefined; + let offered: string | string[] | undefined; + const session = await connectQwpBrowserIngress({ + url: "wss://questdb.example/write/v4", + auth: { type: "bearer", token }, + webSocketFactory: (url, protocols) => { + requestUrl = new URL(url); + offered = protocols; + return asQwpSocket(questDbBrowserSocket(url, protocols)); + }, + }); + try { + expect(offered).toEqual([ + QWP_V1_PROTOCOL, + `${CREDENTIAL_PREFIX}QmVhcmVyIHF-dDE_Wng`, + ]); + expect(decodeBrowserCredential(offered)).toBe(`Bearer ${token}`); + // The credential travels in the subprotocol offer alone. + expect([...requestUrl!.searchParams.keys()]).toEqual([ + "qwp_browser_handshake", + ]); + expect(session.handshake.maxBatchSizeBytes).toBe(1_048_576); + } finally { + await session.close(); + } + }); + + it("sends Basic credentials as the Authorization value on the query path", async () => { + const offers: (string | string[] | undefined)[] = []; + const connect = ( + username: string, + password: string, + ): Promise<{ close(): Promise }> => + connectQwpBrowserEgress({ + url: "wss://questdb.example/read/v1", + auth: { type: "basic", username, password }, + webSocketFactory: (url, protocols) => { + offers.push(protocols); + return asQwpSocket(questDbBrowserSocket(url, protocols)); + }, + }); + + await (await connect("admin", "quest")).close(); + // The pairing QuestDB's own test fixture decodes. + expect(offers[0]).toEqual([ + QWP_V1_PROTOCOL, + `${CREDENTIAL_PREFIX}QmFzaWMgWVdSdGFXNDZjWFZsYzNRPQ`, + ]); + expect(decodeBrowserCredential(offers[0])).toBe("Basic YWRtaW46cXVlc3Q="); + + // Non-ASCII credentials travel inside the Basic value's own base64. + await (await connect("zoë", "pässwörd ok")).close(); + expect(decodeBrowserCredential(offers[1])).toBe( + `Basic ${Buffer.from("zoë:pässwörd ok", "utf8").toString("base64")}`, + ); + }); + + it("offers durable ACK instead of questdb.qwp.v1 when requested", async () => { + let offered: string | string[] | undefined; + const session = await connectQwpBrowserIngress({ + url: "wss://questdb.example/write/v4", + requestDurableAck: true, + auth: { type: "bearer", token: "rest-token" }, + webSocketFactory: (url, protocols) => { + offered = protocols; + return asQwpSocket(questDbBrowserSocket(url, protocols)); + }, + }); + try { + expect(offered).toEqual([ + QWP_DURABLE_ACK_WEBSOCKET_PROTOCOL, + expect.stringMatching(/^questdb\.qwp\.authorization\./), + ]); + expect(decodeBrowserCredential(offered)).toBe("Bearer rest-token"); + expect(session.handshake.durableAckEnabled).toBe(true); + } finally { + await session.close(); + } + }); + + it("keeps caller protocols and never offers durable ACK on the query path", async () => { + const offers: (string | string[] | undefined)[] = []; + const webSocketFactory = ( + url: string | URL, + protocols?: string | string[], + ): QwpWebSocketLike => { + offers.push(protocols); + return asQwpSocket(questDbBrowserSocket(url, protocols)); + }; + const url = "wss://questdb.example/read/v1"; + + // The split client form accepts ingress-only keys on egress options. + await ( + await connectQwpBrowserEgress({ + url, + protocols: ["application.v1", QWP_V1_PROTOCOL], + requestDurableAck: true, + auth: { type: "bearer", token: "rest-token" }, + webSocketFactory, + }) + ).close(); + expect(offers[0]).toEqual([ + "application.v1", + QWP_V1_PROTOCOL, + expect.stringMatching(/^questdb\.qwp\.authorization\./), + ]); + + // Without auth the offer stays exactly what the caller configured: a + // server that predates questdb.qwp.v1 would select nothing from it. + await ( + await connectQwpBrowserEgress({ + url, + protocols: ["application.v1"], + webSocketFactory, + }) + ).close(); + await (await connectQwpBrowserEgress({ url, webSocketFactory })).close(); + expect(offers.slice(1)).toEqual([["application.v1"], undefined]); + }); + + it("calls the auth provider before every connect, failover, and reconnect attempt", async () => { + let providerCalls = 0; + const providerSignals: AbortSignal[] = []; + const attempts: { host: string; authorization: string }[] = []; + const sockets: FakeWebSocket[] = []; + const session = await connectQwpBrowserIngress( + { + url: "wss://node-a.example/write/v4", + failoverUrls: ["wss://node-b.example/write/v4"], + auth: async ({ signal }) => { + providerSignals.push(signal); + return { type: "bearer", token: `token-${++providerCalls}` }; + }, + webSocketFactory: (url, protocols) => { + const host = new URL(url).hostname; + attempts.push({ + host, + authorization: decodeBrowserCredential(protocols), + }); + if (host === "node-a.example") { + // Refused, as a browser reports it: an opaque error and close. + const refused = new FakeWebSocket(); + queueMicrotask(() => { + refused.error(); + refused.close(1006, ""); + }); + return asQwpSocket(refused); + } + const socket = questDbBrowserSocket(url, protocols); + sockets.push(socket); + return asQwpSocket(socket); + }, + }, + { reconnect: { initialBackoffMs: 0, maxBackoffMs: 0 } }, + ); + try { + expect(attempts).toEqual([ + { host: "node-a.example", authorization: "Bearer token-1" }, + { host: "node-b.example", authorization: "Bearer token-2" }, + ]); + + sockets[0].close(1006, "dropped"); + await vi.waitFor(() => expect(sockets).toHaveLength(2)); + // Which endpoint the reconnect sweep tries first depends on health + // bookkeeping; that every attempt asked for a fresh credential does not. + expect(attempts.map((attempt) => attempt.authorization)).toEqual( + Array.from( + { length: providerCalls }, + (_, index) => `Bearer token-${index + 1}`, + ), + ); + expect(providerCalls).toBeGreaterThanOrEqual(3); + expect( + providerSignals.every( + (signal) => signal instanceof AbortSignal && !signal.aborted, + ), + ).toBe(true); + } finally { + await session.close(); + } + }); + + it("includes a stalled auth provider in the connection deadline", async () => { + vi.useFakeTimers(); + try { + let providerSignal: AbortSignal | undefined; + let webSocketFactoryCalls = 0; + const connecting = connectQwpBrowserWebSocket({ + url: "wss://questdb.example/write/v4", + connectTimeoutMs: 25, + auth: ({ signal }) => { + providerSignal = signal; + return new Promise(() => undefined); + }, + webSocketFactory: () => { + webSocketFactoryCalls++; + return asQwpSocket(new FakeWebSocket()); + }, + }); + const rejected = expect(connecting).rejects.toMatchObject({ + name: "QwpUpgradeError", + kind: QWP_UPGRADE_ERROR_KIND.TIMEOUT, + message: "QWP WebSocket connection timed out after 25ms", + } satisfies Partial); + + expect(providerSignal?.aborted).toBe(false); + await vi.advanceTimersByTimeAsync(25); + await rejected; + expect(providerSignal?.aborted).toBe(true); + expect(webSocketFactoryCalls).toBe(0); + } finally { + vi.useRealTimers(); + } + }); + + it("aborts an auth provider still pending when its session closes", async () => { + let providerCalls = 0; + let reconnectSignal: AbortSignal | undefined; + const sockets: FakeWebSocket[] = []; + const session = await connectQwpBrowserIngress( + { + url: "wss://questdb.example/write/v4", + connectTimeoutMs: 30_000, + auth: ({ signal }) => { + if (++providerCalls === 1) { + return { type: "bearer", token: "first" }; + } + reconnectSignal = signal; + return new Promise(() => undefined); + }, + webSocketFactory: (url, protocols) => { + const socket = questDbBrowserSocket(url, protocols); + sockets.push(socket); + return asQwpSocket(socket); + }, + }, + { reconnect: { initialBackoffMs: 0, maxBackoffMs: 0 } }, + ); + + sockets[0].close(1006, "dropped"); + await vi.waitFor(() => expect(providerCalls).toBe(2)); + expect(reconnectSignal?.aborted).toBe(false); + await session.close(); + expect(reconnectSignal?.aborted).toBe(true); + expect(sockets).toHaveLength(1); + }); + + it("fails an attempt whose auth provider throws without walking the endpoints", async () => { + const failure = new Error("identity provider unavailable"); + let providerCalls = 0; + const attempted: string[] = []; + const webSocketFactory = (url: string | URL): QwpWebSocketLike => { + attempted.push(new URL(url).hostname); + return asQwpSocket(new FakeWebSocket()); + }; + await expect( + connectQwpBrowserIngress({ + url: "wss://node-a.example/write/v4", + failoverUrls: ["wss://node-b.example/write/v4"], + auth: () => { + providerCalls++; + throw failure; + }, + webSocketFactory, + }), + ).rejects.toMatchObject({ + name: "QwpUpgradeError", + kind: QWP_UPGRADE_ERROR_KIND.AUTHENTICATION, + retryable: true, + tryNextEndpoint: false, + cause: failure, + } satisfies Partial); + expect(providerCalls).toBe(1); + expect(attempted).toEqual([]); + + // A provider that knows retrying cannot help says so like the rest of the + // client does. + await expect( + connectQwpBrowserWebSocket({ + url: "wss://node-a.example/write/v4", + auth: async () => { + throw Object.assign(new Error("signed out"), { retryable: false }); + }, + webSocketFactory, + }), + ).rejects.toMatchObject({ + kind: QWP_UPGRADE_ERROR_KIND.AUTHENTICATION, + retryable: false, + }); + expect(attempted).toEqual([]); + }); + + it("retries a failed auth provider during reconnect", async () => { + let providerCalls = 0; + const sockets: FakeWebSocket[] = []; + const authorizations: string[] = []; + const session = await connectQwpBrowserIngress( + { + url: "wss://questdb.example/write/v4", + auth: async () => { + if (++providerCalls === 2) throw new Error("token refresh failed"); + return { type: "bearer", token: `token-${providerCalls}` }; + }, + webSocketFactory: (url, protocols) => { + authorizations.push(decodeBrowserCredential(protocols)); + const socket = questDbBrowserSocket(url, protocols); + sockets.push(socket); + return asQwpSocket(socket); + }, + }, + { reconnect: { initialBackoffMs: 0, maxBackoffMs: 0, maxAttempts: 3 } }, + ); + + const pending = session.sendFrame(Uint8Array.of(1)); + await vi.waitFor(() => expect(sockets[0].sent).toHaveLength(1)); + sockets[0].close(1006, "connection lost"); + + await vi.waitFor(() => expect(sockets).toHaveLength(2)); + expect(providerCalls).toBe(3); + expect(authorizations).toEqual(["Bearer token-1", "Bearer token-3"]); + await vi.waitFor(() => expect(sockets[1].sent).toEqual(sockets[0].sent)); + sockets[1].message(ingressResponse(QWP_STATUS.OK, 0n)); + await expect(pending).resolves.toMatchObject({ + status: QWP_STATUS.OK, + sequence: 0n, + }); + await session.close(); + }); + + it("rejects an invalid credential from the auth provider without retrying", async () => { + let webSocketFactoryCalls = 0; + const webSocketFactory = (): QwpWebSocketLike => { + webSocketFactoryCalls++; + return asQwpSocket(new FakeWebSocket()); + }; + for (const [credential, reason] of [ + [{ type: "bearer", token: "not a token" }, "visible ASCII"], + [{ type: "bearer", token: "" }, "bearer token cannot be empty"], + [undefined, "must be a"], + ] as const) { + const error = await connectQwpBrowserWebSocket({ + url: "wss://node-a.example/write/v4", + failoverUrls: ["wss://node-b.example/write/v4"], + auth: () => credential as never, + webSocketFactory, + }).then( + () => undefined, + (reason: unknown) => reason as QwpUpgradeError, + ); + expect(error).toMatchObject({ + name: "QwpUpgradeError", + kind: QWP_UPGRADE_ERROR_KIND.AUTHENTICATION, + retryable: false, + tryNextEndpoint: false, + } satisfies Partial); + expect(error?.message).toContain( + "QWP browser auth provider returned an invalid credential", + ); + expect(error?.message).toContain(reason); + expect(error?.message).not.toContain("not a token"); + } + expect(webSocketFactoryCalls).toBe(0); + }); + + it("validates a fixed auth credential before opening a socket", async () => { + let webSocketFactoryCalls = 0; + const webSocketFactory = (): QwpWebSocketLike => { + webSocketFactoryCalls++; + return asQwpSocket(new FakeWebSocket()); + }; + const url = "wss://questdb.example/write/v4"; + for (const [auth, message] of [ + [ + { type: "bearer", token: "" }, + "browser auth bearer token cannot be empty", + ], + [{ type: "bearer", token: "two words" }, "visible ASCII characters"], + [{ type: "bearer", token: "t\u00f6ken" }, "visible ASCII characters"], + [{ type: "bearer", token: "token\n" }, "cannot contain CR or LF"], + [ + { type: "basic", username: "", password: "quest" }, + "browser auth username cannot be empty", + ], + [ + { type: "basic", username: "ad:min", password: "quest" }, + "browser auth username cannot contain ':'", + ], + [null, "browser auth credential must be a"], + [{ type: "digest" }, "unsupported browser auth credential type 'digest'"], + ] as const) { + expect(() => + createQwpBrowserConnectionFactory({ + url, + auth: auth as never, + webSocketFactory, + }), + ).toThrow(message); + // The sender connects lazily but still refuses the option up front. + expect(() => + createQwpBrowserSender({ url, auth: auth as never, webSocketFactory }), + ).toThrow(message); + await expect( + connectQwpBrowserEgress({ + url: "wss://questdb.example/read/v1", + auth: auth as never, + webSocketFactory, + }), + ).rejects.toThrow(message); + } + expect(webSocketFactoryCalls).toBe(0); + // No error quotes the credential it rejects. + let rejection: unknown; + try { + createQwpBrowserConnectionFactory({ + url, + auth: { type: "bearer", token: "secret value" }, + }); + } catch (error) { + rejection = error; + } + expect(rejection).toBeInstanceOf(TypeError); + expect(String(rejection)).not.toContain("secret"); + }); + + it("rejects auth combined with sessionBootstrap at every entry point", async () => { + const conflict = + "auth cannot be combined with sessionBootstrap; configure exactly one of them"; + const options = { + auth: { type: "bearer", token: "rest-token" }, + sessionBootstrap: { + authentication: { type: "bearer", token: "rest-token" }, + }, + webSocketFactory: () => { + throw new Error("no WebSocket may open"); + }, + } as const; + const ingress = { ...options, url: "wss://questdb.example/write/v4" }; + const egress = { ...options, url: "wss://questdb.example/read/v1" }; + + expect(() => connectQwpBrowserWebSocket(ingress)).toThrow(conflict); + expect(() => createQwpBrowserConnectionFactory(ingress)).toThrow(conflict); + expect(() => createQwpBrowserSender(ingress)).toThrow(conflict); + await expect(connectQwpBrowserIngress(ingress)).rejects.toThrow(conflict); + await expect(connectQwpBrowserEgress(egress)).rejects.toThrow(conflict); + expect(() => + createQwpBrowserClient({ + cluster: { ...options, url: "wss://questdb.example" }, + }), + ).toThrow(conflict); + expect(() => createQwpBrowserClient({ ingress, egress })).toThrow(conflict); + }); + + it("rejects a credential among the caller's protocols when auth is set", () => { + const url = "wss://questdb.example/write/v4"; + const credential = `${CREDENTIAL_PREFIX}QmVhcmVyIHQ`; + const message = `protocols cannot contain a ${CREDENTIAL_PREFIX}* credential when auth is set`; + for (const protocols of [credential, ["application.v1", credential]]) { + expect(() => + createQwpBrowserConnectionFactory({ + url, + protocols, + auth: { type: "bearer", token: "rest-token" }, + }), + ).toThrow(message); + } + // A unified client's per-side override meets the shared auth only after + // the merge. + expect(() => + createQwpBrowserClient({ + cluster: { + url: "wss://questdb.example", + auth: { type: "bearer", token: "rest-token" }, + }, + egress: { protocols: [credential] }, + }), + ).toThrow(message); + }); + + it("shares cluster auth across ingress and egress", async () => { + const attempts: { path: string; authorization: string }[] = []; + const providerSignals: AbortSignal[] = []; + const client = await connectQwpBrowserClient({ + cluster: { + url: "wss://questdb.example/qdb", + auth: ({ signal }) => { + providerSignals.push(signal); + return { type: "bearer", token: "oidc-access-token" }; + }, + webSocketFactory: (url, protocols) => { + attempts.push({ + path: new URL(url).pathname, + authorization: decodeBrowserCredential(protocols), + }); + return asQwpSocket(questDbBrowserSocket(url, protocols)); + }, + }, + }); + try { + expect(attempts.sort((a, b) => a.path.localeCompare(b.path))).toEqual([ + { path: "/qdb/read/v1", authorization: "Bearer oidc-access-token" }, + { path: "/qdb/write/v4", authorization: "Bearer oidc-access-token" }, + ]); + expect(providerSignals).toHaveLength(2); + } finally { + await client.close(); + } + + for (const side of ["ingress", "egress"] as const) { + expect(() => + createQwpBrowserClient({ + cluster: { url: "wss://questdb.example" }, + [side]: { auth: { type: "bearer", token: "other-token" } }, + } as never), + ).toThrow(`${side}.auth must be configured once under cluster.auth`); + } + }); + + it("treats a server that echoes the credential as a server defect", async () => { + for (const path of ["write/v4", "read/v1"]) { + const attempted: string[] = []; + const sockets: FakeWebSocket[] = []; + const connecting = + path === "write/v4" + ? connectQwpBrowserIngress + : (options: Parameters[0]) => + connectQwpBrowserEgress(options); + const error = await connecting({ + url: `wss://node-a.example/${path}`, + failoverUrls: [`wss://node-b.example/${path}`], + auth: { type: "bearer", token: "echoed-secret" }, + webSocketFactory: (url, protocols) => { + attempted.push(new URL(url).hostname); + const socket = new FakeWebSocket(); + sockets.push(socket); + // Selects the credential, which is in the offer, so a browser + // accepts the handshake. + socket.protocol = offeredProtocols(protocols).find((protocol) => + protocol.startsWith(CREDENTIAL_PREFIX), + )!; + queueMicrotask(() => socket.open()); + return asQwpSocket(socket); + }, + }).then( + () => undefined, + (reason: unknown) => reason as QwpUpgradeError, + ); + + expect(error).toMatchObject({ + name: "QwpUpgradeError", + kind: QWP_UPGRADE_ERROR_KIND.CAPABILITY_MISMATCH, + retryable: false, + tryNextEndpoint: false, + } satisfies Partial); + expect(error?.message).toMatch(/server defect/); + expect(JSON.stringify(error)).not.toContain(CREDENTIAL_PREFIX); + expect(error?.message).not.toContain( + Buffer.from("Bearer echoed-secret").toString("base64url"), + ); + // The exposure is not repeated on the rest of the cluster. + expect(attempted).toEqual(["node-a.example"]); + expect(sockets[0].closeCalls).toHaveLength(1); + } + }); +}); + describe("QwpIngressSession", () => { it("returns the highest split-frame sequence from the browser sender", async () => { const socket = new FakeWebSocket(); From d896ab9e91eaf948b7b6fb8b6becc187ec7f4141 Mon Sep 17 00:00:00 2001 From: glasstiger Date: Wed, 30 Sep 2026 13:46:59 +0100 Subject: [PATCH 2/3] test(qwp): wait for the ACK watermark in the deferred-recovery test "retires a wholly deferred recovered transaction without replaying it" waited for the journal's .sfa segments to disappear and then checked for .ack-watermark with a single readdir. The store removes both, but not together: background maintenance unlinks the segments first and deletes the watermark only once that deletion is durable, after an ownership check and a directory sync. A check that landed between the two found the watermark still present, as seen on CI (Node 20). A 100ms delay after that sync reproduces the failure deterministically. Wait for the watermark the way the test already waits for the segments. The store's ordering is deliberate -- the watermark is what stops a crash in that window from recovering the discarded frames -- so it is unchanged. --- test/qwp/reconnect.test.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/qwp/reconnect.test.ts b/test/qwp/reconnect.test.ts index 51f3c138..3962173d 100644 --- a/test/qwp/reconnect.test.ts +++ b/test/qwp/reconnect.test.ts @@ -5066,7 +5066,13 @@ describe("QWP ingress reconnect and replay", () => { fromFsn: 5n, toFsn: 7n, } satisfies Partial); - expect(await readdir(directory)).not.toContain(".ack-watermark"); + // The watermark outlives the segments on purpose: maintenance removes it + // only once their deletion is durable, after an ownership check and a + // directory sync. So wait for it like the segments above; a single read + // here raced that tail on slow CI runners. + await vi.waitFor(async () => + expect(await readdir(directory)).not.toContain(".ack-watermark"), + ); const currentFrame = encodeQwpIngressFrame([symbolTable("SOL-USD")]); const current = session.sendFrame(currentFrame); From 3c4515d052af60b1aa9704966c17d69462521919 Mon Sep 17 00:00:00 2001 From: glasstiger Date: Wed, 30 Sep 2026 14:13:01 +0100 Subject: [PATCH 3/3] test: retry integration queries that race QuestDB table creation "can ingest data via TCP and run queries" failed on main (Node 20) with a 400 from its first query. The container log shows why: QuestDB answered "table does not exist [table=test_tcp]" 5ms after tables() had listed the table. ILP over TCP has no acknowledgement, so the test waits for the table to appear in tables(), but QuestDB lists a new table there before its name resolves for queries: registerName() hydrates the metadata cache that tables() reads, syncs the name to the table registry, and only then makes the name queryable. A query in between gets "table does not exist", and query() failed on any non-200 without retrying. runSelect() now treats that one answer as "not yet" and keeps polling, reporting the last such error if it times out. Any other non-200 still fails at once, now with the server's error message, which the job log lacked. This covers the three TCP tests that share the pattern; the HTTP tests are not exposed, because an HTTP flush resolves only after table creation has completed. --- test/sender.integration.test.ts | 81 +++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 18 deletions(-) diff --git a/test/sender.integration.test.ts b/test/sender.integration.test.ts index c4ceb540..082a801a 100644 --- a/test/sender.integration.test.ts +++ b/test/sender.integration.test.ts @@ -14,6 +14,45 @@ async function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } +/** A non-200 answer from QuestDB's /exec, with the reason the server gave. */ +class QueryError extends Error { + readonly serverError?: string; + + constructor( + readonly statusCode: number | undefined, + body: string, + query: string, + ) { + let serverError: string | undefined; + try { + serverError = JSON.parse(body).error; + } catch { + serverError = body || undefined; + } + super( + `HTTP request failed, statusCode=${statusCode}, query=${query}` + + (serverError ? `, error=${serverError}` : ""), + ); + this.name = "QueryError"; + this.serverError = serverError; + } +} + +/** + * ILP over TCP has no acknowledgement, so a test cannot know when QuestDB has + * finished creating a table. QuestDB lists a new table in tables() before its + * name resolves for queries -- the name is synced to the table registry in + * between -- so a query can land in that gap and get this answer. It means + * "not yet", not a failure. + */ +function isTableNotYetQueryable(error: unknown): error is QueryError { + return ( + error instanceof QueryError && + error.statusCode === 400 && + /table does not exist/.test(error.serverError ?? "") + ); +} + describe("Sender tests with containerized QuestDB instance", () => { let container: StartedTestContainer; @@ -27,22 +66,19 @@ describe("Sender tests with containerized QuestDB instance", () => { return new Promise((resolve, reject) => { const req = http.request(options, (response) => { - if (response.statusCode === HTTP_OK) { - const body: Uint8Array[] = []; - response - .on("data", (data: Uint8Array) => { - body.push(data); - }) - .on("end", () => { - resolve(JSON.parse(Buffer.concat(body).toString())); - }); - } else { - reject( - new Error( - `HTTP request failed, statusCode=${response.statusCode}, query=${query}`, - ), - ); - } + const body: Uint8Array[] = []; + response + .on("data", (data: Uint8Array) => { + body.push(data); + }) + .on("end", () => { + const text = Buffer.concat(body).toString(); + if (response.statusCode === HTTP_OK) { + resolve(JSON.parse(text)); + } else { + reject(new QueryError(response.statusCode, text, query)); + } + }); }); req.on("error", (error) => reject(error)); @@ -59,15 +95,24 @@ describe("Sender tests with containerized QuestDB instance", () => { const interval = 500; const num = timeout / interval; let selectResult: any; + let notQueryable: QueryError | undefined; for (let i = 0; i < num; i++) { - selectResult = await query(container, select); + try { + selectResult = await query(container, select); + notQueryable = undefined; + } catch (error) { + if (!isTableNotYetQueryable(error)) throw error; + notQueryable = error; + selectResult = undefined; + } if (selectResult && selectResult.count >= expectedCount) { return selectResult; } await sleep(interval); } throw new Error( - `Timed out while waiting for ${expectedCount} rows, select='${select}'`, + `Timed out while waiting for ${expectedCount} rows, select='${select}'` + + (notQueryable ? `; last error: ${notQueryable.serverError}` : ""), ); }