internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: electricitymaps/electricitymaps-contrib

Issue:
add PJM load forecast
Data available here : http://www.pjm.com/markets-and-operations/energy/real-time/7-day-load-forecast.aspx


Discussion:
Can you assign me to this if nobody else has started?
I don't think I can assign to people that are not members of the project.
But I think it's enough if you say you'll be working on it!
Thank you so much @lorrieq !

Resolving patch:
diff --git a/parsers/US_PJM.py b/parsers/US_PJM.py
--- a/parsers/US_PJM.py
+++ b/parsers/US_PJM.py
@@ -6,9 +6,13 @@
 from bs4 import BeautifulSoup
 from dateutil import parser, tz
 import demjson
+import json
+import os
 import re
 import requests
 
+# Used for consumption forecast data.
+API_ENDPOINT = 'https://api.pjm.com/api/v1/'
 # Used for both production and price data.
 url = 'http://www.pjm.com/markets-and-operations.aspx'
 
@@ -115,6 +119,50 @@ def data_processer(data):
     return production
 
 
+def fetch_consumption_forecast_7_days(zone_key='US-PJM', session=None,
+                               target_datetime=None, logger=None):
+    """
+    Gets consumption forecast for specified zone.
+    Returns a list of dictionaries.
+    """
+
+    if target_datetime:
+        raise NotImplementedError(
+            'This parser is not yet able to parse past dates')
+    if not session:
+        session = requests.session()
+
+    if 'PJM_TOKEN' not in os.environ:
+        raise Exception('No PJM_TOKEN found! Please add it to secrets.env!')
+    headers = {'Ocp-Apim-Subscription-Key': os.environ['PJM_TOKEN']}
+
+    # startRow must be set if forecast_area is set.
+    # RTO_COMBINED is area for whole PJM zone.
+    params = {
+        'download': True,
+        'startRow': 1,
+        'forecast_area': 'RTO_COMBINED'
+    }
+
+    # query API
+    url = API_ENDPOINT + 'load_frcstd_7_day'
+    resp = requests.get(url, params, headers=headers)
+    data = json.loads(resp.content)
+
+    data_points = list()
+    for elem in data:
+        utc_datetime = elem['forecast_datetime_beginning_utc']
+        data_point = {
+            'zoneKey': zone_key,
+            'datetime': arrow.get(utc_datetime).replace(tzinfo='UTC').datetime,
+            'value': elem['forecast_load_mw'],
+            'source': 'pjm.com'
+        }
+        data_points.append(data_point)
+
+    return data_points
+
+
 def fetch_production(zone_key='US-PJM', session=None, target_datetime=None, logger=None):
     """
     Requests the last known production mix (in MW) of a given country
@@ -372,6 +420,8 @@ def fetch_price(zone_key='US-PJM', session=None, target_datetime=None, logger=No
 
 
 if __name__ == '__main__':
+    print('fetch_consumption_forecast_7_days() ->')
+    print(fetch_consumption_forecast_7_days())
     print('fetch_production() ->')
     print(fetch_production())
     print('fetch_exchange(US-NY, US-PJM) ->')


Test patch:
Repository: electricitymaps/electricitymaps-contrib

Issue:
US-IPC is occasionally missing a key
```
Traceback (most recent call last):
  File "/home/feeder/lib/fetch_data.py", line 130, in launch_parsers
    **parser_kwargs)
  File "/home/electricitymap/parsers/US_IPC.py", line 129, in fetch_production
    processed_data = data_processer(raw_data, logger)
  File "/home/electricitymap/parsers/US_IPC.py", line 83, in data_processer
    production.pop(key)
KeyError: 'Net Purchases'
```


Discussion:
Sometimes the 'Net Purchases' key is missing so a keyerror is raised by the pop function.  Supplying a default None argument fixes this.

Resolving patch:
diff --git a/parsers/US_IPC.py b/parsers/US_IPC.py
--- a/parsers/US_IPC.py
+++ b/parsers/US_IPC.py
@@ -12,7 +12,7 @@
 # https://docs.idahopower.com/pdfs/AboutUs/PlanningForFuture/irp/IRP.pdf
 
 # Renewable energy (PURPA) is likely bought with credits from outside the Utility
-# area and not supplied to customers. For that reason those types are commented out. 
+# area and not supplied to customers. For that reason those types are commented out.
 
 PRODUCTION_URL = 'https://api.idahopower.com/Energy/Api/V1/GenerationAndDemand/Subset'
 
@@ -80,7 +80,7 @@ def data_processer(raw_data, logger):
         keys_to_remove = keys_to_ignore | unknown_keys
 
         for key in keys_to_remove:
-            production.pop(key)
+            production.pop(key, None)
 
         production = {GENERATION_MAPPING[k]: v for k, v in production.items()}
 


Test patch:
Repository: electricitymaps/electricitymaps-contrib

Issue:
GB-NIR urls have changed
```
Traceback (most recent call last):
  File "/home/feeder/lib/fetch_data.py", line 130, in launch_parsers
    **parser_kwargs)
  File "/home/electricitymap/parsers/GB_NIR.py", line 258, in fetch_production
    thermal_df = create_thermal_df(thermal_data)
  File "/home/electricitymap/parsers/GB_NIR.py", line 95, in create_thermal_df
    usecols=cols_to_use)
  File "/usr/local/lib/python3.6/site-packages/pandas/io/parsers.py", line 709, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/local/lib/python3.6/site-packages/pandas/io/parsers.py", line 449, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/usr/local/lib/python3.6/site-packages/pandas/io/parsers.py", line 818, in __init__
    self._make_engine(self.engine)
  File "/usr/local/lib/python3.6/site-packages/pandas/io/parsers.py", line 1049, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/usr/local/lib/python3.6/site-packages/pandas/io/parsers.py", line 1747, in __init__
    raise ValueError("Usecols do not match names.")
ValueError: Usecols do not match names.
```


Discussion:
Something has changed on the site which results in not getting the excel data properly.  Time for more fun with aspx pages!

Resolving patch:
diff --git a/parsers/GB_NIR.py b/parsers/GB_NIR.py
--- a/parsers/GB_NIR.py
+++ b/parsers/GB_NIR.py
@@ -13,9 +13,9 @@
 
 from .lib.validation import validate
 
-thermal_url = 'http://www.soni.ltd.uk/DownloadCentre/aspx/FuelMix.aspx'
-wind_url = 'http://www.soni.ltd.uk/DownloadCentre/aspx/SystemOutput.aspx'
-exchange_url = 'http://www.soni.ltd.uk/DownloadCentre/aspx/MoyleTie.aspx'
+thermal_url = 'http://ws.soni.ltd.uk/DownloadCentre/aspx/FuelMix.aspx'
+wind_url = 'http://ws.soni.ltd.uk/DownloadCentre/aspx/SystemOutput.aspx'
+exchange_url = 'http://ws.soni.ltd.uk/DownloadCentre/aspx/MoyleTie.aspx'
 # Positive values represent imports to Northern Ireland.
 # Negative value represent exports from Northern Ireland.
 


Test patch:
Repository: electricitymaps/electricitymaps-contrib

Issue:
Restore access to India-Gujarat (IN-GJ) wind and solar data
Hey everyone,

looks like SLDCGUJ has also removed the access to real-time data websites for wind and solar, just like they did for the conventional real-time data.
The solution should be really simple: We can use the same link which still gives access to that ["print" page](http://www.sldcguj.com/RealTimeData/PrintPage.php?page=realtimedemand.php). It has wind and solar generation on the right side, too ;)

![image](https://user-images.githubusercontent.com/25743609/43044321-0939e890-8da4-11e8-868d-51a54a1a5b60.png)

Greetings, Alex


Discussion:

Resolving patch:
diff --git a/parsers/IN_GJ.py b/parsers/IN_GJ.py
--- a/parsers/IN_GJ.py
+++ b/parsers/IN_GJ.py
@@ -10,6 +10,7 @@
 from .lib.validation import validate
 from logging import getLogger
 
+SLDCGUJ_URL = 'http://www.sldcguj.com/RealTimeData/PrintPage.php?page=realtimedemand.php'
 
 station_map = {
      "coal": ["Ukai(1-5)+Ukai6",
@@ -59,29 +60,23 @@ def fetch_data(zone_key, session=None, logger=None):
     values = collections.Counter()
     zonekey.assert_zone_key(zone_key, 'IN-GJ')
 
-    solar_html = web.get_response_soup(
-        zone_key, 'https://www.sldcguj.com/RealTimeData/GujSolar.php', session)
-    wind_html = web.get_response_soup(
-        zone_key, 'https://www.sldcguj.com/RealTimeData/wind.php', session)
-
-    values['date'] =  arrow.get(
-        solar_html.find_all('tr')[0].text.split('\t')[-1].strip()
-        + ' Asia/Kolkata', 'D-MM-YYYY H:mm:ss ZZZ').datetime
-    values['solar'] = split_and_sum(
-        solar_html.find_all('tr')[-1].find_all('td')[-1].text.strip())
-    values['wind'] = split_and_sum(
-        wind_html.find_all('tr')[-1].find_all('td')[-1].text.strip())
-
     cookies_params = {
         'ASPSESSIONIDSUQQQTRD': 'ODMNNHADJFGCMLFFGFEMOGBL',
         'PHPSESSID': 'a301jk6p1p8d50dduflceeg6l1'
     }
 
-    rows = web.get_response_soup(
-        zone_key,
-        'http://www.sldcguj.com/RealTimeData/PrintPage.php?page=realtimedemand.php',
-        session).find_all('tr')
+    soup = web.get_response_soup(zone_key, SLDCGUJ_URL, session)
+    rows = soup.find_all('tr')
+    cells = [c.text.strip() for c in soup.find_all('td')]
 
+    # get wind and solar values
+    values['date'] = arrow.get(cells[1], 'DD-MM-YYYY HH:mm:ss').replace(
+        tzinfo='Asia/Kolkata')
+    [wind_solar_index] = [i for i, c in enumerate(cells) if c == '(Wind+Solar) Generation']
+    value = cells[wind_solar_index + 1]
+    values['wind'], values['solar'] = [int(v) for v in value.split(' + ')]
+
+    # get other production values
     for row in rows:
         elements = row.find_all('td')
         if len(elements) > 3:  # will find production rows
@@ -177,7 +172,7 @@ def fetch_production(zone_key='IN-GJ', session=None, target_datetime=None,
 
     data = {
         'zoneKey': zone_key,
-        'datetime': value_map['date'],
+        'datetime': value_map['date'].datetime,
         'production': {
             'biomass': None,
             'coal': value_map.get('coal', 0),


Test patch:
Repository: electricitymaps/electricitymaps-contrib

Issue:
Add JP prices
See https://github.com/tmrowco/electricitymap-contrib/pull/1543#issuecomment-411281685 by @tmslaine 


Discussion:

Resolving patch:
diff --git a/parsers/JP.py b/parsers/JP.py
--- a/parsers/JP.py
+++ b/parsers/JP.py
@@ -3,6 +3,7 @@
 import logging
 # The arrow library is used to handle datetimes
 import arrow
+import datetime as dt
 import pandas as pd
 from . import occtonet
 
@@ -16,6 +17,8 @@
 # JP-SK  : Shikoku
 # JP-KY  : Kyushu
 # JP-ON  : Okinawa
+# JP-CG  : Chūgoku
+
 
 def fetch_production(zone_key='JP-TK', session=None, target_datetime=None,
                      logger=logging.getLogger(__name__)):
@@ -118,6 +121,47 @@ def fetch_consumption_df(zone_key='JP-TK', target_datetime=None,
     df = df[['datetime', 'cons']]
     return df
 
+
+def fetch_price(zone_key='JP-TK', session=None, target_datetime=None,
+                logger=logging.getLogger(__name__)):
+    if target_datetime is None:
+        target_datetime = dt.datetime.now() + dt.timedelta(days=1)
+
+    # price files contain data for fiscal year and not calendar year.
+    if target_datetime.month <= 3:
+        fiscal_year = target_datetime.year - 1
+    else:
+        fiscal_year = target_datetime.year
+    url = 'http://www.jepx.org/market/excel/spot_{}.csv'.format(fiscal_year)
+    df = pd.read_csv(url)
+
+    df = df.iloc[:, [0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14]]
+    df.columns = ['Date', 'Period', 'JP-HKD', 'JP-TH', 'JP-TK', 'JP-CB',
+                  'JP-HR', 'JP-KN', 'JP-CG', 'JP-SK', 'JP-KY']
+
+    if zone_key not in df.columns[2:]:
+        return []
+
+    start = target_datetime - dt.timedelta(days=1)
+    df['Date'] = df['Date'].apply(lambda x: dt.datetime.strptime(x, '%Y/%m/%d'))
+    df = df[(df['Date'] >= start.date()) & (df['Date'] <= target_datetime.date())]
+
+    df['datetime'] = df.apply(lambda row: arrow.get(row['Date']).shift(
+        minutes=30 * (row['Period'] - 1)).replace(tzinfo='Asia/Tokyo'), axis=1)
+
+    data = list()
+    for row in df.iterrows():
+        data.append({
+            'zoneKey': zone_key,
+            'currency': 'JPY',
+            'datetime': row[1]['datetime'].datetime,
+            'price': row[1][zone_key],
+            'source': 'jepx.org'
+        })
+
+    return data
+
+
 def parse_dt(row):
     """
     Parses timestamps from date and time
@@ -125,8 +169,11 @@ def parse_dt(row):
     return arrow.get(' '.join([row['Date'], row['Time']]).replace('/', '-'),
                      'YYYY-M-D H:mm').replace(tzinfo='Asia/Tokyo').datetime
 
+
 if __name__ == '__main__':
     """Main method, never used by the Electricity Map backend, but handy for testing."""
 
     print('fetch_production() ->')
     print(fetch_production())
+    print('fetch_price() ->')
+    print(fetch_price())


Test patch:
Repository: electricitymaps/electricitymaps-contrib

Issue:
Decoding error in JP price parser
`JP.fetch_price` is failing due to a `UnicodeDecodeError` in `pandas.read_csv`, the CSV file contains Japanese characters. I don't get this issue locally and saw it for the first time on the Kibana logs. 

Maybe it's as simple as passing an `encoding` parameter to `pandas.read_csv`. But I'm using the same version of `pandas` that's specified in the `requirements.txt` file, so maybe that's not it. I can't replicate the issue locally. Any ideas?


Discussion:
Hmm maybe. @maxbellec any ideas?
I was able to replicate the UnicodeDecodeError on my other Debian installation. Giving `read_csv` `encoding='shift-jis'` seemed to have fixed it. Sorry, I can't debug the locale/encoding settings more right now.

