Qubx 0.6.29__tar.gz → 0.6.30__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Qubx might be problematic. Click here for more details.
- {qubx-0.6.29 → qubx-0.6.30}/PKG-INFO +1 -1
- {qubx-0.6.29 → qubx-0.6.30}/pyproject.toml +1 -1
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/data.py +4 -3
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/context.py +2 -2
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/helpers.py +2 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/tardis.py +9 -0
- {qubx-0.6.29 → qubx-0.6.30}/LICENSE +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/README.md +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/build.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/_nb_magic.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/account.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/broker.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/data.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/management.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/ome.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/optimization.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/runner.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/simulated_data.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/simulated_exchange.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/simulator.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/utils.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/cli/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/cli/commands.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/cli/deploy.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/cli/misc.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/cli/release.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/account.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/broker.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exceptions.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exchanges/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exchanges/binance/broker.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exchanges/binance/exchange.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exchanges/kraken/kraken.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/factory.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/reader.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/utils.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/tardis/data.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/tardis/utils.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/account.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/basics.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/deque.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/errors.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/exceptions.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/initializer.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/interfaces.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/loggers.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/lookups.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/metrics.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/market.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/processing.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/subscription.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/trading.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/universe.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/series.pxd +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/series.pyi +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/series.pyx +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/utils.pyi +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/utils.pyx +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/composite.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/helpers.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/hft.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/readers.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/registry.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/base.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/composite.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/csv.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/prometheus.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/questdb.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/composite.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/formatters/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/formatters/base.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/formatters/incremental.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/formatters/slack.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/redis_streams.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/slack.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/core.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/orderbook.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/price.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/trades.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/utils.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/gathering/simplest.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/health/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/health/base.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/math/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/math/stats.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/notifications/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/notifications/composite.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/notifications/slack.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/pandaz/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/pandaz/ta.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/pandaz/utils.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/_build.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-binance.cm.json +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-binance.json +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-binance.um.json +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-bitfinex.f.json +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-bitfinex.json +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-kraken.f.json +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-kraken.json +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restarts/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restarts/state_resolvers.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restarts/time_finders.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/balance.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/factory.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/interfaces.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/position.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/signal.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/state.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/utils.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/ta/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/ta/indicators.pxd +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/ta/indicators.pyi +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/ta/indicators.pyx +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/advanced.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/composite.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/rebalancers.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/riskctrl.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/sizers.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/_pyxreloader.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/charting/lookinglass.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/charting/mpl_helpers.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/collections.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/marketdata/binance.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/marketdata/ccxt.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/marketdata/dukas.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/misc.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/ntp.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/numbers_utils.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/orderbook.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/dashboard.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/data.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/interfaces.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/renderers/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/renderers/plotly.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/questdb.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/__init__.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/_jupyter_runner.pyt +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/accounts.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/configs.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/factory.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/runner.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/time.py +0 -0
- {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/version.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "Qubx"
|
|
7
|
-
version = "0.6.
|
|
7
|
+
version = "0.6.30"
|
|
8
8
|
description = "Qubx - Quantitative Trading Framework"
|
|
9
9
|
authors = [ "Dmitry Marienko <dmitry.marienko@xlydian.com>", "Yuriy Arabskyy <yuriy.arabskyy@xlydian.com>",]
|
|
10
10
|
readme = "README.md"
|
|
@@ -616,9 +616,10 @@ class CcxtDataProvider(IDataProvider):
|
|
|
616
616
|
for exch_symbol, ccxt_ticker in ccxt_tickers.items(): # type: ignore
|
|
617
617
|
instrument = ccxt_find_instrument(exch_symbol, self._exchange, _symbol_to_instrument)
|
|
618
618
|
quote = ccxt_convert_ticker(ccxt_ticker)
|
|
619
|
-
self.
|
|
620
|
-
|
|
621
|
-
|
|
619
|
+
if self._last_quotes[instrument] is None or quote.time > self._last_quotes[instrument].time:
|
|
620
|
+
self._health_monitor.record_data_arrival(sub_type, dt_64(quote.time, "ns"))
|
|
621
|
+
self._last_quotes[instrument] = quote
|
|
622
|
+
channel.send((instrument, sub_type, quote, False))
|
|
622
623
|
|
|
623
624
|
async def un_watch_quote(instruments: list[Instrument]):
|
|
624
625
|
symbols = [_instr_to_ccxt_symbol[i] for i in instruments]
|
|
@@ -430,8 +430,8 @@ class StrategyContext(IStrategyContext):
|
|
|
430
430
|
def close_positions(self, market_type: MarketType | None = None) -> None:
|
|
431
431
|
return self._trading_manager.close_positions(market_type)
|
|
432
432
|
|
|
433
|
-
def cancel_order(self, order_id: str) -> None:
|
|
434
|
-
return self._trading_manager.cancel_order(order_id)
|
|
433
|
+
def cancel_order(self, order_id: str, exchange: str | None = None) -> None:
|
|
434
|
+
return self._trading_manager.cancel_order(order_id, exchange)
|
|
435
435
|
|
|
436
436
|
def cancel_orders(self, instrument: Instrument):
|
|
437
437
|
return self._trading_manager.cancel_orders(instrument)
|
|
@@ -202,6 +202,8 @@ class CachedMarketDataHolder:
|
|
|
202
202
|
series = self._ohlcvs.get(instrument)
|
|
203
203
|
if series:
|
|
204
204
|
for ser in series.values():
|
|
205
|
+
if len(ser) > 0 and ser[0].time > quote.time:
|
|
206
|
+
continue
|
|
205
207
|
ser.update(quote.time, quote.mid_price(), 0)
|
|
206
208
|
|
|
207
209
|
@SW.watch("CachedMarketDataHolder")
|
|
@@ -529,6 +529,7 @@ class TardisMachineReader(DataReader):
|
|
|
529
529
|
raise ValueError(f"Invalid data_id format: {data_id}. Expected format: 'exchange:symbol'")
|
|
530
530
|
|
|
531
531
|
exchange = TARDIS_EXCHANGE_MAPPERS.get(exchange.lower(), exchange)
|
|
532
|
+
symbol = self._map_symbol(symbol, exchange)
|
|
532
533
|
|
|
533
534
|
start_date, end_date = handle_start_stop(start, stop)
|
|
534
535
|
if not start_date:
|
|
@@ -607,6 +608,7 @@ class TardisMachineReader(DataReader):
|
|
|
607
608
|
try:
|
|
608
609
|
chunk = chunk_queue.get()
|
|
609
610
|
if chunk is None: # End of chunks
|
|
611
|
+
logger.info(f"End of chunks for {data_id}")
|
|
610
612
|
break
|
|
611
613
|
|
|
612
614
|
# Process and yield the chunk
|
|
@@ -877,3 +879,10 @@ class TardisMachineReader(DataReader):
|
|
|
877
879
|
def _stream_data(self, url: str, line_queue: Queue, stop_event: threading.Event):
|
|
878
880
|
"""Submit the streaming coroutine to the asyncio loop"""
|
|
879
881
|
return self._async_loop.submit(self._fetch_stream(url, line_queue, stop_event))
|
|
882
|
+
|
|
883
|
+
def _map_symbol(self, symbol: str, exchange: str) -> str:
|
|
884
|
+
"""Map symbol to Tardis Machine API format"""
|
|
885
|
+
if exchange.lower() == "bitfinex-derivatives":
|
|
886
|
+
return f"{symbol[:3]}F0:USTF0"
|
|
887
|
+
else:
|
|
888
|
+
return symbol
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|