Skip to content

PERF: leverage tzlocal package to provide 2000x speedup for dateutil.tz.tzlocal operations #24737

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from

Conversation

qwhelan
Copy link
Contributor

@qwhelan qwhelan commented Jan 12, 2019

This is a follow-up to #24491, where it was noted that tzlocal operations are notably slower:

[ 53.12%] ··· timeseries.DatetimeIndex.time_add_timedelta                                                                                                                 ok
[ 53.12%] ··· ============ =============
               index_type
              ------------ -------------
                  dst         471±8μs
                repeated    3.52±0.05ms
                tz_aware    3.78±0.07ms
              **tz_local     5.77±0.01s**
                tz_naive    1.98±0.03ms
              ============ =============

This PR makes them indistinguishable from other timezones:

[ 60.00%] ··· timeseries.DatetimeIndex.time_add_timedelta                                                                                                                 ok
[ 60.00%] ··· ============ =============
               index_type
              ------------ -------------
                  dst         465±8μs
                repeated    3.55±0.07ms
                tz_aware    3.65±0.05ms
                tz_local    3.68±0.04ms
                tz_naive    1.81±0.05ms
              ============ =============

To do this, we add a new optional dependency: tzlocal. This package queries the OS to try and identify a pytz compatible timezone name for the local timezone. If this is successful, we can use the pytz timezone instead of dateutil.tz.tzlocal(), yielding a huge speedup as the latter invokes datetime.datetime(). In cases where the local timezone is also UTC, further speedups are possible.

In all cases, the tzlocal() object is maintained as the .tz to preserve any semantic meaning.

One unresolved issue is an incompatibility with python-dateutil versions prior to 2.6.0. I'm unable to reproduce the error locally, but can repeatably get this error on Travis:

    def test_timetz_accessor(self, tz_naive_fixture):
        # GH21358
        tz = timezones.maybe_get_tz(tz_naive_fixture)
    
        expected = np.array([time(10, 20, 30, tzinfo=tz), pd.NaT])
    
        index = DatetimeIndex(['2018-06-04 10:20:30', pd.NaT], tz=tz)
        result = index.timetz
    
>       tm.assert_numpy_array_equal(result, expected)
pandas/tests/indexes/datetimes/test_timezones.py:824: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
pandas/core/dtypes/missing.py:404: in array_equivalent
    ensure_object(left.ravel()), ensure_object(right.ravel()))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