Resolving patch:
diff --git a/parsers/JP.py b/parsers/JP.py
--- a/parsers/JP.py
+++ b/parsers/JP.py
@@ -133,7 +133,7 @@ def fetch_price(zone_key='JP-TK', session=None, target_datetime=None,
     else:
         fiscal_year = target_datetime.year
     url = 'http://www.jepx.org/market/excel/spot_{}.csv'.format(fiscal_year)
-    df = pd.read_csv(url)
+    df = pd.read_csv(url, encoding='shift-jis')
 
     df = df.iloc[:, [0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14]]
     df.columns = ['Date', 'Period', 'JP-HKD', 'JP-TH', 'JP-TK', 'JP-CB',


Test patch:
Repository: electricitymaps/electricitymaps-contrib

Issue:
MY-WM->TH bug
```
Traceback (most recent call last):
  File "/home/feeder/lib/fetch_data.py", line 130, in launch_parsers
    **parser_kwargs)
  File "/home/electricitymap/parsers/MY_WM.py", line 309, in fetch_exchange
    hvdc_hidden_values = extract_hidden_values(hvdc_switch_req)
  File "/home/electricitymap/parsers/MY_WM.py", line 176, in extract_hidden_values
    viewstategenerator = soup.find("input", attrs={'id': '__VIEWSTATEGENERATOR'})['value']
TypeError: 'NoneType' object is not subscriptable
```


Discussion:
It's fixed itself now, data on the map and can run locally. Looks like another of those errors that just happens every now and then, rather than an error that signifies the parser is not fit for purpose anymore.
Is there an approach to make such situations stand out, maybe with some logging and graceful exit, to differentiate from odd hiccups like this and parsers that are properly broken?
For this one we could make a try/except that catches this and generates a warning rather than an error.

Resolving patch:
diff --git a/parsers/MY_WM.py b/parsers/MY_WM.py
--- a/parsers/MY_WM.py
+++ b/parsers/MY_WM.py
@@ -52,7 +52,7 @@ def get_data(session=None):
 
     except AttributeError:
         # No data is available between 12am-1am.
-        raise ValueError('No data is currently available for Malaysia.')
+        raise ValueError('No production data is currently available for West Malaysia.')
 
     mix_header = mixsoup.find('tr', {"class": "gridheader"})
     mix_table = mix_header.find_parent("table")
@@ -173,10 +173,13 @@ def extract_hidden_values(req):
     soup = BeautifulSoup(req.content, 'html.parser')
 
     # Find and define parameters needed to send a POST request.
-    viewstategenerator = soup.find("input", attrs={'id': '__VIEWSTATEGENERATOR'})['value']
-    viewstate = soup.find("input", attrs={'id': '__VIEWSTATE'})['value']
-    eventvalidation = soup.find("input", attrs={'id': '__EVENTVALIDATION'})['value']
-    jschartviewerstate = soup.find("input", attrs={'id': 'MainContent_ctl17_JsChartViewerState'})['value']
+    try:
+        viewstategenerator = soup.find("input", attrs={'id': '__VIEWSTATEGENERATOR'})['value']
+        viewstate = soup.find("input", attrs={'id': '__VIEWSTATE'})['value']
+        eventvalidation = soup.find("input", attrs={'id': '__EVENTVALIDATION'})['value']
+        jschartviewerstate = soup.find("input", attrs={'id': 'MainContent_ctl17_JsChartViewerState'})['value']
+    except TypeError:
+        raise ValueError('No exchange data is currently available for West Malaysia.')
 
     hidden_values = {'viewstategenerator': viewstategenerator,
                      'viewstate': viewstate,


Test patch:
Repository: electricitymaps/electricitymaps-contrib

Issue:
GB-NIR invalid data in database
The latest observation seems to be problematic:

![image](https://user-images.githubusercontent.com/1655848/42372212-eecab938-8111-11e8-808c-779694b74962.png)

therefore it is not shown on the map. However it is inserted in the database.
We should add proper validations to make sure coal/gas are present and that load > 0


Discussion:
@corradio 
You could add a check in https://github.com/tmrowco/electricitymap/blob/master/parsers/lib/quality.py for the sum of all production keys. Right now it checks each key individually.

This seems like something best applied to every parser, the only time it could cause a problem is if the zone is running wholly on storage.

Resolving patch:
diff --git a/parsers/GB_NIR.py b/parsers/GB_NIR.py
--- a/parsers/GB_NIR.py
+++ b/parsers/GB_NIR.py
@@ -277,7 +277,7 @@ def fetch_production(zone_key='GB-NIR', session=None, target_datetime=None,
             'source': 'soni.ltd.uk'
         }
         production_mix_by_quarter_hour.append(
-            validate(production_mix, logger=logger, required=['gas', 'coal']))
+            validate(production_mix, logger=logger, required=['gas', 'coal'], floor=1.0))
 
     return production_mix_by_quarter_hour
 


Test patch:
Repository: electricitymaps/electricitymaps-contrib

Issue:
GB-NIR fetch historical data available with 15-min 
Using the same sources than current parser for live data.

http://ws.soni.ltd.uk/DownloadCentre/aspx/FuelMix.aspx
http://ws.soni.ltd.uk/DownloadCentre/aspx/SystemOutput.aspx
http://ws.soni.ltd.uk/DownloadCentre/aspx/MoyleTie.aspx

Quite interesting as current database is 80% empty for NIR
![image-2](https://user-images.githubusercontent.com/22095643/45501672-22117100-b782-11e8-89d1-b8d489bdb5fe.png)





Discussion:
I'll do this one.

Resolving patch:
diff --git a/parsers/GB_NIR.py b/parsers/GB_NIR.py
--- a/parsers/GB_NIR.py
+++ b/parsers/GB_NIR.py
@@ -20,7 +20,7 @@
 # Negative value represent exports from Northern Ireland.
 
 
-def get_data(url, session=None):
+def get_data(url, target_datetime, session=None):
     """
     Requests data from a specified url in CSV format.
     Returns a response.text object.
@@ -42,10 +42,15 @@ def get_data(url, session=None):
     eventvalidation = soup.find("input", attrs={'id': '__EVENTVALIDATION'})['value']
 
     # Set date for post request.
-    current_date = datetime.now().date()
-    month = current_date.month
-    day = current_date.day
-    year = current_date.year
+    if target_datetime:
+        target_date = target_datetime.date()
+    else:
+        # get the latest data
+        target_date = datetime.now().date()
+
+    month = target_date.month
+    day = target_date.day
+    year = target_date.year
 
     FromDatePicker_clientState = '|0|01%s-%s-%s-0-0-0-0||[[[[]],[],[]],[{%s},[]],"01%s-%s-%s-0-0-0-0"]' % (year, month, day, '', year, month, day)
     ToDatePicker_clientState = '|0|01%s-%s-%s-0-0-0-0||[[[[]],[],[]],[{%s},[]],"01%s-%s-%s-0-0-0-0"]' % (year, month, day, '', year, month, day)
@@ -250,11 +255,9 @@ def fetch_production(zone_key='GB-NIR', session=None, target_datetime=None,
           'source': 'mysource.com'
         }
     """
-    if target_datetime:
-        raise NotImplementedError('This parser is not yet able to parse past dates')
 
-    thermal_data = get_data(thermal_url)
-    wind_data = get_data(wind_url)
+    thermal_data = get_data(thermal_url, target_datetime)
+    wind_data = get_data(wind_url, target_datetime)
     thermal_df = create_thermal_df(thermal_data)
     wind_df = create_wind_df(wind_data)
     thermal = thermal_processor(thermal_df)
@@ -296,10 +299,8 @@ def fetch_exchange(zone_key1, zone_key2, session=None, target_datetime=None, log
       'source': 'mysource.com'
     }
     """
-    if target_datetime:
-        raise NotImplementedError('This parser is not yet able to parse past dates')
 
-    exchange_data = get_data(exchange_url)
+    exchange_data = get_data(exchange_url, target_datetime)
     exchange_dataframe = create_exchange_df(exchange_data)
     if '->'.join(sorted([zone_key1, zone_key2])) == 'GB->GB-NIR':
         moyle = moyle_processor(exchange_dataframe)


Test patch:
Repository: electricitymaps/electricitymaps-contrib

Issue:
FR: key coal has negative value -9.0
```
invalid point: {'zoneKey': 'FR', 'datetime': datetime.datetime(2018, 10, 9, 11, 15, tzinfo=tzoffset(None, 7200)), 'production': {'nuclear': 41740.0, 'coal': -9.0, 'gas': 4057.0, 'oil': 188.0, 'wind': 1158.0, 'solar': 2762.0, 'biomass': 861.0, 'hydro': 3366.0}, 'storage': {'hydro': -1024.0}, 'source': 'opendata.reseaux-energies.fr', 'schemaVersion': 1}, reason:FR: key coal has negative value -9.0
```

Probably a good idea to set small negative values to 0


Discussion:
ENTSOE parser does this https://github.com/tmrowco/electricitymap-contrib/blob/27d9f7e8f1641b3b536e9bdb1bf9c1a1c1520041/parsers/ENTSOE.py#L887

Probably makes sense to adapt https://github.com/tmrowco/electricitymap-contrib/blob/926ee622abb0c22cd15a26044c6b218183aa7a52/parsers/lib/quality.py#L79

Using 50 MW or less than 0.1% of total production or something

Resolving patch:
diff --git a/parsers/FR.py b/parsers/FR.py
--- a/parsers/FR.py
+++ b/parsers/FR.py
@@ -75,7 +75,12 @@ def fetch_production(zone_key='FR', session=None, target_datetime=None,
     for row in df.iterrows():
         production = dict()
         for key, value in MAP_GENERATION.items():
-            production[value] = row[1][key]
+             # Set small negative values to 0
+            if row[1][key] < 0 and row[1][key] > -50:
+                logger.warning('Setting small value of %s (%s) to 0.' % (key, value))
+                production[value] = 0
+            else:
+                production[value] = row[1][key]
 
         # Hydro is a special case!
         production['hydro'] = row[1]['hydraulique_lacs'] + row[1]['hydraulique_fil_eau_eclusee']


Test patch: