appier 1.34.2__tar.gz → 1.34.3__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.
- {appier-1.34.2/src/appier.egg-info → appier-1.34.3}/PKG-INFO +1 -1
- {appier-1.34.2 → appier-1.34.3}/setup.py +1 -1
- {appier-1.34.2 → appier-1.34.3}/src/appier/base.py +8 -3
- {appier-1.34.2 → appier-1.34.3}/src/appier/scheduler.py +35 -7
- {appier-1.34.2 → appier-1.34.3}/src/appier/scheduler.pyi +19 -2
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/scheduler.py +25 -0
- {appier-1.34.2 → appier-1.34.3/src/appier.egg-info}/PKG-INFO +1 -1
- {appier-1.34.2 → appier-1.34.3}/MANIFEST.in +0 -0
- {appier-1.34.2 → appier-1.34.3}/README.rst +0 -0
- {appier-1.34.2 → appier-1.34.3}/setup.cfg +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/__init__.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/amqp.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/api.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/asgi.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/async_neo.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/async_old.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/asynchronous.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/asynchronous.pyi +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/base.pyi +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/bus.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/bus.pyi +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/cache.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/cache.pyi +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/common.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/component.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/component.pyi +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/compress.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/config.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/controller.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/crypt.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/data.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/data.pyi +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/defines.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/exceptions.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/execution.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/export.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/extra.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/extra_neo.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/extra_old.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/geo.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/git.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/graph.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/http.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/legacy.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/log.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/meta.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/mock.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/model.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/model.pyi +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/model_a.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/mongo.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/observer.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/part.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/part.pyi +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/preferences.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/preferences.pyi +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/queuing.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/redisdb.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/request.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/res/static/css/base.css +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/res/static/images/favicon.ico +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/res/static/js/base.js +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/res/templates/error.html.tpl +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/res/templates/holder.html.tpl +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/res/templates/layout.html.tpl +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/serialize.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/session.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/session.pyi +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/settings.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/smtp.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/storage.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/structures.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/__init__.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/base.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/cache.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/config.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/crypt.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/data.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/exceptions.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/export.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/graph.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/http.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/legacy.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/log.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/mock.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/model.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/part.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/preferences.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/queuing.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/request.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/serialize.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/session.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/smtp.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/structures.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/typesf.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/util.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/test/validation.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/typesf.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/util.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier/validation.py +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier.egg-info/SOURCES.txt +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier.egg-info/dependency_links.txt +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier.egg-info/not-zip-safe +0 -0
- {appier-1.34.2 → appier-1.34.3}/src/appier.egg-info/top_level.txt +0 -0
|
@@ -94,7 +94,7 @@ NAME = "appier"
|
|
|
94
94
|
""" The name to be used to describe the framework while working
|
|
95
95
|
on its own environment, this is just a descriptive value """
|
|
96
96
|
|
|
97
|
-
VERSION = "1.34.
|
|
97
|
+
VERSION = "1.34.3"
|
|
98
98
|
""" The version of the framework that is currently installed
|
|
99
99
|
this value may be used for debugging/diagnostic purposes """
|
|
100
100
|
|
|
@@ -2328,7 +2328,7 @@ class App(
|
|
|
2328
2328
|
thread.daemon = True
|
|
2329
2329
|
thread.start()
|
|
2330
2330
|
|
|
2331
|
-
def cron(self, job, cron):
|
|
2331
|
+
def cron(self, job, cron, id=None, description=None):
|
|
2332
2332
|
"""
|
|
2333
2333
|
Schedule the provided method for regular execution using
|
|
2334
2334
|
the provided Cron like string.
|
|
@@ -2342,6 +2342,11 @@ class App(
|
|
|
2342
2342
|
:type cron: String/SchedulerDate
|
|
2343
2343
|
:param cron: The cron like string that is going to be used to
|
|
2344
2344
|
define the execution time of the provided method.
|
|
2345
|
+
:type id: String
|
|
2346
|
+
:param id: The unique identifier for the task to be created.
|
|
2347
|
+
:type description: String
|
|
2348
|
+
:param description: The description for the task to be created
|
|
2349
|
+
that describes the goal of the task.
|
|
2345
2350
|
:rtype: SchedulerTask
|
|
2346
2351
|
:return: The task that has been scheduled for execution at the
|
|
2347
2352
|
provided time.
|
|
@@ -2350,7 +2355,7 @@ class App(
|
|
|
2350
2355
|
if self._cron == None:
|
|
2351
2356
|
self._cron = scheduler.CronScheduler(self)
|
|
2352
2357
|
self._cron.start()
|
|
2353
|
-
return self._cron.schedule(job, cron)
|
|
2358
|
+
return self._cron.schedule(job, cron, id=id, description=description)
|
|
2354
2359
|
|
|
2355
2360
|
def chunks(self, data, size=32768):
|
|
2356
2361
|
for index in range(0, len(data), size):
|
|
@@ -29,6 +29,7 @@ __license__ = "Apache License, Version 2.0"
|
|
|
29
29
|
""" The license for the module """
|
|
30
30
|
|
|
31
31
|
import time
|
|
32
|
+
import uuid
|
|
32
33
|
import heapq
|
|
33
34
|
import datetime
|
|
34
35
|
import logging
|
|
@@ -143,7 +144,7 @@ class CronScheduler(Scheduler):
|
|
|
143
144
|
|
|
144
145
|
self.timeout = max(0, timestamp - current_ts())
|
|
145
146
|
|
|
146
|
-
def schedule(self, job, cron, now=None):
|
|
147
|
+
def schedule(self, job, cron, id=None, description=None, now=None):
|
|
147
148
|
"""
|
|
148
149
|
Schedules the provided job function for execution according
|
|
149
150
|
to the provided cron string.
|
|
@@ -156,13 +157,18 @@ class CronScheduler(Scheduler):
|
|
|
156
157
|
:param job: The function to be executed as the job.
|
|
157
158
|
:type cron: String/SchedulerDate
|
|
158
159
|
:param cron: The cron like string defining the schedule.
|
|
160
|
+
:type id: String
|
|
161
|
+
:param id: The unique identifier for the task to be created.
|
|
162
|
+
:type description: String
|
|
163
|
+
:param description: The description for the task to be created
|
|
164
|
+
that describes the goal of the task.
|
|
159
165
|
:type now: datetime
|
|
160
166
|
:param now: Optional time reference for the job scheduling.
|
|
161
167
|
:rtype: SchedulerTask
|
|
162
168
|
:return: The task object that was created for the job.
|
|
163
169
|
"""
|
|
164
170
|
|
|
165
|
-
task = SchedulerTask(job, cron)
|
|
171
|
+
task = SchedulerTask(job, cron, id=id, description=description)
|
|
166
172
|
heapq.heappush(self._tasks, (task.next_timestamp(now=now), task))
|
|
167
173
|
self.awake()
|
|
168
174
|
return task
|
|
@@ -181,16 +187,18 @@ class CronScheduler(Scheduler):
|
|
|
181
187
|
|
|
182
188
|
class SchedulerTask(object):
|
|
183
189
|
|
|
184
|
-
def __init__(self, job, cron):
|
|
190
|
+
def __init__(self, job, cron, id=None, description=None):
|
|
185
191
|
self.job = job
|
|
186
192
|
self.date = SchedulerDate.from_cron(cron)
|
|
193
|
+
self.id = str(uuid.uuid4()) if id == None else id
|
|
194
|
+
self.description = description
|
|
187
195
|
self._enabled = True
|
|
188
196
|
|
|
189
197
|
def __repr__(self):
|
|
190
|
-
return "<SchedulerTask: %s, %s>" % (self.job, self.date)
|
|
198
|
+
return "<SchedulerTask: [%s] %s, %s>" % (self.id[:-12], self.job, self.date)
|
|
191
199
|
|
|
192
200
|
def __str__(self):
|
|
193
|
-
return "<SchedulerTask: %s, %s>" % (self.job, self.date)
|
|
201
|
+
return "<SchedulerTask: [%s] %s, %s>" % (self.id[:-12], self.job, self.date)
|
|
194
202
|
|
|
195
203
|
def __eq__(self, other):
|
|
196
204
|
if isinstance(other, self.__class__):
|
|
@@ -216,6 +224,10 @@ class SchedulerTask(object):
|
|
|
216
224
|
def enabled(self):
|
|
217
225
|
return self._enabled
|
|
218
226
|
|
|
227
|
+
@property
|
|
228
|
+
def cron(self):
|
|
229
|
+
return self.date.into_cron()
|
|
230
|
+
|
|
219
231
|
|
|
220
232
|
class SchedulerDate(object):
|
|
221
233
|
|
|
@@ -229,10 +241,10 @@ class SchedulerDate(object):
|
|
|
229
241
|
self.days_of_week = self._parse_field(days_of_week, 0, 6)
|
|
230
242
|
|
|
231
243
|
def __repr__(self):
|
|
232
|
-
return "<SchedulerDate: %s>" % self.next_run()
|
|
244
|
+
return "<SchedulerDate: %s, %s>" % (self.into_cron(), self.next_run())
|
|
233
245
|
|
|
234
246
|
def __str__(self):
|
|
235
|
-
return "<SchedulerDate: %s>" % self.next_run()
|
|
247
|
+
return "<SchedulerDate: %s, %s>" % (self.into_cron(), self.next_run())
|
|
236
248
|
|
|
237
249
|
@classmethod
|
|
238
250
|
def from_cron(cls, cron):
|
|
@@ -241,6 +253,17 @@ class SchedulerDate(object):
|
|
|
241
253
|
values = (value.strip().split(",") for value in cron.split(" "))
|
|
242
254
|
return cls(*values)
|
|
243
255
|
|
|
256
|
+
def into_cron(self):
|
|
257
|
+
return " ".join(
|
|
258
|
+
[
|
|
259
|
+
self._into_cron_field(self.minutes, 0, 59),
|
|
260
|
+
self._into_cron_field(self.hours, 0, 23),
|
|
261
|
+
self._into_cron_field(self.days_of_month, 1, 31),
|
|
262
|
+
self._into_cron_field(self.months, 1, 12),
|
|
263
|
+
self._into_cron_field(self.days_of_week, 0, 6),
|
|
264
|
+
]
|
|
265
|
+
)
|
|
266
|
+
|
|
244
267
|
def next_timestamp(self, now=None):
|
|
245
268
|
date = self.next_run(now=now)
|
|
246
269
|
return legacy.to_timestamp(date)
|
|
@@ -301,6 +324,11 @@ class SchedulerDate(object):
|
|
|
301
324
|
else:
|
|
302
325
|
return set((int(field),))
|
|
303
326
|
|
|
327
|
+
def _into_cron_field(self, field, min_value, max_value):
|
|
328
|
+
if field == set(range(min_value, max_value + 1)):
|
|
329
|
+
return "*"
|
|
330
|
+
return ",".join(str(v) for v in sorted(field))
|
|
331
|
+
|
|
304
332
|
|
|
305
333
|
class Cron(object):
|
|
306
334
|
pass
|
|
@@ -29,7 +29,12 @@ class CronScheduler(Scheduler):
|
|
|
29
29
|
def __init__(self, owner: App | None, timeout: float = ..., daemon: bool = ...): ...
|
|
30
30
|
def tick(self, now_ts: float | None = ...): ...
|
|
31
31
|
def schedule(
|
|
32
|
-
self,
|
|
32
|
+
self,
|
|
33
|
+
job: JobFunction,
|
|
34
|
+
cron: Cron,
|
|
35
|
+
id: str | None = ...,
|
|
36
|
+
description: str | None = ...,
|
|
37
|
+
now: datetime | None = ...,
|
|
33
38
|
) -> SchedulerTask: ...
|
|
34
39
|
def next_run(self) -> datetime | None: ...
|
|
35
40
|
def next_timestamp(self) -> float | None: ...
|
|
@@ -38,13 +43,21 @@ class SchedulerTask(object):
|
|
|
38
43
|
job: JobFunction
|
|
39
44
|
date: SchedulerDate
|
|
40
45
|
|
|
41
|
-
def __init__(
|
|
46
|
+
def __init__(
|
|
47
|
+
self,
|
|
48
|
+
job: JobFunction,
|
|
49
|
+
cron: Cron,
|
|
50
|
+
id: str | None = ...,
|
|
51
|
+
description: str | None = ...,
|
|
52
|
+
): ...
|
|
42
53
|
def enable(self): ...
|
|
43
54
|
def disable(self): ...
|
|
44
55
|
def next_run(self, now: datetime | None = ...) -> datetime: ...
|
|
45
56
|
def next_timestamp(self, now: datetime | None = ...) -> float: ...
|
|
46
57
|
@property
|
|
47
58
|
def enabled(self) -> bool: ...
|
|
59
|
+
@property
|
|
60
|
+
def cron(self) -> str: ...
|
|
48
61
|
|
|
49
62
|
class SchedulerDate(object):
|
|
50
63
|
minutes: set[int]
|
|
@@ -63,8 +76,12 @@ class SchedulerDate(object):
|
|
|
63
76
|
): ...
|
|
64
77
|
@classmethod
|
|
65
78
|
def from_cron(cls, cron: Cron) -> SchedulerDate: ...
|
|
79
|
+
def into_cron(self) -> str: ...
|
|
66
80
|
def next_timestamp(self, now: datetime | None = None) -> float: ...
|
|
67
81
|
def next_run(self, now: datetime | None = None) -> datetime: ...
|
|
68
82
|
def _parse_field(
|
|
69
83
|
self, field: CronField, min_value: int, max_value: int
|
|
70
84
|
) -> set[int]: ...
|
|
85
|
+
def _into_cron_field(
|
|
86
|
+
self, field: set[int], min_value: int, max_value: int
|
|
87
|
+
) -> str: ...
|
|
@@ -164,6 +164,12 @@ class CronSchedulerTest(unittest.TestCase):
|
|
|
164
164
|
|
|
165
165
|
class SchedulerDateTest(unittest.TestCase):
|
|
166
166
|
|
|
167
|
+
def test_repr(self):
|
|
168
|
+
date = appier.SchedulerDate.from_cron("11")
|
|
169
|
+
self.assertEqual(
|
|
170
|
+
repr(date), "<SchedulerDate: 11 * * * *, %s>" % str(date.next_run())
|
|
171
|
+
)
|
|
172
|
+
|
|
167
173
|
def test_from_cron(self):
|
|
168
174
|
date = appier.SchedulerDate.from_cron("11")
|
|
169
175
|
self.assertEqual(date.minutes, set((11,)))
|
|
@@ -172,6 +178,25 @@ class SchedulerDateTest(unittest.TestCase):
|
|
|
172
178
|
self.assertEqual(date.months, set(range(1, 13)))
|
|
173
179
|
self.assertEqual(date.days_of_week, set(range(0, 7)))
|
|
174
180
|
|
|
181
|
+
def test_into_cron(self):
|
|
182
|
+
date = appier.SchedulerDate.from_cron("11")
|
|
183
|
+
self.assertEqual(date.into_cron(), "11 * * * *")
|
|
184
|
+
|
|
185
|
+
date = appier.SchedulerDate.from_cron("11 3")
|
|
186
|
+
self.assertEqual(date.into_cron(), "11 3 * * *")
|
|
187
|
+
|
|
188
|
+
date = appier.SchedulerDate.from_cron("11 3 10")
|
|
189
|
+
self.assertEqual(date.into_cron(), "11 3 10 * *")
|
|
190
|
+
|
|
191
|
+
date = appier.SchedulerDate.from_cron("11 3 10 5")
|
|
192
|
+
self.assertEqual(date.into_cron(), "11 3 10 5 *")
|
|
193
|
+
|
|
194
|
+
date = appier.SchedulerDate.from_cron("11 3 10 5 2")
|
|
195
|
+
self.assertEqual(date.into_cron(), "11 3 10 5 2")
|
|
196
|
+
|
|
197
|
+
date = appier.SchedulerDate.from_cron("* 3 10 5 2")
|
|
198
|
+
self.assertEqual(date.into_cron(), "* 3 10 5 2")
|
|
199
|
+
|
|
175
200
|
def test_next_run(self):
|
|
176
201
|
date = appier.SchedulerDate.from_cron("11")
|
|
177
202
|
|
|
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
|