From aa56746ccdd0ef774c88efc12c5579821ba498cc Mon Sep 17 00:00:00 2001 From: profxj Date: Sat, 10 Aug 2019 14:37:06 -0700 Subject: [PATCH 01/15] build --- .gitignore | 1 - frb/builds/build_frbs.py | 34 ++++++++++++++++++++++++++++++++++ frb/data/FRBs/FRB181112.json | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 frb/data/FRBs/FRB181112.json diff --git a/.gitignore b/.gitignore index 3598818d..5f418fe0 100755 --- a/.gitignore +++ b/.gitignore @@ -91,7 +91,6 @@ ENV/ # Rope project settings .ropeproject -FRB181112.json FRB190102.json FRB190608.json FRB190608_host.json diff --git a/frb/builds/build_frbs.py b/frb/builds/build_frbs.py index b1dd82ba..1fe84d7a 100644 --- a/frb/builds/build_frbs.py +++ b/frb/builds/build_frbs.py @@ -59,6 +59,35 @@ def frb_180924(): path = resource_filename('frb', 'data/FRBs') frb180924.write_to_json(path=path) +def frb_181112(): + """ + Generate the JSON file for FRB 181112 + All of the data comes from Prochaska+2019 + + Returns: + + """ + frb181112 = frb.FRB('FRB181112', 'J214923.63-525815.33', + 589.27 * units.pc / units.cm**3, + z_frb=0.4755) + # Error in DM + frb181112.DM_err = 0.03 * units.pc / units.cm**3 + # Error ellipse + frb181112.set_ee(a=555.30/1e3, b=152.93/1e3, theta=120.15, cl=68.) + # RM + frb181112.RM = 10.9 * units.rad / units.m**2 + frb181112.RM_err = 0.9 * units.rad / units.m**2 + + # NE2001 + frb181112.set_DMISM() + + # References + frb181112.refs = ['Prochaska2019'] + + # Write + path = resource_filename('frb', 'data/FRBs') + frb181112.write_to_json(path=path) + def main(inflg='all'): if inflg == 'all': @@ -74,9 +103,14 @@ def main(inflg='all'): if flg & (2**1): frb_180924() + # 181112 + if flg & (2**2): + frb_181112() # Command line execution +# Only for testing +# Use the Build script to build if __name__ == '__main__': # FRB 121102 frb_121102() diff --git a/frb/data/FRBs/FRB181112.json b/frb/data/FRBs/FRB181112.json new file mode 100644 index 00000000..93f99a40 --- /dev/null +++ b/frb/data/FRBs/FRB181112.json @@ -0,0 +1,36 @@ +{ + "DM": { + "unit": "pc / cm3", + "value": 589.27 + }, + "DMISM": { + "unit": "pc / cm3", + "value": 42.395814203084775 + }, + "DM_err": { + "unit": "pc / cm3", + "value": 0.03 + }, + "FRB": "FRB181112", + "RM": { + "unit": "rad / m2", + "value": 10.9 + }, + "RM_err": { + "unit": "rad / m2", + "value": 0.9 + }, + "cosmo": "Planck15", + "dec": -52.970925, + "eellipse": { + "a": 0.5552999999999999, + "b": 0.15293, + "cl": 68.0, + "theta": 120.15 + }, + "ra": 327.34845833333327, + "refs": [ + "Prochaska2019" + ], + "z": 0.4755 +} \ No newline at end of file From b2c5708dd33b8a55f42270c9643fbc02bc692239 Mon Sep 17 00:00:00 2001 From: profxj Date: Sat, 10 Aug 2019 15:03:57 -0700 Subject: [PATCH 02/15] fg --- frb/builds/build_fg.py | 83 ++++++++++++++++++ .../181112/J214923.89-525810.4_FRB181112.json | 72 +++++++++++++++ frb/data/Halos/DM_PDF.fits | Bin 0 -> 97920 bytes frb/data/Halos/README | 6 ++ frb/figures/dm.py | 1 + frb/scripts/build.py | 5 +- 6 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 frb/builds/build_fg.py create mode 100644 frb/data/Galaxies/181112/J214923.89-525810.4_FRB181112.json create mode 100644 frb/data/Halos/DM_PDF.fits create mode 100644 frb/data/Halos/README diff --git a/frb/builds/build_fg.py b/frb/builds/build_fg.py new file mode 100644 index 00000000..95b4e228 --- /dev/null +++ b/frb/builds/build_fg.py @@ -0,0 +1,83 @@ +""" Top-level module to build or re-build the JSON files for +FRB host galaxies""" + +from pkg_resources import resource_filename +import os +import sys + +from IPython import embed + +import numpy as np + +from astropy.coordinates import SkyCoord +from astropy import units + +from frb.galaxies import frbgalaxy, defs +from frb.surveys import des +from frb.frb import FRB + +db_path = os.getenv('FRB_GDB') +if db_path is None: + embed(header='You need to set $FRB_GDB') + + +def build_fg_181112(): + # Coord from DES + fg_coord = SkyCoord('J214923.89-525810.43', unit=(units.hourangle, units.deg)) # from DES + frb181112 = FRB.by_name('FRB181112') + + # Instantiate + fg_13_5 = frbgalaxy.FGGalaxy(fg_coord.ra.value, fg_coord.dec.value, '181112') + fg_13_5.frb_coord = frb181112.coord + + # Redshift + fg_13_5.set_z(0.36738, 'spec', err=7e-5) + + # Photometry + + # DES + # Grab the table (requires internet) + search_r = 2 * units.arcsec + des_srvy = des.DES_Survey(fg_coord, search_r) + des_tbl = des_srvy.get_catalog(print_query=True) + + fg_13_5.parse_photom(des_tbl) + + # VLT -- Lochlan 2019-05-02 + # VLT -- Lochlan 2019-06-18 + fg_13_5.photom['VLT_g'] = 21.20 + fg_13_5.photom['VLT_g_err'] = 0.05 + fg_13_5.photom['VLT_I'] = 19.20 + fg_13_5.photom['VLT_I_err'] = 0.02 + + # Nebular lines + #fg_13_5.parse_ppxf('fg_FORS2_ppxf_results.ecsv') + fg_13_5.parse_ppxf(os.path.join(db_path, 'CRAFT', 'Prochaska2019', 'FG181112_13_5_FORS2_ppxf.ecsv')) + + # Derived quantities + fg_13_5.calc_nebular_AV('Ha/Hb') + + # This will be an upper limit + fg_13_5.calc_nebular_SFR('Ha') + fg_13_5.derived['SFR_nebular_err'] = -999. + + # CIGALE + fg_13_5.parse_cigale(os.path.join(db_path, 'CRAFT', 'Prochaska2019', 'FG181112_13_5_CIGALE.fits')) + + # Write + path = resource_filename('frb', 'data/Galaxies/181112') + fg_13_5.write_to_json(path=path) + + +def main(inflg='all'): + + if inflg == 'all': + flg = np.sum(np.array( [2**ii for ii in range(25)])) + else: + flg = int(inflg) + + # 121102 + if flg & (2**0): + build_fg_181112() + + diff --git a/frb/data/Galaxies/181112/J214923.89-525810.4_FRB181112.json b/frb/data/Galaxies/181112/J214923.89-525810.4_FRB181112.json new file mode 100644 index 00000000..8bc1eae2 --- /dev/null +++ b/frb/data/Galaxies/181112/J214923.89-525810.4_FRB181112.json @@ -0,0 +1,72 @@ +{ + "FRB": "181112", + "cosmo": "Planck15", + "dec": -52.96956388888889, + "dec_FRB": -52.970925, + "derived": { + "AV_nebular": 0.3069974061760228, + "EBV_photom": 0.42701304189141803, + "EBV_photom_err": 0.1887595379550144, + "EBV_spec": 0.07161311131728877, + "Lnu_r": 2.714578159459023e+22, + "Lnu_r_err": 1.3572890797295115e+21, + "M_r": -21.98425587647592, + "M_r_err": 0.05428681023790647, + "Mstar": 48625580336.23453, + "Mstar_err": 31761232142.752293, + "Mstar_spec": 37274253739.32703, + "SFR_nebular": 0.2706892260945006, + "SFR_nebular_err": -999.0, + "SFR_photom": 32.26055521817566, + "SFR_photom_err": 36.8665043421349, + "Z_photom": 0.01739105275461353, + "Z_photom_err": 0.01606591559899191, + "Z_spec": 0.2147619526066883, + "f_AGN": 0.1366732092641889, + "f_AGN_err": 0.2264457828372441, + "u-r": 2.29887036782725, + "u-r_err": 0.1132538751501561 + }, + "neb_lines": { + "Halpha": 5.5364989015362205e-17, + "Halpha_err": 2.6846105838794755e-18, + "Hbeta": 1.7928968010781702e-17, + "Hbeta_err": 2.1495383787332407e-18, + "[NII] 6584": 1.0468157658809236e-16, + "[NII] 6584_err": 5.332037614150855e-18, + "[OIII] 5007": 2.2971636407736724e-16, + "[OIII] 5007_err": 3.281481372196428e-18 + }, + "photom": { + "DES_Y": 18.8641, + "DES_Y_err": 0.024993099999999997, + "DES_g": 21.4157, + "DES_g_err": 0.0287154, + "DES_i": 19.3382, + "DES_i_err": 0.0093098, + "DES_r": 19.8958, + "DES_r_err": 0.0104099, + "DES_z": 19.0319, + "DES_z_err": 0.0126389, + "VLT_I": 19.2, + "VLT_I_err": 0.02, + "VLT_g": 21.2, + "VLT_g_err": 0.05, + "W1": 15.529000000000002, + "W1_err": 0.04, + "W2": 14.886, + "W2_err": 0.063, + "W3": 12.284, + "W3_err": -999.0, + "W4": 8.589, + "W4_err": -999.0 + }, + "ra": 327.3495416666666, + "ra_FRB": 327.34845833333327, + "redshift": { + "z": 0.36738, + "z_err": 7e-05, + "z_spec": 0.36738, + "z_spec_err": 7e-05 + } +} \ No newline at end of file diff --git a/frb/data/Halos/DM_PDF.fits b/frb/data/Halos/DM_PDF.fits new file mode 100644 index 0000000000000000000000000000000000000000..0b7b7d2cdd7dbe72e9cced92f34045ea91653f32 GIT binary patch literal 97920 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 S?+SQVz`Fw875JO1!2bd8Nkw4* literal 0 HcmV?d00001 diff --git a/frb/data/Halos/README b/frb/data/Halos/README new file mode 100644 index 00000000..b9b85b05 --- /dev/null +++ b/frb/data/Halos/README @@ -0,0 +1,6 @@ +DM_PDF.fits + -- DM_cosmic PDFs at a series of redshifts + -- Extensions: + zvals + DMvals + logPDF diff --git a/frb/figures/dm.py b/frb/figures/dm.py index c57b7b27..9ca55585 100644 --- a/frb/figures/dm.py +++ b/frb/figures/dm.py @@ -17,6 +17,7 @@ from ne2001 import density + def sub_cartoon(ax1, ax2, coord, zFRB, halos=False, host_DM=50., ymax=None, IGM_only=True, M31=False, fg_halos=None, dsmx=0.05, FRB_DM=None, yscl = 0.97): diff --git a/frb/scripts/build.py b/frb/scripts/build.py index 89b68c2e..b41a704b 100644 --- a/frb/scripts/build.py +++ b/frb/scripts/build.py @@ -8,7 +8,7 @@ def parser(options=None): import argparse # Parse parser = argparse.ArgumentParser(description='Build parts of the CASBAH database; Output_dir = $CASBAH_GALAXIES [v1.1]') - parser.add_argument("item", type=str, help="Item to build ['FRBs', 'Hosts', 'specDB']") + parser.add_argument("item", type=str, help="Item to build ['FRBs', 'Hosts', 'specDB', 'FG']") parser.add_argument("--flag", type=str, default='all', help="Flag passed to the build") if options is None: @@ -25,6 +25,7 @@ def main(pargs): from frb.builds import build_specdb from frb.builds import build_frbs from frb.builds import build_hosts + from frb.builds import build_fg # Parse item = pargs.item @@ -34,6 +35,8 @@ def main(pargs): build_hosts.main(inflg=pargs.flag) elif item == 'specDB': build_specdb.main(inflg=pargs.flag) + elif item == 'FG': + build_fg.main(inflg=pargs.flag) else: raise IOError("Bad build item {:s}".format(item)) From d66a491b0abf4f1484a917fd567f49b74e909718 Mon Sep 17 00:00:00 2001 From: profxj Date: Sat, 10 Aug 2019 15:35:21 -0700 Subject: [PATCH 03/15] building --- frb/builds/build_fg.py | 54 +++++++++----- frb/builds/build_hosts.py | 76 +++++++++++++++++++- frb/builds/build_specdb.py | 4 ++ frb/data/Galaxies/181112/FRB181112_host.json | 67 +++++++++++++++++ 4 files changed, 180 insertions(+), 21 deletions(-) create mode 100644 frb/data/Galaxies/181112/FRB181112_host.json diff --git a/frb/builds/build_fg.py b/frb/builds/build_fg.py index 95b4e228..ae906b47 100644 --- a/frb/builds/build_fg.py +++ b/frb/builds/build_fg.py @@ -11,17 +11,19 @@ from astropy.coordinates import SkyCoord from astropy import units +from astropy.table import Table -from frb.galaxies import frbgalaxy, defs +from frb.galaxies import frbgalaxy from frb.surveys import des from frb.frb import FRB +from frb.galaxies import photom as frbphotom db_path = os.getenv('FRB_GDB') if db_path is None: embed(header='You need to set $FRB_GDB') -def build_fg_181112(): +def build_fg_181112(build_photom=False): # Coord from DES fg_coord = SkyCoord('J214923.89-525810.43', unit=(units.hourangle, units.deg)) # from DES frb181112 = FRB.by_name('FRB181112') @@ -34,24 +36,38 @@ def build_fg_181112(): fg_13_5.set_z(0.36738, 'spec', err=7e-5) # Photometry - - # DES - # Grab the table (requires internet) - search_r = 2 * units.arcsec - des_srvy = des.DES_Survey(fg_coord, search_r) - des_tbl = des_srvy.get_catalog(print_query=True) - - fg_13_5.parse_photom(des_tbl) - - # VLT -- Lochlan 2019-05-02 - # VLT -- Lochlan 2019-06-18 - fg_13_5.photom['VLT_g'] = 21.20 - fg_13_5.photom['VLT_g_err'] = 0.05 - fg_13_5.photom['VLT_I'] = 19.20 - fg_13_5.photom['VLT_I_err'] = 0.02 + photom_file = os.path.join(db_path, 'CRAFT', 'Prochaska2019', 'prochaska2019_photom.ascii') + + if build_photom: + # DES + # Grab the table (requires internet) + search_r = 2 * units.arcsec + des_srvy = des.DES_Survey(fg_coord, search_r) + des_tbl = des_srvy.get_catalog(print_query=True) + + fg_13_5.parse_photom(des_tbl) + # VLT -- Lochlan 2019-05-02 + # VLT -- Lochlan 2019-06-18 + fg_13_5.photom['VLT_g'] = 21.20 + fg_13_5.photom['VLT_g_err'] = 0.05 + fg_13_5.photom['VLT_I'] = 19.20 + fg_13_5.photom['VLT_I_err'] = 0.02 + # Build a Table + photom = Table() + photom['Name'] = ['FG181112_13_5'] # JXP internal name + photom['ra'] = fg_13_5.coord.ra.value + photom['dec'] = fg_13_5.coord.dec.value + # Add in + for key in fg_13_5.photom.keys(): + photom[key] = fg_13_5.photom[key] + # Merge + # Merge/write + photom = frbphotom.merge_photom_tables(photom, photom_file) + photom.write(photom_file, format=frbphotom.table_format, overwrite=True) + # Either way read it + fg_13_5.parse_photom(Table.read(photom_file, format=frbphotom.table_format)) # Nebular lines - #fg_13_5.parse_ppxf('fg_FORS2_ppxf_results.ecsv') fg_13_5.parse_ppxf(os.path.join(db_path, 'CRAFT', 'Prochaska2019', 'FG181112_13_5_FORS2_ppxf.ecsv')) # Derived quantities @@ -78,6 +94,6 @@ def main(inflg='all'): # 121102 if flg & (2**0): - build_fg_181112() + build_fg_181112(build_photom=False) diff --git a/frb/builds/build_hosts.py b/frb/builds/build_hosts.py index 8bdf2ca6..935d9af1 100644 --- a/frb/builds/build_hosts.py +++ b/frb/builds/build_hosts.py @@ -190,6 +190,73 @@ def build_host_180924(build_photom=True): # Write path = resource_filename('frb', 'data/Galaxies/180924') host.write_to_json(path=path) + + +def build_host_181112(build_photom=False): + frbname = '181112' + FRB_coord = SkyCoord('J214923.63-525815.39', + unit=(units.hourangle, units.deg)) # Cherie; 2019-04-17 (Slack) + # Coord from DES + Host_coord = SkyCoord('J214923.66-525815.28', + unit=(units.hourangle, units.deg)) # from DES + + # Instantiate + host181112 = frbgalaxy.FRBHost(Host_coord.ra.value, Host_coord.dec.value, frbname) + host181112.frb_coord = FRB_coord + + # Redshift + host181112.set_z(0.4755, 'spec', err=7e-5) + + # ############ + # Photometry + + # DES + # Grab the table (requires internet) + search_r = 2 * units.arcsec + des_srvy = des.DES_Survey(Host_coord, search_r) + des_tbl = des_srvy.get_catalog(print_query=True) + + host181112.parse_photom(des_tbl) + + # VLT -- Lochlan 2019-05-02 + # VLT -- Lochlan 2019-06-18 + photom_file = os.path.join(db_path, 'CRAFT', 'Prochaska2019', 'prochaska2019_photom.ascii') + if build_photom: + photom = Table() + photom['Name'] = ['HG{}'.format(frbname)] + photom['ra'] = host181112.coord.ra.value + photom['dec'] = host181112.coord.dec.value + photom['VLT_g'] = 22.45 + photom['VLT_g_err'] = 0.06 + photom['VLT_I'] = 21.41 + photom['VLT_I_err'] = 0.04 + # Add in DES + for key in host181112.photom.keys(): + photom[key] = host181112.photom[key] + # Merge/write + photom = frbphotom.merge_photom_tables(photom, photom_file) + photom.write(photom_file, format=frbphotom.table_format, overwrite=True) + host181112.parse_photom(Table.read(photom_file, format=frbphotom.table_format)) + + # Nebular lines + host181112.parse_ppxf(os.path.join(db_path, 'CRAFT', 'Prochaska2019', 'HG181112_FORS2_ppxf.ecsv')) + + # Adjust errors on Ha, [NII] because of telluric + + # Derived quantities + host181112.calc_nebular_AV('Ha/Hb', min_AV=0.) + + # Ha is tough in telluric + host181112.calc_nebular_SFR('Hb', AV=0.15) # Photometric + # This would be an upper limit + #host.calc_nebular_SFR('Ha') + + # CIGALE + host181112.parse_cigale(os.path.join(db_path, 'CRAFT', 'Prochaska2019', 'HG181112_CIGALE.fits')) + + # Write + path = resource_filename('frb', 'data/Galaxies/{}'.format(frbname)) + host181112.write_to_json(path=path) def main(inflg='all'): @@ -201,11 +268,16 @@ def main(inflg='all'): # 121102 if flg & (2**0): - build_host_121102(build_photom=True) + build_host_121102(build_photom=False) # 180924 if flg & (2**1): - build_host_180924(build_photom=True) + build_host_180924(build_photom=False) + + # 181112 + if flg & (2**2): + build_host_181112(build_photom=False) + # Command line execution diff --git a/frb/builds/build_specdb.py b/frb/builds/build_specdb.py index f7918f44..54e6227d 100644 --- a/frb/builds/build_specdb.py +++ b/frb/builds/build_specdb.py @@ -271,6 +271,10 @@ def main(inflg='all'): if flg & (2**0): generate_by_refs(['Prochaska2019', 'Bannister2019', 'Bhandari2019'], 'specDB_CRAFT.hdf5', 'v0.1') + # Public + if flg & (2**1): + generate_by_refs(['Prochaska2019', 'Bannister2019'], 'specDB_Public.hdf5', 'v0.1') + # Command line execution if __name__ == '__main__': diff --git a/frb/data/Galaxies/181112/FRB181112_host.json b/frb/data/Galaxies/181112/FRB181112_host.json new file mode 100644 index 00000000..c44c91aa --- /dev/null +++ b/frb/data/Galaxies/181112/FRB181112_host.json @@ -0,0 +1,67 @@ +{ + "FRB": "181112", + "cosmo": "Planck15", + "dec": -52.970911111111114, + "dec_FRB": -52.97094166666667, + "derived": { + "AV_nebular": 0.0, + "EBV_photom": 0.153821087317966, + "EBV_photom_err": 0.08210368780206626, + "EBV_spec": 0.6728969763283427, + "Lnu_r": 5.950847388124152e+21, + "Lnu_r_err": 3.894508369898693e+20, + "M_r": -20.33644703187715, + "M_r_err": 0.07105557345279981, + "Mstar": 2609194095.6801996, + "Mstar_err": 1107505410.1392717, + "Mstar_spec": 55476962114.8469, + "SFR_nebular": 0.5733783330543467, + "SFR_photom": 0.4009018565156828, + "SFR_photom_err": 0.5667222115045049, + "Z_photom": 0.006074170958730715, + "Z_photom_err": 0.01189473050873001, + "Z_spec": -0.26900567612975296, + "f_AGN": 0.02751849589666505, + "f_AGN_err": 0.024872820073696535, + "u-r": 1.1526518377513286, + "u-r_err": 0.15634427608374452 + }, + "neb_lines": { + "Halpha": 6.445076261911804e-17, + "Halpha_err": 7.851771549771335e-18, + "Hbeta": 2.868286974001483e-17, + "Hbeta_err": 2.0582592184492076e-18, + "Hgamma": 7.177895062215415e-18, + "Hgamma_err": 2.1268690019005353e-18, + "[NII] 6584": 4.8940024039665055e-17, + "[NII] 6584_err": 1.0359113352252274e-17, + "[OIII] 5007": 5.40602020186808e-17, + "[OIII] 5007_err": 3.2545695709644632e-18 + }, + "photom": { + "DES_Y": 21.0728, + "DES_Y_err": 0.16852, + "DES_g": 22.7064, + "DES_g_err": 0.0858693, + "DES_i": 21.4916, + "DES_i_err": 0.0612987, + "DES_r": 21.726, + "DES_r_err": 0.050682599999999994, + "DES_z": 21.4456, + "DES_z_err": 0.10654000000000001, + "VLT_I": 21.41, + "VLT_I_err": 0.04, + "VLT_g": 22.45, + "VLT_g_err": 0.06 + }, + "ra": 327.3485833333333, + "ra_FRB": 327.34845833333327, + "redshift": { + "z": 0.4755, + "z_FRB": 0.4755, + "z_FRB_err": 7e-05, + "z_err": 7e-05, + "z_spec": 0.4755, + "z_spec_err": 7e-05 + } +} \ No newline at end of file From f52b2a0f8e967244d86a8593045533713858758d Mon Sep 17 00:00:00 2001 From: profxj Date: Sun, 11 Aug 2019 08:01:09 -0700 Subject: [PATCH 04/15] BPT edits --- frb/figures/galaxies.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frb/figures/galaxies.py b/frb/figures/galaxies.py index 0628a124..0c7c9f04 100644 --- a/frb/figures/galaxies.py +++ b/frb/figures/galaxies.py @@ -120,8 +120,8 @@ def sub_bpt(ax_BPT, galaxies, clrs, markers, show_kewley=True, SDSS_clr='BuGn'): # Legend ax_BPT.legend(loc="lower left") # Axes - ax_BPT.set_xlabel(r"$\log \, ({\rm [NII]/H_\alpha)}$") - ax_BPT.set_ylabel(r"$\log \, ({\rm [OIII]/H_\beta)}$") + ax_BPT.set_xlabel(r"$\log \, ({\rm [N\textsc{ii}]/H\,\alpha)}$") + ax_BPT.set_ylabel(r"$\log \, ({\rm [O\textsc{iii}]/H\,\beta)}$") ax_BPT.set_xlim(-1.5, 0.5) ax_BPT.set_ylim(-1, 1.2) utils.set_fontsize(ax_BPT, 13.) From db38f9451e43fb3f067425569ebf35c2e5f5b1e9 Mon Sep 17 00:00:00 2001 From: Sunil Simha Date: Sun, 11 Aug 2019 14:19:03 -0700 Subject: [PATCH 05/15] random association calculations --- frb/scripts/random_assoc.py | 111 ++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100755 frb/scripts/random_assoc.py diff --git a/frb/scripts/random_assoc.py b/frb/scripts/random_assoc.py new file mode 100755 index 00000000..245ecb52 --- /dev/null +++ b/frb/scripts/random_assoc.py @@ -0,0 +1,111 @@ +import numpy as np +from astropy.coordinates import SkyCoord +from astropy import units as u +from astropy.table import Table +from matplotlib import pyplot as plt +import pdb +from frb.surveys import des +import sys,os +import progressbar as pb #pip install progressbar2 +from matplotlib import pyplot as plt +import seaborn as sns +def get_catalog(coords,size=1*u.deg): + """ + Download a catalog objects within + a square of input `size` centered + around `coords`. + Args: + coords (astropy SkyCoord): central coordinates + size (astropy Angle): Size of the square FoV around + the central coordinates + Returns: + catalog (astropy Table): DES DR1 search results + """ + survey = des.DES_Survey(coords,size/np.sqrt(2)) + catalog = survey.get_catalog(print_query=False) + select = (catalog['ra']>coords.ra.value-size.value/2)&(catalog['ra']coords.dec.value-size.value/2)&(catalog['dec'] Date: Tue, 13 Aug 2019 12:30:44 -0700 Subject: [PATCH 06/15] public spectra --- docs/data.rst | 41 ++++++++++++++++++++++++++++++++++++++ docs/galaxies.rst | 4 ++-- docs/index.rst | 8 ++++++++ frb/builds/build_specdb.py | 2 +- frb/galaxies/utils.py | 13 +++++++++--- 5 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 docs/data.rst diff --git a/docs/data.rst b/docs/data.rst new file mode 100644 index 00000000..0a02ccf4 --- /dev/null +++ b/docs/data.rst @@ -0,0 +1,41 @@ +**** +Data +**** + +Overview +======== + +One purpose of this repository is to provide data +related to FRBs, their host galaxies, and the galaxies +foreground to them. This includes measurements +(e.g. photometry), derived quantities (e.g. star formation +rate), and observational data (e.g. spectra). + +Spectra +======= + +SpecDB +------ + +As galaxy spectra related to FRB surveys becomes available, +we intend to archive these within a +`specdb `_ +database file. + +Here is the +`public specdb `_ +which currently includes galaxy spectra related to +FRB 180924 +`Bannister et al. 2019 `_ +and FRB 181112 (Prochaska et al. 2019). + +You will need to: + +#. Install `specdb `_ +#. Place the above file in a folder +#. Point the environmental variable SPECDB to the folder + +Accessing a spectrum +-------------------- + +You can load up diff --git a/docs/galaxies.rst b/docs/galaxies.rst index c363c39d..c76bc1ce 100644 --- a/docs/galaxies.rst +++ b/docs/galaxies.rst @@ -98,8 +98,8 @@ This method also requires that the redshift have been set previously. I/O --- -One can write the main contents of the FRBGalaxy object to disk -with the write_to_json() method:: +One can write the main contents of the FRBGalaxy object +to disk with the write_to_json() method:: frbgalaxy.write_to_json() diff --git a/docs/index.rst b/docs/index.rst index 0813114b..e1d20e8c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -20,6 +20,14 @@ Getting Started installing +Data +---- + +.. toctree:: + :maxdepth: 2 + + data + Dispersion Measure ------------------ diff --git a/frb/builds/build_specdb.py b/frb/builds/build_specdb.py index 54e6227d..a7e50373 100644 --- a/frb/builds/build_specdb.py +++ b/frb/builds/build_specdb.py @@ -273,7 +273,7 @@ def main(inflg='all'): # Public if flg & (2**1): - generate_by_refs(['Prochaska2019', 'Bannister2019'], 'specDB_Public.hdf5', 'v0.1') + generate_by_refs(['Prochaska2019', 'Bannister2019'], 'FRB_specDB_Public.hdf5', 'v0.1') # Command line execution diff --git a/frb/galaxies/utils.py b/frb/galaxies/utils.py index aad2f4e0..876414cf 100644 --- a/frb/galaxies/utils.py +++ b/frb/galaxies/utils.py @@ -1,7 +1,7 @@ """ Utilities related to FRB galaxies""" import os -import warnings +import glob from IPython import embed try: @@ -25,10 +25,17 @@ def load_specdb(specdb_file=None): """ if not flg_specdb: - warnings.warn("You must install the specdb package first!") + raise IOError("You must install the specdb package first!") return if specdb_file is None: - specdb_file = os.path.join(os.getenv('SPECDB'), 'FRB_specDB.hdf5') + if os.getenv('SPECDB') is None: + raise IOError("You must set the SPECDB environmental variable") + specdb_files = glob.glob(os.path.join(os.getenv('SPECDB'), 'FRB_specDB_*.hdf5')) + if len(specdb_files) > 0: + specdb_file = specdb_files[0] + print("Loading spectra from {:s}".format(specdb_file)) + else: + raise IOError("There are no FRB_specdb.hdf5 files in your SPECDB folder") # Load it up specDB = SpecDB(db_file=specdb_file) # Return From 4080bdb35cbe0c70132c02f0bbf26be73c72d041 Mon Sep 17 00:00:00 2001 From: profxj Date: Tue, 13 Aug 2019 12:31:21 -0700 Subject: [PATCH 07/15] public spectra --- docs/data.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/data.rst b/docs/data.rst index 0a02ccf4..d5bdbdd2 100644 --- a/docs/data.rst +++ b/docs/data.rst @@ -38,4 +38,4 @@ You will need to: Accessing a spectrum -------------------- -You can load up +You can load up From 5fa197dedb4f3ab3d6fcb2bee813cebfce5d86b0 Mon Sep 17 00:00:00 2001 From: profxj Date: Tue, 13 Aug 2019 13:25:31 -0700 Subject: [PATCH 08/15] legend --- frb/figures/galaxies.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frb/figures/galaxies.py b/frb/figures/galaxies.py index 0c7c9f04..8f5cbb5a 100644 --- a/frb/figures/galaxies.py +++ b/frb/figures/galaxies.py @@ -14,7 +14,8 @@ primus_path = os.path.join(resource_filename('frb', 'data'), 'Public') -def sub_bpt(ax_BPT, galaxies, clrs, markers, show_kewley=True, SDSS_clr='BuGn'): +def sub_bpt(ax_BPT, galaxies, clrs, markers, show_kewley=True, SDSS_clr='BuGn', + show_legend=True): """ Generate a BPT diagram @@ -34,6 +35,8 @@ def sub_bpt(ax_BPT, galaxies, clrs, markers, show_kewley=True, SDSS_clr='BuGn'): Show the BPT lines? SDSS_clr (str, optional): Set the color map for SDSS + show_legend (bool, optional): + Show a legend Returns: ax_BPT is modified in place @@ -118,7 +121,8 @@ def sub_bpt(ax_BPT, galaxies, clrs, markers, show_kewley=True, SDSS_clr='BuGn'): ax_BPT.annotate(r"\textbf{Seyfert}", (-0.5, 1), fontsize=lsz) # Legend - ax_BPT.legend(loc="lower left") + if show_legend: + ax_BPT.legend(loc="lower left") # Axes ax_BPT.set_xlabel(r"$\log \, ({\rm [N\textsc{ii}]/H\,\alpha)}$") ax_BPT.set_ylabel(r"$\log \, ({\rm [O\textsc{iii}]/H\,\beta)}$") From b28c0394fcbe3baada27496e423a196f3cf27e0d Mon Sep 17 00:00:00 2001 From: profxj Date: Tue, 13 Aug 2019 13:42:36 -0700 Subject: [PATCH 09/15] 190523 --- frb/builds/build_frbs.py | 35 +++++++++++ frb/builds/build_hosts.py | 64 +++++++++++++++++++- frb/data/FRBs/FRB190523.json | 32 ++++++++++ frb/data/Galaxies/190523/FRB190523_host.json | 43 +++++++++++++ frb/surveys/panstarrs.py | 5 -- 5 files changed, 173 insertions(+), 6 deletions(-) create mode 100644 frb/data/FRBs/FRB190523.json create mode 100644 frb/data/Galaxies/190523/FRB190523_host.json diff --git a/frb/builds/build_frbs.py b/frb/builds/build_frbs.py index 1fe84d7a..6d36d546 100644 --- a/frb/builds/build_frbs.py +++ b/frb/builds/build_frbs.py @@ -88,6 +88,36 @@ def frb_181112(): path = resource_filename('frb', 'data/FRBs') frb181112.write_to_json(path=path) + +def frb_190523(): + """Ravi+19""" + fname = 'FRB190523' + frb190523 = frb.FRB(fname, 'J134815.6+722811', + 760.8 * units.pc / units.cm**3, + z_frb=0.660) + # Error ellipse [REQUIRED] + frb190523.set_ee(5, 2, 0., 340) # JXP eyeball + # Error in DM + frb190523.DM_err = 0.6 * units.pc / units.cm**3 + + # Fluence + frb190523.fluence = 280 * units.Jy * units.ms + #frb180924.fluence_err = 1 * units.Jy * units.ms + + # NE2001 + frb190523.set_DMISM() + + # RM + #frb190102.RM = 10 * units.rad / units.m**2 + #frb190102.RM_err = 1 * units.rad / units.m**2 + + # References + frb190523.refs = ['Ravi2019'] + + # Write + path = resource_filename('frb', 'data/FRBs') + frb190523.write_to_json(path=path) + def main(inflg='all'): if inflg == 'all': @@ -107,6 +137,11 @@ def main(inflg='all'): if flg & (2**2): frb_181112() + # 195023 + if flg & (2**3): + frb_190523() + + # Command line execution # Only for testing diff --git a/frb/builds/build_hosts.py b/frb/builds/build_hosts.py index 935d9af1..f51aceff 100644 --- a/frb/builds/build_hosts.py +++ b/frb/builds/build_hosts.py @@ -16,6 +16,7 @@ from frb.galaxies import frbgalaxy, defs from frb.galaxies import photom as frbphotom from frb.surveys import des +from frb.surveys import panstarrs db_path = os.getenv('FRB_GDB') if db_path is None: @@ -257,7 +258,64 @@ def build_host_181112(build_photom=False): # Write path = resource_filename('frb', 'data/Galaxies/{}'.format(frbname)) host181112.write_to_json(path=path) - + + +def build_host_190523(build_photom=False): #:run_ppxf=False, build_photom=False): + frbname = '190523' + gal_coord = SkyCoord(ra=207.06433, dec=72.470756, unit='deg') + + # Instantiate + host190523 = frbgalaxy.FRBHost(gal_coord.ra.value, gal_coord.dec.value, frbname) + + # Load redshift table + host190523.set_z(0.660, 'spec') + + # Morphology + + # Photometry + + # PanStarrs + # Grab the table (requires internet) + photom_file = os.path.join(db_path, 'DSA', 'Ravi2019', 'ravi2019_photom.ascii') + if build_photom: + search_r = 1 * units.arcsec + ps_srvy = panstarrs.Pan_STARRS_Survey(gal_coord, search_r) + ps_tbl = ps_srvy.get_catalog(print_query=True) + photom = frbphotom.merge_photom_tables(ps_tbl, photom_file) + photom.write(photom_file, format=frbphotom.table_format, overwrite=True) + # Parse + host190523.parse_photom(Table.read(photom_file, format=frbphotom.table_format)) + + # PPXF + ''' + if run_ppxf: + results_file = os.path.join(db_path, 'CRAFT', 'Bhandari2019', 'HG190608_SDSS_ppxf.ecsv') + meta, spectrum = host190608.get_metaspec(instr='SDSS') + spec_fit = None + ppxf.run(spectrum, 2000., host190608.z, results_file=results_file, spec_fit=spec_fit, chk=True) + host190608.parse_ppxf(os.path.join(db_path, 'CRAFT', 'Bhandari2019', 'HG190608_SDSS_ppxf.ecsv')) + ''' + + # CIGALE -- PanStarrs photometry but our own CIGALE analysis + host190523.parse_cigale(os.path.join(db_path, 'DSA', 'Ravi2019', + 'S1_190523_CIGALE.fits')) + + # Derived quantities + host190523.derived['SFR_nebular'] = 1.3 + host190523.derived['SFR_nebular_err'] = -999. + + ''' + # CIGALE + host190608.parse_cigale(os.path.join(db_path, 'CRAFT', 'Bhandari2019', + 'HG190608_CIGALE.fits')) + ''' + # Vet all + host190523.vet_all() + + # Write -- BUT DO NOT ADD TO REPO (YET) + path = resource_filename('frb', 'data/Galaxies/{}'.format(frbname)) + host190523.write_to_json(path=path) + def main(inflg='all'): @@ -278,6 +336,10 @@ def main(inflg='all'): if flg & (2**2): build_host_181112(build_photom=False) + # 181112 + if flg & (2**3): + build_host_190523(build_photom=False) + # Command line execution diff --git a/frb/data/FRBs/FRB190523.json b/frb/data/FRBs/FRB190523.json new file mode 100644 index 00000000..13537ca6 --- /dev/null +++ b/frb/data/FRBs/FRB190523.json @@ -0,0 +1,32 @@ +{ + "DM": { + "unit": "pc / cm3", + "value": 760.8 + }, + "DMISM": { + "unit": "pc / cm3", + "value": 36.79825691679175 + }, + "DM_err": { + "unit": "pc / cm3", + "value": 0.6 + }, + "FRB": "FRB190523", + "cosmo": "Planck15", + "dec": 72.46972222222223, + "eellipse": { + "a": 5, + "b": 2, + "cl": 340, + "theta": 0.0 + }, + "fluence": { + "unit": "Jy ms", + "value": 280.0 + }, + "ra": 207.065, + "refs": [ + "Ravi2019" + ], + "z": 0.66 +} \ No newline at end of file diff --git a/frb/data/Galaxies/190523/FRB190523_host.json b/frb/data/Galaxies/190523/FRB190523_host.json new file mode 100644 index 00000000..905eabea --- /dev/null +++ b/frb/data/Galaxies/190523/FRB190523_host.json @@ -0,0 +1,43 @@ +{ + "FRB": "190523", + "cosmo": "Planck15", + "dec": 72.470756, + "derived": { + "EBV_photom": 0.30037593825743913, + "EBV_photom_err": 0.15208458616339954, + "Lnu_r": 2.8940025009350273e+22, + "Lnu_r_err": 3.1675101594782217e+21, + "M_r": -22.053747255227947, + "M_r_err": 0.11883474385297058, + "Mstar": 125593780706.51276, + "Mstar_err": 86539948924.39392, + "SFR_nebular": 1.3, + "SFR_nebular_err": -999.0, + "SFR_photom": 12.61819472896052, + "SFR_photom_err": 32.555019878720714, + "Z_photom": 0.007629025869678679, + "Z_photom_err": 0.01327365192264198, + "f_AGN": 0.07950435656472606, + "f_AGN_err": 0.0704900060380915, + "u-r": 1.9531768136045813, + "u-r_err": 0.1932605048375288 + }, + "photom": { + "Pan-STARRS_g": null, + "Pan-STARRS_g_err": null, + "Pan-STARRS_i": 21.0578, + "Pan-STARRS_i_err": 0.0574, + "Pan-STARRS_r": null, + "Pan-STARRS_r_err": null, + "Pan-STARRS_y": 20.0666, + "Pan-STARRS_y_err": 0.1505, + "Pan-STARRS_z": 20.6865, + "Pan-STARRS_z_err": 0.0995 + }, + "ra": 207.06433, + "redshift": { + "z": 0.66, + "z_FRB": 0.66, + "z_spec": 0.66 + } +} \ No newline at end of file diff --git a/frb/surveys/panstarrs.py b/frb/surveys/panstarrs.py index 729d9538..3dfdfee3 100644 --- a/frb/surveys/panstarrs.py +++ b/frb/surveys/panstarrs.py @@ -173,8 +173,3 @@ def get_url(coord,imsize=30*u.arcsec,filt="i",output_size=None,imgformat="fits", url.append(urlbase+extensions) return url - - - - - \ No newline at end of file From 4190c6e8ca8e5955be71098006d448d3b3fd8df0 Mon Sep 17 00:00:00 2001 From: profxj Date: Tue, 13 Aug 2019 13:57:48 -0700 Subject: [PATCH 10/15] spectra --- docs/data.rst | 54 ++- docs/nb/FRB_Galaxies.ipynb | 937 ++++++++++++++++++++++++++++++++++++- 2 files changed, 983 insertions(+), 8 deletions(-) diff --git a/docs/data.rst b/docs/data.rst index d5bdbdd2..7916bf96 100644 --- a/docs/data.rst +++ b/docs/data.rst @@ -32,10 +32,56 @@ and FRB 181112 (Prochaska et al. 2019). You will need to: #. Install `specdb `_ -#. Place the above file in a folder +#. Place the `public specdb `_ file in a folder #. Point the environmental variable SPECDB to the folder -Accessing a spectrum --------------------- +Galaxy Spectrum +--------------- -You can load up +The easiest way (perhaps) to load up a spectrum is +by first instantiating an FRB galaxy object. Here +is an example for the host galaxy of FRB 180924:: + + # Load the FRB + frb180924 = frb.FRB.by_name('FRB180924') + # Load the host galaxy + hg180924 = frb180924.grab_host() + # Load a meta data Table and the spectra + meta, spec = hg180924.get_metaspec() + +*meta* is an astropy Table describing all of the archived spectra +for this galaxy (here only 1 spectrum). *spec* is an +XSpectrum1D object from `linetools `_. + +Galaxy script +------------- + +The FRB repo also provides a basic script -- frb_galaxies -- for accessing galaxy spectra +in the *specdb* archive. Here is the usage:: + + usage: frb_galaxies [-h] [--rho RHO] [--ang_offset ANG_OFFSET] [--cat] + [--specdb SPECDB] [-p] + coord + + Script to fuss with FRB galaxies [v1.1] + + positional arguments: + coord Coordinates, e.g. J081240.7+320809 or 122.223,-23.2322 + or 07:45:00.47,34:17:31.1 or FRB name (FRB180924) + + optional arguments: + -h, --help show this help message and exit + --rho RHO Maximum impact parameter in kpc [default=300.] + --ang_offset ANG_OFFSET + Maximum offset in arcsec [over-rides --rho if set] + --cat Only show data from the catalog (not meta) + --specdb SPECDB specDB file; defaults to $SPECDB/FRB_specdb.hdf5 + -p, --plot Launch a plotting GUI? + +And here is an example call:: + + frb_galaxies FRB180924 + +This prints a brief summary of the spectra available +in the field surrounding FRB180924 (default is a 300kpc +radius). You can plot spectra by adding the -p option. \ No newline at end of file diff --git a/docs/nb/FRB_Galaxies.ipynb b/docs/nb/FRB_Galaxies.ipynb index bd83dd0c..05fbd91f 100644 --- a/docs/nb/FRB_Galaxies.ipynb +++ b/docs/nb/FRB_Galaxies.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -19,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -28,7 +28,8 @@ "from matplotlib import pyplot as plt\n", "import numpy as np\n", "\n", - "from frb.galaxies import frbgalaxy" + "from frb.galaxies import frbgalaxy\n", + "from frb import frb" ] }, { @@ -969,6 +970,934 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Let's play with FRB 180924" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load the FRB" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "frb180924 = frb.FRB.by_name('FRB180924')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Host galaxy" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "hg180924 = frb180924.grab_host()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## How about a spectrum?" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading spectra from /data/spec_DB/FRB_specDB_CRAFT.hdf5\n", + "Database is FRB\n", + "Created on 2019-Jun-28\n", + "Version: v0.1\n", + "Your search yielded 1 match[es] within radius=0.5 arcsec\n", + "Staged 1 spectra totalling 6.4e-05 Gb\n", + "Loaded spectra\n", + "Staged 1 spectra totalling 6.4e-05 Gb\n", + "Loaded spectra\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/xavier/Projects/anaconda3/lib/python3.7/site-packages/h5py/_hl/dataset.py:313: H5pyDeprecationWarning: dataset.value has been deprecated. Use dataset[()] instead.\n", + " \"Use dataset[()] instead.\", H5pyDeprecationWarning)\n", + "/data/Projects/Python/linetools/linetools/spectra/xspectrum1d.py:222: RuntimeWarning: invalid value encountered in greater\n", + " gdsigval = np.where(self.data['sig'][kk].data > 0.)[0]\n", + "/data/Projects/Python/linetools/linetools/spectra/xspectrum1d.py:223: RuntimeWarning: invalid value encountered in less_equal\n", + " badsigval = self.data['sig'][kk].data <= 0.\n", + "/data/Projects/Python/linetools/linetools/spectra/xspectrum1d.py:253: UserWarning: No unit given to wavelength, assuming Angstroms.\n", + " warnings.warn(\"No unit given to wavelength, assuming Angstroms.\")\n", + "/data/Projects/FRB/frb/galaxies/frbgalaxy.py:340: UserWarning: Multiple spectra returned for this galaxy. Taking the first, but you may wish to specify your instrument\n", + " warnings.warn(\"Multiple spectra returned for this galaxy. Taking the first, but you may wish to specify your instrument\")\n" + ] + } + ], + "source": [ + "meta, spec = hg180924.get_metaspec()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "Table length=1\n", + "\n", + "\n", + "\n", + "\n", + "
RA_GROUPDEC_GROUPzem_GROUPsig_zemZQREPOCHGROUP_IDFRB_IDNPIXWV_MINWV_MAXSTYPEflag_zemSPEC_FILEDATE-OBSDISPERSERINSTRTELESCOPERefGROUP
float64float64float64float64int64float64float64int64int64int64float64float64str3str8str92str10str4str4str6str13str4
326.10521-40.900220.3210.042000.02000.01537214700.99352.1GALHAND/home/xavier/Projects/FRB/Galaxy_DB/CRAFT/Bannister2019/J214425.25-405400.8_MUSE_A_spec.fits2018-11-05VPHGMUSEVLTBannister2019MUSE
" + ], + "text/plain": [ + "\n", + " RA_GROUP DEC_GROUP zem_GROUP sig_zem ... INSTR TELESCOPE Ref GROUP\n", + " float64 float64 float64 float64 ... str4 str6 str13 str4\n", + "--------- --------- --------- ------- ... ----- --------- ------------- -----\n", + "326.10521 -40.90022 0.321 0.0 ... MUSE VLT Bannister2019 MUSE" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "meta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plot" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('
');\n", - " var button = $('');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " event.shiftKey = false;\n", - " // Send a \"J\" for go to next cell\n", - " event.which = 74;\n", - " event.keyCode = 74;\n", - " manager.command_mode();\n", - " manager.handle_keydown(event);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/xavier/Projects/FRB/frb/figures/galaxies.py:59: RuntimeWarning: divide by zero encountered in true_divide\n", + " select[line] = bptdat[line] / bptdat[err] >= 5\n", + "/home/xavier/Projects/FRB/frb/figures/galaxies.py:59: RuntimeWarning: invalid value encountered in true_divide\n", + " select[line] = bptdat[line] / bptdat[err] >= 5\n", + "/home/xavier/Projects/FRB/frb/figures/galaxies.py:59: RuntimeWarning: invalid value encountered in greater_equal\n", + " select[line] = bptdat[line] / bptdat[err] >= 5\n", + "/home/xavier/Projects/FRB/frb/figures/galaxies.py:71: RuntimeWarning: divide by zero encountered in log10\n", + " mplt = ax_BPT.pcolormesh(xedges, yedges, np.log10(counts.transpose()), cmap=cm)\n", + "/home/xavier/local/Python/linetools/linetools/lists/linelist.py:379: UserWarning: Not implemented: will not set relative strength for LineList: Galaxy.\n", + " warnings.warn('Not implemented: will not set relative strength for LineList: {}.'.format(self.list))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Not making a dust correction of the SFR. Set AV_nebular to do so or input AV to this method\n", + "Not making a dust correction of the SFR. Set AV_nebular to do so or input AV to this method\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/xavier/local/Python/linetools/linetools/lists/linelist.py:379: UserWarning: Not implemented: will not set relative strength for LineList: Galaxy.\n", + " warnings.warn('Not implemented: will not set relative strength for LineList: {}.'.format(self.list))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Not making a dust correction of the SFR. Set AV_nebular to do so or input AV to this method\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/xavier/local/Python/linetools/linetools/lists/linelist.py:379: UserWarning: Not implemented: will not set relative strength for LineList: Galaxy.\n", + " warnings.warn('Not implemented: will not set relative strength for LineList: {}.'.format(self.list))\n", + "/home/xavier/local/Python/linetools/linetools/lists/linelist.py:379: UserWarning: Not implemented: will not set relative strength for LineList: Galaxy.\n", + " warnings.warn('Not implemented: will not set relative strength for LineList: {}.'.format(self.list))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Not making a dust correction of the SFR. Set AV_nebular to do so or input AV to this method\n" + ] }, { "data": { - "text/html": [ - "" - ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAacAAAEOCAYAAAAt/Ni+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsnXd4FGXXh+9J750Sagq9BEgCKCIWqlgQBLFiQal+WF6BFwQbKFLsvirYu0hRsEMSOkpJKAICkgQEEgKk9zrfH7sJSZ6zsCGFBOa+rr1gn52debI7O2fOec75HU3XdQwMDAwMDOoTNpd6AgYGBgYGBpUxjJOBgYGBQb3DME4GBgYGBvUOwzgZGBgYGNQ7DONkYGBgYFDvMIyTgYGBgUG9wzBOBgYGBgb1DsM4GRgYGBjUOwzjZGBgYGBQ77C71BOoj/j5+ekBAQGXehoGBlc059Ou0aqwbXmKSuQt7W0q71Gm0ML7K2Mn7M/SsaszH0t7tO7dNU90dPRZXdcb1cS+DOMkEBAQwM6dOy/1NAwMqkxecYk47mR7aYIkluYjUXmOVXmvtaQXFFu1naeDbY2/39r3AjRxtrdqu/r2fWuadqym9mUYJwMDg3qJpQtsdYyWp4Otst+k3MKL3l/pPquzXXUMyaUyQnXB5fuXGRgYGBg0WAzPycDAoF4geUS14RnURriwOlSeT0JOjridq52jOG5tCLChYRgnA4PLiPoW5rF2PtVZmzrf+61ZxzqZkyyMQahvU2U8HXXdKL2g+KINRH0zlPUJwzgZGBjUCLWxOG/tepCl9ZzqXPyr8t7K88wuyhe3C3J3u+j5VIf6ljhhDYZxMjAwuOTEZqYqY36OHjV+nE1J8cpYiHcrZcySsZOMjqVwmzVIITxL+7M28eJyof6aTQMDAwODKxbDczIwuMyxFBqrvE5SldDP/jR1nSbY3Vt8v7RtZy9fcdvLncqfhbPtxXtdlpC+74bodRnGycDAoEaQikzP5mdY9V7pIn2+91Y2btIFefvZWGWsoNi6OZ6Vl4zEUOORzERlLMy3hTImhS6bubjIBxKwlMVnzTpWdZI2LhWGcTIwaGDExMQwb948goKCAPD19WXHjh0sW7asRvb/2MQJBAYFs2LZd/zv/cVc3TO8yvvYGBVJvxv718h8DK5MDONkYNDA6N+/P79v+ZPWgSbjtDEqknffX1zmPVh7h1zZ2/B0sOXVhQuJiozkwHvvEx8XK25nDe+8tui8xqm6KdQxyacqPG/ucmWGCaH6Chf1FcM4GRg0IOLi4khLSyM9Lb1srN+N/enavbvF90jGSrqgpRcUk5GaQnBQEE62Nny4ZInFC5+lTLr0tDTmzppZ9jytIFvZRgp57U87YXH+lWnu4qWMSbVKPo5qyOxUTqYyJs0xJV8Ooe04c1QZ83VyVcakEF5+sfyZV8bS+lAzFxerpZcaWghPwsjWMzBoQAQFBeHl5cWga3rzyL138c5rizgWH8eHX31btk1ERATjx49nwYIFjBo1iuXLlwOwZMkSvL29CQ4OZu+uXQDMmTWDQX16s3fXLjZGRRIREcHOnTuZPn06cXFxbIyKZOpjk3jntUU8cu9d/Pj9CgC++OhD2jdrzNTHJjFn1gx6d+7A3l27WL1iORvXRbEnJpo5s2aw7sef6/5DMrgsqLeek6ZpA4AUXddjLrDdNPN/fYHFuq7HWfOagYElqqtWYC3WZlVVvrv+7uffeXryBH76fiU/fb+SubNmMmvuyzz21NPs3bWLQQMHcuDwPwQGBREfF0endm05lHCaYfc/xPEzycydNZPWgYEAePv48sFX35SFCP9cH4UOvPDyPHbFxHDnLTexbf9BWgcGcSw+jt6dO3Ao4TT3j32EDVERrF65nEMJpzkWH09aakrZeEZ6OrPnzhOTBQwunrjMrArPq1NjVd+pd8bJbFB8gWnAdMCicdI0bRmwQ9f1BZqmhQJrNU0L03U97Xyv1cXfYWBQW4T06MGardtIT0tj9YrlfPHRB8ydNZP7H36E3743eUlRkRF47/IhNSWFW4aPIC01BU8vL+5/+BHmzprJss8+5j9Tp5J4LJ6Q9m3F4yz/7jsAVv+2Gg9vbzJSU+l/2y0cTIijhUNrnGxtCA4KoomzPT+uXMH+tGTO5mdQUFJEQUkRZ/MzcLZ1UPZ7IO20VX+nlFkHcDJH/QlnFqrpddmFBVYd50S2GoJr5OwubtvWU21VZCkEWBlpXUwKR2YXWa8i0RBTxK2l3hknXdcXQAWvR0TTtCBgJDDP/L4Y89idmqZFWHoNWFKL0ze4wqgrL6uUvbt2sScmmvvHPmIyNmMf4f6xj9DUxYFj8efUD+4YdSdeXqa1mZEPjC0bLzVQH32whMCgQEbcMfKCxxx4+224e3oCMOKB+8vG84pLcPPyPu+C/N979tKxW0iV/06D6lFXIrq1Sb0zTlUg1Pxv+duoNGAgkHKe1wzjZFAvsLq/Tznnw83ehndfX8R9d48uMz5paWl4eXlxbe9w7N2ceW3RQtZu2cI1N9wAwMrPvuC2O0biad7+/rGP8sXHH/LyvHms3riprH6mcs3NI+PG8dqihfy773DZvr755GNuHj4Cf78mAHiYjVaFv8vLixNHjwIQteonuoeGVXhdqmk6mJ6kjBUUF4mfT2G+euHNEWSF0vKzlDE3eydlLK9Y9bBcLITLDqSq82zqonpZUvKDJH3UyauxMmapngmsq2m6XMRkG7Jx8hHGUgCvC7xmYNCgubF/fxa+8goA6elppKSk8MuatQC0Cgzk81WrWfzG62xeF4WXjw/hoT3LDBOYwoKdu3fn7oceqrDfXTExrIuKJD4ujlcXLuQ/U6cq++rSrTseXl5sjIrkr927AVPa+GNPPV22n1EPPcD+x3fz2nMv0CW0R21/HAaXKZquW9/Xvi7RNE0HppeG+YTXxwGLgeDSRAdN01KBCGCtpdd0XR91nv2NA2jVqlXYsWM11m3YoBY5313ixYYxGvKdp7VCok9MHs9Lb75VYUxSK6hKb6HqqEH8eUZSc7DgOZXUvufU2FmWYpKQPCcp3d3LQfV6qvKZW9reWmozrJeXl4ednR329vbRuq5XvWpboCF7TjvN/5Y/C7yAuAu8JqLr+hLMIb/w8PD6abEN6oSa6EFkTR8ha7erqiyQJWmfObNmADDl6ek4urmQVlDx4p1brF7gq6L9tidFrVVq5KRekPOEkFeakFTQ1lMNeQGsT/jbqvkUl6ifm5ejOp9AV9UQJQpJEiAbssIS1YhKNVaOwucbm6mOWdIorAp1vb50//3307dv3xrdZ4NaIdM0ba2madFgSnLAZGyCzK+VGqLF53utbmdsYFB/6B4WzrH4eN5aNJ8pz8261NMxaOCUj7o9/fTTrFixokb3X+88J3N4Ldj8dLSmaeVrlCrnkA4EFpsz8QYCo8rVMp3vNYMrkPrYcK02QoiWsuduHX4Htw6/A5BTmA0uX2riPCv9neTk5PDyyy9z7NgxvvjiCwB69+7N+vXrsbWtudT2ervmdCkJDw/Xd+7ceeENDRoU9c041VXnWCkrUFrXSMxNUca8HFRpHpDDfVJY8LfjfyljAe5qrZBUaySF0CzhJNRTJWarBtjbSV0fOpSiri+72strO228mls1HynbTwr1BbqrtU+OtrL0kJQBKGX7gfVh5argaKPxww8/8MQTT/Dvv/8CsG/fPjp37ly2jaZpxpqTgUF9pbpGx5oalYactGFQ+9T0+XH40CGmPvkEa9asAaB79+688847FQxTTWMYJ4MrhvpWhCjNp7oXFU8HW6vEQaVsO0mQ1VLmWOVkCoDkfFVAtZ1XU2VMUnPwdHBWxlxK5GSM41lnlLEiISmhlbvqVaTmq8Kv3k5qrVaxLqtTSN6cu706d1d71ZPzcFAzBaUMPskDtbRtVajKDU75bWfPns38+fMpLCzEy8uLuXPnMmHChBoN4UkYxsnAwMDAwCLp6ekUFhYyduxY5s2bR6NGali2NjCMk8CpU6dYuXIl7du3p02bNjg6Xr7iilcSNS01VJehtaoc63Lt72NQN/x94AApKSlcY04Nn/nc84y862769bm6TudhJEQImAuAAbCxsSEgIIAOHTrQsWPHCg9v7+rXIxjUHXVpnGoyhGht7ZMlpJqoBEE8tZlQOCr1OgLIKVINoK+jmjwhhfpOZqvHPpiq1kjZ2shho7wiNbTmI9RTZRbkKmMOFpINKlMgJB8AZBaq+5TCh1Kor5uvdckUx7LkGqv+/p2UsaoIv14orJeRkcFLL77Iu++8TfMWLdj11z6cnZ0tvl/CSIioZRo3bkx4eDiHDh0iPj6euLg44uLi+OWXXyps16RJEzp27Ejnzp0rPHx9r9yunAYGBg0LXdf59puvmTl9OqcSE9E0jUGDB1NYWFjBONU1hnESyMrK4uefTU3S8vPzmTx5MgUFBeTk5JCamkpCQgJHjx4lKSmJpKQk1q9fX+H9TZs2pUuXLnTu3JmQkBBCQkLo1KkTLtWQHrlcqE4mW1XDaPWtfsma+VibCm5gUFWkc/KvvXt5csoUtmzeBEDPXr154+23CQ0LU7ata4ywnoC7u7uemWnK6snJycHVVa71cHBwYMqUKTRp0oR9+/axbds2YmNjKSxULzA2Nja0adOmzFiFhITQvXt3WrVqhaZptfr31CeuBONUnb+xKutF1rbiluazKSleGZPCcpYyxKSaqD3JJ5WxqxoHqsc+dUTcp3IMoU4J5HCfh4N645dRoGYaOtio9+NHM9R5B3jIITg7G/U7DPFtpYzFZZxVxjp5+ytj1zZRPx+pxTvIskaWsikrq5dL50BRURFdO3bgaHw8jRo1Yu68edw35gFsbGwu+rdjhPVqmbZtzzVf03WdBQsWcOrUKRITEzl16hQJCQkkJiaSkZFBv379uPXWWwGYM2cOzz77rLI/GxsbSkpKOHz4MIcPHy5rmw3g4eFBSEgIPXv2JDQ0lB49etC+fXvs7IyvxsDAoGYpKSmhsLAQR0dH7OzseHn+fDZu2MCzz79Q79bQjSuggE25uyNXV1emTp0qbpednV3BiPTp04enn36ahIQETp48WfbIzc2lTZs2LFu2jL1797J3717efPNNioqKyMjIYPPmzWzevLlsPw4ODoSFhREWFkaHDh1o2bIl1113HZ5C7xyDhkNNZ/dZmyhhhAWvPKRzY/euXTw5ZQpX9+nDy/PnAzB8xB0MH3FHXU/PKoywnkBNyhfpuk5qairp6ekEBppc+OLiYiZMmMCJEyeIi4vj5MmTZGfLWVHlsbOzw9vbm9atW9OlSxe6dOnClClTsLe3LrxjUDfUtBGqisGxdlupVXquUGBqSb5IktKpTvv0w2lqtl5KXrp47EZCOwtnoahYCusFe6qhtb9T/lXGnOzUIloALyH0GejRRBmTVNZbuqnzDhKknPwcPcRjW9ucsvL5l5KSwgvPzubDJUsoKSmhZcuWHDp0qFaSHYywXi2jo37BFxuDzS/RcfH0wsXTq9w+Nd5+v6JAemZmJgknT5J08gT+/v6cOnWK6OhoVqxYwe7duykqKqKoqIgzZ85w5swZSo3nbxGRhPXqTWjPXrw29wWys7MJDAwkKCiIwMDAskdQUJDFtbMrmfqmt2dgUFUsncMlJSV8+vFHPPvMMyQnJ2Nra8v/Pf4Ezzz7LJqDI3nFJfX6PDc8J4Gw8HB9y7btFcbqqnGdpeOcOXOGyMhI1q9fz9Zt2zly+BC552lKVpmZM2fy0ksvAXDgwAGWLl1KcHBw2aNJkyZXVGJGKXVlnKpTY1WVOiepFbiUvODvrDaLlrazVHPTzUeSOlI9p4yCPGUsKVetu9p2ar8yFuLXRjx2uuARnRaObS8kThQKPZ5chQaE0hiAraaeFwWCdFKAu+pNdfJWx07lqHJKHQTJJ7C+z1N6QTFZmZmMHDqY3dGmm9hr+13H62+9RecuXSpsW9PnueE5XYE0atSIu+66i7vuuouk3EJ0Xeffo/HE7NhOzI4dxOzYzt5dMUqmoIODAw4ODhw9epRdu3YREhLCH3/8wYsvvlhhO1dXV4KDg2nXrh2fffZZWdp7RkYG7u7uV6ThMjBoqLi5u9OkaVOa+jfj+VfmM+aeuxvcb9jwnAQkz6kyUgpndVool1L5TiYuUxXYlEQ7ATy1Ynbu3MnWrVvZsmULW7du5ezZiimtnp6edO7SBSdHR2xtbUlNTSU2NpbUVNMdsru7O0kpqWUncs/u3Th27Bjt2rWjXbt2dOjQgfbt29O+fXvatWvX4Gu3alo1oqr7lKjsFUlrDYbnVJEr3XMqLi7mow+W0Kv3VQR2DgHgTFISLq6uuLq51UhSjKEQYUbTtGnm/5ZvNihtF825tuxl6Lo+XtO0AZxrzx4EDNR1ffyFjl1Uolf48Vf3i61p1zm7KF+pYzBhT9++fcvaJecWFXPkn3/YumUzmzdtYvOmTRyNj2frli1l73B1daVfv3707H0VAYGBeHp5lRkmXddJSUkhMzOT6OhooqOjKxztmWeeYe7cuQAcOXKEiIgIOnXqRKdOnfDz86vRv/lyxRoF8ehkNVlAUhA3od64tHFXkwAkI+Ys9ESS2qyD3JJdam3uK/RPkpTB3YR6KskIAZzITFLG7ARZohKh0bdksFKFxIvGgpQTgI+j+vfYC7VPhSXqDYql5JLKWEqIsHRDsnPbn8x4Ygp/7dlNeO+rWB25Hn9XR5oEWDpHTNT3tiv10jhpmrYM2KHr+gJN00KBtZqmhem6rt4eQaj5UZ4F5n9HAePM/4/D1BH3ikHTNNq2a0fbdu144KGHATh+/DibN23kj02b2LBhA4cPH+bXX3/l119/BcDPz49+11/Pjf37c8ON/Tlx4gTJyckcPnyYQ4cOlT0OHjxYoZdLZGQkEydOLHveqFGjMkPVqVMnJkyYYNRuGRjUIGeSkpg7+xmWfvk5AM1btGT8lMcbXPjOEvUurGduqx4LhOm6HmMe04Hxuq4vqbStFzC/1BsyP5+h6/p08/PFwDIAXdcjrJ1Dt9Awfc2WP8ueW9tJ1FJYz9ptpcpwqeMoyKG9yooB1giTJiQkEBUVxZqICNZFRXHi+PEK27Vp04YhQ4YwZMgQrr/+emyd5PTTdZGRfPP1V/x94G8O/n2ArKxz4UgvLy9SUlLKfjTjx4/HxcWFLl260LVrV4I7dLQ6k7A+JSrUxD4rnxvS93okM1EZs+Q5WSsIK3lO1vZoAjiTp25rred0UlB+SMhWQ4q+TrIHYa3nZC+oQdigXrizC9XfZ3uf1uKxq+M59WkSpIxJwrqSp1ueoqIiPl3yPgvmvEBGejoODg5MfPxJpkz7b9nvyBr1kNpQXKnJsF59NE4jMRmU4NJQnqZpqUCEruujhO29Sj0qTdMWlw/bmY1TNKbQ3nnDg+WpXOckrfvECj+QEG9VxkS6CID1xsmSiy9xMcapPLquc+TIESIjI4mIiCAqKqpsLQpMyRV9r72WAYMGM3jIEDp26iTepem6bqrhOnSQAwcOkJeXx4wZMwAoLCzE1dW1QuKGpmkEBQcT0q0b48ZP4Pobb6zSvOsb1q4TSueGteuWVWkCKEkQSeevJF9kib0pquSPr5P6/r3Jag1RimDYJGVvqfYJoFi48BeWqLVTUgNCKXyYV6Sui0m1VKZxtRDeTjCCUpv2pi6qYZPqnCzdkJaeG4mJiYR07EBWVhaDBg/m1TfepE05VRu4dL+Ty33NSV2phRRMBkahnGEah8njKk80JqMWV/q6pmneFsKDZWQVFbDl9LkflbR43NCxJEzatm1b2rZty4QJEziZmcvu6J1ErfmddWvXmP4fGUlUZCQzp08jIDCQobfcwi233Erffv3KioE1TaNly5a0DWjN4MGDleOsXLmSv/76q+xx8OBBYo8cIfbIEYYNH1623Tdff8Xnn3xKSLdudA/tQWhoGF07dqig4FGVv6/0b7wQ+9NkTbfOXobavMGl4UxSEo1btsTOzg5/f38Wvf46vn5+3HzLreIN4sUKD9cn6qPnNA5YjJWeU7n3pWIKBVpKnAjFZKyU8GC5444DaNKiediK6K1VnruUeSPdLYFs8Ky9u7aEnCShYu2Fu/LifPLZs+zYGMWa335j7e+/c+bMuXbZ7h4e3DhoMIOG3kz/wTfh5e1ttTBpQUEBBw8eZPfu3QwYMIBmzZoBMGnSJN57770K27q5udGjRw+uu+465syZU+2/UaK6xsmSeGvlz0PaztL3bY2QJ1gWDa2MpPAgCbJKHgDIbcj/SVPDj7e27q6M/Xp8rzJ2JldNSsix8FnkFqqhsPwitc+Sl7OalCO9t6mr6rWVWLgu9mnaXhmTsg+lkKIU/gvxUQVmy4dSiwoL+eHjz/nytbeY9eLLPDxhorK9tRGTujBOl7vnVBpPK+8plWbciZTLykspNxaEyRj1L127EvZbhtlgLQHo0D2kVi32Rws9+WSRakj+M7OYqbPqbwaNr58fo++6m9F33U1xcTHbt23jl59+YvWPqzn899+sWr6MVcuXYWdnx7XX38g9o0cxbNiwC7Z1dnBwKFNqL8/s2bMZOnQou3btKssWPHHiBJs2baqwXVFREbfccgvdu3enV69e9O7dG9+m54/bGxjUd3Zv+YP/zXqBY4dNNw27Y2pGUq2hUO88JwBN02KB6bquLzcnOaRi9qQ0TVsL+Oi6HlZu+2mYEiO0cmNemIxTmK7raZJHZokO3UP0j9b8VOV5V9VzumeoKbng619Md33V9ZwkJG/K0p2VNYvplmpujsbFsuaXn/n955/4c/MmiotN+7KxsaHfddcz/I4R3Hb7cJo2bWqVAgLId3qnT58mOjoaW1tbBg0aBMCePXvo3r3iHbp/s2b07NWL8J69uOe++2jevLnFv7Hynaclz0mqM5HmaMlzqvzZSXOx9vu2tDZleE7naKie08H4Iyx5cR4bfjQ1N20W0IqJL8zm0VEPiHOqTHW641aXyzohAsq8nsXAWkzp34t1XV9ufm0Z4KXr+sBy24/DFK4Lq7SfkUBPTN5SECYDdsGsvU7du+lfRv5e9lzKWJKKCz0c1MK9PAvtnp1s7Xl6pCl8tWh5gsW5SC2t+wk/EEtIxsnankEXe5KfPXuW5d9/z/crVhAVGUlRkWlhWtM0ru13Hffdew8jR44sk+ivbhgiMzOT9evXs23bNrZt28aOHTtITz93sfvrr7/o0qULSbmF/P7TjxQUFtDrqj408Td5V1VJJLFmjlJChLWJDtZmbFoqxLY2C09KktiVfEwZc7C1JDaqhmylczUuQ028sNQCvTJSS3QAL0d17olZZ5QxW8FA+LuqoVlHW3U7KWkD5PqnJkKShJStJxl0gHuCupX9f/fu3fTp25fc7GycnJ159KknefCxSTg6OYk3R5ZuKC9VqO9yD+th9mxKjc+CSq8p607lQ3KVxpcDyyuPG9Qufn5+PPjwWB58eCypqan88tOP/LByJWvXrGHjhvVs3LCeyZMnM3ToUO69914G3DS0WgrJ7u7u3HrrrWV9tUp7Z23fvp2YmBg6depUtu1bixYQvX0bAK0CAul51VUMuuF6rrvuOtq1a3fZ1IgYNEy6du1KQHAQLQICmDrnRZq1anmpp3TJqJfG6UqhuAiOH7EnO8MGV4/aWWuqSmfV6mDpzszb25t77x/DvfePISMjg9U/fM+3X3/NuqgoVq1axapVq3B3d2fY8OHce9/99Lv+equy8c6HjY0NHTp0oEOHDowZM6bCa4NvvgU3d3eit2/j36Px/Hs0nhXffgPA/z3+BAtefRUwrWPZ2tpe0FhJXpKBgbWcOZnAHTNfYdacl2nWwlS79ulPq3F1l5cDrKW+qz9YQ70M611qgkM66wtWf1f2XAptFBSr7rS0viStQwFkFuYxY0gnTsU58+jCePoMSxHrRJoLYQQpzCjVqDR3sT712dosMYmL+SEkJiayYtkyvv36a6J37igbDwwM5KGHHuKBBx6gVSu1bqw6lJ9ncXEx+/76i61btrB500Y2b9zI/Fdf5a677wFgxbff8NRTT9GvXz8GDBjAwIEDCQqqWERZV4bJ2po4sFwjY80+Fx9UM1TDG8nfgaS55yi1QM9Uw22nctT3JmadUsZcHOQLtFQIe1J4f6HQn6qlh1q8LPWCyrXwe2jhpib3SJJIXo7nD+MW5Ofz8wef8/P7H5Obm8uoe+/j7Q8+BuBsvrqGBfKaZ3WbSxphvSuA3Gwb4o/bkXTSjqQTtiT+a0fvG/Pw7y4bJ4D0M6a48KYVvvQZplbI1wcqe14nc9RkgU5e6oLyhfD39+exKVN4bMoUjvzzD9989RVffP4Z8fHxPPvsszz33HMMGjSIhx9+mGHDhuHoaN1F11psbW3p1r073bp3Z+Lkyei6XpbEAfDn9h2cPn2a5cuXs3y5KTLcMiCAa264gX79+zP4tmE1Oh+DK4dd6zbyxYsLSfrXpMZy+6g7mfm85bKIKxXDcxLo3KO7/t26yLLnB9PUu7J9ezW+fbkFZ086kpFsR0GuLfaOJdjZl1BcpFGQZwOCVEpFdEBDs9HRS0zb2tmX8O3hv8u2SBE6akrqxtKdbGuh8ybINVbSornkeUnGSVpch6plCoLJm1kfFcWnn3zM6h9+oKDAdOfr4+PDgw8+yKRJkwgODrb4/poir7jEpJbxzz+sXxdFVGQk66LWkZ5m+oy7h4ezImodAIFurvzxxx/06tXrvNqB1i5IS9ttSopXxiQ1EpC/HwlHIaFBktLZeUZVeABZfcFDEDY9LiQqnMpRb8QcbdT5JGWr2X8AzvbqeWUjhF/dhO0kVXLJ8/GoglqGh4PqJXXybqaMJR0/yQfPvcT2CNO507JtMFNfmUto3z4VtruQfFF5rO2OW1cYnlM9wNW9mHY9s/DwLeLMcUdSTtmTmWqHrttg51CCnYNOUYFGq44VjUtJMeRm2ZKZaktBrunEsnMooUWHLG4dk0lYf8ue1uWOra0t/QcOpP/AgaSkpLDi22/46KOP2LNnD6+99hqvv/46Q4YMYfLkydx0003VXps6H+VFcx8dP4HjmZns372bLevX0ajpuZYG+/fv55prrsHLy4vBgwf02LJTAAAgAElEQVRz8803M2TIkAvWdhlceWRnZLAzagPObq7c/eRj3PLgvTR2UzP9DEwYxuki8WtRwPApFe/sCopLyEyxIyXBgZRER1p3yaZpC/UOEyBiuRtfz2qHXgI2NjrXjD5Fv+Hytg0VKRnD2ni4j48Pj06azKOTJrNzxw4Wv/cuy5YuLVNQDwoKYuLEidzzwIP4+NS+vJStrS0hYWGEhFWoVmBX/FEC27Qh/sgRli5dytKlS9E0jbDwngy56Sb+74kn8PCwrI9Y+TOqib47BvUDXdc5GL2bjuE9AAjq3JHHX32Zbn2vxqdJ1UPhVaGyB25tynl9wgjrCVQuwpVCa5Jgo9RsbVPiIfEYn43vxb/RvqCBpkGr0GQmfqQWJ/ZtqjZcW59wUBkL9FBDfWnCvAFc7NR6i7ae1t3pS59FZy91kdlSHY6EtQKoZ8+e5evPPuW9997j6NGjADg5OTHmwQeZ8sSTBLeRm9PVFOdrBHk0Npb1a9awfs0atm/eRH5+Pp6envybeAoHBwcOpJ3myN8HCWjbpiz8J4VNrS3ClRoDAuQUWZedKamKu9ur31lmoTyfgmL1Rio5T/X6i3Q1THkwRQ1TSmHCEiEEB4gZlK091ZRrqZ7K2uSHvCI1mQLkcJ/UWLAkKZkPnn+Z6HWbmP3xu/QccINYGxYsvLeqTUutCQ3XlXGqybBew1ICvIywsy/BzS+fpu3T6THiGLZ2DT/1s7bx8/Nj2rRpHDlyhNWrVzN48GDy8vJY8v77dO3YgbvvHMX2bdsuydwCgoN5cOJEPv3+e06ePsOKH1bxysKFODiYbgRys3MYM/AmBnfuxgtTnmTjb2vIzZWLTA0aLvk5uXz/+rs8NvA2otdtwtXDnWyj3OCiMMJ6l4i73t7Ol+OvBmDI9H3m0Ybd8rwuKA2D9RowhF4DhpBw5BBvvPYq33z1FT+sXMkPK1fS99p+PPmf/zBk6NAaXZeyNmXe1dWVobfcUmEs4fhxmjRrxr9xcaz++ltWf/0tz7i6MvjmW7h95J3cMGhwmSEzaHjouk7M71F8N/8NUhNNqhj9Rw1nzH+fwrtR7XaFrumaJmuFi2sbI6wnUDlbT8piklpaSz1upFAHQIB7I569KwCAF789Csghs6NC351kQcvL1V6VTpKyiADchG3zhJoQN3v1/VLdi/RZWMrgyy1WQyhS/YaEFJoozU47k3iKbz74iOWffEZ2pukz79y5M7Nnz2bUqFHY2NhUKdxRmequBSXk5KDrOv8cPMjan35izU8/sm/XrrLXf9i+lZZBgWJavtSmXfrMAU4KoWWpJk+S2jqaWb1yhgShiWCG0GpdOtdyBM07S/p2DkItV5HQz8nFXg3BSb2gfJ3VNcHGznKb9kThb+zZuA1rv17G4mdeACCoSyemvPQ8ncIrNuiWpMyk5QGQFfCrI6tVFfmi6hgnI6xnYFCJRv5NmfLsM/yyN5onXniOxv7+7N+/n7vuuouQkBCWLVtGiXBhqks0TaNdx45MnjqVVRs2smrnnzw2eyZDR91By6DAsu1uGjiQJ/7vMbZu2YJx81h/Kf/d9L1tKK3at+XRubOZ98M3imEyqDqGcTK4rHBzd+f+yRNYHf0nC976H81btGT//v3ceeed9A4L5fuVKy65kSqlRUBrHnr8/5jz3jtlY4cOHmT9uigWv/ce/a/rR9eOHfjs9bdJOmlZHNigbtF1nQO/b+SLsdMoyDGtGzq7ubLolxUMvnc0thbEcqtCXGaW8qgKecUlFR7WblefZI+MsJ5A19BQfdWGjWXPrS1Q3ZuqFixK6uVgki965b52APz3y8MAnBRCBgnZaqglNfesMmZvq4ZppPbRAD5Oam2Fl5CF1NhCq+rKBLhbn8otfR6S7JO1zRi3n63c/NhELz9TsW5+fj7ffv4Zby54hYSTpvBY564hTJ31LINvuZUEIetN+m4lSRlrpYIszV3iRPZZDv21jzXfr+KXZSs4c8pUAK5pGtdcfwPz3nmHZi1biuckwMF0NQzczUfNptyapHaNkVSzpQw+gONC0XdqvhrCPpZ5WhkrFEK7BULGnCVdw8ISNezkaq+eQ8W6Gs70Fs59V3tVdDgtX/58O+a6sHj2XPb9aZLceuS5Gdw2doyynY8gXyRJmXXwaqqMWTqvLJ1DF6tAXlVDZE1h7yUL62ma5qFpWoCmad01TQuoiQlciSx9oxEPtQvj0HZ3Dm1356F2YTzULozI92tf/eBKw9HRkQceHccf+/5m3utv4d+sOfv/2suDo0cyfPAA9sfsvtRTrICmaXQI6cqU52bx856dvL30K4aOGIG9vT17YqLx8Tu3uH4mUVUuMagd8rNy2PzW5zw+ZAT7/tyBu7cXj81/kVseuu9ST61aHlZ9xirPSdO0qcBooHIgVcfUkmKeruv161deDcLCw/Ut27aXPU/IURd196epi9TSwrMlpAZlUv+a08ICd2ahOp9s4c6+kau82Jon1MJId5lS7xtJeqZP047KmKVEkCEtuypjUn3YtU0ClTFJ7PR8yRTSnV5eXh5Llixhzpw5nD1r8kAHjhjG+JnTaNrS5GFYko+xtimhhNTcT0JKJNmfdoLMtDSO/n2Yrlf3AsCpSGd4t960ahPMiIfHcONtN+Po5CQmSkhJEhJSTZNUzwSQI9QBxaarckMpeYKHJXj+tpoaCrO34EFIEQFJ0qhYqJ1yFrwkG0FmrHw90+ENf/Lry/8jOyUNzcaGa+4cxk3/9wiunqZECk8HdZ9SzzUpGcgSUkKEtYbHUp1UQ2vTft7ZaprWQ9O0nYAPMB3w1nXdpvQBtAG+AxZomvZeTUyo3LGnmR/zzc0HLW03QNO0kZqmhZr/XXwx+zG4MnBycmLKlCkcOXKE6dOn4+DoyNqVq7jnmht5d848sjJkRehLjbuXV5lhAoj7+xCajcbfu3bz0v89xYgeV/Huiy9z4qjaMNCgemg2NmSnpNEipCP/WfoBI2c9VWaYDGoPi56Tpmk9gDt1XZ9h1Y6quP0F9rUM2KHr+gJN00KBZZjbrQvbLgbGmZ/GAQNL27BXZT/lMTwnEw3dc6qcJi6JosYfjWPxywtYu3IVAF6+Pvx39gvcP/YRZWG78vsl8VRLVNdzqoyPowt5OblE/LCalZ98zuG9plo5TdPo0/8G5n/0Ac6uLuZ5G57Tue0u7DnlZWSRvPcIHftfUzYWv20XAb2608RFPd9qw3OSylekdVgJS55T5d/D+cojLtbLuqzbtJu9m1hMRiTGPKZjasOudLs1G6dlAOVbsFd1P+UJDw/Xd+7cWfbcWndauohIkiUAB1LVH7J0kh9MVfcpKSsfz1CTMTRNPsEKi9SkhKwC1bj5ewQoY7mF6mfRxFUNg/kJrasBnATppDaC9NIRob33wOadlDFLWKuoXmpg/oqJ4dXZz7Fz6x8AdA0L5dnXFtExJASQjUtVjJN0sZHCh5Z6+VSmvEHXdZ1Du/fy42dfsW7VT7Tq0JbZyz8re72PX7CimL7xlCqrJRkcS0jn4P6Uo8qYjRCcKRAu0sk56vpZXpEsv+XmoJ5bnk7q9y0lP2QXqud+aZ2TXlLC3p8iWffOZ+SmZzLp63fwb19xHViSCZP6WOULhjG7UP18w/xU2aVcoQ4MIMxXTWyxtp9TVfs+1QfjdMEZmJMgRpQmQJifd6+Jg1ugdF2r/O1eGufatksEAaGVQncXsx+DK5SuoaF88tNqXv/sE5o08+ev6BhG3zCAV2Y8Q1ZG/VaK1zSNDj26MfWNBby+6Rceenl22Wsnj8RxbaeOvP/aq2SkWedBXYkkHviHz8ZO4+c5b5GTmk7r7p2xc6i/oqhXAtaYxw8xJT3Eapq2FEgFojVNK9Y0bWwtzEnyXVMAuWQbooEIXdcXYPKUYjVN87qI/ZRRWKKTlFtY9jC4MtA0jYG33crqP7cyZtIEAL58fzG3XXU1Eat/ahAFsW7eXrRod04Ad/vPazh96hQLn3+evp068vLMGSScUL3xK5W89Ex+nfc/PnnwPyTsO4Sbnw/D5vyHsR8upFFgzXZiNqgaFwzraZo2Vdf1hZqmDQDWYAqhLQEGAY8Cd+i6vq7GJqRp44DFQHC5taNUTAZo1AXeG4rJWI03D1m9H/NxxwG0aNkqbOehI2WvWStdI61NWapHkdYWIhP+VsZyhPqPw0L4sFAKI1gIEZ3JVgs6C4T1LkdB/kgKn0hhGjcHecHY00mN2fs6qdsObtlFGfsnXW1cZ0lN3Vp1bmltq/R73L9nD7OfeII90aYQ71X9r+c/r8zFv5UpFOMlNNcD8HNU/x4pXCdtdyRTDfceSFVDnFJNEqhrRLquk7P3CJ+//S7bN24CwNbOjmuH3cwdj43HP+DcBdhBKB49LDTaBMgSwmMHkg8rY/5uaujyaJpaY+Vop4a0LVEs1Dl5O6uyT1Lzw4xK4dWNCz7i8M8bsLG1pefdt9H3kbtwdHXBx1GW35JUza1V+bc2k7K0Rq8y0jlkac21OvJF1aGu65x0KFvPWQDE6boeqev6dEzhtAk1MZFylC72lPdwvDAlO1RA07QgTdNSzUaJSttbvR8AXdeX6Loerut6ePlaEoMrl87durEsIoI5r7+Bm4cHf0auZ8z1g/np66UNwosCkzd49Q3X897K7/gy8ncGjxgOus76FatY9laNJtg2GIryz63phD04nLbX9mLs12/R//GHcXS9PMSX96clV3g0RKzxnB4F1uq6flTTtPeBI7quLyr3+lRd1xfW6KQ0LRaYruv6cnOILhWzB6Rp2lrAR9f1MPNr0Zgz8Cp7Xefbz/mOXzlbDy6+Z4qlBW5pgVy6E99x5qhwHNXLkcQ0955W+z4B6Khzz8xPV8ayC9S1loJ8dd52wp2jl6vcTK2lkGQhJUlIop+t3NV9SkkkIH9GdwX1VsasbTu/79hBXp/xLOt/+hWAawYN4LV3F+PXWJ1TrCDW28xFjSZbKygcffa4MiZ5ygDdfJsrY8cqqTmcPn6Sb958hxvH3otfK9P2CYdj0V0c8GxS8Y7fzoKqe6bw+doK7c4PnlXPwRwhqcZOaNPuasH7zilUz0vJc6qcAZiXlsHOD1aQGnucW96djY35N93JJ0B575lc9fcAcgari+BNSaopUu+mXclq6n/fJu3EY1vq9RXkXvF8tWSMpNqpmqZO27Truv6BpmmvaJr2vq7rkpdUG7eQA4HF5uSGgcCocgalzA82G6TpwAyz8QmiXCr5BfZjYGA1vo0bM+fD91i74gdem/EsW9ZEcFPvXsx9800G3zbsUk+vSjRu2Zw7X5hW9lzXdb57biGJ/8QRPmIofR+8E/dGtd9duK4oKS7m0Or1xHz8PQVZOdjY2XL2UDyNOxmKLPUZq/o56br+X03T7tA0bTyQjGndZremaTdSMRuuRjAbkNKsugWVXhtV6flyTAkbVdpPVTHaaRtomsagkcPpdnVv5j0xlZ0bNzPpvvsYfvfdPLdgIe6ecvp8fSc/JxffFv6c2H+Ibd+uIvr737jq7mH0fehO3DxUzbqGRNJf//Dnm1+SEmvyPpv37MJVU+7Fs6WqaddQsVYjT9pOVFGpo/WpC3FRdU6apvXHdNEPxZQkEQPs1HW9fpbXV5HKYT1rWxxLX6pUOGoJqZYmWQijWdt3R0qcAIgXFqTThMLIIqHuJUs4tourelG21GLbVQhvSXUrzkIvHmm7q4RiR4DdZ9W/sZ3QTr6J0MtH6nXkW0kYt6SkhDfefoNlC9+iIC8fH/8mjH/1JdqFd8fXSZ27VKAtJSBIdXFSS3VLNHJSQ5LWtmSP3LaJte9+xoF1WwBw8/Vm2BMTuOr2odhUmqt0bqULIezMfPXeVROWuqUkB0ngFWRBWD8XNfFi29tfc2ClqfTRrYkvvR+7hxbXhCjv9xOKWy2FTVu6qYkOAUJPpj+T1OSQfs3UYnVJIFbq6wbQXPjtSP2/oHoJEdUxTpe8n5M5IeK/uq4PMq8/pQLjNU2bVxOTMjCo79jY2DDg/tE8/8NXBIV0JiUxifn3j+f3T75qMMkSlfFvF8yYN15k0hfv0CqkI1nJqaxc+A45DVRM1KNFE2zt7eg+5jZGfPYSra8Ntah0blD/qJE27bqu7wJ2XXBDA4PLDP+gAGZ++xErXn+XXz/4nG/nvc6/ew4wZeFcXNzldOT6TquQjkz8/G32/LYO+xINNy+Tx1pYUED66bP4tWh2iWcoc2r3IbLPpBA88GoAOtx2Ay2v7oa7v1xucDlzOSxD1IhxutzQqOjCOjlb52BK4T9LvVkknS0pS0yS4bE2zNPZRy4iTMlTM5HyBUmjPIRsMqH3UrEQjszLlecohfty7YTsKzc1s0mSY9qfoso2AdgLkjJSvyFJhsclX/3OpBbbzV3PhVmefP5Zeva+ikVPTmPrL79z4vAR5n70PkEd5MwrkOuX+jRRtYn3JqvZelIND4C7vTrPxGw1tFzgpH6PPo4Vx268fRhHM5PK+oz9+cVKNrz/Jb3vuZ3wB4bj4Fwx/Clp5kl9lhIz1e/M0U7qRyYrNFRu056bnE7Uov9xbF00ds6OeHdtjYufJ0UlReBjXyG06O6ohsaaCnp5UvYryCG8E8Lne5WQcSeFdiW9PKnvE8iyRtKygVQ/VxXqem3JEvVjFgYGlwF9bxrE/375geCOHfj3SCzjhtxWJih7OZCeeJrigkK2frqMT+95gqPbLm2XnJLCIg4tW8eaRxZwbF00tg72dBzVH0ePy6NW6UrHME4COnL74vraztig/tA8KIDFv/zA4FEjyMvN5YWJU3h9xrMUFTZ8GazB0ybwwCeLaNI+iIzE0yx//EV+ffFtctPrXnswKeYwEZNeY99HP1OUm0+La0IY+tEzdLn/JmwNTTyrqc/XNmuKcOedrw2GpmlPly/KvRyQinAlrHF/z/dFV36/pH4uhf+krD5JBsWS9MxRQfE7X8iMSs1R5YLOZKpZWlIIr6BAzjgqKRLaGAjZfo5CxpskpyQVX4LcgsFLCKE0dlbDPK2F0I3UAkRq3VCKruts/W4VK195i+LCQkL6Xs3T775eYR1Kygo8mW1dZYZUZAzQwlUNUUlhJ4kiIUMtXfgei4uK+HHJB+z/8ndKCgpx9HLjxtem4OyvHlvX1fM/WyiitbdRi48rh+9KsbN1JOrJN0g+cBS35o3oMekOWl+lalHnCEXkUhsOXxf1++7s01o8ttQWxEfIkJTUy6UMSSnUJ7VuB3mJwFLrdglr27lD/VAlt2bNaeAFMlwGAJeVcaor6ssdikHNo2ka14y+neYd2/LhYzPYu/kPZt85hpkfv4uvf8OusbG1s6PD6P407xtC9BtL0YtLcPX3pURQHqkpiguLKMrJx9HTFU3TCJ08klM7D9LujhuwdTCWzq2hoV1vrPGcKv9FOlTozqXrut7wUkHOQ+V+TtXBkqq5tT1XrO3vIwlAfhsnJ1Aey1Q9on8zVS/rdNZJZSwzV61zKpDklHLlUE9OluoZOAl3nlKNlZuHqnno4iYLXzZyUzPK7IUFdn831VBI0kl9hHoqSx5JZe8l6fgJXnhgHKfj/8WzSSPGv7uAZu3biLI3nbzVO+49ycL3IAj1gtyvqIO3Kml0PEuVuMkTPvMTWeq5ApCRb/rb9ZISCrJycfRwRUMjOymFUzv/JmhoHzRNI1voEyaRV6gm39iav68zMUc4+MFvuLVsRI+Zo3F1UJMsbAUvVhIpljxqJzv1vEgVkoYA2nmrSUbHMk8rY1IDzsIS1TjYC/JQ5RNtyuMizFPqCVYTmXn1wXOyZgbLgWDzow2wQnhuYGBggSYtW/D4l+8RFNaN9KQzvDlmMoe27rjU06oRNBsbHD1MIVhd14l+6zt2vrmULc9/SH6GanCqQm5SGrteXkrMC1+Tk5BC9slkCrNU42tweWKNcVqq63q8+REHxFZ6vriW51jnSAkR1lBfFxYNLj2unh5MXPIqPYbcSH52DosnTWXLih8v9bRqnICBvbB3debkH3/x+4T5JO+Lr/I+iguKiFu6mc2PvcvpbYewdXKg/UMD6fPmeOzd1HU6g9rnUiROVFm+SNO0V3Rd/28tzadeYI0quURVvixr2yZLdQzSwqikhF1ZcqeUTaeOKGOSHE2OEGpJzlGPIy08SzJHAGkpai+p3FxB6VyQ9nEXwno2dvJ6Q+NGar2QWOMihP9KBC1je0Fxu5GFVvTejmrYqVTluqSkhMh3PmHLZyY5yKGTHmbo5LFlygVSuK6JcBwpNGtpTpZCgJWREiKOZ6q1SwBpeWpYMMtcT5STlMquRctJO3gcbDTa3XUDbUdfj2b+DUmh4VJl+5LCIrY9+TE5J03bNLsuhE4PD8HJ91ztjhSedRD6QdkIa+VSPV9Td1XWKk/YDmQF81M56m/US/jtdfBSw6sSUot3gNZCCFvqZCBdH5q5yOn11obvrJU0qus27ZUlifQLvG5gYGABGxsbBk4Zy83/nYxmY8Mv737M94v+12AljyRcmnhz9byHCR7VD3Q4/HUUf87+BN2Kmzcbezv8wtvg2qoRV88bS+jUOysYJoMrB2vSXEaZ21GUMqDS83DAYqq5gYGBSs9Rt9CsWQs+emoWkZ98DcDwpydf4lnVHDZ2tnQYM4BG3YLZ9eoyfDoHlHlO5SnOL+Tf77fj2aYZja8yJZ0E3X0twfddh6sFz9TgyuBisvUqY2TrmaluDNbaUJ/UDl5CCvWBLMUTl6GGb6RQnxTeik9Vw4SnU9QmagCFhWrd1ulTR5Ux6bSUQn12FsJ67l5q7Yp/k7bKmJ+rGtYrEmRinOzVsIi7BQkhKbTW2FkNyZzOTeXvdVv5ZtpcSoqKueb+Oxjy5KOKOKkUDjoi1KqBKkEEcFQ4D5oLTfOsVRoHOJutZncWCp9biV5MQUYOdq5OZc398pIycPTz4OyOwxz8aA15Z9JxauTB1f8bj439ue/Yw1HOxJRkrGyELDypTiolV82sk7L/Bgf0E4+9PUltnthYkD+SyBbCq6OC1QaYOUXWF2xLDQxBbUBoKWu4cu1TdanrOqclwHxLcwGmWXitWmiaVrpfX2CxpSaB5kaC4znXjn1+6baapg3gXGv20kaE42tjvgYGF0PHG/pw94JZfDvtJbZ8YUp8lQxUQ8ahnJxQ3pkM/nz6Q9CgMMN0sXYPbEq7RwdUMEwG1cOSMWpIWGOclum6bjHlRtO0ZTU4n/L73KHr+gJN00KBtZqmhem6nlZpOy9gLefatC8GYjVNK23FPgoYZ968fOPBWqG6gomSwKykGmFtG3BpDOT24McFj8jLUa0/OpWtelhS7Yibm9xJ9YzQdt7dXZ1nVpbQNj5XXaR2cpTv/HRBVFVSp8j2U5M5HIT6o9beap2TpVoYJ6HV+vnamre+Npzhr0xn5X/ns+WLFdhqNtz6n4nlkiTUvzvDggKHVKsksftsrDImJbZISRIABcXqnPKFeRaU60dWnF9I3GcbKcw0fxaaRvPbQ2k+rAc+Pqp3mJYnJ9V4OannlrSti+AReQjvtdPUy+DqI2vEY/u5qnVx0mfuZKeeA5JH/U+6mtgi1UMB3NZKVcG4nLF4NdU0rYemaSN0XY883w4u9HpVMXtCI4EI8/5jMHk9dwqb+5hfG2B+XprWPrLcNgMxeUzBlrwvA4NLTbvrrmLEK//F1s6OjZ8v48dX37uskiRKyTxokv+xdXEAXSdp7T4y/5FDlAZXNue71Y8DgjVN26lp2nuaptWV2Q41/1veS0pD8HrMxibY3KodTIYKTHOn3FiopmnzzYbPwKBe0u663ox59fkyA/XTq+83eAOVcyKFomzTOqOtoz3B426g83O30/31e/AMaUlRVj4HX/mZE5GXVuHcoP5hVZ2TuS37eCAQ0/rPh7U2IU0bh8kDCi63dhQLxOm6ft6wnKZpawFKtzPvK0LX9bhy+/WuHB4st+04gFatWoUdOyYv6Nc11VnIlEKCIItFrv5XvThIraqlcJBUO3I6S24Rnyv0VDpzSnVoCwvUfWYJiSDFFpJQXJ3VYk1pGcfLV02IcBXqSTxd1QSLRkIyBYCHEA7NExa5JS06TwdXjmzczuqZiygpKuK6/3uAmx4ZI+xPDt/lFqkJJ8l5alKDtIh/QpCwyi6QQ5dS+/Xy15KinHxiv93E8Z934D+oK0EPnEswKC42nVd6cQnHvv6DxN/2gqbR5aURODc7F+K1JE3lLCSiSOdgsfBZ+Lmr4UOpl5S0PwBne/XY0jVUSqCRaqSchd+i1GMM4K4gNXlCwpJ8UV30aarzNu3mtux3YgqfeZu9qaV16E35UNGTUjAnUFQwYLquLykXyitNv5PCg6Xbhuu6Ht6o0ZXXOdOg/tCmXy+GPjcFgA1vf8Zfazdc4hlZj67rJG7Yx5bJ7/Pv6m3oJSXoJbp4AddsbQi4/xqCxl5Hy7t6VTBMBgZVkvPVdT0dWAgs1DStBzBB07QwYCmwRNd161Qez0+pESl/ppZm3ImYvR50XR9vTpK4E9OaVTTQ37xuVX5f56VUvqg8F3vXURuy9FU9jkHDo8PAvqQnnmbTu1+ydOY8PBr50bp750s9rfOSeTSJg0t+J+2AqXOvZ/vmBD7YF7dAua1JKU1u7ERR4TlPMPdkKvbertAwu9w3eKxVg6htLlprXtf1XcAEAE3THgWiNE2L1XV9dHUmpOt6jKZppanfMeUKfhebj7UW8NF1Pcz8fCQwHVhuztYLMm+bYn6UGrVSV7N0fapBUNN1CJYIcFezmKR6qH8z1QyoJKHnlJQVBXIIxNtPlY9JT1H75uQXqMfJzpHDL4WFakjSQWhCpwnHkepoJCQZHYDETDUk3MIzWBlLFySAyreX73L3UJJPJnJgVSSfPj6LBz5eiE9LUyix2ELoRwrhlejqtmdy1UBEsdDTy1LYv3JdUXZCMn8+9RGU6Nh7OBN037U0ua4z+fnZFFb63myF2rELIaUAACAASURBVDQHR5P8UM7xZA7O+wWnxh6EzB6FvbsqS2Qp5FaZRh7qeSXVYmVkqZl+jd3U94J8bhSVqPv0ElqlSzJHnX1UlXNLvbqkDgVSS/b0guI6u27UJjXSCEXX9Q+ADzRNq6mS7oHAYnMCw0BgVLnwXNmvyvx6aSp7+Xqr6ebU8unADLOBK61zavAZe9I6VE3I5BvULzRNo9+TD5F/Jo3YrdEsffx5Hvh4IS5e9UM5Qdf1snR312a+NLqqHQ6ezgSM7oOd68UJtNo42WPn4kBW3Gn2vPAdIbNH4eBptF2vKvvTKt74SC11oO69oapQZeHXK4Ga7OdUG1hrnCTFCZDvwKTaJ6lSXaqd+vrIH8qYdGcOkC7Uo6TlqrUeSUlq4oVUp5SQKCdeFBSqf7vkbXi4qRc+D3fVO5R6STm7yJpvzk7q+z2dVUUGPxe1F4+kYNDEthHfTZrN6cPxNOvanjveeg4bR/m+sliokbEVegadzlbTtwsEDzjLgkLE6b//IfaT9QSN6Yd7G1PtT3FREZpNxawTqUuyo5P6mduVqwvKT8li7wsryE1Mxbm5D12eGYaD97lEhBLhe3QVzktnBzUuWCwk+eQXqZ6KVCMFcsdeKaEi0CtAGbu+mdrjSUKKWFgiSOjaLFFXxqlOEiI0TRtxMY+amJSBgcE5HFyduX3RTNyb+JHw1yF+n/M2uoVCzdqmIDOXA+//wq4Z35BxKJF/V2wre62yYbpYHH3c6PbCSFxa+JB7MoW/XlxJfrKceWpw+XI+sznT/K9WhYchAGtgUAu4NfJh+KvP4ODqwuGoP9jy/jd1eny9ROf4mhg2T3yH47/uNKk73NyD9v83pFaO5+DlSpfZw3Ft7UfeqXT2zf2ekgJZrcKgZrkUvZskzrfmtFTX9ZVV2ZmmaT2rOR8DK7B2fcnTwdaC266Go6SF1SOZarJAQo4arguwID4pIbUml1p0e3iqGV4ZgiSRu6u8HnE6RVjwF35gWdnq4roU6XZ2Vj+fYgsCnYVCWCYtV5B9EhIqztfW3C+4FbfNm8rKJ+cS/eUqvDq0otU1PSrtU/1Jp2Wpx5bCVlnCsdPST5GbmEbs4nVkx5nCr+4d/Gkz9gZcW5pClbpu+lyl2rQiYUzC1lX9LBy93Oj67B3sf2UVTft3wc7JdO7YO6hJErl5av2cLvTlchN6ehUJiSBS4gTIodiMfDVUfVpIflhzfK+6P0HSqI2H/HvycFDDh9LvNluo70rIyVHEYOs7Fj0nXdcXln+uaVqAtF358cu9CaGBwaWmVc8Q+k68F4BN8z8m65TcDLAmsXNxIC8xDXtvF9pMupGOM24pM0y1jb2bE91eGEXTG+p3Gr1BzVOVbL35pQoMlRgIVCt93KD2uBzUiQ0qEnb3rcTt3M2JP/eyfs5ihr453WJH4ItBLy7hxIY9NO8XAoC9pwvtn7oJl9a+2DrVfYpy+T5QWfGniftiM52fvq2C2rnB5UdVzuhgQFInVws4DGoVKVQnxYQtZeuBWj8Vk6xK17RxV0MY2wX5Ih9H9SKRUSCHEKQ+QlLmWL6TEA4SEo5ysuWsQCkLLy1DDR9KSudSVp+mnVTGfH3k0E+pPE+F+XiqWVXpuWqdk5ezmhV4NE2tfuj+1B0kTzrGmQOxbH3/K0IevRWQexjZ26oGJSVHytbLI+3gCf5e/BuZcafITU2n2S0mqUuXsIoffkaa+v7CfFVeysFJlfspyFO/hywhi87NveK5ous6sZ9uIONgAvvmraTrs3dg62C6hLkI4bHScGN5svNVOSYbQZHfxV4+f6Wwqb9QE9XU1boeT1L/rZtbyll9Uh83KYRnqSV7Q6MqxmmU1DpD07TAGpyPgYGBFTh6uNJrxn1snPoe/6zYQKOQYPx7d7ro/eWnZbH/419IiDKtizj5eeDctH7JCWmaRofHb2LPrO/IOJzIwbd+pdNTN6MJqfIGDZ+qfKuWCqKMQikz9SXLxRqScgsrPAwaHn6dA+n8oClbbueib8k5c175SZGS4mLiV//BuvFvkBC1F83OlsCR19DnfxNo3FvtYXWpcfRxo8vM27F1cSB5eyyxn25o8Mrtl4r6fr0y1pwuE8SsPLVeEJDDfV5CwaKUFdjZSw1h7BfaewdYKA6UGuc52amhHzdHNVwhFTtmuMq9gAoLVYNrY6OGRaQLW4EgfZSXp4bwcnPkzDoHocg0LVUNm/r6qp9llqD27SyEmEpDdV1GDyb5r6Mk7jjAjnlfcd3CydjYVfzeznfxTty8n/1LfgbAq1srAsf0xdnfi7ziLMiGgnxZSkcK4UnhzGIhc1Gaj1RYW2SpcaK3LcGP3cA/r60l4bc9aB72BN1xjVXHlkJ4Hq5qKFVq+w5yQ0YnocDaWwjXNREyPqUMvANpaiE2yL9RqcNATVAflCOqMoNgoI3wMNac6gH1+Q7IoPbQbGy4atp9OPt5cfZAPPs+++WC7ykuVy/U7Nou+PftQvise+k47Wac/etXKM8S7h38CRjbF4CTy6LJTVRTtxsy2zZs5KWnphLm589t4Vfx1gtz+Te+4qrKrz/8wNTHJtHUxYFBfXozZ9YMNkZF8tjECTjb2eLv50ta2rmbnYiICEaNGkVwcDDTp08nKiKCe0bfibOdLZ3ateWxiRN4bOIEbh48CE3TWLJkSYX3aZpGWFgY48ePZ/z48QwcOJDp06fX2mdgtXyRpmmBltacztfGvSFSX+SLYmJimDdvHkFBph6Jvr6+7Nixg2XLlpVtExERwYABA6psjCrfGVl6/+OTJhIcHMzSpUv54IMPcAxqbdX+96TIskJnctU7z0bO5+4y540Zj4uHOwFP3qpsVyTUniRnqbVYIPeISklVExBS01Xlgfwc1WtDuJP09pQXzf2bqq287e3VO2QXQVLGxUVd2He0U+t6Ki/MJ+87yh8zPkIvKaH3Cw/QJPxcSC4t23QnXlJUTMJvezi+aidXLXoY58YVDZFUKyTVLgHiOk92hvr5St6U5BG5CwkjlrAv520k/roHBx83mlyjJhFI3pgkLSWJFEtSTgCuDqr3IyVPdGvUVhkrf56Xkl2ofhZhfi0BOHH0GMPCr2LEmPt45jVTZU+ob8Vz6+9/jtCpXVueenoqL73yCgDxcXE8O3MGy5cvJygoiNjYc0lMaWlpzJs3j/nz5wMQFxdHcHAw48aNY/HixWXbRUREsHbtWmW7adOmlY0BeHt7Ex4eztq1pqBanfdzMmOsOdUx/fv3Z/78+WWP0NBQYmJiKmxT/kSpaV5duJCIiAimTZtGeHiNnG8XxMXDncYtZUVoA8v4dgmg/X39Adjz1vcUVlJrT913nJipXxH3+UYK03M4tfnApZhmjeN/Uzd8e58L3hjrTyZ69uzJsmXLiIuLY9SoUVa/LyYmhri4OAYMGFDB67KEj48PtXUjb6w51VPi4uJIS0urcIIMGDCA0FBTam9aWlq1XGprPK2U5GQCAgPJKy7hzXffAyA2s3bDJ4+/swiAVbENp8FefaHNyH4kbTtI6qHj/P3p74RMGkbu2XT+fv9nzvzxDwBOTb1o8+B1NLu66yWebc2TcTiR2E830PWZ4di51s5azKWmcsmH6lOfY+TIkcyfP5/p06ezYMECpk2bdp6tTSxdupTRo02X8/KelERcXBxxcXG1doNs1DnVU4KCgvDy8iIsLIyRI0fSs2dPRo4cWRbS++6774iIiCAlJYXp06eXvQ4watQogoKC8PD2ISpiLXPnvUKP0FA++mAJs2bM4I5Ro/D09OL7lSv46tul9DAbvPJERUSwLiqS+Lg4nvnvf3lk3Dji4+J4b/FiuoeFcywujtZBQTz21NN88dGHzJ09k9tGjMTDy5Ofvv+etz77jONHjzJzyv/RtUcP7n7oYdJSU/jkg8WMnDwOgMy0dH7/ailhd9xMn1G3ceiPnXz6n9n4tmjGE98uZs+aDSx/YREtOrfnhofv5sDhAxxcvY5u991K0PW9AIhbv52zu2NxaepD+j8J+HUPIm7lFsLfVFubZ2WpNS72QvFqgb0aitJz1bHcfHnBPiFRDTX6eqvhICm8VSSEeXy81dbiWbnyTULXx4ax6Yl3OfrLdhy83YhdvonivAJsHOxoNaIXLW4JxcZB/tlrQh/7rAxZgcLWXs22KSxUQ2FSrZGjUBcnYS8kC4Apw1CZj5MjR7/ZSlZsEkeWRNF56u04CKFHKURaLPS7ksJ3AC2lHlFCjVZavhou9hRkl5q6qKG+XHP4ulSdvEgvIbe4AGdb9TPPNKvv55eUlCU6ZZZT5J82bRo7duxg+vTphIaGWoyAlK4rLV++vMw4ScTExLBkyRKio6NZsmQJixcvZty4cRa3rw71ts7J3HYdwBdYfL4+TOfbtir7qW9ERkby6KOPsnz5cpYvX8706dOZP38+06ZNY9y4caxdu5a0tDTxzmX06NF06tad+LhY7r1rNAcO/8PYR8cRGRHBimXLSDybTHx8HKkpqi4YwI0DBnBDRAQAL73yCvFxcdw8ZDDb9h+kdaBpDax35w54enpx/9hH2BAVweqVyzmUcJpj8fGkp6Zy0+23s3ldFL98/z1z3+hGq8BANm3bwvyJT7Bk0xqatm7JqWP/8uPr79Fn1G20vzqcq0fexuE/TWGCboOu458/d7Ln9/X4tvCnY4cmnD10lO3vLyXo+l7kZ2aze/4yrn59HJ7B/uyY/QU5p1Lo+eL9V2ys2SOwKcEj+nJk2UZOROyipKAQv95tCHqgH05+8gX3ckDTNDo+NpT/b+/M4+Mq6/3/eWYmM0kmy2Trvk4LdIHSJilLCwqSKIqCSNKqF/3J9TYBFa+KdPFeFbzeW1Pk6kVc0ir3Cri0CSIiiGbKplUgS6EtdIFM0pLSPZk2bfbk+f1xzkxm5vmezDmzz+R5v17zavOcM8/5zpkz53u+3+e7NH/9/3DqlUM4+txuzPlIWaLFign739iDxZcv071/Q0MDysrKUFlZ6VsbCqaiogL19fW+IAhgfD3bn9LS0gBlVFtbi4qKCt+6eDTRvebkVUyMsTxqPJowxhrUubdAaQHf5NcRV/e+RuaJBlp5A3rzCYK3L7l8OXa91oyenh7U19ejtLQUGzZswPEz3RgYHcMo5xjjXJhv27ZtaGlpwb9t3Iju7m50uAP18Xz1Qvr19h34QEUFllx8EbIsZt+L4ndPPAEAPsWk/H8+HvvFtvG/5ynPKT//1W+x+vrrAQB5+coC/5z5yjZ7Xi7seXmYNldZ9M0tmPjryFSLVRbNUjrAWv0qP/S+pxQizZ6qBBZY7JnoO+5B9jR92fnpykWfvB7Z04vQd7wb8z56FZbc89G0VkxesqYVYNEXPgwAeOd/n8e5djF8Px343S8fC7nP8BgPuJc885cmOByOkOtPNTU1vqUD/8ArisrKSgCKEosFuiwnVSFtA1Cl/g0oHWhrOOfaZZTDQO1uWwVgM+Br2+4EsAbAVr37MsZceudJRna3taGttQWfX1cDh8OBmpoa1NTUgDGGDrdbcMXtbmvD1SvL4Xa7UVZWhoaGBnz28/+CBx94AE+qisVLQUFBQLSeS7XAvFA5Dt1nxEgsj2p15VvNyDAxFBcV+nKjLvh5OhyOcWVRnJmLDJMJH5u9CACw3zEFJpgwSy33kpuRCavJggHVtTHKR5GZn4uB0SGUZDmQnZEJMzOhJMuBkuXL8cecLAx2diN/xcU47z6OS//5JmRn5JCtyQsKxGrPwyPifoNDomttmFhoH+inI7osZlHB914Q84WoxXvKDUbl5lD7AQBTo/gW1tyAPffvQOezr6HoAxche0ZgRFp3t1iOaZjIadLKNaLGqcg+yjU3MCC6vKioPq3ghhGiZI9FdTM6ymZjWsWlOO7ahzcf/AOu+eGdyMieuCtvpoVoOJlJP+D0EceekytW0B8hXH3DRA8uqlmgt9J4Ro7yfeRnZGNh7nRcGBnEkY4OtLy8y5fzdGhI+R77R4Z8TURzM8TrxeFwYOfOnSgr02dNut3ukIEODofyYNna2gog+koqpOWktl7vhBL4sBvATvXfNQA6gi2pKOC96/qHinjU4xvZ18g8ScmDDzwQoDQ8Hg8cDodPMRUWFqKnR1l7aNyxQ/m3sREej8dnjne4xVp4+Y5Aa8XpdGLJ5ct9L8qyq1qzBgCwZ/du39jhzg7cXDX+JBY8rxYc4xUqeomOtUaYsvwiHGp4Ea/+52OYec0yzLxWv7sjnSm4bA6mXX8p+Mgo3q7fCT42eRyd8z9zDexzi9F3rBv7fvx0osUJi5ef34mHH1SCg15+4Xnc+6Uv4LO33Izr/dx5f/r97/HIDx8CALzy0kv472/fj3+8+BL+bdNGPNGwAw8+ENBYAqWlpaivr0dRkZI07HK5fEsCLpcLGzZsQG1trS8XyuuqC95vy5YtABRXYE1NjW/M7Y7uiknIPCfG2M8AtBMtNPKhNCTM45zfFTWBGKsBUA9ggXd9iDHWDsDNOa/Uuy8Uy07XPMEkQ55TW1sb6uvrfU8nHo8H3d3d2LRpk8/sbmtrw7p161BRUeELiPB4PL6AiLKyMhQWFmLdunVYs2YNqqurUVtbC0DxFftH7wQro91tbfjinbXocLuxadMmrF+/Hi6XC//94x/jstJSHOnowJz581H7la/iwN//ji99QbkEPr+uBvfcey9az3Th4J69qLtnI947fAR3/fsmLFp+Gf7n3m9iz+u78cCPfoLLS8vw9S/eiT2v78aXv/XvuOL91+K7X/06jh4+gtu+fQ+KZs3A9vu24EzXe/jYV+/CjMUL0XD/93F0/9uo+tbXcFXVx7D5ts/hzNuHfXJbc7LxoQfvBZ8pFjs91X1EGDt9QvRKHzslrsP1nRUrImBE47eTIT7zZeWKT+/5uWJljAKHmHNjyxLzaGw28b0AMDQ0LufI+UHs/+YfMNI7iLmfW42S91/s28aYKCNVzFULqpeV1SYu+FPHofKPMonAAK17U06ueI6C5+w/5sGBumdxae1HMfXKRb7xfCKnibKy82zifgAwO1esJpFJBCrcOk8MPGjvFc/vtVPFJXsjBZu1So8F7xcvopnnpEs5cc7vDHe7YYFohdMDwMU5r9a7L4AmvfP4zVUDAHPmzCk7fPhw8C5pjVZoebCLz90rumSoKsitZ+gkXKrS+dE+0WX41+PvCGPBrpJXGp9Gy0sv4/r7vgAAGDzfhz2/egbHWt/C1T9YJ7x/siknAOh+tQOHt+2COduKS//rVmTkK99VuisnAHBkTxVKOUnlFFvinYQbKhMr2okvXpPF30fkgGINGdnXyDzgnG/lnJdzzsuLS0rCCmhIJLGSMZkLxPafOw+r3w3elpONvBklsOXRN+7JSMEV85B32UyM9g3hyK9eTbQ4ccVfMfUcfBcjGmuEqYTe33ey36/0oCcgIpSzOqrRb2rgghuAE0CbX3RdPQCoicCFnPOyifblnLsnmkcSCBUEQSkju8UmPJVRF77Dql9BzMwuEua0ET2IDngCo6/u+NcvY9t/1uG9X72Aktmz0NfbC3NXL774vf/ESbu+1ttUcdC+AfEm1k8UfuVEThIAYEQ8HyNE4EUfcbO0ZojxRVT+kZk4PwBgzxEX8mfffiX2f/MP6GnuRM/rh5G/bBYGiDbiVOAFdX60ZKICIqgyR1Yi34eyfCirC6BzwfLyxMACb2+s9j//A698/zHMu2Elrrz3nwTZp9jFQBkq8AEApmSJ59dO5Hx5hkQPw7KCOcKYVlL7UodYTFavgqEKNqciepRTAWPsHs75g8EbGGObYyAToAQt1KvRdZVQcqy8Fk+wJTfRvhNtk6QBt339bnL8ZHdnfAVJYmzFOZj+8ctxdEcrjja0Ie/SGYkWKa4UL5oHk9WCjqZXMXXFRZhfeWWiRZLoQI9y2gAlKu8bUNZyAMVa8mZnRT2pRFUg3qCFLUHbqg3sq7lNEj6xcBEEl2WhLCdJ+JR8YBFO7TyAgfc86H6lA/bl+gutpjr5c6fjirs/iX888CjafvYkZlyxFDaNor3JQiq64aJNSOXEOT/LGCuH4g7zVwxtUCyRqOY5JSvJ0N8kGaBcBlT7aC2ottKUC8QzJLbypnrfvHOOXsS3Z4iuo1yb6IE+g3eFMQvxXWdliq6bvj6NNbh+0UU1bBH3tRAJzxf6iH5XmeJn6T1L9/yh+ix5XWYlNy3G0Udb8N6Tu+Fc8gGYgvJhKFfdwADdz4lB3NdEufBs4ndGuSQplyJVyV2ZUzwfVM8r/55MC2+8Bh07m3G8bT/af/k8bv72V3zbhgjXZQnR9h0AVk0VKyE0n+oUxmZmi265d3rFslaU+3sBUa0eoH9n6dKSnULXHZdz7uacV3LOTVCi30xq8EBatcqQSNIZx8o5sE3Pw3B3Hzx/70y0OHGFMYar/vXTMGdY8MbTTTjcti/RIklCoKmctNaTJlJIMVyDmhTEIuIuFSINJfGBmRim3rwUAHD6z4cwOpBc0ZexJm/2NKz+nJJM7vqfX8j2GknORG69SsZYs4G5GJR1qE2RiZR4GFLPjUfJG6kSonIlqDlp1wLtbqByOPS2mqbcIrNzRPcJAJzqF91wowWiS2ZghGo3Lt60+wfEOJo+puHOpG56fURV8wwx6sxMuLeGiXJKZqJEEgAMDYluOP+ot+wlJciaV4D+zh6cch1EYeX4OaFca1YiEg0ABodE96xZI7ouGKr00ggxX16+WBYIADKI68Vq1ncNrf3SXTBdGMaN6z6LQrXs0Emiwvv8PDGCDxAjRgGgKFNfZOrC3Om6Il0B+vdsxIWXavcviomU0wYYDxPfGIEsSQOHeNHo+bKNXGjJZr3oTa6VpDaMMUy5eQkOP7QLnpc6kb9qFsx2WgGlIxk2Gz79rXsTdny9v/to3x+M3JsinTNaaConzvnOmB5ZQhLNJ55YPD1Ri7KU5eMtQhlMFvGES72fCpygKMmko648RGAABVUdwGoVlXIhUT1dq5/ThWGx3Tmo4AmLGFQwlCH+JD3nxAeHvBz6wcFsEa3d0aBzaZ2bi8yLCzFwqBtnXG4U3LRQ3SJad1pQwROjxM2KET2eLBZRGWYT+Vk24nsAgByrGKyQYRLnpKypDL+gjbHRUbz+wl9xyfuvFj6P1nU1I1u8DgYJS1tvrhGV56QVEAGkh0Wkl8nzSSUSiQ/HhxR3Xu8rRzHiESME0x3OOf573b/iR1/4Onb/5YVEiyMhmCggYgVjbLmRyRhj/xK5SJJwoIIegksPJWsZIkn8sc7IRfayKcDIGM7u7Ey0OHGHMYayyusAAI2bf4j+82LqQiqQzgFPE7n1djPGvscYqwXwPc65ZiVUxthtUIqm1sZAxrgTbkBEKpvcztzoJiV6e9IEozdPqn9UdAdRbaqnZ9EFOjt7xeKt0+1i8MSJHLEF+hixYN9/QSwxac+iXZcXMgmXIlXMc1A8zlC/6Cqk8oeoHCmAlt1iFn/mY2MceRXz0LfvFC60HkPO6llAoZhXlJ1JBxoMDosPOGaT6OobITyFFqs4ZyZR3JZpPDtTLkUHcR0sLZxLvt/L+9d+An/73R/hfmMf/vjQVlR/46u+bdmEexSgXXhUTpNeFuQWpOx9I9ZyTzg753wjgCcA7GSMnWGM/Zkxtp0x9lP13xbG2CiAcgBrOOedMZVWIpFEDUtRNuzl0wEOnHNNvpRFk8mE//edb8BkNuOlXz+BI28eSLRIEj/0VIhwAVjIGJsPJVR8AZQovhYAW2XgRGyJRZQNNa+RKg+S9CHv+rno230c/W+eRtbRXmTMFFtXpDNzFl+M626vxvO//C1+c/8W3PubbTBphOnHi4nc7olqhZEIdLVpB3zJt9tiKIskyuRbzVEPY9cbXq6l7E4Piu46ygVIufX6iariNmI/ACi0iXJSlaanZov9eagW2z12Mccq105XlD5tI9xoICL7iOrlGBTdf6OZREVzonK6FhkZYt6Vt0STyZGJnKtmovev72Lg1feQ88mlAfsNEDlWAF1l3ZolugUzs8TvYZSoKk61fe/XiPi0W0UF6rDpc0tbCRfnDzf/AB/a+Tcc2XcAI68ews1r1mD3GXoV45qpFwtjlKtaqydTopRLKroOdSsnSXyIdh5EuiyOSmJH7qpZ6N3Vhb69pzDy4UFY8vUltKYL9pwcfPN738Ppk6fwoVtuiemx5O9RP1I5JQgjFk3wvtG4wIPnpHKN9D4RUvtpWVhnh8TjUJUfqI65RugdFsOjS7LEJ+5Zdn1F9XuLxeoSZ3tEuQEgzy4WJvWcJSydc4RV0kv0oSICDUz59JMwZVFZCSsnwz+fKssM26IiDL51Gp5dR5Bzw7zx4xDHBuhAiZFR6jiiNWWyiLcdO5E/VJJDt/awE3lOVHUKB2E9U7T3nsDC66/CQgBdQx5QRq4XI1aSnvdq7afX0klFi0gv6fvJJBKJbrKvUhRBf8txcJ0323TlXHcPRohoREl8MaScGGNvM8bmBY0tZ4w1q5F886j3SSSS5MYyOxeWGTng/SMY2Hsq0eIkjD/83+P47NXX4aUnn060KLqYlHlOGmwBUKt2lv0t5/xJADuhBEq0Q6nHd1d0RZw8RGLKJ9sF+ZaH7jdENRGkXHh7eo4IY0U2/a3fcwl30rRs0a3n6npLGBslcoVm580Txnqmi0VAAeDCBbF8kcdyVtyR9piJEHVkhwlXHUC74UaIa4Nz0TKwrZyGkafeQd8rR2FZVgzGGKxW+hYxTLjwsmxiHhpV5JUqMEsFoVBjAGAnvltq7AIReLGkQCzo6p8rN79kJvrOX8AzP/1ffOPOe5CREXi96i3fBegLfki2320yYdStVwmgDMrP6gG1RYYDwH9xzrcBiEoLdMbYevVVpypCrf2c6j716svpt62CMVbFGCtV/62PhmwSSbpiXVIElpOB0VP9GOkglOkk4GPV1XBedBGOdHZgx+OPJVqcSY1R5dTMm8qAPwAAIABJREFUOf8g53wN53whlJwn+HXDpWNrDcAYa1Dn3AJgO4AmxpiwWqqONQHYzDn3VqZo91NQ1QAaALQCqFNfSUMk5ng0zHh37/mAl0TCzCZklk8DAAy8Rgd7pDtmsxl3b1S6/vygbjOGNELp9ZDs7jate1CyyGnUrbeAMXY5gA4oVSGClcaCSIRRFUsVgM0AwDlvU8fWANgatHshACeUxOBGKG3ka9T3b1H3qVTncUUiV6oQ7O7TSuajKn5fGBkUShhRSotyYZwdGhVcGJT7DqCrklPRessK5ghjVKVzdy+9PkK58ChKS+YJY2cGxDprrSffEcaKc8XSRwDwrlnssmovEvNwLhCReWSZo17xBjlGVDQHgP4x8caSky260QaHRZeZ2WSG6bIi4K9dGH7Hg4ET58Gn0K5Uq1X8foeIIIIpDrEnE1V+KC9TjJp0ZIk5aAAwPCaeo6lEW3Uqp6lvRJQxOLJ03e23o/77D+DA/v34w28ew+fX1fi2UXl6eiNdY4GM1hvHBWA3FAupEYAHwG5vSaMoyFOq/utfyMwDVcn4wzl3Q2kZ36gOeS0mf9eiE0BpKPcgADDGatRyTC2nTiXPgnA8i7ZGchxZWDY9YNkZsCxVasUNt55IsDSJwWw24xvf/CYAoG5zZNZTMMlooSQrhiwnznkjY6wAgJNzvts7zhhbB8DBOX8gQnmoKp7d0Gh6qCooL7UAXH7KqlX9280Yq4Hi8ivgnIsVPJW5tkK1zsrLy2PevzmSJx7KUqHQ2mdgVF+uRiS5T1qFXym5jvWLRVopJupzE8x7feLXfO3U+cLYM+/u1z1nMDk2uhfnlOnic9AZz+vijhbiGiA65gLETey8Ru+lXNEqOX9B7I5rs4nXBmPKcSxlUzCy5zSG957G6HWzYcoUbxOE8QMbUdC1jyiYW0JYq7nEubSZ6Ot3oUO0WJcVimMdvWeEMSqohuqpdPVHbsJFixcj3+HAns5OzJg1CwBt+UdqJSXK+kl2qyucJNxqKBF7gBKx96AaDEHCGFsPYG2IOW/QUhpQFFbbRG9Wj+H2W3vyKhsvLeq/lHtQIpH4YSrJgmlOLsaO9GLojVPIvDKyhOhUxGQy4dfPPouCwiLSDSmJPYaUE2PsXigWihuK0vg3xhjjnH9f6z1qYMMWre1BeJWI/2OUAxNEAapWETjntWqQxBoo7sdWKErPX7EZbTsfV4yY+Xr3TcanIxmAkfxYyqdg6EgvBluOw7ZyGphGpYh0prCIXvNKdmJVLDreGA6IUKP0fDDGfhYtYdQACDeUtaI2vyi9evVYTQAKOedl6t9VUHKrGtVQcae6b7f68iq1cvVfr8svZaBKmUTqq6Yu0rMIv1Al9V69bdYBoKxolq79/nqCbutQOUOMw6HcilTuFRU4ceKMGHhx3cxLhbHnjtAGfWa2eGyqrfo5qh8U0eEdo1Sik0YVh2HCxUTolSEiICKDj7+Xz80B8q3gZ4fQf+A0LBcHulSzTWJe0TAREMGJfKjz50U3bpFdtM6sGkE1VBkqyoW3yDFNGKOuC+pa9Xdp739zHx756U/w3Qd/gCm5+koiaZFqCiKRGFVOYsgSPRYJlQC8OUuVAKr91pZ8rj91e4P653q/92/gnHsYYxsAbFIVnBNAZdAalUQi0YAxBnNpCUZfOIqRlpOCcposcM5x9+fvwL49b2DxpZfhq1/+UqJFmjQYVU5XMMbmerviqm3cV0ZTIFWBeKPztgRtqw7aT9PXoAZGpJylFA9i4T5MJDI6MDaYlhZidNcxjHWdx9ipfphKxIK26Q5jDF/d+A18/tNr8aPvb8HdX7gTFqJwrV6o35O0pmiMnuWtADoYY/5+BiHMWxJbYnExRzsvQ2/fJ0B/VWcq2k7rvVROFNUPimrzPn2WOLbzPTGqjyqZAwA5hOuooKBEGDtxWowSG+4h3KFUBN+YRkApdW0w8WfOiUhBc/B7s0wwLS3G4O6TwMGzyJwp5hL5Q7WTz84RLa68PPFcUNF6WueXgqpCT0XWHe0T3X8AUFoU6AL0Xxd930duxPyFC9Hxzjt44qmncePHbg7YN5Lq/bEgXZSdoU/h7YoLYBOABwCUc86fj4VgEokk8VgvVYICht48Dc5jnmGRlJhMJnzyjjsAAI898osESzN5MGyfqu40n7uNMfYJzvnvoipVguEQze9oP41E4i7TcmMFBy+kgktOktxY5uSB5VoxdnYQI13nkTE7Pdu4t50JLOLrsAZW9PjEpz+NB++/H8//5Tm8e+QwZs+ZG0/xJiUhlRNjrDnELk4AaaWcEkm8THK9EYB65NGK9IsEygVCVYTWch9eGCEqRYtFs9HeK1ZBWJArVq62Z4hvtmfQazBUcq49V3QVUiWAhomEV1wg3HpauTfU90gZPP3inGOEPP2DQzBd4sBoy0n0vXECGSXKeQhoVqiSYRfP0RhRasjExO/23KDo4pyVI7r/AKAkUywFRX1nb3q6hLGlDjEy1DMkpjYEX1czsufg1ttuw/bf/AZPPf5L/Md//Idvm96HRYkx9FhOCzBx4urkS4AwgNaFGwv/c/CxJjpGuFaVDD6YfJgXF2K05SRGD/bAcv0sMPPk/MnX3vUFFJeU4La1n4yaV8LoPOmynqQHPcqpmnO+U2sjY2xFFOVJChhifxHoLUFEoXcBlrI0ANra0AosyMwK7zzoDXLQgspJmpldpPs41NMwxQyiPXj/qBiUQD2tlxaLARoAMDQqKvCzA+JCvD2L6EFkIxKdKF1A5T4BwAgxPkCcoyyiGOyQKLc9OxOm6XYMF2aCdw8AXedhduaTfaMyiXNUUigW8LVZRItzfr7oJrvIQVemoEoQUSWwnLm05SXIo5FPFczVq1bh6lWrhHEjbdUl+gl5RidSTOr23RNtl0gkqQ1jDJYliltydL++OogSSaRIdZ9AkrWPij+y2rgEACyLFeU0cqgHfDj5rtN48qvHHsU1V12Fw52dvrFU+C2nGuFnk0l0oV0ZPPyLl3IhUO63E2IxagCRudy01rH09pLSu9Z2elCfq4XKZ9KCct9Q1cupXlJU3yirmf4sSwlXlrunXRjLtYvurZM2qvwQ4dfTun448bw5QuxrEc+FjQiIyPB+xhI7hqbbMXrsAtBxDtYS0R06PCy6QxkT5aFaty8qEAMVhkbpyut7uo8KY++bdokwpr/PkrGSRC+4XGhtacZj//sIvvvd70b9tyxRkGdGIpHoIsPb5+lNOpF1slBbqzQ/+MUvfkHWE5REB6mcYozRNsip6h5IRZklxrAuUZVTuwejk9jFW371KixavBjHjx/H7/7wh0SLk7ZIt14CiXa18WCMuBSphmtUBWe9uUZa7rbTg8BSR2DUHeUCpErPUBzwHCfH86z6St9QkV9U2/iZZFQf3SE1k3AfUm3I7URpH1v2aWFs0EZEXfZqVSXXmedEVHsYI1q8+/cyMufaYJmXh5HOc+jbdxI5K2cE7JtlF8sbjYyJ322JfYYwRrVUn0ucHwBYmCtG8VGVxfW6kLXc3NTvZ2B0DIwx/PO/rMP6e76GX2zdius+cjPx7vAjXSUK8uylMUattnghgyxSF+tSpZzRhTfEUP/JxD995jOw2WxwNTXhcCfdyiWYeP0ek/V3bxRpOcUYIwue8VwcDT6WXkslUrTatwc/pbp79fWDonr2RCoP9RRO5T4Fl7jxQuXcTM0WG9fl5Itj2ZlHhLHBDOK60EqEpfKc7IQFQeQpjRHWVHAx2Mylxeh7rgOD7h6MnhuCJc/mt69oaYxx0SrJs4nnzWYSb0UOq2jVAnTx1iWOKcIYlStH7WcE7+9mRkkxqqur8fjjj+PJxx/Ft7/znYjmlYgkpXJS264DQBGAeq0+TIyxCox3yvX2bKr1265rHolEog9TpgXWhQUYOtiNvj0nkXfN7ESLlDC+9rWv4QMf+ABuvq0q0aKkJUmnnBhjDQCaOedbGGOlAJoYY2WcczHmF6gGUKP+378PlNF5UopotGFONjP/TU/g03C8LDmJcWyXFWPoYDcuvHE8rZVTqJp5K1aswIoVK5Lut5QuJJVyUrvbVgHYDPjatjsBrIF2fb9KdV9XhPOkHVrKivoxzcjO1hWgkW/VlxOyIFd/51QqGIPKUTF6nHCL2za9J7rWqDJHekskAYDZJLrWZhcvEsbetb8ljPVQeU5ahV/1MiSeC1uu6JZjxHFsFxfigs2Coa5eWAcssE1RKpVbbWLe1qz8BcKYmSj8SvVjonLQvFTOCJyXUiQzs4sEdzG1n95yYFpkmk0YGhqC1UpUFg7aLx6kS+5Usn2KUvVf/6vSg4kbGjoBlDLG6lQFFNY8jLEaxlgLY6zl1Ckx4VIikSiwDDPylisRd2dbxMrfk417770XU6dOhdstVw2iSVJZTgDEvgJAN5R1JYpWAC7OuZsxVgOgnTFWEMY84JxvhWpVlZeXp2RXtUjdC+nmntBbpV1GDBonv3w2PK8egaflCEo+vIi0sGLJrpOB1i0VXh4vDh87Do/Hg4d+thWb7h9vpSFbZkRGzJWTGpSwNsRuN0ywFlQIoI3aoCoULy3qv2uMzpNqUGZ7rBRLuC4CI/JQrjnKrULlTpF9m0C7BfVWOtfbDt5I6aQpWeJz0ck+ccxmJT6PnfiZ9mooVL1fl0VUJpTrkerbBACZC3Jgys7A0Inz6D/ugbXEjuysidu4e6Har1+Ur6+CeKToLb9F9f7SYu3tn0XDrx7HM089GaCcJJERc7ce53wL57wsxMurmLwKxv9X643GC4Ax5mSM9ajBDgjaX/c8EonEOMxsgv0SRaFcODC53eBXrb4GBYWFeOfQIbx98ECixUkbkmrNiXPehvGwcDDGvMqlXv27iTHWqo51qy+vwilX/20MNY8kfIITaGUi7eRlXDmlfkJuJAmrFosFN9z4YQDAc398OhbiTUqSbc0JUIIW6tXghkoozQ69Csjn+uOcexhjGwBsUpWPN8/JrWOeSU+iInoo9xjlaqHH9Ln/vAT7/N/pFcsNUQmdSlpcIFRirla4OzW+pEBcEznSK97UqZJGMIvRg5qPlVQS7hgxlqGvtI8tg143secWIaM8E8d/+wb63j6D7KwCDBHnaJpdTDSeli1+xiyz6EejXK7xYqLrKrgs0dSsDHzqtk+g8de/wvPP/hHf/fdvxFq8SUHSKSdVgXij6rYEbasO+rsRQKPReST614RSOSxVWnSxxVpoR+b0fAwcO4vz7SeRWxhZ9YVU5oMf/CBsNhteeeUVHD9+HNOmiZVLopGfOJlIOuUkCY94JeBGGoGkd0E6FgEesYjocuaKpXho2acKIxlEAEJBCZHUmrlPHLNofN+jVEt28WduJt5vs4r75WjkkdkylXy3guVzcezYHvQdPAXH+0UricJhE3PlqF5blLUK0KWktMpihYveorFecnJy8POf/xxLlizB1Knidy0xjlROEokkbByXzcaxP+2BZ8+7iRYl4dx+++2JFiGtkMopTYhVKHnwvJQvnnrCpdpoGDlOqpCqckeLvEUzwCwmnO84icGzF2DLp4u1SiRGkcppkqLHDRjJjZfq+wToV1qRBE5ovZ9SolQ+FJW/ZKQcE8XuM4eFsSzi2AN94rFzssWyQOet9PkFlQubJZ6jTJsYgGDPEvOPbFl05XVv+3VLlg15i2bg7L4usLd7Ma/isoD9zvSLn2dRvuj28gxdEMXO0g44odypkRCtdZ/f/va3ePjhh3HPPffg1ltvjckxJgvybEkkkohwXDYHAHD4tTcSLEniOXz4MHbt2oUnn3wy0aKkPFI5JQithmDxahKWDs3IJMmBY5kSxHHk1TfAiZ5QqUC0fg+33HILAOCZZ57ByMhINEWcdEi3XpoQi2g9ak669TTdzppCb5v3fKs5ogg+yt13gbhXaOVThVvRXGvfm2YvFsZOEC6v6UVOYexQxh7iwBo/XQshJ1H3jnIVZttzhbEMjXb3dr8q7dmL8mF12HH+VDfOHTmO4vnjEYcXF88S3ntmUHThUSWjYkGsS38tWrQIl1xyCQ4ePIi//e1vuO6666I292RDWk4STdKl3XM4TMbPHC7MxFC0XFEuna+8nhAZkula9VpPv//97xNy/HRBWk4JIt0XR7U+n/68IH1ztp05rrl/aVFgIiSVHwPojyrU+51R/akorpoiWgsvdTULYzl20Xrptmnk4YwSrdYJK0tvEXGrjY6+s5gCreUppRfj2Iv7cLR5Lyo+90nf+NQsMf+oiJjzLc9J4fuKF1rVIGgvQWg+/vGPY8uWLXjqqafwgx/8IO4V29OF9L5DSiSSuFC8XHFHdrbtxfCgWCZqMnHllVdi6tSp6OzsxN69exMtTsoiLSdJTJjIGtJrgejJsYon1GdKdwtYL7aCXEy72Injh9w4vHsfFl4V3CwgNO5esbNwJJZ2pIRbbshkMuH+++9HVlYW5s6dGwvRJgVSOU1C9N5QU+HGS7Xi1kIrVynaOV9UKR0q8KL1jNhF1koUjc3MFIMXGFGSCAA44e7LzhTdgrl20bWW5xDzj2xE7yUAyLWJ53LB1aU4fsiNQ/9oxbwrlgMA5ueKxVupgq5apYqMEO71arRUkR5qa2ujPudkI/nvPhKJJCVYoFpL7f9oDbGnRBIaaTmlCUZdHZGESkd67GiTyOMn+rMnE3OWL4XFZsOJtzvQe6obuSWFEc+ZjOdXr3u3tbUVW7duxTXXXIPPfOYz8RAtrZDKSRIzInULBr+fip4ycvOKJCqLisAzUtJI73rZlGyxXXmWXWx/npN9WvexqWi/bEL2udOWCmNjY7TcRYSci6fMxdKryvHGS7twYV8HSm9div5RfcERRmsxRtPlHKuK/m+++Sa2bt0Kt9stlVMYJKVyYoytV/9bBKBeq0mg2hW3JXicc17LGKvAeGt2byNC6QiWSGLIZddejTde2oW9f/07rr31o4kWJ6HcdNNNMJvNePHFF+HxeOBwOEK/SeIj6ZQTY6wBQDPnfAtjrBRAE2OsjHPuIXYvVV/+eBsLVgOoUf/v33gwbIaHh9HV1YWBgYFIp0o6tMrOhJujMTKm/YRpMYV+Ug2QhzHYbDZMnTETOZmBAQNGnnrDzVsBgKUO/V1ZqeNQjQ+nZ4lurwX5Ys+pXZli5QbKGgKAMaLrbUmxmD+UQwQqXBg8K4wV2ekeWCunXCSM5WbYcPX11+Hx734f+3a9Crs5A92DffjY7EUB+yWjq04vRq63oqIiXHvttXjxxRfxpz/9CZ/61KdiKFn6kVTKSW2pXgVgMwBwztvUsTUAtgbt6wCw1WsNqX9v4pxv8NutUp3HFQ35urq6kJubi3nz5qVdYt2YhnIyhfk5B6mmdyo2c+joKH95OOfoPnMGJ947ihynWN5HkjzMWuhE8fRpOH3sODr3H4RzqVi2aTJxyy234MUXX8RTTz0llZNBki1az2sF+VtJHhBWj2pJ+SuiuiDFBCjuvFLGWJ2q5DRhjNUwxloYYy2nTp0i9xkYGEBRUVHaKaZIGeNceEXz/YwxFBYVYXBQDDeORcFcaq4T/cPki0LvfukIYwzL37cKALD7pb8BEM9HvIhFSSOjc3pLGT377LPk9SvRJqksJwBUeE83lLUjAa+rjzFWA6A9aHMrABfn3O3dzhgr0HAPgnO+Fap1Vl5ernl3DUcx3XcfcP/94vi3v61sSwbCtZC0yDCZojonYwxI0YrXXoLzsd70iIVf+4l8H6tNzHOyZ4ljAJCVLeZYZdnFn8/iGVcIYw6bmPBqZvTz60xiTm9ZohsqPwTX9t/hrV2voe5b3xP201v8Nx2YP38+li1bhj179uDll19GZWXEqwuThpgrJzW4YW2I3W7QUhpQFFZbiPfXASjzH1CVjRdv0ITgHowH992nvLwFil98Mbrzu91ubNiwAW63G9u2bUNpaSkaGxtRXV2Nuro61NTU+BZjXS4X2traUFo6vlTX1NSEuro6399tbW1oaWlBTU2Nb6yxsREA0NzcjJUrV6KqqmrC/Seax+FwwOPxwOl0+uTwzt/S3IzyoPklqUX5asVy2tfWhtHRUZh1uHHTmbvuugudnZ2YNUus0C7RJubKiXO+BeNBCqHwKhH/xzJvxB2JX1Ret9+YE4rldAPn3F+xJTRcZmQEOHAAOHsWyBejg8PG6XRi7dq1aGpq8t3sq6qq4HQ6UVVV5VNMW7duRXt7e4Ai8ng8AX+7XC40NDSgrKzM515ra2tDXn4+Kioq8InbbkNRYSEqKirgcDjgcrmwY8cOlJYFPBvA5XLhicZGlPmNezweNDU1ob6+HgBQXV2NhoYGtLW1weFwoKKiAlVVVQHzx5p4Ls6nciCAEQpLijF99iwce7cLhw7sx+KllyZapIRy5513JlqElCSp3HpqAIQ39LtNDXIAgHoAYIw1ASjknPvfCUvV9/pbXt3qy6vUytV/G2Mlux7OnFFeTz8N3H57/I9fW1srROU5HI6AUisVFRXweDzo7vbperjdbrQ0N6OiogIAUFhYCLfbjdLSUlRUVKC7pydgf+88586eDRjfsWOHoHDa2trQ2dGB5uZmfFB1efjPH4pYlVjSk2OlBVVOiVJMVJmjs0OEy6tggTCmlX80MizmFeUSkXlTssU8J8qF96HZtGKhIg39q75fVlqqKKc32nDVisuD9hRLNJ0dGtVdhkovsbg2UqGkV7qQjGe6EkCt6g5sAFDtl+fkgZ+F5DcW4PbzC5bYxBirhxJWXqmVLxUvjh1T/n3kkfgf2+VywakR6RbKhVZVVYXvqdaVx6M8A+hRHMF4PB4sWDB+o/UqoaqqKp/1Fsn8kuTh0tIVAIDWFiENcVLy1ltv4eGHH0Z7e/DSuESLpLKcAEBVIN5Vwy1B26qJ/X2BDEHjjYixpfSVrwCvh+it9vLL4jr+Cy+M99NhDHjf+7Tfv3w58MMf6pPH7XbD5RqPmg+2Zrz4u+t2ulxob29HTW0tyoNccxQbN2xAU1OTLnmCo++4RiTfsF9O1L3r1+PZP/9Z1/yJJhqV19MVr3JqaRb7U+nFyPmNpPxWPKirq8Ojjz6Khx56CHfffXeixUkJkk45pRurVimuvPfeA86pwVkmE5CTA8yYARTpz+0MidPp9LneAMUy8VJRUQG3O9Bw9FonO3bsIC2V4Gi7xsZGbNy4UbDATIz5Xl4oJZTvcOCsZ9z72t3dHTDXE42N+Pr69XA6nRjlHBlBybqxCOFP5M2LqsTtzBMrg+8/fVAYK86nF9fPD4pxRTPyRYv5HNEq/bqZoguvb4QO/T7WLz74LMwdT9h93xXXgjGGvXv2oKOnBzZboCuPaoWRzqxevRqPPvoodu3aJZWTTqRyigC9Fg0APPYYcMcdwOgokJ0N/PjH8V93qq+vR21tLX76s5/5xrSsq2BcLhdKS0vhdDp9a1JabkIt1qxZg40bxlPRPB4PSktLMTw2hp0uF1aEmH80xUPJJxM5ublYeMklePvAARzYuxeXl5eHfpMBUi24ZPXq1QCAXbt2JViS1EEqpzjxyCOKYjKZgL4+5e9oKSe3243t27fD7Xb7wsQbGxvR3d2NxsZGXyh5TU0NXC4XNm3ciAULFqCwsBBOpxO1tbU+q8flcmH79u2+UO+Kigq0tbWhtrbWF8zgdrvR09OjuT8APL9zJxp27IDH48HCBQtQUVGBwoICrFmzxud63KAqqr2vv44v3nVXwPwnz5yJzsmJIYZKJxH7Urk9ywpnCmNvnxVLBXX10u3p8zNFU3xZ8UJhbF6uWLg1zyqWRJqRTUdM6ulZdeUVVyjK6fU9WHXVanKeidA6v8nuwqNYvHgxHA4Hurq6cOTIEcyZMyfRIiU9TKum2mSmvLyctxALufv378fixeGVY7nxRmDvXmD6dODKK4H2duC55yKVNH0ZJmrzHTxwAJcuWZIAaWIDdZN9y3NSGHuiQ7wWtZQTRaKU089+8hN89ct3o/qfbsePtgVGAUUSmZeKyglQCsE+++yz+PWvf522pYwYY62c86iYycn9baYRzz0HXHSRstb04x9LxRQtJipfFO3SNdGWM90pU115r7eKynUyng/p2jOGdOtJkpLgYAgAME+CmoZUC/Nsi1UYu7iAdgvNtIvvvyhftJKoQIdlxJxaLcyp/lanBwOrt19RugIZGRl45+BBZI8MIDdXqa4eqSJKdgtJi1WrViE/Px8mHVX5JdJyigv33aeEjL/0kvJiTHklS109iSQW2Gw2XH755eCco7VVtm6/9tpr0d3djYceeijRoqQEUjnFgfvuU3Kdgl+pqJyoCuJGq5CHyyjnEVe4nozupESycuVKAMBrr72WYEkSj9lsllaTAaRbT5LSGCl7k0hFpNcV1T4ouss+PHuZMHa0j66TPDRBHy1/si0ZWD0l0I1HnR+t9vJUQATFypUr8dOf/hTNfsm4WnNG0gwylRgYGMDp06dlIdgQTI6rIYrI6MbEMNF5T7bgh1QhHufLazk1h1EpIhkDWyLl+eefR35+Pu64445Ei6JJspxzaTkZwGw2Y3h4GFaruEA9WYh23ye9DA8Pw5aRIVhJRn40qbCQviBXLMhKBR8sdeh/6o6kV5JWQIReFi9eDLvdjsOHD+PkyZOYMmVKxHOmMosXL8bQ0BBeeeUVjIyMwGKRt2Atkv/XmkQ4HA6cOHECY0QOjiR2jI2N4cSJE8iPZp8RSVwwm82+tinhWE/pxvTp0zF//nycP38ee/fuTbQ4SY1U2wYoLi5GV1cXDh4Ua51J9KHlngtVN89ut6O4uDgWIklizMqVK/Hyyy+jubkZN910U6LFSTirV69GR0cHdu3ahRUrViRanKRFKicDmEwmWXYkQqKd3Z8KrjojUJ8nyyz2P9LCbtHXKymeVRaC1530HiPdvlsvq1evxuOPP46///3v+NKXvpRocQSS5bwnhxQSiSRtueKKKwAoykkGFMlKEXpJWstJbb+DzvbvAAAJrUlEQVTeHdRmndpvvfrfIgD1/g0FJ9omSS6oJ/lkeYKTiOi1vAZGxzBt9hwUFRXh1KlTOOTuwNx58yb1d7t06VLk5+fjyJEj6OrqkiHlGiSdclIVShGA9VC62WoqJ8ZYA4BmzvkWxlgpgCbGWBnn3DPRtnh8DgkNdVNK5dDgeEBF22nlCumNhIuncmCMoay8HH/585/R0tKMufPmxe3YyYjJZEJjYyOcTidmzhSr0EsUku7xhXO+hXO+IdR+jDEngCoALvV9bQCcANZMtC1WckskEm3KVyquvdZm2bYdUJp/Op3OmDTQTBeStmUGY4wD2MA536KxvQpAA4AFXncdY6wHikLarrWNavWubq8BUKP+eSmAfVH8OLGiGMDpRAsRglSQEZByRhspZ3RJFTkv4ZznRmOipHPrGaCQGOsG4AixjYRzvhXAVgBgjLVEqydJLEkFOVNBRkDKGW2knNElleSM1lwxV07qGtLaELvdEKW1oEJor1FNtE0ikUgkSUTMlZPqliNdcxHi1dD+1pADgDvENolEIpEkOUkXEDERjLEmxlgr4AtycEMJdABjzKuI6ifapvNQW6MmdGxJBTlTQUZAyhltpJzRZdLJmXQBEWpgwgIooeRtUAIc6jnnbjU83ME5r1T3dUJROE0AKtX9GkNtk0gkEklyk3TKSSKRSCLBSPJ9IpP49c6vPmjXYnyZos4vCrkC40sWTgCVnPPaBMk5oSyGzyfnXL7kS77kKy1eUFJI1qv/LwXQDsXbYmhfI/PEUk71Zu8vVz0ADsAZ9DdX93Mm8HxqyhLO+Zz0lpOeMklRfyKInZwJfcLSK6e6X0KeWA08BbZiPLDGB+e8Nq2fVmMnZ8yvTfUY7QDKvNefmi9Zy5VUEV37QllK0DVPOIQpZzXnvFGtdtMKNQeUMVYP5cYPzrkrUtnClVPdRspidB4f8XiaScYXlDWtOihafn2IfaP6RBALOZH4Jywj5zMhT6xG5vY7V/6vujidy4Q9rcZCznhdm1CqwvCgc9ADoMHIvkbmibWc6jYn8d4qv3NX4/f7i9q1GIacpCzhns+UitaLJlxnmSQ/KqE80flXnYh5mSQDchaqx65Q//ZGJlb57SN8hmihV85ElZ0yMrca3bmVc8445wxAAYDgzxeTcxnmOYj7tWlw/nhdm0aS76OaxG8QQ/MHnY9aKJVuvMFdrerfW6Ao9na/6OS4yjmBLGGdz0mrnMLACaCUMVan/jAB5WkRAPwTiD1QfmhxRb2AF/hdtF4Z/S9s6jPEm4nOWSzPp+65uZIQ7q+I6gjFG6tzGc45SMS1aeR8JvLaLAySMdx9jcwTDiHnV12obq5GKwNKZRs/5eV1Q8eyhqimnAZlCfl5pXLSR1SfCGJFAp+wjJCoJ1ajT6sewJfa0B60OW2fVg2QjE//RpLvE5nEb3h+9ToEV9Y8HYyxGsaYkzHWo65D+ROt71i3nCFkCet8pnJtvQBiWSaJBy7a6XkimChoIeblnPyesHyLyhN8BnJBMhXKTkVBRj0lreoAlPkPJOBcasqZZNdmyPMZjWtTC855G2PMG1TRFpx8zxhrAlDIOS+baF+u5FRqzhMpRuRU/66CYsk3qkEH3hzObvXlvcl7a+9FJZ/ToJyasoR7PtNGOfEYlUlSXQytUH6U/j88B1R/Oww8EcRKTi/BT1hQfuQuaH+GeMsZtSdWgzKG87TqjSLr9hub6HogiZWcCb42I376R5jXZggqAdSr56YSSpSbV6ZgpTrRvhNtiwa65FS3N6h/rvd7/wau9K3bAGCTej69kY5xl1OHLMbPZ7iRHOnyAhFdBqWqRKv6/+BIoxoERhq1YzxyxuG/LZ5y8vGomHYoT/ve6hhVoT5DAuTUPGexPJ8hjhsgozq2XvmJBIzF/FzqlTPR16aR85kM16Z8pdYrbSwno/iVSQKAtYwx/zyN2D4RxEDORD9h6ZVTJVFPrEaeqr1jAW6qeJxLvXIm+trUK2eir01JajLpk3AlEolEknzIaD2JRCKRJB1SOUkkEokk6ZDKSSKRSCRJh1ROEkmM8E9IZIxVMMZaGWN1UT7GenXeqgn2cRDJkTEjnseSpC9SOUkkMYBQQg4Am7mxeo4h4Upu0uYQu9VgvGRQPFgrFZQkUqRykkxKVEumhymtMaI+N5S8Ha3KFhWMsXrGGFdlcARta2CMtUfRylrLlXYL/sf1zc8Yq1KPyaNh3akKeFtUJJdMWqRykkxKuNJvJuLePBrUQ0k2nejYdVDKzDigVEjw37YOStmXiK0sVVG2BB0XUGrZbVDHGzFe6NYVJevOxcZ7PUkkhpHKSSKJImrCaaHOJNJmANUAnIyxBmoHtaBmq2rZOLXGJqAWUaoJZ5AmhK7TJ5FoIpWTRKLi51Jbr7q/1vttq/KOqfvUMMaCq5UDSs8ioYOuFn5WSxVlaahKzgWgyavwqDGNz+OAUgYoVHFb3fi5AOsYY02qZQZCSbZAaYGRkAr9ktRn0pYvkkj8UW+uTVD6Dnkb9rUzxjwAdkApv+OtZt0EpVQT1RtpAQz2/eFKu+2VAOoYY20woNxCUANtq6kiaG0pZMCEun8VlPPgURVTE2NsARR3YbV3X3U7EPs+SJI0RSoniUShChD6DrmhuMVa/P4GlJutU8NqCahirhfOebUanNGE6DUEXMvVtgsEAWtLbLyzLYm6fT3UenjqsPe8NCCwOaM/0nKShIV060kkCkXEWCHga0HuwXiPmlIA2zXmaQfdiE8PN6jHIdefjKCGckezeKo3NNzbigN+SsqtBltQSKtJEhZSOUkkCtsBIYHUiXEl5AKwQQ1caOTjXVyDaUOYOUXqzf4GRMfaqEXo/CcjUNXGvedKsBS9a1CyurgkXKRykkxK1BtrBZRIuSrVOqqE0rphPVM6jm5Wk1wBReFUQHF9rWd0S2pvuPaECajqWk0dlGTVgCAIVY5aAGfUfb3HrfSP1gseIygPDoRQj+t1v5X75Tl55QGUtSgqMKNNfa83KGS9ek6q/efyoxRR6sgqmZzIlhkSSQjUXlWVnPNq9W8HgE0AKqg1HfVG3exvXXnLC01gcUUiX8DcqrwOP8Uad9SgkQ3RjBSUTC6k5SSRhCYgyEF1v7VDO/BhMxTrJ1HUInYJxiHxrndJxSSJBKmcJJIQqBaIR83tqVFdWmXQUECq8qpVLRgvHiguw2gXfq2DYsV5/3ZAUQyJDERYyzlPpHKWpAHSrSeRSCSSpENaThKJRCJJOqRykkgkEknSIZWTRCKRSJIOqZwkEolEknRI5SSRSCSSpEMqJ4lEIpEkHf8fLREPN4wwjMAAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "
" ] }, - "metadata": {}, + "metadata": { + "needs_background": "light" + }, "output_type": "display_data" } ], "source": [ + "ffutils.set_mplrc()\n", "plt.clf()\n", - "ax_BPT = plt.gca()\n", - "# Plot FRB 121102\n", - "ax_BPT.plot([np.log10(host121102.neb_lines['[NII] 6583']/host121102.neb_lines['Ha'])],\n", - " [np.log10(host121102.neb_lines['[OIII] 5007']/host121102.neb_lines['Hb'])], 'bo',\n", - " label='Repeater')\n", - "# Axes\n", - "ax_BPT.set_xlabel(r\"$\\log \\, ({\\rm [NII]/H_\\alpha)}$\")\n", - "ax_BPT.set_ylabel(r\"$\\log \\, ({\\rm [OIII]/H_\\beta)}$\")\n", - "ax_BPT.set_xlim(-1.5, 0.5)\n", - "ax_BPT.set_ylim(-1, 1.2)\n", - "# Standard curves\n", - "demarc = lambda x: 0.61 / (x - 0.05) + 1.3 # Kauffman et al 2003, MNRAS, 346, 4, pp. 1055-1077. Eq 1\n", - "demarc_kewley = lambda x: 0.61 / (\n", - " x - 0.47) + 1.19 # Kewley F., Dopita M., Sutherland R., Heisler C., Trevena J., 2001, ApJ, 556,121\n", - "demarc_liner = lambda x: 1.01 * x + 0.48 # Cid Fernandes et al 2010, MNRAS, 403,1036 Eq 10\n", - "ax_BPT.plot(np.linspace(-2, 0), demarc(np.linspace(-2, 0)), \"k-\", lw=2)#, label=\"Kauffman et al 2003\")\n", - "ax_BPT.plot(np.linspace(-2, 0.25), demarc_kewley(np.linspace(-2, 0.25)), \"k--\", lw=2)#, label=\"Kewley et al 2001\")\n", - "ax_BPT.plot(np.linspace(-0.43, 0.5), demarc_liner(np.linspace(-0.43, 0.5)), \"k:\", lw=2)#, label=\"Cid Fernandes et al 2010\")\n", - "# Labels\n", - "lsz = 13.\n", - "ax_BPT.annotate(\"Star-forming\", (-1.30, 0), fontsize=lsz)\n", - "ax_BPT.annotate(\"LINER\", (0.23, 0), fontsize=lsz)\n", - "ax_BPT.annotate(\"Seyfert\", (-0.5, 1), fontsize=lsz)\n", - "# Legend\n", - "ax_BPT.legend(loc=\"lower left\")\n", - "# \n", + "ax = plt.gca()\n", + "ffgal.sub_bpt(ax, [host121102], ['b'], ['*'], show_kewley=True)\n", "plt.show()" ] }, @@ -986,7 +242,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -1002,13 +258,61 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "hg180924 = frb180924.grab_host()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derived properties" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'AV_nebular': 1.0045498154718946,\n", + " 'EBV_photom': 0.26696021019289895,\n", + " 'EBV_photom_err': 0.11409651615769302,\n", + " 'EBV_spec': 0.17217024497708244,\n", + " 'Lnu_r': 8.832473807459252e+21,\n", + " 'Lnu_r_err': 4.416236903729626e+20,\n", + " 'M_r': -20.765205895540973,\n", + " 'M_r_err': 0.05428681023790647,\n", + " 'Mstar': 22454584690.16538,\n", + " 'Mstar_err': 7114264761.28221,\n", + " 'Mstar_spec': 12560336857.112703,\n", + " 'SFR_nebular': 1.68933090286253,\n", + " 'SFR_nebular_err': -999.0,\n", + " 'SFR_photom': 2.9199953061580506,\n", + " 'SFR_photom_err': 3.9101845793972356,\n", + " 'Z_photom': 0.012670477657916993,\n", + " 'Z_photom_err': 0.014291544504794269,\n", + " 'Z_spec': -0.07485665291622498,\n", + " 'f_AGN': 0.2379513222257412,\n", + " 'f_AGN_err': 0.2072343379515631,\n", + " 'u-r': 1.74720683809408,\n", + " 'u-r_err': 0.1627709656798918}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hg180924.derived" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1018,14 +322,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Loading spectra from /data/spec_DB/FRB_specDB_CRAFT.hdf5\n", + "Loading spectra from /u/xavier/SPECDB/FRB_specDB_CRAFT.hdf5\n", "Database is FRB\n", "Created on 2019-Jun-28\n", "Version: v0.1\n", @@ -1040,15 +344,15 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/xavier/Projects/anaconda3/lib/python3.7/site-packages/h5py/_hl/dataset.py:313: H5pyDeprecationWarning: dataset.value has been deprecated. Use dataset[()] instead.\n", + "/home/xavier/anaconda3/lib/python3.7/site-packages/h5py/_hl/dataset.py:313: H5pyDeprecationWarning: dataset.value has been deprecated. Use dataset[()] instead.\n", " \"Use dataset[()] instead.\", H5pyDeprecationWarning)\n", - "/data/Projects/Python/linetools/linetools/spectra/xspectrum1d.py:222: RuntimeWarning: invalid value encountered in greater\n", + "/home/xavier/local/Python/linetools/linetools/spectra/xspectrum1d.py:222: RuntimeWarning: invalid value encountered in greater\n", " gdsigval = np.where(self.data['sig'][kk].data > 0.)[0]\n", - "/data/Projects/Python/linetools/linetools/spectra/xspectrum1d.py:223: RuntimeWarning: invalid value encountered in less_equal\n", + "/home/xavier/local/Python/linetools/linetools/spectra/xspectrum1d.py:223: RuntimeWarning: invalid value encountered in less_equal\n", " badsigval = self.data['sig'][kk].data <= 0.\n", - "/data/Projects/Python/linetools/linetools/spectra/xspectrum1d.py:253: UserWarning: No unit given to wavelength, assuming Angstroms.\n", + "/home/xavier/local/Python/linetools/linetools/spectra/xspectrum1d.py:253: UserWarning: No unit given to wavelength, assuming Angstroms.\n", " warnings.warn(\"No unit given to wavelength, assuming Angstroms.\")\n", - "/data/Projects/FRB/frb/galaxies/frbgalaxy.py:340: UserWarning: Multiple spectra returned for this galaxy. Taking the first, but you may wish to specify your instrument\n", + "/home/xavier/Projects/FRB/frb/galaxies/frbgalaxy.py:340: UserWarning: Multiple spectra returned for this galaxy. Taking the first, but you may wish to specify your instrument\n", " warnings.warn(\"Multiple spectra returned for this galaxy. Taking the first, but you may wish to specify your instrument\")\n" ] } @@ -1059,14 +363,14 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Table length=1\n", - "
\n", + "
\n", "\n", "\n", "\n", @@ -1080,7 +384,7 @@ "326.10521 -40.90022 0.321 0.0 ... MUSE VLT Bannister2019 MUSE" ] }, - "execution_count": 7, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -1098,799 +402,19 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support.' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '
');\n", - " var titletext = $(\n", - " '
');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('
');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('
')\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('
RA_GROUPDEC_GROUPzem_GROUPsig_zemZQREPOCHGROUP_IDFRB_IDNPIXWV_MINWV_MAXSTYPEflag_zemSPEC_FILEDATE-OBSDISPERSERINSTRTELESCOPERefGROUP
float64float64float64float64int64float64float64int64int64int64float64float64str3str8str92str10str4str4str6str13str4
326.10521-40.900220.3210.042000.02000.01537214700.99352.1GALHAND/home/xavier/Projects/FRB/Galaxy_DB/CRAFT/Bannister2019/J214425.25-405400.8_MUSE_A_spec.fits2018-11-05VPHGMUSEVLTBannister2019MUSE