>   if not (PyObject_RichCompareBool(x, y, Py_EQ) or
E   TypeError: can't compare offset-naive and offset-aware times

While this only shows up on the 2.7 build, I believe this is due to it being the only one actually building against python-dateutil=2.5.0. Any version >=2.6.0 does not exhibit this error.

Finally, here is the asv benchmark against v0.24.0rc1:

$ asv compare v0.24.0rc1 HEAD -s --sort ratio --only-changed
       before           after         ratio
     [fdc4db25]       [56e5cc0d]
     <v0.24.0rc1^0>       <tzlocal>
-        68.4±5μs         17.9±1μs     0.26  timeseries.DatetimeIndex.time_get('tz_local')
-      5.54±0.02s          188±2ms     0.03  timeseries.DatetimeIndex.time_to_pydatetime('tz_local')
-      7.13±0.02s       30.2±0.7ms     0.00  timeseries.DatetimeIndex.time_normalize('tz_local')
-      6.00±0.05s       23.7±0.3ms     0.00  timeseries.DatetimeIndex.time_to_time('tz_local')
-      6.00±0.01s       21.3±0.3ms     0.00  timeseries.DatetimeIndex.time_to_date('tz_local')
-      5.98±0.06s      3.68±0.04ms     0.00  timeseries.DatetimeIndex.time_add_timedelta('tz_local') 
-      5.96±0.05s      2.49±0.05ms     0.00  timeseries.DatetimeIndex.time_timeseries_is_month_start('tz_local')
  • closes #xxxx
  • tests added / passed
  • passes git diff upstream/master -u -- "*.py" | flake8 --diff
  • whatsnew entry

@codecov
Copy link

codecov bot commented Jan 12, 2019

Codecov Report

Merging #24737 into master will decrease coverage by <.01%.
The diff coverage is n/a.

Impacted file tree graph

@@            Coverage Diff             @@
##           master   #24737      +/-   ##
==========================================
- Coverage   92.39%   92.38%   -0.01%     
==========================================
  Files         166      166              
  Lines       52358    52358              
==========================================
- Hits        48374    48373       -1     
- Misses       3984     3985       +1
Flag Coverage Δ
#multiple 90.81% <ø> (ø) ⬆️
#single 43.07% <ø> (-0.02%) ⬇️
Impacted Files Coverage Δ
pandas/util/testing.py 88% <0%> (-0.1%) ⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update fdc4db2...5f9fb96. Read the comment docs.

@codecov
Copy link

codecov bot commented Jan 12, 2019

Codecov Report

Merging #24737 into master will decrease coverage by 49.61%.
The diff coverage is 9.77%.

Impacted file tree graph

@@             Coverage Diff             @@
##           master   #24737       +/-   ##
===========================================
- Coverage   92.37%   42.75%   -49.62%     
===========================================
  Files         166      171        +5     
  Lines       52408    52582      +174     
===========================================
- Hits        48412    22484    -25928     
- Misses       3996    30098    +26102
Flag Coverage Δ
#multiple ?
#single 42.75% <9.77%> (-0.11%) ⬇️
Impacted Files Coverage Δ
pandas/_libs/src/tzlocal/win32.py 0% <0%> (ø)
pandas/_libs/src/tzlocal/windows_tz.py 0% <0%> (ø)
pandas/_libs/src/tzlocal/unix.py 10.41% <10.41%> (ø)
pandas/_libs/src/tzlocal/utils.py 28.57% <28.57%> (ø)
pandas/_libs/src/tzlocal/__init__.py 75% <75%> (ø)
pandas/io/formats/latex.py 0% <0%> (-100%) ⬇️
pandas/core/categorical.py 0% <0%> (-100%) ⬇️
pandas/io/sas/sas_constants.py 0% <0%> (-100%) ⬇️
pandas/tseries/plotting.py 0% <0%> (-100%) ⬇️
pandas/tseries/converter.py 0% <0%> (-100%) ⬇️
... and 133 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update e3b0950...59c1cb6. Read the comment docs.

@jschendel jschendel added Datetime Datetime data dtype Performance Memory or execution speed performance Timezones Timezone data dtype labels Jan 12, 2019
Copy link
Member

@mroeschke mroeschke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall we need to consider whether this is worth bumping up our min dateutil version and adding an optional dependency to accelerate only dateutil.tz.tzlocal

Alternatively, could tzlocal be vendored?

@@ -10,10 +10,11 @@ dependencies:
- numpy=1.12.0
- openpyxl=2.5.5
- pytables=3.4.2
- python-dateutil=2.5.0
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We would need to discuss bumping up our minimum version of dateutil

@@ -34,6 +36,38 @@ cdef inline bint is_tzlocal(object tz):
return isinstance(tz, _dateutil_tzlocal)


cpdef bint have_tzlocal_package():
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couldn't this just be run once with the imports and just assign the sentinel value?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Absolutely


try:
return pytz.timezone(tzlocal_tz)
except pytz.exceptions.UnknownTimeZoneError:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't think you need the exceptions here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tzlocal will report the system tz even if it isn't a valid pytz tz. For example, we'll hit this case if /etc/timezone contains foo/bar or, more likely, an ambiguous user timezone like STD.

@@ -820,7 +820,8 @@ def test_timetz_accessor(self, tz_naive_fixture):

index = DatetimeIndex(['2018-06-04 10:20:30', pd.NaT], tz=tz)
result = index.timetz

print('result', result)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leftover prints?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, will clean up

@@ -536,6 +536,8 @@ def test_dt_timetz_accessor(self, tz_naive_fixture):
expected = Series([time(23, 56, tzinfo=tz), time(21, 24, tzinfo=tz),
time(22, 14, tzinfo=tz)])
result = s.dt.timetz
print('result', result)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leftover prints?

Copy link
Contributor

@jreback jreback left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we just moved min version for python dateutil
how hard is it to vendor tzlocal?

@qwhelan
Copy link
Contributor Author

qwhelan commented Jan 12, 2019

@mroeschke Agreed, it's worth mentioning that this mostly fixes the top performance regression between v0.23.4 and v0.24.0rc1:

       before           after         ratio
     [04095216]       [fdc4db25]
     <v0.23.4^0>       <v0.24.0rc1^0>
+     3.91±0.01ms       18.8±0.01s  4819.04  timeseries.DatetimeIndex.time_add_timedelta('tz_local')

It'd be relatively simple to vendor it as it's only a handful of files. It's MIT licensed, so should be fine but worth mentioning now.

I haven't been able to reproduce the python-dateutil conflict locally thus far, but I'll dig into that further to see if there's an easy workaround.

@jreback
Copy link
Contributor

jreback commented Jan 12, 2019

if we bump to 2.6.0 would u still need tzlocal?

@jbrockmendel
Copy link
Member

I generally like the idea of avoiding returning dateutil.tz.tzlocal(). Besides the performance issue, it hurts portability.

Do we have any read on how accurate/canonical tzlocal.get_localzone is? For instance I just called it and got "America/Los_Angeles" back, while I was expecting to get "US/Pacific". Do/should we care about that distinction?

Also FWIW, the way dateutil decides to return a tzlocal() object is based on looking at time.tzname, which for me returns a tuple ('PST', 'PDT').

@qwhelan
Copy link
Contributor Author

qwhelan commented Jan 12, 2019

@jreback Yes, there's just a hard-to-reproduce conflict with 2.5.0-2.5.3. Not sure how serious it is at this point.

@jbrockmendel Regarding accuracy, it's pulling from system files like /etc/timezone, /var/db/zoneinfo, etc so should accurately reflect the system timezone. However, given that it's checking so many places it's entirely possible a user has different timezones configured in different files.

There's no distinction between America/Los_Angeles and US/Pacific other than the latter being deprecated (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).

@mroeschke
Copy link
Member

Although tzlocal hurts portability (unless that's the intension), I think pandas should ensure that timezones in == timezones out and shouldn't make any assumptions or transformation when returning the timezone (i.e tzlocal in, tzlocal out; US/Pacific in, US/Pacific out), which I can see your PR does @qwhelan .

Overall agreed that I'd be great to address this regression. Shot in the dark: I think the proper way to compare dateutil tzs is with is and not ==, so maybe that's why you're seeing that error?

@jreback
Copy link
Contributor

jreback commented Jan 13, 2019

Overall agreed that I'd be great to address this regression. Shot in the dark: I think the proper way to compare dateutil tzs is with is and not ==, so maybe that's why you're seeing that error?

use tz_compare for this purpose

@qwhelan qwhelan force-pushed the tzlocal branch 2 times, most recently from 64e8788 to 79bb80e Compare January 30, 2019 08:13
@pep8speaks
Copy link

pep8speaks commented Jan 30, 2019

Hello @qwhelan! Thanks for updating the PR.

Line 63:80: E501 line too long (81 > 79 characters)
Line 121:33: E226 missing whitespace around arithmetic operator
Line 128:37: E226 missing whitespace around arithmetic operator
Line 131:80: E501 line too long (81 > 79 characters)
Line 134:80: E501 line too long (80 > 79 characters)
Line 160:80: E501 line too long (89 > 79 characters)

Line 12:80: E501 line too long (80 > 79 characters)
Line 27:80: E501 line too long (80 > 79 characters)
Line 37:16: E126 continuation line over-indented for hanging indent

Line 90:80: E501 line too long (96 > 79 characters)
Line 100:80: E501 line too long (89 > 79 characters)

Line 4:2: E128 continuation line under-indented for visual indent
Line 5:2: E128 continuation line under-indented for visual indent
Line 6:2: E128 continuation line under-indented for visual indent
Line 7:2: E128 continuation line under-indented for visual indent
Line 8:2: E128 continuation line under-indented for visual indent
Line 9:2: E128 continuation line under-indented for visual indent
Line 10:2: E128 continuation line under-indented for visual indent
Line 11:2: E128 continuation line under-indented for visual indent
Line 12:2: E128 continuation line under-indented for visual indent
Line 13:2: E128 continuation line under-indented for visual indent
Line 14:2: E128 continuation line under-indented for visual indent
Line 15:2: E128 continuation line under-indented for visual indent
Line 16:2: E128 continuation line under-indented for visual indent
Line 17:2: E128 continuation line under-indented for visual indent
Line 18:2: E128 continuation line under-indented for visual indent
Line 19:2: E128 continuation line under-indented for visual indent
Line 20:2: E128 continuation line under-indented for visual indent
Line 21:2: E128 continuation line under-indented for visual indent
Line 22:2: E128 continuation line under-indented for visual indent
Line 23:2: E128 continuation line under-indented for visual indent
Line 24:2: E128 continuation line under-indented for visual indent
Line 25:2: E128 continuation line under-indented for visual indent
Line 26:2: E128 continuation line under-indented for visual indent
Line 27:2: E128 continuation line under-indented for visual indent
Line 28:2: E128 continuation line under-indented for visual indent
Line 29:2: E128 continuation line under-indented for visual indent
Line 30:2: E128 continuation line under-indented for visual indent
Line 31:2: E128 continuation line under-indented for visual indent
Line 32:2: E128 continuation line under-indented for visual indent
Line 33:2: E128 continuation line under-indented for visual indent
Line 34:2: E128 continuation line under-indented for visual indent
Line 35:2: E128 continuation line under-indented for visual indent
Line 36:2: E128 continuation line under-indented for visual indent
Line 37:2: E128 continuation line under-indented for visual indent
Line 38:2: E128 continuation line under-indented for visual indent
Line 39:2: E128 continuation line under-indented for visual indent
Line 40:2: E128 continuation line under-indented for visual indent
Line 41:2: E128 continuation line under-indented for visual indent
Line 42:2: E128 continuation line under-indented for visual indent
Line 43:2: E128 continuation line under-indented for visual indent
Line 44:2: E128 continuation line under-indented for visual indent
Line 45:2: E128 continuation line under-indented for visual indent
Line 46:2: E128 continuation line under-indented for visual indent
Line 47:2: E128 continuation line under-indented for visual indent
Line 48:2: E128 continuation line under-indented for visual indent
Line 49:2: E128 continuation line under-indented for visual indent
Line 50:2: E128 continuation line under-indented for visual indent
Line 51:2: E128 continuation line under-indented for visual indent
Line 52:2: E128 continuation line under-indented for visual indent
Line 53:2: E128 continuation line under-indented for visual indent
Line 54:2: E128 continuation line under-indented for visual indent
Line 55:2: E128 continuation line under-indented for visual indent
Line 56:2: E128 continuation line under-indented for visual indent
Line 57:2: E128 continuation line under-indented for visual indent
Line 58:2: E128 continuation line under-indented for visual indent
Line 59:2: E128 continuation line under-indented for visual indent
Line 60:2: E128 continuation line under-indented for visual indent
Line 61:2: E128 continuation line under-indented for visual indent
Line 62:2: E128 continuation line under-indented for visual indent
Line 63:2: E128 continuation line under-indented for visual indent
Line 64:2: E128 continuation line under-indented for visual indent
Line 65:2: E128 continuation line under-indented for visual indent
Line 66:2: E128 continuation line under-indented for visual indent
Line 67:2: E128 continuation line under-indented for visual indent
Line 68:2: E128 continuation line under-indented for visual indent
Line 69:2: E128 continuation line under-indented for visual indent
Line 70:2: E128 continuation line under-indented for visual indent
Line 71:2: E128 continuation line under-indented for visual indent
Line 72:2: E128 continuation line under-indented for visual indent
Line 73:2: E128 continuation line under-indented for visual indent
Line 74:2: E128 continuation line under-indented for visual indent
Line 75:2: E128 continuation line under-indented for visual indent
Line 76:2: E128 continuation line under-indented for visual indent
Line 77:2: E128 continuation line under-indented for visual indent
Line 78:2: E128 continuation line under-indented for visual indent
Line 79:2: E128 continuation line under-indented for visual indent
Line 80:2: E128 continuation line under-indented for visual indent
Line 81:2: E128 continuation line under-indented for visual indent
Line 82:2: E128 continuation line under-indented for visual indent
Line 83:2: E128 continuation line under-indented for visual indent
Line 84:2: E128 continuation line under-indented for visual indent
Line 85:2: E128 continuation line under-indented for visual indent
Line 86:2: E128 continuation line under-indented for visual indent
Line 87:2: E128 continuation line under-indented for visual indent
Line 88:2: E128 continuation line under-indented for visual indent
Line 89:2: E128 continuation line under-indented for visual indent
Line 90:2: E128 continuation line under-indented for visual indent
Line 91:2: E128 continuation line under-indented for visual indent
Line 92:2: E128 continuation line under-indented for visual indent
Line 93:2: E128 continuation line under-indented for visual indent
Line 94:2: E128 continuation line under-indented for visual indent
Line 95:2: E128 continuation line under-indented for visual indent
Line 96:2: E128 continuation line under-indented for visual indent
Line 97:2: E128 continuation line under-indented for visual indent
Line 98:2: E128 continuation line under-indented for visual indent
Line 99:2: E128 continuation line under-indented for visual indent
Line 100:2: E128 continuation line under-indented for visual indent
Line 101:2: E128 continuation line under-indented for visual indent
Line 102:2: E128 continuation line under-indented for visual indent
Line 103:2: E128 continuation line under-indented for visual indent
Line 104:2: E128 continuation line under-indented for visual indent
Line 105:2: E128 continuation line under-indented for visual indent
Line 106:2: E128 continuation line under-indented for visual indent
Line 107:2: E128 continuation line under-indented for visual indent
Line 108:2: E128 continuation line under-indented for visual indent
Line 109:2: E128 continuation line under-indented for visual indent
Line 110:2: E128 continuation line under-indented for visual indent
Line 111:2: E128 continuation line under-indented for visual indent
Line 112:2: E128 continuation line under-indented for visual indent
Line 113:2: E128 continuation line under-indented for visual indent
Line 114:2: E128 continuation line under-indented for visual indent
Line 115:2: E128 continuation line under-indented for visual indent
Line 116:2: E128 continuation line under-indented for visual indent
Line 117:2: E128 continuation line under-indented for visual indent
Line 118:2: E128 continuation line under-indented for visual indent
Line 119:2: E128 continuation line under-indented for visual indent
Line 120:2: E128 continuation line under-indented for visual indent
Line 121:2: E128 continuation line under-indented for visual indent
Line 122:2: E128 continuation line under-indented for visual indent
Line 123:2: E128 continuation line under-indented for visual indent
Line 124:2: E128 continuation line under-indented for visual indent
Line 125:2: E128 continuation line under-indented for visual indent
Line 126:2: E128 continuation line under-indented for visual indent
Line 127:2: E128 continuation line under-indented for visual indent
Line 128:2: E128 continuation line under-indented for visual indent
Line 129:2: E128 continuation line under-indented for visual indent
Line 130:2: E128 continuation line under-indented for visual indent
Line 131:2: E128 continuation line under-indented for visual indent
Line 132:2: E128 continuation line under-indented for visual indent
Line 133:2: E128 continuation line under-indented for visual indent
Line 134:2: E128 continuation line under-indented for visual indent
Line 135:2: E128 continuation line under-indented for visual indent
Line 141:2: E128 continuation line under-indented for visual indent
Line 142:2: E128 continuation line under-indented for visual indent
Line 143:2: E128 continuation line under-indented for visual indent
Line 144:2: E128 continuation line under-indented for visual indent
Line 145:2: E128 continuation line under-indented for visual indent
Line 146:2: E128 continuation line under-indented for visual indent
Line 147:2: E128 continuation line under-indented for visual indent
Line 148:2: E128 continuation line under-indented for visual indent
Line 149:2: E128 continuation line under-indented for visual indent
Line 150:2: E128 continuation line under-indented for visual indent
Line 151:2: E128 continuation line under-indented for visual indent
Line 152:2: E128 continuation line under-indented for visual indent
Line 153:2: E128 continuation line under-indented for visual indent
Line 154:2: E128 continuation line under-indented for visual indent
Line 155:2: E128 continuation line under-indented for visual indent
Line 156:2: E128 continuation line under-indented for visual indent
Line 157:2: E128 continuation line under-indented for visual indent
Line 158:2: E128 continuation line under-indented for visual indent
Line 159:2: E128 continuation line under-indented for visual indent
Line 160:2: E128 continuation line under-indented for visual indent
Line 161:2: E128 continuation line under-indented for visual indent
Line 162:2: E128 continuation line under-indented for visual indent
Line 163:2: E128 continuation line under-indented for visual indent
Line 164:2: E128 continuation line under-indented for visual indent
Line 165:2: E128 continuation line under-indented for visual indent
Line 166:2: E128 continuation line under-indented for visual indent
Line 167:2: E128 continuation line under-indented for visual indent
Line 168:2: E128 continuation line under-indented for visual indent
Line 169:2: E128 continuation line under-indented for visual indent
Line 170:2: E128 continuation line under-indented for visual indent
Line 171:2: E128 continuation line under-indented for visual indent
Line 172:2: E128 continuation line under-indented for visual indent
Line 173:2: E128 continuation line under-indented for visual indent
Line 174:2: E128 continuation line under-indented for visual indent
Line 175:2: E128 continuation line under-indented for visual indent
Line 176:2: E128 continuation line under-indented for visual indent
Line 177:2: E128 continuation line under-indented for visual indent
Line 178:2: E128 continuation line under-indented for visual indent
Line 179:2: E128 continuation line under-indented for visual indent
Line 180:2: E128 continuation line under-indented for visual indent
Line 181:2: E128 continuation line under-indented for visual indent
Line 182:2: E128 continuation line under-indented for visual indent
Line 183:2: E128 continuation line under-indented for visual indent
Line 184:2: E128 continuation line under-indented for visual indent
Line 185:2: E128 continuation line under-indented for visual indent
Line 186:2: E128 continuation line under-indented for visual indent
Line 187:2: E128 continuation line under-indented for visual indent
Line 188:2: E128 continuation line under-indented for visual indent
Line 189:2: E128 continuation line under-indented for visual indent
Line 190:2: E128 continuation line under-indented for visual indent
Line 191:2: E128 continuation line under-indented for visual indent
Line 192:2: E128 continuation line under-indented for visual indent
Line 193:2: E128 continuation line under-indented for visual indent
Line 194:2: E128 continuation line under-indented for visual indent
Line 195:2: E128 continuation line under-indented for visual indent
Line 196:2: E128 continuation line under-indented for visual indent
Line 197:2: E128 continuation line under-indented for visual indent
Line 198:2: E128 continuation line under-indented for visual indent
Line 199:2: E128 continuation line under-indented for visual indent
Line 200:2: E128 continuation line under-indented for visual indent
Line 201:2: E128 continuation line under-indented for visual indent
Line 202:2: E128 continuation line under-indented for visual indent
Line 203:2: E128 continuation line under-indented for visual indent
Line 204:2: E128 continuation line under-indented for visual indent
Line 205:2: E128 continuation line under-indented for visual indent
Line 206:2: E128 continuation line under-indented for visual indent
Line 207:2: E128 continuation line under-indented for visual indent
Line 208:2: E128 continuation line under-indented for visual indent
Line 209:2: E128 continuation line under-indented for visual indent
Line 210:2: E128 continuation line under-indented for visual indent
Line 211:2: E128 continuation line under-indented for visual indent
Line 212:2: E128 continuation line under-indented for visual indent
Line 213:2: E128 continuation line under-indented for visual indent
Line 214:2: E128 continuation line under-indented for visual indent
Line 215:2: E128 continuation line under-indented for visual indent
Line 216:2: E128 continuation line under-indented for visual indent
Line 217:2: E128 continuation line under-indented for visual indent
Line 218:2: E128 continuation line under-indented for visual indent
Line 219:2: E128 continuation line under-indented for visual indent
Line 220:2: E128 continuation line under-indented for visual indent
Line 221:2: E128 continuation line under-indented for visual indent
Line 222:2: E128 continuation line under-indented for visual indent
Line 223:2: E128 continuation line under-indented for visual indent
Line 224:2: E128 continuation line under-indented for visual indent
Line 225:2: E128 continuation line under-indented for visual indent
Line 226:2: E128 continuation line under-indented for visual indent
Line 227:2: E128 continuation line under-indented for visual indent
Line 228:2: E128 continuation line under-indented for visual indent
Line 229:2: E128 continuation line under-indented for visual indent
Line 230:2: E128 continuation line under-indented for visual indent
Line 231:2: E128 continuation line under-indented for visual indent
Line 232:2: E128 continuation line under-indented for visual indent
Line 233:2: E128 continuation line under-indented for visual indent
Line 234:2: E128 continuation line under-indented for visual indent
Line 235:2: E128 continuation line under-indented for visual indent
Line 236:2: E128 continuation line under-indented for visual indent
Line 237:2: E128 continuation line under-indented for visual indent
Line 238:2: E128 continuation line under-indented for visual indent
Line 239:2: E128 continuation line under-indented for visual indent
Line 240:2: E128 continuation line under-indented for visual indent
Line 241:2: E128 continuation line under-indented for visual indent
Line 242:2: E128 continuation line under-indented for visual indent
Line 243:2: E128 continuation line under-indented for visual indent
Line 244:2: E128 continuation line under-indented for visual indent
Line 245:2: E128 continuation line under-indented for visual indent
Line 246:2: E128 continuation line under-indented for visual indent
Line 247:2: E128 continuation line under-indented for visual indent
Line 248:2: E128 continuation line under-indented for visual indent
Line 249:2: E128 continuation line under-indented for visual indent
Line 250:2: E128 continuation line under-indented for visual indent
Line 251:2: E128 continuation line under-indented for visual indent
Line 252:2: E128 continuation line under-indented for visual indent
Line 253:2: E128 continuation line under-indented for visual indent
Line 254:2: E128 continuation line under-indented for visual indent
Line 255:2: E128 continuation line under-indented for visual indent
Line 256:2: E128 continuation line under-indented for visual indent
Line 257:2: E128 continuation line under-indented for visual indent
Line 258:2: E128 continuation line under-indented for visual indent
Line 259:2: E128 continuation line under-indented for visual indent
Line 260:2: E128 continuation line under-indented for visual indent
Line 261:2: E128 continuation line under-indented for visual indent
Line 262:2: E128 continuation line under-indented for visual indent
Line 263:2: E128 continuation line under-indented for visual indent
Line 264:2: E128 continuation line under-indented for visual indent
Line 265:2: E128 continuation line under-indented for visual indent
Line 266:2: E128 continuation line under-indented for visual indent
Line 267:2: E128 continuation line under-indented for visual indent
Line 268:2: E128 continuation line under-indented for visual indent
Line 269:2: E128 continuation line under-indented for visual indent
Line 270:2: E128 continuation line under-indented for visual indent
Line 271:2: E128 continuation line under-indented for visual indent
Line 272:2: E128 continuation line under-indented for visual indent
Line 273:2: E128 continuation line under-indented for visual indent
Line 274:2: E128 continuation line under-indented for visual indent
Line 275:2: E128 continuation line under-indented for visual indent
Line 276:2: E128 continuation line under-indented for visual indent
Line 277:2: E128 continuation line under-indented for visual indent
Line 278:2: E128 continuation line under-indented for visual indent
Line 279:2: E128 continuation line under-indented for visual indent
Line 280:2: E128 continuation line under-indented for visual indent
Line 281:2: E128 continuation line under-indented for visual indent
Line 282:2: E128 continuation line under-indented for visual indent
Line 283:2: E128 continuation line under-indented for visual indent
Line 284:2: E128 continuation line under-indented for visual indent
Line 285:2: E128 continuation line under-indented for visual indent
Line 286:2: E128 continuation line under-indented for visual indent
Line 287:2: E128 continuation line under-indented for visual indent
Line 288:2: E128 continuation line under-indented for visual indent
Line 289:2: E128 continuation line under-indented for visual indent
Line 290:2: E128 continuation line under-indented for visual indent
Line 291:2: E128 continuation line under-indented for visual indent
Line 292:2: E128 continuation line under-indented for visual indent
Line 293:2: E128 continuation line under-indented for visual indent
Line 294:2: E128 continuation line under-indented for visual indent
Line 295:2: E128 continuation line under-indented for visual indent
Line 296:2: E128 continuation line under-indented for visual indent
Line 297:2: E128 continuation line under-indented for visual indent
Line 298:2: E128 continuation line under-indented for visual indent
Line 299:2: E128 continuation line under-indented for visual indent
Line 300:2: E128 continuation line under-indented for visual indent
Line 301:2: E128 continuation line under-indented for visual indent
Line 302:2: E128 continuation line under-indented for visual indent
Line 303:2: E128 continuation line under-indented for visual indent
Line 304:2: E128 continuation line under-indented for visual indent
Line 305:2: E128 continuation line under-indented for visual indent
Line 306:2: E128 continuation line under-indented for visual indent
Line 307:2: E128 continuation line under-indented for visual indent
Line 308:2: E128 continuation line under-indented for visual indent
Line 309:2: E128 continuation line under-indented for visual indent
Line 310:2: E128 continuation line under-indented for visual indent
Line 311:2: E128 continuation line under-indented for visual indent
Line 312:2: E128 continuation line under-indented for visual indent
Line 313:2: E128 continuation line under-indented for visual indent
Line 314:2: E128 continuation line under-indented for visual indent
Line 315:2: E128 continuation line under-indented for visual indent
Line 316:2: E128 continuation line under-indented for visual indent
Line 317:2: E128 continuation line under-indented for visual indent
Line 318:2: E128 continuation line under-indented for visual indent
Line 319:2: E128 continuation line under-indented for visual indent
Line 320:2: E128 continuation line under-indented for visual indent
Line 321:2: E128 continuation line under-indented for visual indent
Line 322:2: E128 continuation line under-indented for visual indent
Line 323:2: E128 continuation line under-indented for visual indent
Line 324:2: E128 continuation line under-indented for visual indent
Line 325:2: E128 continuation line under-indented for visual indent
Line 326:2: E128 continuation line under-indented for visual indent
Line 327:2: E128 continuation line under-indented for visual indent
Line 328:2: E128 continuation line under-indented for visual indent
Line 329:2: E128 continuation line under-indented for visual indent
Line 330:2: E128 continuation line under-indented for visual indent
Line 331:2: E128 continuation line under-indented for visual indent
Line 332:2: E128 continuation line under-indented for visual indent
Line 333:2: E128 continuation line under-indented for visual indent
Line 334:2: E128 continuation line under-indented for visual indent
Line 335:2: E128 continuation line under-indented for visual indent
Line 336:2: E128 continuation line under-indented for visual indent
Line 337:2: E128 continuation line under-indented for visual indent
Line 338:2: E128 continuation line under-indented for visual indent
Line 339:2: E128 continuation line under-indented for visual indent
Line 340:2: E128 continuation line under-indented for visual indent
Line 341:2: E128 continuation line under-indented for visual indent
Line 342:2: E128 continuation line under-indented for visual indent
Line 343:2: E128 continuation line under-indented for visual indent
Line 344:2: E128 continuation line under-indented for visual indent
Line 345:2: E128 continuation line under-indented for visual indent
Line 346:2: E128 continuation line under-indented for visual indent
Line 347:2: E128 continuation line under-indented for visual indent
Line 348:2: E128 continuation line under-indented for visual indent
Line 349:2: E128 continuation line under-indented for visual indent
Line 350:2: E128 continuation line under-indented for visual indent
Line 351:2: E128 continuation line under-indented for visual indent
Line 352:2: E128 continuation line under-indented for visual indent
Line 353:2: E128 continuation line under-indented for visual indent
Line 354:2: E128 continuation line under-indented for visual indent
Line 355:2: E128 continuation line under-indented for visual indent
Line 356:2: E128 continuation line under-indented for visual indent
Line 357:2: E128 continuation line under-indented for visual indent
Line 358:2: E128 continuation line under-indented for visual indent
Line 359:2: E128 continuation line under-indented for visual indent
Line 360:2: E128 continuation line under-indented for visual indent
Line 361:2: E128 continuation line under-indented for visual indent
Line 362:2: E128 continuation line under-indented for visual indent
Line 363:2: E128 continuation line under-indented for visual indent
Line 364:2: E128 continuation line under-indented for visual indent
Line 365:2: E128 continuation line under-indented for visual indent
Line 366:2: E128 continuation line under-indented for visual indent
Line 367:2: E128 continuation line under-indented for visual indent
Line 368:2: E128 continuation line under-indented for visual indent
Line 369:2: E128 continuation line under-indented for visual indent
Line 370:2: E128 continuation line under-indented for visual indent
Line 371:2: E128 continuation line under-indented for visual indent
Line 372:2: E128 continuation line under-indented for visual indent
Line 373:2: E128 continuation line under-indented for visual indent
Line 374:2: E128 continuation line under-indented for visual indent
Line 375:2: E128 continuation line under-indented for visual indent
Line 376:2: E128 continuation line under-indented for visual indent
Line 377:2: E128 continuation line under-indented for visual indent
Line 378:2: E128 continuation line under-indented for visual indent
Line 379:2: E128 continuation line under-indented for visual indent
Line 380:2: E128 continuation line under-indented for visual indent
Line 381:2: E128 continuation line under-indented for visual indent
Line 382:2: E128 continuation line under-indented for visual indent
Line 383:2: E128 continuation line under-indented for visual indent
Line 384:2: E128 continuation line under-indented for visual indent
Line 385:2: E128 continuation line under-indented for visual indent
Line 386:2: E128 continuation line under-indented for visual indent
Line 387:2: E128 continuation line under-indented for visual indent
Line 388:2: E128 continuation line under-indented for visual indent
Line 389:2: E128 continuation line under-indented for visual indent
Line 390:2: E128 continuation line under-indented for visual indent
Line 391:2: E128 continuation line under-indented for visual indent
Line 392:2: E128 continuation line under-indented for visual indent
Line 393:2: E128 continuation line under-indented for visual indent
Line 394:2: E128 continuation line under-indented for visual indent
Line 395:2: E128 continuation line under-indented for visual indent
Line 396:2: E128 continuation line under-indented for visual indent
Line 397:2: E128 continuation line under-indented for visual indent
Line 398:2: E128 continuation line under-indented for visual indent
Line 399:2: E128 continuation line under-indented for visual indent
Line 400:2: E128 continuation line under-indented for visual indent
Line 401:2: E128 continuation line under-indented for visual indent
Line 402:2: E128 continuation line under-indented for visual indent
Line 403:2: E128 continuation line under-indented for visual indent
Line 404:2: E128 continuation line under-indented for visual indent
Line 405:2: E128 continuation line under-indented for visual indent
Line 406:2: E128 continuation line under-indented for visual indent
Line 407:2: E128 continuation line under-indented for visual indent
Line 408:2: E128 continuation line under-indented for visual indent
Line 409:2: E128 continuation line under-indented for visual indent
Line 410:2: E128 continuation line under-indented for visual indent
Line 411:2: E128 continuation line under-indented for visual indent
Line 412:2: E128 continuation line under-indented for visual indent
Line 413:2: E128 continuation line under-indented for visual indent
Line 414:2: E128 continuation line under-indented for visual indent
Line 415:2: E128 continuation line under-indented for visual indent
Line 416:2: E128 continuation line under-indented for visual indent
Line 417:2: E128 continuation line under-indented for visual indent
Line 418:2: E128 continuation line under-indented for visual indent
Line 419:2: E128 continuation line under-indented for visual indent
Line 420:2: E128 continuation line under-indented for visual indent
Line 421:2: E128 continuation line under-indented for visual indent
Line 422:2: E128 continuation line under-indented for visual indent
Line 423:2: E128 continuation line under-indented for visual indent
Line 424:2: E128 continuation line under-indented for visual indent
Line 425:2: E128 continuation line under-indented for visual indent
Line 426:2: E128 continuation line under-indented for visual indent
Line 427:2: E128 continuation line under-indented for visual indent
Line 428:2: E128 continuation line under-indented for visual indent
Line 429:2: E128 continuation line under-indented for visual indent
Line 430:2: E128 continuation line under-indented for visual indent
Line 431:2: E128 continuation line under-indented for visual indent
Line 432:2: E128 continuation line under-indented for visual indent
Line 433:2: E128 continuation line under-indented for visual indent
Line 434:2: E128 continuation line under-indented for visual indent
Line 435:2: E128 continuation line under-indented for visual indent
Line 436:2: E128 continuation line under-indented for visual indent
Line 437:2: E128 continuation line under-indented for visual indent
Line 438:2: E128 continuation line under-indented for visual indent
Line 439:2: E128 continuation line under-indented for visual indent
Line 440:2: E128 continuation line under-indented for visual indent
Line 441:2: E128 continuation line under-indented for visual indent
Line 442:2: E128 continuation line under-indented for visual indent
Line 443:2: E128 continuation line under-indented for visual indent
Line 444:2: E128 continuation line under-indented for visual indent
Line 445:2: E128 continuation line under-indented for visual indent
Line 446:2: E128 continuation line under-indented for visual indent
Line 447:2: E128 continuation line under-indented for visual indent
Line 448:2: E128 continuation line under-indented for visual indent
Line 449:2: E128 continuation line under-indented for visual indent
Line 450:2: E128 continuation line under-indented for visual indent
Line 451:2: E128 continuation line under-indented for visual indent
Line 452:2: E128 continuation line under-indented for visual indent
Line 453:2: E128 continuation line under-indented for visual indent
Line 454:2: E128 continuation line under-indented for visual indent
Line 455:2: E128 continuation line under-indented for visual indent
Line 456:2: E128 continuation line under-indented for visual indent
Line 457:2: E128 continuation line under-indented for visual indent
Line 458:2: E128 continuation line under-indented for visual indent
Line 459:2: E128 continuation line under-indented for visual indent
Line 460:2: E128 continuation line under-indented for visual indent
Line 461:2: E128 continuation line under-indented for visual indent
Line 462:2: E128 continuation line under-indented for visual indent
Line 463:2: E128 continuation line under-indented for visual indent
Line 464:2: E128 continuation line under-indented for visual indent
Line 465:2: E128 continuation line under-indented for visual indent
Line 466:2: E128 continuation line under-indented for visual indent
Line 467:2: E128 continuation line under-indented for visual indent
Line 468:2: E128 continuation line under-indented for visual indent
Line 469:2: E128 continuation line under-indented for visual indent
Line 470:2: E128 continuation line under-indented for visual indent
Line 471:2: E128 continuation line under-indented for visual indent
Line 472:2: E128 continuation line under-indented for visual indent
Line 473:2: E128 continuation line under-indented for visual indent
Line 474:2: E128 continuation line under-indented for visual indent
Line 475:2: E128 continuation line under-indented for visual indent
Line 476:2: E128 continuation line under-indented for visual indent
Line 477:2: E128 continuation line under-indented for visual indent
Line 478:2: E128 continuation line under-indented for visual indent
Line 479:2: E128 continuation line under-indented for visual indent
Line 480:2: E128 continuation line under-indented for visual indent
Line 481:2: E128 continuation line under-indented for visual indent
Line 482:2: E128 continuation line under-indented for visual indent
Line 483:2: E128 continuation line under-indented for visual indent
Line 484:2: E128 continuation line under-indented for visual indent
Line 485:2: E128 continuation line under-indented for visual indent
Line 486:2: E128 continuation line under-indented for visual indent
Line 487:2: E128 continuation line under-indented for visual indent
Line 488:2: E128 continuation line under-indented for visual indent
Line 489:2: E128 continuation line under-indented for visual indent
Line 490:2: E128 continuation line under-indented for visual indent
Line 491:2: E128 continuation line under-indented for visual indent
Line 492:2: E128 continuation line under-indented for visual indent
Line 493:2: E128 continuation line under-indented for visual indent
Line 494:2: E128 continuation line under-indented for visual indent
Line 495:2: E128 continuation line under-indented for visual indent
Line 496:2: E128 continuation line under-indented for visual indent
Line 497:2: E128 continuation line under-indented for visual indent
Line 498:2: E128 continuation line under-indented for visual indent
Line 499:2: E128 continuation line under-indented for visual indent
Line 500:2: E128 continuation line under-indented for visual indent
Line 501:2: E128 continuation line under-indented for visual indent
Line 502:2: E128 continuation line under-indented for visual indent
Line 503:2: E128 continuation line under-indented for visual indent
Line 504:2: E128 continuation line under-indented for visual indent
Line 505:2: E128 continuation line under-indented for visual indent
Line 506:2: E128 continuation line under-indented for visual indent
Line 507:2: E128 continuation line under-indented for visual indent
Line 508:2: E128 continuation line under-indented for visual indent
Line 509:2: E128 continuation line under-indented for visual indent
Line 510:2: E128 continuation line under-indented for visual indent
Line 511:2: E128 continuation line under-indented for visual indent
Line 512:2: E128 continuation line under-indented for visual indent
Line 513:2: E128 continuation line under-indented for visual indent
Line 514:2: E128 continuation line under-indented for visual indent
Line 515:2: E128 continuation line under-indented for visual indent
Line 516:2: E128 continuation line under-indented for visual indent
Line 517:2: E128 continuation line under-indented for visual indent
Line 518:2: E128 continuation line under-indented for visual indent
Line 519:2: E128 continuation line under-indented for visual indent
Line 520:2: E128 continuation line under-indented for visual indent
Line 521:2: E128 continuation line under-indented for visual indent
Line 522:2: E128 continuation line under-indented for visual indent
Line 523:2: E128 continuation line under-indented for visual indent
Line 524:2: E128 continuation line under-indented for visual indent
Line 525:2: E128 continuation line under-indented for visual indent
Line 526:2: E128 continuation line under-indented for visual indent
Line 527:2: E128 continuation line under-indented for visual indent
Line 528:2: E128 continuation line under-indented for visual indent
Line 529:2: E128 continuation line under-indented for visual indent
Line 530:2: E128 continuation line under-indented for visual indent
Line 531:2: E128 continuation line under-indented for visual indent
Line 532:2: E128 continuation line under-indented for visual indent
Line 533:2: E128 continuation line under-indented for visual indent
Line 534:2: E128 continuation line under-indented for visual indent
Line 535:2: E128 continuation line under-indented for visual indent
Line 536:2: E128 continuation line under-indented for visual indent
Line 537:2: E128 continuation line under-indented for visual indent
Line 538:2: E128 continuation line under-indented for visual indent
Line 539:2: E128 continuation line under-indented for visual indent
Line 540:2: E128 continuation line under-indented for visual indent
Line 541:2: E128 continuation line under-indented for visual indent
Line 542:2: E128 continuation line under-indented for visual indent
Line 543:2: E128 continuation line under-indented for visual indent
Line 544:2: E128 continuation line under-indented for visual indent
Line 545:2: E128 continuation line under-indented for visual indent
Line 546:2: E128 continuation line under-indented for visual indent
Line 547:2: E128 continuation line under-indented for visual indent
Line 548:2: E128 continuation line under-indented for visual indent
Line 549:2: E128 continuation line under-indented for visual indent
Line 550:2: E128 continuation line under-indented for visual indent
Line 551:2: E128 continuation line under-indented for visual indent
Line 552:2: E128 continuation line under-indented for visual indent
Line 553:2: E128 continuation line under-indented for visual indent
Line 554:2: E128 continuation line under-indented for visual indent
Line 555:2: E128 continuation line under-indented for visual indent
Line 556:2: E128 continuation line under-indented for visual indent
Line 557:2: E128 continuation line under-indented for visual indent
Line 558:2: E128 continuation line under-indented for visual indent
Line 559:2: E128 continuation line under-indented for visual indent
Line 560:2: E128 continuation line under-indented for visual indent
Line 561:2: E128 continuation line under-indented for visual indent
Line 562:2: E128 continuation line under-indented for visual indent
Line 563:2: E128 continuation line under-indented for visual indent
Line 564:2: E128 continuation line under-indented for visual indent
Line 565:2: E128 continuation line under-indented for visual indent
Line 566:2: E128 continuation line under-indented for visual indent
Line 567:2: E128 continuation line under-indented for visual indent
Line 568:2: E128 continuation line under-indented for visual indent
Line 569:2: E128 continuation line under-indented for visual indent
Line 570:2: E128 continuation line under-indented for visual indent
Line 571:2: E128 continuation line under-indented for visual indent
Line 572:2: E128 continuation line under-indented for visual indent
Line 573:2: E128 continuation line under-indented for visual indent
Line 574:2: E128 continuation line under-indented for visual indent
Line 575:2: E128 continuation line under-indented for visual indent
Line 576:2: E128 continuation line under-indented for visual indent
Line 577:2: E128 continuation line under-indented for visual indent
Line 578:2: E128 continuation line under-indented for visual indent
Line 579:2: E128 continuation line under-indented for visual indent
Line 580:2: E128 continuation line under-indented for visual indent
Line 581:2: E128 continuation line under-indented for visual indent
Line 582:2: E128 continuation line under-indented for visual indent
Line 583:2: E128 continuation line under-indented for visual indent
Line 584:2: E128 continuation line under-indented for visual indent
Line 585:2: E128 continuation line under-indented for visual indent
Line 586:2: E128 continuation line under-indented for visual indent
Line 587:2: E128 continuation line under-indented for visual indent
Line 588:2: E128 continuation line under-indented for visual indent
Line 589:2: E128 continuation line under-indented for visual indent
Line 590:2: E128 continuation line under-indented for visual indent
Line 591:2: E128 continuation line under-indented for visual indent
Line 592:2: E128 continuation line under-indented for visual indent
Line 593:2: E128 continuation line under-indented for visual indent
Line 594:2: E128 continuation line under-indented for visual indent
Line 595:2: E128 continuation line under-indented for visual indent
Line 596:2: E128 continuation line under-indented for visual indent
Line 597:2: E128 continuation line under-indented for visual indent
Line 598:2: E128 continuation line under-indented for visual indent
Line 599:2: E128 continuation line under-indented for visual indent
Line 600:2: E128 continuation line under-indented for visual indent
Line 601:2: E128 continuation line under-indented for visual indent
Line 602:2: E128 continuation line under-indented for visual indent
Line 603:2: E128 continuation line under-indented for visual indent
Line 604:2: E128 continuation line under-indented for visual indent
Line 605:2: E128 continuation line under-indented for visual indent
Line 606:2: E128 continuation line under-indented for visual indent
Line 607:2: E128 continuation line under-indented for visual indent
Line 608:2: E128 continuation line under-indented for visual indent
Line 609:2: E128 continuation line under-indented for visual indent
Line 610:2: E128 continuation line under-indented for visual indent
Line 611:2: E128 continuation line under-indented for visual indent
Line 612:2: E128 continuation line under-indented for visual indent
Line 613:2: E128 continuation line under-indented for visual indent
Line 614:2: E128 continuation line under-indented for visual indent
Line 615:2: E128 continuation line under-indented for visual indent
Line 616:2: E128 continuation line under-indented for visual indent
Line 617:2: E128 continuation line under-indented for visual indent
Line 618:2: E128 continuation line under-indented for visual indent
Line 619:2: E128 continuation line under-indented for visual indent
Line 620:2: E128 continuation line under-indented for visual indent
Line 621:2: E128 continuation line under-indented for visual indent
Line 622:2: E128 continuation line under-indented for visual indent
Line 623:2: E128 continuation line under-indented for visual indent
Line 624:2: E128 continuation line under-indented for visual indent
Line 625:2: E128 continuation line under-indented for visual indent
Line 626:2: E128 continuation line under-indented for visual indent
Line 627:2: E128 continuation line under-indented for visual indent
Line 628:2: E128 continuation line under-indented for visual indent
Line 629:2: E128 continuation line under-indented for visual indent
Line 630:2: E128 continuation line under-indented for visual indent
Line 631:2: E128 continuation line under-indented for visual indent
Line 632:2: E128 continuation line under-indented for visual indent
Line 633:2: E128 continuation line under-indented for visual indent
Line 634:2: E128 continuation line under-indented for visual indent
Line 635:2: E128 continuation line under-indented for visual indent
Line 636:2: E128 continuation line under-indented for visual indent
Line 637:2: E128 continuation line under-indented for visual indent
Line 638:2: E128 continuation line under-indented for visual indent
Line 639:2: E128 continuation line under-indented for visual indent
Line 640:2: E128 continuation line under-indented for visual indent
Line 641:2: E128 continuation line under-indented for visual indent
Line 642:2: E128 continuation line under-indented for visual indent
Line 643:2: E128 continuation line under-indented for visual indent
Line 644:2: E128 continuation line under-indented for visual indent
Line 645:2: E128 continuation line under-indented for visual indent
Line 646:2: E128 continuation line under-indented for visual indent
Line 647:2: E128 continuation line under-indented for visual indent
Line 648:2: E128 continuation line under-indented for visual indent
Line 649:2: E128 continuation line under-indented for visual indent
Line 650:2: E128 continuation line under-indented for visual indent
Line 651:2: E128 continuation line under-indented for visual indent
Line 652:2: E128 continuation line under-indented for visual indent
Line 653:2: E128 continuation line under-indented for visual indent
Line 654:2: E128 continuation line under-indented for visual indent
Line 655:2: E128 continuation line under-indented for visual indent
Line 656:2: E128 continuation line under-indented for visual indent
Line 657:2: E128 continuation line under-indented for visual indent
Line 658:2: E128 continuation line under-indented for visual indent
Line 659:2: E128 continuation line under-indented for visual indent
Line 660:2: E128 continuation line under-indented for visual indent
Line 661:2: E128 continuation line under-indented for visual indent
Line 662:2: E128 continuation line under-indented for visual indent
Line 663:2: E128 continuation line under-indented for visual indent
Line 664:2: E128 continuation line under-indented for visual indent
Line 665:2: E128 continuation line under-indented for visual indent
Line 666:2: E128 continuation line under-indented for visual indent
Line 667:2: E128 continuation line under-indented for visual indent
Line 668:2: E128 continuation line under-indented for visual indent
Line 669:2: E128 continuation line under-indented for visual indent
Line 670:2: E128 continuation line under-indented for visual indent
Line 671:2: E128 continuation line under-indented for visual indent
Line 672:2: E128 continuation line under-indented for visual indent
Line 673:2: E128 continuation line under-indented for visual indent
Line 674:2: E128 continuation line under-indented for visual indent
Line 675:2: E128 continuation line under-indented for visual indent
Line 676:2: E128 continuation line under-indented for visual indent
Line 677:2: E128 continuation line under-indented for visual indent
Line 678:2: E128 continuation line under-indented for visual indent
Line 679:2: E128 continuation line under-indented for visual indent
Line 680:2: E128 continuation line under-indented for visual indent
Line 681:2: E128 continuation line under-indented for visual indent
Line 682:2: E128 continuation line under-indented for visual indent
Line 683:2: E128 continuation line under-indented for visual indent
Line 684:2: E128 continuation line under-indented for visual indent
Line 685:2: E128 continuation line under-indented for visual indent
Line 686:2: E128 continuation line under-indented for visual indent
Line 687:2: E128 continuation line under-indented for visual indent
Line 688:2: E128 continuation line under-indented for visual indent
Line 689:2: E128 continuation line under-indented for visual indent
Line 690:2: E128 continuation line under-indented for visual indent

Comment last updated on February 05, 2019 at 07:53 Hours UTC

@qwhelan qwhelan force-pushed the tzlocal branch 7 times, most recently from 3c66b5f to 702b29a Compare January 30, 2019 20:53
@qwhelan
Copy link
Contributor Author

qwhelan commented Feb 5, 2019

@jreback I'm finally able to reproduce the dateutil 2.5.0 issue locally and think I have it resolved without needing to bump the dependency. Where would be the appropriate directory to vendor tzlocal?

@qwhelan qwhelan force-pushed the tzlocal branch 3 times, most recently from 9c695f7 to 6e37589 Compare February 5, 2019 07:28
@jreback
Copy link
Contributor

jreback commented Feb 5, 2019

put in pandas/tseries/_tzlocal.py i think - see how that works

@mroeschke
Copy link
Member

@jreback How about pandas/_libs/tslibs/*? Could give way to cythonize some things?

@jreback
Copy link
Contributor

jreback commented Feb 5, 2019

sure that’s ok too

@jbrockmendel
Copy link
Member

Could give way to cythonize some things?

Is there anything in particular that bears cythonizing?

@mroeschke
Copy link
Member

Haven't looked closely, but I imagine most all functions here can be cdef'd given that it just interacts in timezones.pyx?

@@ -17,7 +17,7 @@ cimport numpy as cnp
from numpy cimport int64_t
cnp.import_array()


cimport pandas._libs.tslibs
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cython was making noise about this when running under 2.7; looks like it doesn't raise the same error under 3. Will remove this.

@@ -3,6 +3,9 @@
cpdef bint is_utc(object tz)
cdef bint is_tzlocal(object tz)

cpdef object get_tzlocal_tz(object tz)
cpdef _set_tzlocal_tz(object tz)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this used externally? If so, it shouldn’t be private. If not, it shouldn’t be in the pxd file.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's currently being used to assist in testing, where we cycle through all pytz timezones and check equivalence against tzlocal.

Copy link
Contributor

@jreback jreback left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so I wouldn't change anything in the vendored copy (its hard to tell if you did); I just saw a comment about 'cythonizing it'. Just drop it in place.

@@ -0,0 +1,5 @@
import sys
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't put this in src (which is not a real package, nor do we want it to be), rather just in pandas/_libs/tzlocal is fine

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

alternative would be something like pandas/vendored/. pd.io.clipboard would also belong in such a directory.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

call this pandas/_vendored/ (explicity private)

@@ -0,0 +1,5 @@
import sys
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you make it clear that this is a vendored copy

@@ -34,6 +37,25 @@ cdef inline bint is_tzlocal(object tz):
return isinstance(tz, _dateutil_tzlocal)


cpdef object get_tzlocal_tz(object tz):
global tzlocal_tz
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this to prevent import issues?

@WillAyd
Copy link
Member

WillAyd commented Feb 27, 2019

@qwhelan can you merge master and address build failures?

@@ -0,0 +1,5 @@
import sys
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

call this pandas/_vendored/ (explicity private)

@jreback
Copy link
Contributor

jreback commented Apr 5, 2019

can you merge master and update

1 similar comment
@jreback
Copy link
Contributor

jreback commented May 12, 2019

can you merge master and update

@jreback
Copy link
Contributor

jreback commented Jun 8, 2019

closing as stale. nice idea though, pls ping if you can continue.

@jreback jreback closed this Jun 8, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Datetime Datetime data dtype Performance Memory or execution speed performance Timezones Timezone data dtype
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants