qis 3.2.3__tar.gz → 3.2.4__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.
Files changed (149) hide show
  1. {qis-3.2.3 → qis-3.2.4}/PKG-INFO +1 -1
  2. {qis-3.2.3 → qis-3.2.4}/pyproject.toml +1 -1
  3. {qis-3.2.3 → qis-3.2.4}/qis/examples/core/perf_bbg_prices.py +34 -5
  4. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/returns_heatmap.py +1 -1
  5. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/reports/config.py +3 -3
  6. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/reports/multi_assets_factsheet.py +6 -3
  7. {qis-3.2.3 → qis-3.2.4}/qis/settings.yaml +0 -1
  8. {qis-3.2.3 → qis-3.2.4}/LICENSE.txt +0 -0
  9. {qis-3.2.3 → qis-3.2.4}/README.md +0 -0
  10. {qis-3.2.3 → qis-3.2.4}/qis/__init__.py +0 -0
  11. {qis-3.2.3 → qis-3.2.4}/qis/examples/best_returns.py +0 -0
  12. {qis-3.2.3 → qis-3.2.4}/qis/examples/bond_futures_portfolio.py +0 -0
  13. {qis-3.2.3 → qis-3.2.4}/qis/examples/bootstrap_analysis.py +0 -0
  14. {qis-3.2.3 → qis-3.2.4}/qis/examples/boxplot_conditional_returns.py +0 -0
  15. {qis-3.2.3 → qis-3.2.4}/qis/examples/btc_asset_corr.py +0 -0
  16. {qis-3.2.3 → qis-3.2.4}/qis/examples/constant_notional.py +0 -0
  17. {qis-3.2.3 → qis-3.2.4}/qis/examples/constant_weight_portfolios.py +0 -0
  18. {qis-3.2.3 → qis-3.2.4}/qis/examples/core/price_plots.py +0 -0
  19. {qis-3.2.3 → qis-3.2.4}/qis/examples/core/us_election.py +0 -0
  20. {qis-3.2.3 → qis-3.2.4}/qis/examples/credit_spreads.py +0 -0
  21. {qis-3.2.3 → qis-3.2.4}/qis/examples/credit_trackers.py +0 -0
  22. {qis-3.2.3 → qis-3.2.4}/qis/examples/europe_futures.py +0 -0
  23. {qis-3.2.3 → qis-3.2.4}/qis/examples/factsheets/multi_assets.py +0 -0
  24. {qis-3.2.3 → qis-3.2.4}/qis/examples/factsheets/multi_strategy.py +0 -0
  25. {qis-3.2.3 → qis-3.2.4}/qis/examples/factsheets/pyblogs_reports.py +0 -0
  26. {qis-3.2.3 → qis-3.2.4}/qis/examples/factsheets/strategy.py +0 -0
  27. {qis-3.2.3 → qis-3.2.4}/qis/examples/factsheets/strategy_benchmark.py +0 -0
  28. {qis-3.2.3 → qis-3.2.4}/qis/examples/generate_option_rolls.py +0 -0
  29. {qis-3.2.3 → qis-3.2.4}/qis/examples/interpolation_infrequent_returns.py +0 -0
  30. {qis-3.2.3 → qis-3.2.4}/qis/examples/leveraged_strategies.py +0 -0
  31. {qis-3.2.3 → qis-3.2.4}/qis/examples/long_short.py +0 -0
  32. {qis-3.2.3 → qis-3.2.4}/qis/examples/momentum_indices.py +0 -0
  33. {qis-3.2.3 → qis-3.2.4}/qis/examples/ohlc_vol_analysis.py +0 -0
  34. {qis-3.2.3 → qis-3.2.4}/qis/examples/overnight_returns.py +0 -0
  35. {qis-3.2.3 → qis-3.2.4}/qis/examples/perf_external_assets.py +0 -0
  36. {qis-3.2.3 → qis-3.2.4}/qis/examples/perp_pricing.py +0 -0
  37. {qis-3.2.3 → qis-3.2.4}/qis/examples/readme_performances.py +0 -0
  38. {qis-3.2.3 → qis-3.2.4}/qis/examples/risk_return_frontier.py +0 -0
  39. {qis-3.2.3 → qis-3.2.4}/qis/examples/rolling_performance.py +0 -0
  40. {qis-3.2.3 → qis-3.2.4}/qis/examples/seasonality.py +0 -0
  41. {qis-3.2.3 → qis-3.2.4}/qis/examples/sharpe_vs_sortino.py +0 -0
  42. {qis-3.2.3 → qis-3.2.4}/qis/examples/simulate_quant_strats.py +0 -0
  43. {qis-3.2.3 → qis-3.2.4}/qis/examples/test_ewm.py +0 -0
  44. {qis-3.2.3 → qis-3.2.4}/qis/examples/test_scatter.py +0 -0
  45. {qis-3.2.3 → qis-3.2.4}/qis/examples/try_pybloqs.py +0 -0
  46. {qis-3.2.3 → qis-3.2.4}/qis/examples/universe_corrs.py +0 -0
  47. {qis-3.2.3 → qis-3.2.4}/qis/examples/vix_beta_to_equities_bonds.py +0 -0
  48. {qis-3.2.3 → qis-3.2.4}/qis/examples/vix_conditional_returns.py +0 -0
  49. {qis-3.2.3 → qis-3.2.4}/qis/examples/vix_spy_by_year.py +0 -0
  50. {qis-3.2.3 → qis-3.2.4}/qis/examples/vix_tenor_analysis.py +0 -0
  51. {qis-3.2.3 → qis-3.2.4}/qis/examples/vol_without_weekends.py +0 -0
  52. {qis-3.2.3 → qis-3.2.4}/qis/file_utils.py +0 -0
  53. {qis-3.2.3 → qis-3.2.4}/qis/local_path.py +0 -0
  54. {qis-3.2.3 → qis-3.2.4}/qis/models/README.md +0 -0
  55. {qis-3.2.3 → qis-3.2.4}/qis/models/__init__.py +0 -0
  56. {qis-3.2.3 → qis-3.2.4}/qis/models/linear/__init__.py +0 -0
  57. {qis-3.2.3 → qis-3.2.4}/qis/models/linear/auto_corr.py +0 -0
  58. {qis-3.2.3 → qis-3.2.4}/qis/models/linear/corr_cov_matrix.py +0 -0
  59. {qis-3.2.3 → qis-3.2.4}/qis/models/linear/ewm.py +0 -0
  60. {qis-3.2.3 → qis-3.2.4}/qis/models/linear/ewm_convolution.py +0 -0
  61. {qis-3.2.3 → qis-3.2.4}/qis/models/linear/ewm_factors.py +0 -0
  62. {qis-3.2.3 → qis-3.2.4}/qis/models/linear/ewm_winsor_outliers.py +0 -0
  63. {qis-3.2.3 → qis-3.2.4}/qis/models/linear/pca.py +0 -0
  64. {qis-3.2.3 → qis-3.2.4}/qis/models/linear/plot_correlations.py +0 -0
  65. {qis-3.2.3 → qis-3.2.4}/qis/models/linear/ra_returns.py +0 -0
  66. {qis-3.2.3 → qis-3.2.4}/qis/models/stats/__init__.py +0 -0
  67. {qis-3.2.3 → qis-3.2.4}/qis/models/stats/bootstrap.py +0 -0
  68. {qis-3.2.3 → qis-3.2.4}/qis/models/stats/ohlc_vol.py +0 -0
  69. {qis-3.2.3 → qis-3.2.4}/qis/models/stats/rolling_stats.py +0 -0
  70. {qis-3.2.3 → qis-3.2.4}/qis/models/stats/test_bootstrap.py +0 -0
  71. {qis-3.2.3 → qis-3.2.4}/qis/perfstats/README.md +0 -0
  72. {qis-3.2.3 → qis-3.2.4}/qis/perfstats/__init__.py +0 -0
  73. {qis-3.2.3 → qis-3.2.4}/qis/perfstats/cond_regression.py +0 -0
  74. {qis-3.2.3 → qis-3.2.4}/qis/perfstats/config.py +0 -0
  75. {qis-3.2.3 → qis-3.2.4}/qis/perfstats/desc_table.py +0 -0
  76. {qis-3.2.3 → qis-3.2.4}/qis/perfstats/fx_ops.py +0 -0
  77. {qis-3.2.3 → qis-3.2.4}/qis/perfstats/perf_stats.py +0 -0
  78. {qis-3.2.3 → qis-3.2.4}/qis/perfstats/regime_classifier.py +0 -0
  79. {qis-3.2.3 → qis-3.2.4}/qis/perfstats/returns.py +0 -0
  80. {qis-3.2.3 → qis-3.2.4}/qis/perfstats/timeseries_bfill.py +0 -0
  81. {qis-3.2.3 → qis-3.2.4}/qis/plots/README.md +0 -0
  82. {qis-3.2.3 → qis-3.2.4}/qis/plots/__init__.py +0 -0
  83. {qis-3.2.3 → qis-3.2.4}/qis/plots/bars.py +0 -0
  84. {qis-3.2.3 → qis-3.2.4}/qis/plots/boxplot.py +0 -0
  85. {qis-3.2.3 → qis-3.2.4}/qis/plots/contour.py +0 -0
  86. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/__init__.py +0 -0
  87. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/data_timeseries.py +0 -0
  88. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/desc_table.py +0 -0
  89. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/drawdowns.py +0 -0
  90. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/perf_table.py +0 -0
  91. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/prices.py +0 -0
  92. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/regime_class_table.py +0 -0
  93. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/regime_data.py +0 -0
  94. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/regime_pdf.py +0 -0
  95. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/regime_scatter.py +0 -0
  96. {qis-3.2.3 → qis-3.2.4}/qis/plots/derived/returns_scatter.py +0 -0
  97. {qis-3.2.3 → qis-3.2.4}/qis/plots/errorbar.py +0 -0
  98. {qis-3.2.3 → qis-3.2.4}/qis/plots/heatmap.py +0 -0
  99. {qis-3.2.3 → qis-3.2.4}/qis/plots/histogram.py +0 -0
  100. {qis-3.2.3 → qis-3.2.4}/qis/plots/histplot2d.py +0 -0
  101. {qis-3.2.3 → qis-3.2.4}/qis/plots/lineplot.py +0 -0
  102. {qis-3.2.3 → qis-3.2.4}/qis/plots/pie.py +0 -0
  103. {qis-3.2.3 → qis-3.2.4}/qis/plots/qqplot.py +0 -0
  104. {qis-3.2.3 → qis-3.2.4}/qis/plots/reports/__init__.py +0 -0
  105. {qis-3.2.3 → qis-3.2.4}/qis/plots/reports/econ_data_single.py +0 -0
  106. {qis-3.2.3 → qis-3.2.4}/qis/plots/reports/gantt_data_history.py +0 -0
  107. {qis-3.2.3 → qis-3.2.4}/qis/plots/reports/price_history.py +0 -0
  108. {qis-3.2.3 → qis-3.2.4}/qis/plots/reports/utils.py +0 -0
  109. {qis-3.2.3 → qis-3.2.4}/qis/plots/scatter.py +0 -0
  110. {qis-3.2.3 → qis-3.2.4}/qis/plots/stackplot.py +0 -0
  111. {qis-3.2.3 → qis-3.2.4}/qis/plots/table.py +0 -0
  112. {qis-3.2.3 → qis-3.2.4}/qis/plots/time_series.py +0 -0
  113. {qis-3.2.3 → qis-3.2.4}/qis/plots/utils.py +0 -0
  114. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/README.md +0 -0
  115. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/__init__.py +0 -0
  116. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/backtester.py +0 -0
  117. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/ewm_portfolio_risk.py +0 -0
  118. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/multi_portfolio_data.py +0 -0
  119. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/portfolio_data.py +0 -0
  120. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/reports/__init__.py +0 -0
  121. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/reports/brinson_attribution.py +0 -0
  122. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/reports/multi_strategy_factseet_pybloqs.py +0 -0
  123. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/reports/multi_strategy_factsheet.py +0 -0
  124. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/reports/strategy_benchmark_factsheet.py +0 -0
  125. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/reports/strategy_benchmark_factsheet_pybloqs.py +0 -0
  126. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/reports/strategy_factsheet.py +0 -0
  127. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/reports/strategy_signal_factsheet.py +0 -0
  128. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/strats/__init__.py +0 -0
  129. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/strats/quant_strats_delta1.py +0 -0
  130. {qis-3.2.3 → qis-3.2.4}/qis/portfolio/strats/seasonal_strats.py +0 -0
  131. {qis-3.2.3 → qis-3.2.4}/qis/sql_engine.py +0 -0
  132. {qis-3.2.3 → qis-3.2.4}/qis/test_data.py +0 -0
  133. {qis-3.2.3 → qis-3.2.4}/qis/utils/README.md +0 -0
  134. {qis-3.2.3 → qis-3.2.4}/qis/utils/__init__.py +0 -0
  135. {qis-3.2.3 → qis-3.2.4}/qis/utils/dates.py +0 -0
  136. {qis-3.2.3 → qis-3.2.4}/qis/utils/df_agg.py +0 -0
  137. {qis-3.2.3 → qis-3.2.4}/qis/utils/df_cut.py +0 -0
  138. {qis-3.2.3 → qis-3.2.4}/qis/utils/df_freq.py +0 -0
  139. {qis-3.2.3 → qis-3.2.4}/qis/utils/df_groups.py +0 -0
  140. {qis-3.2.3 → qis-3.2.4}/qis/utils/df_melt.py +0 -0
  141. {qis-3.2.3 → qis-3.2.4}/qis/utils/df_ops.py +0 -0
  142. {qis-3.2.3 → qis-3.2.4}/qis/utils/df_str.py +0 -0
  143. {qis-3.2.3 → qis-3.2.4}/qis/utils/df_to_scores.py +0 -0
  144. {qis-3.2.3 → qis-3.2.4}/qis/utils/df_to_weights.py +0 -0
  145. {qis-3.2.3 → qis-3.2.4}/qis/utils/generic.py +0 -0
  146. {qis-3.2.3 → qis-3.2.4}/qis/utils/np_ops.py +0 -0
  147. {qis-3.2.3 → qis-3.2.4}/qis/utils/ols.py +0 -0
  148. {qis-3.2.3 → qis-3.2.4}/qis/utils/sampling.py +0 -0
  149. {qis-3.2.3 → qis-3.2.4}/qis/utils/struct_ops.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: qis
3
- Version: 3.2.3
3
+ Version: 3.2.4
4
4
  Summary: Implementation of visualisation and reporting analytics for Quantitative Investment Strategies
5
5
  License: LICENSE.txt
6
6
  Keywords: quantitative,investing,portfolio optimization,systematic strategies,volatility
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "qis"
3
- version = "3.2.3"
3
+ version = "3.2.4"
4
4
  description = "Implementation of visualisation and reporting analytics for Quantitative Investment Strategies"
5
5
  license = "LICENSE.txt"
6
6
  authors = ["Artur Sepp <artursepp@gmail.com>"]
@@ -22,15 +22,44 @@ def run_report():
22
22
  'BNPXOV3U Index': 'BNP 3M Long DHhedged Puts'
23
23
  }
24
24
 
25
+ benchmark = 'SPTR Index'
26
+ tickers = {
27
+ benchmark: benchmark,
28
+ 'BNPIV1EE Index': 'BNP Europe 1Y Volatility',
29
+ 'BNPIV1UE Index': 'BNP US 1Y Volatility',
30
+ 'BNPXVO3A Index': 'BNP VOLA 3 Index',
31
+ 'AIJPVT1U Index': 'JPM Volatility Trend Following',
32
+ 'JPOSLVUS Index': 'JPM US Long Variance',
33
+ 'JPOSPRU2 Index': 'JPM US Put Ratio',
34
+ 'JPOSTUDN Index': 'JPM US Equity Tail Hedge',
35
+ 'JPRC85BE Index': 'JPM Dynamic 85% Rolling Collar EU',
36
+ 'JPRC85BU Index': 'JPM Dynamic 85% Rolling Collar US',
37
+ 'JPUSVXCR Index': 'JPM US Volatility Call Ratio'
38
+ }
39
+
40
+ benchmark = 'HYG US Equity'
41
+ tickers = {
42
+ benchmark: benchmark,
43
+ 'NMVVR1EL Index': 'IRVING1 EUR',
44
+ 'NMVVR1UL Index': 'IRVING1 USD',
45
+ 'NMVVR1L Index': 'IRVING1',
46
+ 'BNPXLVRE Index': 'BNP Long Rates Vol EUR',
47
+ 'BNPXLVRU Index': 'BNP Long Rates Vol USD',
48
+ 'BXIIULSV Index': 'Barclays Long Rates Vol',
49
+ 'BXIIUGNT Index': 'Barclays Gamma Neutral Vol',
50
+ 'BXIIUENT Index': 'Barclays Triangle Vol'
51
+ }
52
+
25
53
  prices = fetch_field_timeseries_per_tickers(tickers=tickers, freq='B', field='PX_LAST').ffill()
26
54
  print(prices)
27
- qis.save_df_to_csv(df=prices, file_name='qis_vol_indices', local_path=qis.get_output_path())
55
+ # qis.save_df_to_csv(df=prices, file_name='qis_vol_indices', local_path=qis.get_output_path())
28
56
 
29
- time_period = qis.TimePeriod('31Dec2019', '15Nov2024')
30
- kwargs = qis.fetch_default_report_kwargs(time_period=time_period, add_rates_data=False)
57
+ time_period = qis.TimePeriod('31Dec2024', '07Apr2025')
58
+ #kwargs = qis.fetch_default_report_kwargs(time_period=time_period, add_rates_data=False)
59
+ kwargs = qis.fetch_factsheet_config_kwargs(factsheet_config=qis.FACTSHEET_CONFIG_DAILY_DATA_SHORT_PERIOD)
31
60
 
32
61
  fig = qis.generate_multi_asset_factsheet(prices=prices,
33
- benchmark='SPTR Index',
62
+ benchmark=benchmark,
34
63
  time_period=time_period,
35
64
  **kwargs)
36
65
  qis.save_figs_to_pdf(figs=[fig],
@@ -70,7 +99,7 @@ def run_unit_test(unit_test: UnitTests):
70
99
 
71
100
  if __name__ == '__main__':
72
101
 
73
- unit_test = UnitTests.PRICE
102
+ unit_test = UnitTests.REPORT
74
103
 
75
104
  is_run_all_tests = False
76
105
  if is_run_all_tests:
@@ -223,7 +223,7 @@ def compute_periodic_returns(prices: pd.DataFrame,
223
223
 
224
224
  if add_total:
225
225
  if freq == 'ME':
226
- total_name = total_name or 'last 12m'
226
+ total_name = total_name or 'YTD'
227
227
  elif freq == 'YE':
228
228
  total_name = total_name or 'Total'
229
229
  else:
@@ -82,9 +82,9 @@ class FactsheetConfig(NamedTuple):
82
82
  # create enumerations
83
83
  FACTSHEET_CONFIG_DAILY_DATA_LONG_PERIOD = FactsheetConfig()
84
84
 
85
- FACTSHEET_CONFIG_DAILY_DATA_SHORT_PERIOD = FactsheetConfig(heatmap_freq='YE',
86
- x_date_freq='QE',
87
- freq_regime='ME',
85
+ FACTSHEET_CONFIG_DAILY_DATA_SHORT_PERIOD = FactsheetConfig(heatmap_freq='ME',
86
+ x_date_freq='ME',
87
+ freq_regime='W-WED',
88
88
  freq_reg='W-WED',
89
89
  alpha_an_factor=52
90
90
  )
@@ -60,6 +60,8 @@ class MultiAssetsReport:
60
60
  prices = pd.concat([self.benchmark_prices[benchmark], self.prices], axis=1)
61
61
  else:
62
62
  prices = self.prices
63
+ # check in case
64
+ prices = prices.loc[:, ~prices.columns.duplicated(keep='first')]
63
65
  if time_period is not None:
64
66
  prices = time_period.locate(prices)
65
67
  return prices
@@ -68,7 +70,7 @@ class MultiAssetsReport:
68
70
  regime_benchmark: str,
69
71
  data_df: pd.DataFrame,
70
72
  time_period: TimePeriod = None,
71
- regime_params: BenchmarkReturnsQuantileRegimeSpecs = REGIME_PARAMS
73
+ regime_params: BenchmarkReturnsQuantileRegimeSpecs = None
72
74
  ) -> None:
73
75
  if isinstance(self.benchmark_prices, pd.Series):
74
76
  pivot_prices = self.benchmark_prices
@@ -83,7 +85,7 @@ class MultiAssetsReport:
83
85
  data_df=data_df,
84
86
  pivot_prices=pivot_prices,
85
87
  benchmark=regime_benchmark,
86
- regime_params=regime_params)
88
+ regime_params=regime_params or self.regime_params)
87
89
 
88
90
  def plot_ra_perf_table(self,
89
91
  benchmark: str,
@@ -334,6 +336,7 @@ class MultiAssetsReport:
334
336
  roll_freq=freq_sharpe,
335
337
  legend_stats=legend_stats,
336
338
  regime_benchmark=regime_benchmark,
339
+ regime_params=self.regime_params,
337
340
  ax=ax,
338
341
  **kwargs)
339
342
  return fig
@@ -417,7 +420,7 @@ def generate_multi_asset_factsheet(prices: pd.DataFrame,
417
420
  heatmap_freq: str = 'YE',
418
421
  time_period: TimePeriod = None, # time period for reporting
419
422
  figsize: Tuple[float, float] = (8.3, 11.7), # A4 for portrait
420
- fontsize: int = 3,
423
+ fontsize: int = 4,
421
424
  factsheet_name: str = None,
422
425
  performance_bars: Tuple[PerfStat, PerfStat] = (PerfStat.SHARPE_RF0, PerfStat.MAX_DD),
423
426
  drop_1y_ra_perf_table: bool = True,
@@ -18,4 +18,3 @@ OUTPUT_PATH:
18
18
 
19
19
  AWS_POSTGRES:
20
20
  ""
21
-
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