From 2e2e525a389c2214d312b9c334bb57fe051831ee Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 3 Jul 2016 06:11:23 +0000 Subject: [PATCH 01/79] beginning to set up infrastructure for postgres --- postgres/build-db.py | 59 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 postgres/build-db.py diff --git a/postgres/build-db.py b/postgres/build-db.py new file mode 100644 index 0000000..e32a744 --- /dev/null +++ b/postgres/build-db.py @@ -0,0 +1,59 @@ +import psycopg2 +from wodpy import wod +import sys + +# connect to database and create a cursor by which to interact with it. +try: + conn = psycopg2.connect("dbname='root' user='root'") +except: + print "I am unable to connect to the database" + +cur = conn.cursor() + +# set up our table +query = """CREATE TABLE IF NOT EXISTS profiles( + lat real, + long real, + uid integer, + cruise integer, + year integer, + month integer, + day integer, + time real, + probetype integer, + depth real[], + temperature real[], + salinity real[] + );""" +cur.execute(query) + +# populate table from wod-ascii data +fid = open(sys.argv[1]) +while True: + profile = wod.WodProfile(fid) + wodDict = profile.npdict() + wodDict['z'] = "'{" + ",".join(map(str, wodDict['z'])) + "}'" + wodDict['t'] = "'{" + ",".join(map(str, wodDict['t'])) + "}'" + wodDict['s'] = "'{" + ",".join(map(str, wodDict['s'])) + "}'" + + query = """INSERT INTO profiles VALUES( + {p[latitude]}, + {p[longitude]}, + {p[uid]}, + {p[cruise]}, + {p[year]}, + {p[month]}, + {p[day]}, + {p[time]}, + {p[probe_type]}, + {p[z]}, + {p[t]}, + {p[s]} + )""".format(p=wodDict) + query = query.replace('--', 'NULL') + query = query.replace('None', 'NULL') + cur.execute(query) + if profile.is_last_profile_in_file(fid) == True: + break + +conn.commit() From be7f4d047f16db916470d985096d437bd21afcd0 Mon Sep 17 00:00:00 2001 From: BillMills Date: Sat, 2 Jul 2016 23:17:41 -0700 Subject: [PATCH 02/79] dockerfile support for postgres infrastructure --- docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index d9c06c4..d2ed46c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,10 +6,10 @@ RUN conda update -q conda RUN apt-get update # dependencies! -RUN apt-get -y install libhdf5-serial-dev libnetcdf-dev unzip +RUN apt-get -y install libhdf5-serial-dev libnetcdf-dev unzip postgresql libpq-dev python-dev nano RUN conda install --yes python=2.7 pip nose Shapely netCDF4 matplotlib numpy scipy pyproj pandas -RUN pip install seabird>=0.6.3 gsw scikit-fuzzy +RUN pip install seabird>=0.6.3 gsw scikit-fuzzy psycopg2 # Pypi is not working well. Temporary solution RUN pip install git+https://github.com/castelao/oceansdb.git@master#egg=oceansdb RUN pip install git+https://github.com/castelao/CoTeDe.git@master#egg=CoTeDe From d6d0e8b676a00d69f073a7588d5f86517fab7af5 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Mon, 4 Jul 2016 01:18:01 +0000 Subject: [PATCH 03/79] parallel experiments --- AutoQC.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 2d70a28..340fb73 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -4,6 +4,7 @@ import sys, os, json, data.ds import util.main as main import pandas +from multiprocessing import Pool def run(test, profiles): ''' @@ -39,6 +40,8 @@ def processFile(fName): data.ds.threadFile = fName for iprofile, pinfo in enumerate(data.ds.threadProfiles): + if iprofile >= 10: + continue # Load the profile data. p, currentFile, f = main.profileData(pinfo, currentFile, f) # Check that there are temperature data in the profile, otherwise skip. @@ -63,7 +66,7 @@ def processFile(fName): trueVerbose.append(truth[1][0]) profileIDs.append(p.uid()) # testResults[i][j] now contains a flag indicating the exception raised by test i on profile j - + return trueResults, testResults, profileIDs @@ -89,9 +92,19 @@ def processFile(fName): # Parallel processing. print('\nPlease wait while QC is performed\n') - processFile.parallel = main.parallel_function(processFile, sys.argv[2]) - parallel_result = processFile.parallel(filenames) + #processFile.parallel = main.parallel_function(processFile, sys.argv[2]) + #parallel_result = processFile.parallel(filenames) + + pool = Pool(processes=int(sys.argv[2])) + parallel_result = [] + def log_result(result): + parallel_result.append(result) + for i in range(len(filenames)): + pool.apply_async(processFile, (filenames[i],), callback = log_result) + pool.close() + pool.join() + # Recombine results truth, results, profileIDs = main.combineArrays(parallel_result) From 64a0e4b23c983453b1bc75030e30b862d1eaeb2b Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Mon, 4 Jul 2016 01:18:29 +0000 Subject: [PATCH 04/79] tentative new parallelization scheme --- AutoQC.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 340fb73..b9f712f 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -92,9 +92,11 @@ def processFile(fName): # Parallel processing. print('\nPlease wait while QC is performed\n') + # old-style---------------------------------- #processFile.parallel = main.parallel_function(processFile, sys.argv[2]) #parallel_result = processFile.parallel(filenames) - + + # tentative new-style------------------------ pool = Pool(processes=int(sys.argv[2])) parallel_result = [] def log_result(result): @@ -104,7 +106,8 @@ def log_result(result): pool.apply_async(processFile, (filenames[i],), callback = log_result) pool.close() pool.join() - + #-------------------------------------------- + # Recombine results truth, results, profileIDs = main.combineArrays(parallel_result) From db12571d5f87908f3ac2d9f965371c6eee235ec8 Mon Sep 17 00:00:00 2001 From: BillMills Date: Mon, 4 Jul 2016 20:39:37 -0700 Subject: [PATCH 05/79] added truth, variable table name to postgres db builder; start postgres automatically on container launch --- docker/Dockerfile | 5 ++++- postgres/build-db.py | 13 +++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index d2ed46c..4963220 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -5,7 +5,7 @@ RUN conda config --set always_yes yes --set changeps1 no RUN conda update -q conda RUN apt-get update -# dependencies! +# dependencies RUN apt-get -y install libhdf5-serial-dev libnetcdf-dev unzip postgresql libpq-dev python-dev nano RUN conda install --yes python=2.7 pip nose Shapely netCDF4 matplotlib numpy scipy pyproj pandas @@ -30,4 +30,7 @@ ADD woa13_decav_s16_5dv2.nc /AutoQC/data/. ADD etopo5.nc /AutoQC/data/. ADD climatological_t_median_and_amd_for_aqc.nc /AutoQC/data/. +# set up database; load quota_subset.dat into a table 'demo'. +RUN /etc/init.d/postgresql start && su postgres -c 'createuser -s root' && su postgres -c 'createdb root' + ADD bashrc /.bashrc diff --git a/postgres/build-db.py b/postgres/build-db.py index e32a744..3d7d7e6 100644 --- a/postgres/build-db.py +++ b/postgres/build-db.py @@ -1,3 +1,5 @@ +# usage: python build-db.py + import psycopg2 from wodpy import wod import sys @@ -11,7 +13,7 @@ cur = conn.cursor() # set up our table -query = """CREATE TABLE IF NOT EXISTS profiles( +query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( lat real, long real, uid integer, @@ -23,7 +25,8 @@ probetype integer, depth real[], temperature real[], - salinity real[] + salinity real[], + truth boolean );""" cur.execute(query) @@ -35,8 +38,9 @@ wodDict['z'] = "'{" + ",".join(map(str, wodDict['z'])) + "}'" wodDict['t'] = "'{" + ",".join(map(str, wodDict['t'])) + "}'" wodDict['s'] = "'{" + ",".join(map(str, wodDict['s'])) + "}'" + wodDict['truth'] = profile.t_level_qc(originator=True) >= 3 - query = """INSERT INTO profiles VALUES( + query = "INSERT INTO " + sys.argv[2] + """ VALUES( {p[latitude]}, {p[longitude]}, {p[uid]}, @@ -48,7 +52,8 @@ {p[probe_type]}, {p[z]}, {p[t]}, - {p[s]} + {p[s]}, + {p[truth]} )""".format(p=wodDict) query = query.replace('--', 'NULL') query = query.replace('None', 'NULL') From 47282bb81f3837032bb3f3717280e9ce2b790a24 Mon Sep 17 00:00:00 2001 From: BillMills Date: Mon, 4 Jul 2016 20:45:10 -0700 Subject: [PATCH 06/79] corrections to previous --- docker/bashrc | 1 + postgres/build-db.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/bashrc b/docker/bashrc index c6b09e4..46dc9a1 100644 --- a/docker/bashrc +++ b/docker/bashrc @@ -1 +1,2 @@ export OCEANSDB_DIR=/AutoQC/data/ +/etc/init.d/postgresql start diff --git a/postgres/build-db.py b/postgres/build-db.py index 3d7d7e6..ce88b7d 100644 --- a/postgres/build-db.py +++ b/postgres/build-db.py @@ -38,7 +38,7 @@ wodDict['z'] = "'{" + ",".join(map(str, wodDict['z'])) + "}'" wodDict['t'] = "'{" + ",".join(map(str, wodDict['t'])) + "}'" wodDict['s'] = "'{" + ",".join(map(str, wodDict['s'])) + "}'" - wodDict['truth'] = profile.t_level_qc(originator=True) >= 3 + wodDict['truth'] = sum(profile.t_level_qc(originator=True) >= 3) >= 1 query = "INSERT INTO " + sys.argv[2] + """ VALUES( {p[latitude]}, From 24976b285262e2cff6a77dee941dc4ae705c4cd2 Mon Sep 17 00:00:00 2001 From: BillMills Date: Mon, 4 Jul 2016 22:00:53 -0700 Subject: [PATCH 07/79] incremental process to async postgres row processing --- AutoQC.py | 53 +++++++++++++++++++++++++++++++++++++++++----------- util/main.py | 14 ++++++++++---- 2 files changed, 52 insertions(+), 15 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index b9f712f..34e8f9d 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -3,7 +3,7 @@ import numpy as np import sys, os, json, data.ds import util.main as main -import pandas +import pandas, psycopg2 from multiprocessing import Pool def run(test, profiles): @@ -96,24 +96,55 @@ def processFile(fName): #processFile.parallel = main.parallel_function(processFile, sys.argv[2]) #parallel_result = processFile.parallel(filenames) - # tentative new-style------------------------ - pool = Pool(processes=int(sys.argv[2])) + # new-style (per file)------------------------ + # pool = Pool(processes=int(sys.argv[2])) + # parallel_result = [] + # def log_result(result): + # '''helper to run as callback after a file is processed''' + # parallel_result.append(result) + + # for i in range(len(filenames)): + # pool.apply_async(processFile, (filenames[i],), callback = log_result) + # pool.close() + # pool.join() + # new-style (per db row)---------------------- parallel_result = [] def log_result(result): + '''helper to run as callback after a file is processed''' parallel_result.append(result) - for i in range(len(filenames)): - pool.apply_async(processFile, (filenames[i],), callback = log_result) + def process_row(i): + '''run all tests on the ith database row''' + + # extract profile + cur.execute('SELECT * FROM demo LIMIT 1 OFFSET ' + str(i)) + row = cur.fetchall() + profile = main.mock_wodpy(row[0]) + print profile.uid() + + conn = psycopg2.connect("dbname='root' user='root'") + cur = conn.cursor() + cur.execute('SELECT COUNT(*) FROM demo') + nRows = cur.fetchall()[0][0] + + # launch async processes + pool = Pool(processes=int(sys.argv[2])) + for i in range(10): + pool.apply_async(process_row, (i,), callback = log_result) pool.close() pool.join() - #-------------------------------------------- + + + + + # ------------------------------------------- - # Recombine results - truth, results, profileIDs = main.combineArrays(parallel_result) + # # Recombine results + # truth, results, profileIDs = main.combineArrays(parallel_result) - # Print summary statistics and write output file. - main.printSummary(truth, results, testNames) - main.generateCSV(truth, results, testNames, profileIDs, sys.argv[1]) + # # Print summary statistics and write output file. + # main.printSummary(truth, results, testNames) + # main.generateCSV(truth, results, testNames, profileIDs, sys.argv[1]) else: print 'Please add command line arguments to name your output file and set parallelization:' print 'python AutoQC myFile 4' diff --git a/util/main.py b/util/main.py index 16f678b..05040ed 100644 --- a/util/main.py +++ b/util/main.py @@ -73,7 +73,7 @@ def catchFlags(profile): def referenceResults(profiles): ''' - extract the summary reference result for each profile: + extract the summary reference result for each profile: DEPRECATED ''' refResult = [] verbose = [] @@ -108,7 +108,7 @@ def generateCSV(truth, results, tests, primaryKeys, name): def parallel_function(f, nfold=2): ''' - thanks http://scottsievert.github.io/blog/2014/07/30/simple-python-parallelism/ + thanks http://scottsievert.github.io/blog/2014/07/30/simple-python-parallelism/ DEPRECATED ''' def easy_parallize(f, sequence): """ assumes f takes sequence as input, easy w/ Python's scope """ @@ -251,9 +251,9 @@ def combineArrays(parallelResults): def sort_headers(headers): ''' - takes a list of headers, and sorts them into a dictionary keyed by cruise number + takes a list of headers, and sorts them into a dictionary keyed by cruise number containing a list of corresponding headers; - header lists are then time sorted. + header lists are then time sorted. DEPRECATED ''' sortedHeaders = {} @@ -269,7 +269,13 @@ def sort_headers(headers): return sortedHeaders +def mock_wodpy(row): + ''' + given a single row from a postgres cursor, return an object that mocks + a wodpy object with the same values + ''' + return testingProfile.fakeProfile(row[10], row[9], latitude=row[0], longitude=row[1], date=[row[4], row[5], row[6], row[7]], probe_type=row[8], salinities=row[11], pressures=None, uid=row[2], cruise=row[3]) From 80c6c9821e32226b1b7d838af217d1dfb44a592e Mon Sep 17 00:00:00 2001 From: BillMills Date: Mon, 4 Jul 2016 22:03:26 -0700 Subject: [PATCH 08/79] remove a couple of hacks --- AutoQC.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 34e8f9d..d4e54b6 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -40,8 +40,6 @@ def processFile(fName): data.ds.threadFile = fName for iprofile, pinfo in enumerate(data.ds.threadProfiles): - if iprofile >= 10: - continue # Load the profile data. p, currentFile, f = main.profileData(pinfo, currentFile, f) # Check that there are temperature data in the profile, otherwise skip. @@ -129,7 +127,7 @@ def process_row(i): # launch async processes pool = Pool(processes=int(sys.argv[2])) - for i in range(10): + for i in range(nRows): pool.apply_async(process_row, (i,), callback = log_result) pool.close() pool.join() From ce4d0a79db41db36d0b1072688565b4fe19ea553 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Tue, 12 Jul 2016 03:34:52 +0000 Subject: [PATCH 09/79] moving towards full testing --- AutoQC.py | 46 +++++++++++------------------ postgres/build-db.py => build-db.py | 18 +++++++++-- util/main.py | 6 ++-- util/testingProfile.py | 10 +++++-- 4 files changed, 43 insertions(+), 37 deletions(-) rename postgres/build-db.py => build-db.py (79%) diff --git a/AutoQC.py b/AutoQC.py index d4e54b6..71b09c1 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -82,34 +82,8 @@ def processFile(fName): for testName in testNames: print(' {}'.format(testName)) - # Identify data files and create a profile list. - filenames = main.readInput('datafiles.json') - profiles = main.extractProfiles(filenames) - data.ds.profiles = profiles - print('\n{} file(s) will be read containing {} profiles'.format(len(filenames), len(profiles))) - # Parallel processing. print('\nPlease wait while QC is performed\n') - # old-style---------------------------------- - #processFile.parallel = main.parallel_function(processFile, sys.argv[2]) - #parallel_result = processFile.parallel(filenames) - - # new-style (per file)------------------------ - # pool = Pool(processes=int(sys.argv[2])) - # parallel_result = [] - # def log_result(result): - # '''helper to run as callback after a file is processed''' - # parallel_result.append(result) - - # for i in range(len(filenames)): - # pool.apply_async(processFile, (filenames[i],), callback = log_result) - # pool.close() - # pool.join() - # new-style (per db row)---------------------- - parallel_result = [] - def log_result(result): - '''helper to run as callback after a file is processed''' - parallel_result.append(result) def process_row(i): '''run all tests on the ith database row''' @@ -118,8 +92,22 @@ def process_row(i): cur.execute('SELECT * FROM demo LIMIT 1 OFFSET ' + str(i)) row = cur.fetchall() profile = main.mock_wodpy(row[0]) + + # data pre-validation + # ---tbd--- + + # run tests + results = [profile.qcflag()] + for itest, test in enumerate(testNames): + if test[0:5] != 'CSIRO': # testing on CSIRO suite for now + continue + result = run(test, [profile]) + query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" + cur.execute(query) + print profile.uid() + # connect to database & determine how many profiles are present conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() cur.execute('SELECT COUNT(*) FROM demo') @@ -127,14 +115,14 @@ def process_row(i): # launch async processes pool = Pool(processes=int(sys.argv[2])) - for i in range(nRows): - pool.apply_async(process_row, (i,), callback = log_result) + for i in range(nRows): # <-- this is not quite right; examine the list of uids printed in process_row, duplicates found. + pool.apply_async(process_row, (i,)) pool.close() pool.join() + conn.commit() - # ------------------------------------------- # # Recombine results diff --git a/postgres/build-db.py b/build-db.py similarity index 79% rename from postgres/build-db.py rename to build-db.py index ce88b7d..f5b49f7 100644 --- a/postgres/build-db.py +++ b/build-db.py @@ -3,6 +3,7 @@ import psycopg2 from wodpy import wod import sys +import util.main as main # connect to database and create a cursor by which to interact with it. try: @@ -12,6 +13,10 @@ cur = conn.cursor() +# Identify tests +testNames = main.importQC('qctests') +testNames.sort() + # set up our table query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( lat real, @@ -26,8 +31,15 @@ depth real[], temperature real[], salinity real[], - truth boolean - );""" + truth boolean, + """ +for i in range(len(testNames)): + query += testNames[i].lower() + ' boolean' + if i= 3) >= 1 - query = "INSERT INTO " + sys.argv[2] + """ VALUES( + query = "INSERT INTO " + sys.argv[2] + " (lat, long, uid, cruise, year, month, day, time, probetype, depth, temperature, salinity, truth) " + """ VALUES( {p[latitude]}, {p[longitude]}, {p[uid]}, diff --git a/util/main.py b/util/main.py index 05040ed..85eaec3 100644 --- a/util/main.py +++ b/util/main.py @@ -4,6 +4,7 @@ import numpy as np from wodpy import wod from netCDF4 import Dataset +import testingProfile def readInput(JSONlist): '''Create a list of data file names from a json array.''' @@ -274,9 +275,8 @@ def mock_wodpy(row): given a single row from a postgres cursor, return an object that mocks a wodpy object with the same values ''' - - return testingProfile.fakeProfile(row[10], row[9], latitude=row[0], longitude=row[1], date=[row[4], row[5], row[6], row[7]], probe_type=row[8], salinities=row[11], pressures=None, uid=row[2], cruise=row[3]) - + + return testingProfile.fakeProfile(row[10], row[9], latitude=row[0], longitude=row[1], date=[row[4], row[5], row[6], row[7]], probe_type=row[8], salinities=row[11], pressures=None, uid=row[2], cruise=row[3], qcflag=row[12]) diff --git a/util/testingProfile.py b/util/testingProfile.py index 904cbde..85f9289 100644 --- a/util/testingProfile.py +++ b/util/testingProfile.py @@ -7,7 +7,8 @@ class fakeProfile: implementations of qc-tests. ''' - def __init__(self, temperatures, depths, latitude=None, longitude=None, date=[1999, 12, 31, 0], probe_type=None, salinities=None, pressures=None, uid=None, cruise=None): + def __init__(self, temperatures, depths, latitude=None, longitude=None, date=[1999, 12, 31, 0], probe_type=None, salinities=None, pressures=None, uid=None, cruise=None, qcflag=False): + self.temperatures = temperatures if salinities is None: self.salinities = np.ma.array(temperatures, mask=True) @@ -29,6 +30,7 @@ def __init__(self, temperatures, depths, latitude=None, longitude=None, date=[19 self.primary_header['Time'] = date[3] self.primary_header['WOD unique cast number'] = uid self.primary_header['Cruise number'] = cruise + self.primary_header['QC summary flag'] = qcflag self.secondary_header = {'entries':[]} if probe_type is not None: @@ -117,4 +119,8 @@ def z_level_qc(self): return np.zeros(self.depths.shape).astype('bool') def t_qc_mask(self): - return np.zeros(self.temperatures.shape).astype('bool') \ No newline at end of file + return np.zeros(self.temperatures.shape).astype('bool') + + def qcflag(self): + """ Returns the time. """ + return self.primary_header['QC summary flag'] From e8213cd7664aafcac0dbb266e77326775500264f Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Wed, 13 Jul 2016 01:49:17 +0000 Subject: [PATCH 10/79] fixed loop over postgres rows --- AutoQC.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 71b09c1..fa7bbbe 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -85,11 +85,11 @@ def processFile(fName): # Parallel processing. print('\nPlease wait while QC is performed\n') - def process_row(i): + def process_row(uid): '''run all tests on the ith database row''' # extract profile - cur.execute('SELECT * FROM demo LIMIT 1 OFFSET ' + str(i)) + cur.execute('SELECT * FROM demo WHERE uid = ' + str(uid) ) row = cur.fetchall() profile = main.mock_wodpy(row[0]) @@ -107,16 +107,16 @@ def process_row(i): print profile.uid() - # connect to database & determine how many profiles are present + # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() - cur.execute('SELECT COUNT(*) FROM demo') - nRows = cur.fetchall()[0][0] + cur.execute('SELECT uid FROM demo') + uids = cur.fetchall() # launch async processes pool = Pool(processes=int(sys.argv[2])) - for i in range(nRows): # <-- this is not quite right; examine the list of uids printed in process_row, duplicates found. - pool.apply_async(process_row, (i,)) + for i in range(len(uids)): + pool.apply_async(process_row, (uids[i][0],)) pool.close() pool.join() From 06bc390c10edf42b0860d5c94c81d641ada76cfe Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 14 Jul 2016 23:15:23 +0000 Subject: [PATCH 11/79] began building summary from postgres table --- summarize-results.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 summarize-results.py diff --git a/summarize-results.py b/summarize-results.py new file mode 100644 index 0000000..c536010 --- /dev/null +++ b/summarize-results.py @@ -0,0 +1,30 @@ +import util.main as main +import psycopg2, pandas + +# what tests are available +testNames = main.importQC('qctests') +testNames.sort() + +testNames = [test for test in testNames if test[0:5] == 'CSIRO'] + +# connect to database +conn = psycopg2.connect("dbname='root' user='root'") +cur = conn.cursor() + +# extract matrix of test results and true flags into a dataframe +query = 'SELECT truth' +for test in testNames: + query += ', ' + test.lower() +query += ' FROM demo' + +cur.execute(query) +rawresults = cur.fetchall() + +df = pandas.DataFrame(rawresults) +df.columns = ['Truth'] + testNames + +# summarize results +print('%35s %7s %7s %7s %7s %7s' % ('NAME OF TEST', 'FAILS', 'TPR', 'FPR', 'TNR', 'FNR')) +for test in testNames: + tpr, fpr, fnr, tnr = main.calcRates(df[test].tolist(), df['Truth'].tolist()) + print('%35s %7i %6.1f%1s %6.1f%1s %6.1f%1s %6.1f%1s' % (test, sum(df[test].tolist()), tpr, '%', fpr, '%', tnr, '%', fnr, '%')) From d90aa64c38267782c289fbe329c6ce6b95930dde Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 21 Jul 2016 06:55:26 +0000 Subject: [PATCH 12/79] rethinking on-the-fly data presence checking for new db backend --- AutoQC.py | 11 +++--- build-db.py | 6 ++- qctests/CSIRO_constant_bottom.py | 32 +++++++--------- qctests/CSIRO_depth.py | 18 ++++----- qctests/CSIRO_long_gradient.py | 32 +++++++--------- qctests/CSIRO_short_gradient.py | 24 +++++------- qctests/CSIRO_surface_spikes.py | 24 ++++++------ qctests/CSIRO_wire_break.py | 16 ++++---- util/main.py | 64 +++++++++++++++++++++++++++++--- 9 files changed, 132 insertions(+), 95 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index fa7bbbe..42a5259 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -91,21 +91,22 @@ def process_row(uid): # extract profile cur.execute('SELECT * FROM demo WHERE uid = ' + str(uid) ) row = cur.fetchall() - profile = main.mock_wodpy(row[0]) - + profile = main.row2dict(row[0]) + # data pre-validation # ---tbd--- # run tests - results = [profile.qcflag()] + results = [profile['qcflag']] for itest, test in enumerate(testNames): if test[0:5] != 'CSIRO': # testing on CSIRO suite for now continue + result = run(test, [profile]) - query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" + query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile['uid']) + ";" cur.execute(query) - print profile.uid() + print profile['uid'] # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") diff --git a/build-db.py b/build-db.py index f5b49f7..ae6632f 100644 --- a/build-db.py +++ b/build-db.py @@ -32,6 +32,7 @@ temperature real[], salinity real[], truth boolean, + n_levels integer, """ for i in range(len(testNames)): query += testNames[i].lower() + ' boolean' @@ -52,7 +53,7 @@ wodDict['s'] = "'{" + ",".join(map(str, wodDict['s'])) + "}'" wodDict['truth'] = sum(profile.t_level_qc(originator=True) >= 3) >= 1 - query = "INSERT INTO " + sys.argv[2] + " (lat, long, uid, cruise, year, month, day, time, probetype, depth, temperature, salinity, truth) " + """ VALUES( + query = "INSERT INTO " + sys.argv[2] + " (lat, long, uid, cruise, year, month, day, time, probetype, depth, temperature, salinity, truth, n_levels) " + """ VALUES( {p[latitude]}, {p[longitude]}, {p[uid]}, @@ -65,7 +66,8 @@ {p[z]}, {p[t]}, {p[s]}, - {p[truth]} + {p[truth]}, + {p[n_levels]} )""".format(p=wodDict) query = query.replace('--', 'NULL') query = query.replace('None', 'NULL') diff --git a/qctests/CSIRO_constant_bottom.py b/qctests/CSIRO_constant_bottom.py index 1a0efde..95fb50b 100644 --- a/qctests/CSIRO_constant_bottom.py +++ b/qctests/CSIRO_constant_bottom.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -11,30 +12,25 @@ def test(p): of quality control decisions with False where the data value has passed the check and True where it failed. """ - + # Get temperature values from the profile. - t = p.t() + t = p['t'] # depths - d = p.z() + d = p['z'] # is this an xbt? - isXBT = p.probe_type() == 2 - latitude = p.latitude() - + isXBT = p['probe_type'] == 2 + latitude = p['latitude'] + # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isDepth = (d.mask==False) - isData = isTemperature & isDepth + qc = numpy.zeros(len(t), dtype=bool) # need more than one level - if len(isData) < 2: + if len(d) < 2: return qc - + # constant temperature at bottom of profile, for latitude > -40 and bottom two depths at least 30m apart: - if isData[-1] and isData[-2] and isXBT: - if t.data[-1] == t.data[-2] and latitude > -40 and d.data[-1] - d.data[-2] > 30: + if main.dataPresent(('t', 'z'), -1, p) and main.dataPresent(('t', 'z'), -2, p) and isXBT: + if t[-1] == t[-2] and latitude > -40 and d[-1] - d[-2] > 30: qc[-1] = True - - return qc \ No newline at end of file + + return qc diff --git a/qctests/CSIRO_depth.py b/qctests/CSIRO_depth.py index d86d9d4..af91825 100644 --- a/qctests/CSIRO_depth.py +++ b/qctests/CSIRO_depth.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -13,21 +14,18 @@ def test(p): """ # Get depth values (m) from the profile. - d = p.z() + d = p['z'] # is this an xbt? - isXBT = p.probe_type() == 2 + isXBT = p['probe_type'] == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(p.n_levels(), dtype=bool) + qc = numpy.zeros(p['n_levels'], dtype=bool) - # check for gaps in data - isDepth = (d.mask==False) - - for i in range(p.n_levels()): - if isDepth[i]: + for i in range(p['n_levels']): + if main.dataPresent(('z'), i, p): # too-shallow temperatures on XBT probes # note we simply flag this profile for manual QC, in order to minimize false negatives. - if isXBT and d.data[i] < 3.6: + if isXBT and d[i] < 3.6: qc[i] = True - return qc \ No newline at end of file + return qc diff --git a/qctests/CSIRO_long_gradient.py b/qctests/CSIRO_long_gradient.py index ad3308d..881c174 100644 --- a/qctests/CSIRO_long_gradient.py +++ b/qctests/CSIRO_long_gradient.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -13,40 +14,35 @@ def test(p): """ # depths - d = p.z() + d = p['z'] # temperatures - t = p.t() + t = p['t'] # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isDepth = (d.mask==False) - isTemperature = (t.mask==False) - isData = isTemperature & isDepth + qc = numpy.zeros(len(t), dtype=bool) on_inv = False # are we currently in an inversion? - for i in range(0, p.n_levels()-1 ): - if isData[i] and isData[i+1]: + for i in range(0, p['n_levels']-1 ): + if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t', 'z'), i+1, p): # not interested below 5m: - if d.data[i] < 5: continue + if d[i] < 5: continue - if t.data[i+1] > t.data[i] and not on_inv: + if t[i+1] > t[i] and not on_inv: # entering an inversion - start_inv_temp = t.data[i] - start_inv_depth = d.data[i] + start_inv_temp = t[i] + start_inv_depth = d[i] potential_flag = i on_inv = True - if t.data[i+1] < t.data[i] and on_inv: + if t[i+1] < t[i] and on_inv: # exiting the inversion - end_inv_temp = t.data[i] - end_inv_depth = d.data[i] + end_inv_temp = t[i] + end_inv_depth = d[i] on_inv = False gradlong = (end_inv_depth - start_inv_depth) / (end_inv_temp - start_inv_depth) if abs(gradlong) < 4: qc[potential_flag] = True - return qc \ No newline at end of file + return qc diff --git a/qctests/CSIRO_short_gradient.py b/qctests/CSIRO_short_gradient.py index 959756a..9de632b 100644 --- a/qctests/CSIRO_short_gradient.py +++ b/qctests/CSIRO_short_gradient.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -13,25 +14,20 @@ def test(p): """ # depths - d = p.z() + d = p['z'] # temperatures - t = p.t() - + t = p['t'] + # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isDepth = (d.mask==False) - isTemperature = (t.mask==False) - isData = isTemperature & isDepth + qc = numpy.zeros(len(t), dtype=bool) - for i in range(0, p.n_levels()-1 ): - if isData[i] and isData[i+1]: - deltaD = (d.data[i+1] - d.data[i]) - deltaT = (t.data[i+1] - t.data[i]) + for i in range(0, p['n_levels']-1 ): + if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t', 'z'), i+1, p): + deltaD = (d[i+1] - d[i]) + deltaT = (t[i+1] - t[i]) gradshort = deltaD / deltaT if (deltaT > 0.5 and deltaD < 30) or abs(gradshort) < 0.4 or (gradshort > 0 and gradshort < 12.5): if abs(deltaT) > 0.4: qc[i] = True - return qc \ No newline at end of file + return qc diff --git a/qctests/CSIRO_surface_spikes.py b/qctests/CSIRO_surface_spikes.py index f88c601..ac2e3cc 100644 --- a/qctests/CSIRO_surface_spikes.py +++ b/qctests/CSIRO_surface_spikes.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -13,26 +14,23 @@ def test(p): """ # depths - d = p.z() + d = p['z'] # is this an xbt? - isXBT = p.probe_type() == 2 + isXBT = p['probe_type'] == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(len(d.data), dtype=bool) - - # check for gaps in data - isDepth = (d.mask==False) + qc = numpy.zeros(len(d), dtype=bool) if not isXBT: return qc - + # flag any level that is shallower than 4m and is followed by a level shallower than 8m. - for i in range(p.n_levels()): - if isDepth[i]: - if d.data[i] < 4 and i < p.n_levels()-1: #only interested in depths less than 4m and not at the bottom of the profile. - if d.data[i+1] < 8: + for i in range(p['n_levels']): + if main.dataPresent(('z'), i, p): + if d[i] < 4 and i < p['n_levels']-1: #only interested in depths less than 4m and not at the bottom of the profile. + if d[i+1] < 8: qc[i] = True else: break - - return qc \ No newline at end of file + + return qc diff --git a/qctests/CSIRO_wire_break.py b/qctests/CSIRO_wire_break.py index 68fc2e7..f8196b6 100644 --- a/qctests/CSIRO_wire_break.py +++ b/qctests/CSIRO_wire_break.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -13,19 +14,16 @@ def test(p): """ # Get temperature values from the profile. - t = p.t() + t = p['t'] # is this an xbt? - isXBT = p.probe_type() == 2 + isXBT = p['probe_type'] == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) + qc = numpy.zeros(len(t), dtype=bool) # wire breaks at bottom of profile: - if isTemperature[-1] and isXBT: - if t.data[-1] < -2.8 or t.data[-1] > 36: + if main.dataPresent(('t'), -1, p) and isXBT: + if t[-1] < -2.8 or t[-1] > 36: qc[-1] = True - return qc \ No newline at end of file + return qc diff --git a/util/main.py b/util/main.py index 85eaec3..16c078d 100644 --- a/util/main.py +++ b/util/main.py @@ -5,6 +5,7 @@ from wodpy import wod from netCDF4 import Dataset import testingProfile +from numbers import Number def readInput(JSONlist): '''Create a list of data file names from a json array.''' @@ -278,10 +279,61 @@ def mock_wodpy(row): return testingProfile.fakeProfile(row[10], row[9], latitude=row[0], longitude=row[1], date=[row[4], row[5], row[6], row[7]], probe_type=row[8], salinities=row[11], pressures=None, uid=row[2], cruise=row[3], qcflag=row[12]) +def row2dict(row): + ''' + given a single row from a postgres cursor, return a dictionary containing the row's info, keyed as a wodpy object + ''' - - - - - - + profile = { + 'latitude': row[0], + 'longitude': row[1], + 'uid': row[2], + 'cruise': row[3], + 'year': row[4], + 'month': row[5], + 'day': row[6], + 'time': row[7], + 'probe_type': row[8], + 'z': row[9], + 't': row[10], + 's': row[11], + 'qcflag': row[12], + 'n_levels': row[13] + } + + return profile + +def dataPresent(keys, level, profile): + ''' + keys: tuple of key names found in the return object of row2dict + level: index number of level in question + profile: return object from row2dict + returns true if all the listed keys have a sensible value in the provided profile at the indicated level; + false otherwise. + ''' + + present = True + + for key in keys: + if key in ['latitude', 'longitude', 'time']: + # must be float + present = present and isinstance(profile[key], Number) + + elif key in ['uid', 'cruise', 'year', 'month', 'day', 'probe_type', 'n_levels']: + # muse be int + present = present and isinstance(profile[key], (int, long)) + + elif key in ['z', 't', 's']: + # must be float at given level + if level >= len(profile[key]): + return False + present = present and isinstance(profile[key][level], Number) + if key == 't': + # t = 99.9 indicates missing value + present = present and profile[key][level] != 99.9 + + elif key in ['qcflag']: + # must be bool + present = present and isinstance(profile[key], bool) + + return present From 063e4407d1ed22604a83a246212108b7feb42feb Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 21 Jul 2016 23:57:20 +0000 Subject: [PATCH 13/79] fix for csiro short gradient divide by 0 problems --- qctests/CSIRO_short_gradient.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qctests/CSIRO_short_gradient.py b/qctests/CSIRO_short_gradient.py index 9de632b..0a79b7f 100644 --- a/qctests/CSIRO_short_gradient.py +++ b/qctests/CSIRO_short_gradient.py @@ -20,11 +20,13 @@ def test(p): # initialize qc as a bunch of falses; qc = numpy.zeros(len(t), dtype=bool) - + for i in range(0, p['n_levels']-1 ): if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t', 'z'), i+1, p): deltaD = (d[i+1] - d[i]) deltaT = (t[i+1] - t[i]) + if deltaT == 0: + continue gradshort = deltaD / deltaT if (deltaT > 0.5 and deltaD < 30) or abs(gradshort) < 0.4 or (gradshort > 0 and gradshort < 12.5): if abs(deltaT) > 0.4: From 1bb1168de9321b2dde5834c32ec7319a77ad11ce Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Fri, 22 Jul 2016 00:50:57 +0000 Subject: [PATCH 14/79] began translating argo tests --- AutoQC.py | 4 +-- qctests/Argo_global_range_check.py | 17 ++++++--- qctests/Argo_gradient_test.py | 22 +++++------- qctests/Argo_impossible_date_test.py | 8 ++--- qctests/Argo_impossible_location_test.py | 4 +-- qctests/Argo_pressure_increasing_test.py | 44 ++++++++++++------------ qctests/Argo_regional_range_test.py | 18 +++++----- qctests/Argo_spike_test.py | 22 +++++------- summarize-results.py | 2 +- util/obs_utils.py | 4 +-- 10 files changed, 69 insertions(+), 76 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 42a5259..508c137 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -99,9 +99,9 @@ def process_row(uid): # run tests results = [profile['qcflag']] for itest, test in enumerate(testNames): - if test[0:5] != 'CSIRO': # testing on CSIRO suite for now + if test[0:4] != 'Argo': # testing on Argo suite for now continue - + result = run(test, [profile]) query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile['uid']) + ";" cur.execute(query) diff --git a/qctests/Argo_global_range_check.py b/qctests/Argo_global_range_check.py index f20cc95..8d38363 100644 --- a/qctests/Argo_global_range_check.py +++ b/qctests/Argo_global_range_check.py @@ -6,6 +6,8 @@ """ from util import obs_utils +import util.main as main +import numpy def test(p): """ @@ -15,15 +17,20 @@ def test(p): """ # Get temperature and pressure values from the profile. - t = p.t() - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + t = p['t'] + z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) + # initialize qc as a bunch of falses; + qc = numpy.zeros(p['n_levels'], dtype=bool) + # Make the quality control decisions. This should # return true if the temperature is outside -2.5 deg C # and 40 deg C or pressure is less than -5. - qct = (t.mask == False) & ((t.data < -2.5) | (t.data > 40.0)) - qcp = (z.mask == False) & (z.data < -5) - qc = qct | qcp + for i in range(p['n_levels']): + if main.dataPresent(('t'), i, p): + qc[i] == t[i] > -2.5 and t[i] < 40.0 + if main.dataPresent(('z', 'latitude'), i, p): + qc[i] == qc[i] and z[i] > -5 return qc diff --git a/qctests/Argo_gradient_test.py b/qctests/Argo_gradient_test.py index 4daddf6..1f83f74 100644 --- a/qctests/Argo_gradient_test.py +++ b/qctests/Argo_gradient_test.py @@ -4,6 +4,7 @@ import numpy from util import obs_utils +import util.main as main def test(p): """ @@ -13,27 +14,20 @@ def test(p): """ # Get temperature values from the profile. - t = p.t() + t = p['t'] # Get depth values (m) from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' + z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) # initialize qc as a bunch of falses; # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isPressure = (z.mask==False) - isData = isTemperature & isPressure + qc = numpy.zeros(p['n_levels'], dtype=bool) - for i in range(1,len(t.data)-1): - if isData[i] & isTemperature[i-1] & isTemperature[i+1]: + for i in range(1,p['n_levels']-1): + if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t'), i-1, p) and main.dataPresent(('t'), i+1, p): - isSlope = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) + isSlope = numpy.abs(t[i] - (t[i-1] + t[i+1])/2) - if z.data[i] < 500: + if z[i] < 500: qc[i] = isSlope > 9.0 else: qc[i] = isSlope > 3.0 diff --git a/qctests/Argo_impossible_date_test.py b/qctests/Argo_impossible_date_test.py index 963736b..f641a19 100644 --- a/qctests/Argo_impossible_date_test.py +++ b/qctests/Argo_impossible_date_test.py @@ -15,10 +15,10 @@ def test(p): """ # Get the year, month, day and time: - year = p.year() - month = p.month() - day = p.day() - time = p.time() + year = p['year'] + month = p['month'] + day = p['day'] + time = p['time'] # initialize qc as false: qc = numpy.zeros(1, dtype=bool) diff --git a/qctests/Argo_impossible_location_test.py b/qctests/Argo_impossible_location_test.py index 8a2276f..bbd2321 100644 --- a/qctests/Argo_impossible_location_test.py +++ b/qctests/Argo_impossible_location_test.py @@ -13,8 +13,8 @@ def test(p): """ # Get the lat and long: - latitude = p.latitude() - longitude = p.longitude() + latitude = p['latitude'] + longitude = p['longitude'] # initialize qc as false: qc = numpy.zeros(1, dtype=bool) diff --git a/qctests/Argo_pressure_increasing_test.py b/qctests/Argo_pressure_increasing_test.py index 6f25b89..6a54d3c 100644 --- a/qctests/Argo_pressure_increasing_test.py +++ b/qctests/Argo_pressure_increasing_test.py @@ -8,6 +8,7 @@ import numpy as np from util import obs_utils +import util.main as main def test(p): """ @@ -15,36 +16,35 @@ def test(p): of quality control decisions with False where the data value has passed the check and True where it failed. """ - + # Get vertical coordinate values from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - + z = obs_utils.depth_to_pressure(np.asarray(p['z']), p['latitude']) + # Make the quality control decisions. This should # return true where z decreases or stays the same. - qc = np.ndarray(p.n_levels(), dtype=bool) + qc = np.ndarray(p['n_levels'], dtype=bool) qc[:] = False iRef = -1 - for i in range(0, p.n_levels()): + for i in range(0, p['n_levels']): # Check if the data value is missing. - if z.mask[i] == True: - continue + if main.dataPresent(('z'), i, p): - # The first level with a z value is saved to use as a reference - # to compare to the next level. - if iRef == -1: - iRef = i - zRef = z[iRef] - continue + # The first level with a z value is saved to use as a reference + # to compare to the next level. + if iRef == -1: + iRef = i + zRef = z[iRef] + continue - # Check for non-increasing z. If z increases, update the reference. - if z[i] == zRef: - qc[i] = True - elif z[i] < zRef: - qc[iRef] = True - qc[i] = True - else: - iRef = i - zRef = z[iRef] + # Check for non-increasing z. If z increases, update the reference. + if z[i] == zRef: + qc[i] = True + elif z[i] < zRef: + qc[iRef] = True + qc[i] = True + else: + iRef = i + zRef = z[iRef] return qc diff --git a/qctests/Argo_regional_range_test.py b/qctests/Argo_regional_range_test.py index 3e2d89e..ddab536 100644 --- a/qctests/Argo_regional_range_test.py +++ b/qctests/Argo_regional_range_test.py @@ -5,6 +5,7 @@ import numpy import pyproj from shapely.geometry import Polygon, Point +import util.main as main def test(p): """ @@ -20,21 +21,18 @@ def test(p): mediterraneanLong = [6., 40., 35., 20., 15., 5., 6.] # Get the lat and long and temp: - latitude = p.latitude() - longitude = p.longitude() - t = p.t() - - # check for gaps in data - isTemperature = (t.mask==False) - + latitude = p['latitude'] + longitude = p['longitude'] + t = p['t'] + # initialize qc as false (all pass) - qc = numpy.zeros(len(t), dtype=bool) + qc = numpy.zeros(p['n_levels'], dtype=bool) isInRedSea = isInRegion(latitude, longitude, redSeaLat, redSeaLong) isInMediterranean = isInRegion(latitude, longitude, mediterraneanLat, mediterraneanLong) - for i in range(p.n_levels()): - if isTemperature[i]: + for i in range(p['n_levels']): + if main.dataPresent(('t'), i, p): if isInRedSea: if t[i] < 21.7 or t[i] > 40.: qc[i] = True diff --git a/qctests/Argo_spike_test.py b/qctests/Argo_spike_test.py index a302571..f5881f5 100644 --- a/qctests/Argo_spike_test.py +++ b/qctests/Argo_spike_test.py @@ -4,6 +4,7 @@ import numpy from util import obs_utils +import util.main as main def test(p): """ @@ -13,25 +14,18 @@ def test(p): """ # Get temperature values from the profile. - t = p.t() + t = p['t'] # Get pressure values (db) from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' - + z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) + # initialize qc as a bunch of falses; # implies all measurements pass when a spike can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isPressure = (z.mask==False) - isData = isTemperature & isPressure + qc = numpy.zeros(p['n_levels'], dtype=bool) - for i in range(1,len(t.data)-1): - if isData[i] & isTemperature[i-1] & isTemperature[i+1]: + for i in range(1,p['n_levels']-1): + if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t'), i-1, p) and main.dataPresent(('t'), i+1, p): - isSpike = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - numpy.abs((t.data[i+1] - t.data[i-1])/2) + isSpike = numpy.abs(t[i] - (t[i-1] + t[i+1])/2) - numpy.abs((t[i+1] - t[i-1])/2) if z.data[i] < 500: qc[i] = isSpike > 6.0 else: diff --git a/summarize-results.py b/summarize-results.py index c536010..4d5348a 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -5,7 +5,7 @@ testNames = main.importQC('qctests') testNames.sort() -testNames = [test for test in testNames if test[0:5] == 'CSIRO'] +testNames = [test for test in testNames if test[0:4] == 'Argo'] # connect to database conn = psycopg2.connect("dbname='root' user='root'") diff --git a/util/obs_utils.py b/util/obs_utils.py index 0c4f83f..cc8c3e5 100644 --- a/util/obs_utils.py +++ b/util/obs_utils.py @@ -89,9 +89,9 @@ def depth_to_pressure(z, lat): lat: scalar or numpy array of latitude (deg).""" assert np.array(lat).size > 0 and np.array(z).size > 0, 'No value provided for z or lat' - + p = gsw.p_from_z(-z, lat) - + return p def pressure_to_depth(p, lat): From 487f709693d22a725cdb687986300731c9767ac6 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 30 Jul 2016 23:39:02 +0000 Subject: [PATCH 15/79] trying full profile in db --- AutoQC.py | 17 +++++---- build-db.py | 44 +++++++++--------------- qctests/Argo_global_range_check.py | 17 +++------ qctests/Argo_gradient_test.py | 22 +++++++----- qctests/Argo_impossible_date_test.py | 8 ++--- qctests/Argo_impossible_location_test.py | 4 +-- qctests/Argo_pressure_increasing_test.py | 44 ++++++++++++------------ qctests/Argo_regional_range_test.py | 18 +++++----- qctests/Argo_spike_test.py | 22 +++++++----- util/obs_utils.py | 4 +-- 10 files changed, 101 insertions(+), 99 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 508c137..a18afed 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -5,6 +5,7 @@ import util.main as main import pandas, psycopg2 from multiprocessing import Pool +import tempfile def run(test, profiles): ''' @@ -87,33 +88,37 @@ def processFile(fName): def process_row(uid): '''run all tests on the ith database row''' - + # extract profile cur.execute('SELECT * FROM demo WHERE uid = ' + str(uid) ) row = cur.fetchall() - profile = main.row2dict(row[0]) + fProfile = tempfile.TemporaryFile() + fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row + fProfile.seek(0) + profile = wod.WodProfile(fProfile) + fProfile.close() # data pre-validation # ---tbd--- # run tests - results = [profile['qcflag']] + results = [row[0][1]] for itest, test in enumerate(testNames): if test[0:4] != 'Argo': # testing on Argo suite for now continue result = run(test, [profile]) - query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile['uid']) + ";" + query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) - print profile['uid'] + print profile.uid() # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() cur.execute('SELECT uid FROM demo') uids = cur.fetchall() - + # launch async processes pool = Pool(processes=int(sys.argv[2])) for i in range(len(uids)): diff --git a/build-db.py b/build-db.py index ae6632f..94ccdc9 100644 --- a/build-db.py +++ b/build-db.py @@ -19,20 +19,12 @@ # set up our table query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( + raw text, + truth boolean, + uid integer, lat real, long real, - uid integer, cruise integer, - year integer, - month integer, - day integer, - time real, - probetype integer, - depth real[], - temperature real[], - salinity real[], - truth boolean, - n_levels integer, """ for i in range(len(testNames)): query += testNames[i].lower() + ' boolean' @@ -46,28 +38,26 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) while True: + # extract profile as wodpy object and raw text + start = fid.tell() profile = wod.WodProfile(fid) + end = fid.tell() + fid.seek(start) + raw = fid.read(end-start) + fid.seek(end) + + # set up dictionary for populating query string wodDict = profile.npdict() - wodDict['z'] = "'{" + ",".join(map(str, wodDict['z'])) + "}'" - wodDict['t'] = "'{" + ",".join(map(str, wodDict['t'])) + "}'" - wodDict['s'] = "'{" + ",".join(map(str, wodDict['s'])) + "}'" + wodDict['raw'] = "'" + raw + "'" wodDict['truth'] = sum(profile.t_level_qc(originator=True) >= 3) >= 1 - query = "INSERT INTO " + sys.argv[2] + " (lat, long, uid, cruise, year, month, day, time, probetype, depth, temperature, salinity, truth, n_levels) " + """ VALUES( + query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, lat, long, cruise) " + """ VALUES( + {p[raw]}, + {p[truth]}, + {p[uid]}, {p[latitude]}, {p[longitude]}, - {p[uid]}, - {p[cruise]}, - {p[year]}, - {p[month]}, - {p[day]}, - {p[time]}, - {p[probe_type]}, - {p[z]}, - {p[t]}, - {p[s]}, - {p[truth]}, - {p[n_levels]} + {p[cruise]} )""".format(p=wodDict) query = query.replace('--', 'NULL') query = query.replace('None', 'NULL') diff --git a/qctests/Argo_global_range_check.py b/qctests/Argo_global_range_check.py index 8d38363..f20cc95 100644 --- a/qctests/Argo_global_range_check.py +++ b/qctests/Argo_global_range_check.py @@ -6,8 +6,6 @@ """ from util import obs_utils -import util.main as main -import numpy def test(p): """ @@ -17,20 +15,15 @@ def test(p): """ # Get temperature and pressure values from the profile. - t = p['t'] - z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) + t = p.t() + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - # initialize qc as a bunch of falses; - qc = numpy.zeros(p['n_levels'], dtype=bool) - # Make the quality control decisions. This should # return true if the temperature is outside -2.5 deg C # and 40 deg C or pressure is less than -5. - for i in range(p['n_levels']): - if main.dataPresent(('t'), i, p): - qc[i] == t[i] > -2.5 and t[i] < 40.0 - if main.dataPresent(('z', 'latitude'), i, p): - qc[i] == qc[i] and z[i] > -5 + qct = (t.mask == False) & ((t.data < -2.5) | (t.data > 40.0)) + qcp = (z.mask == False) & (z.data < -5) + qc = qct | qcp return qc diff --git a/qctests/Argo_gradient_test.py b/qctests/Argo_gradient_test.py index 1f83f74..4daddf6 100644 --- a/qctests/Argo_gradient_test.py +++ b/qctests/Argo_gradient_test.py @@ -4,7 +4,6 @@ import numpy from util import obs_utils -import util.main as main def test(p): """ @@ -14,20 +13,27 @@ def test(p): """ # Get temperature values from the profile. - t = p['t'] + t = p.t() # Get depth values (m) from the profile. - z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' # initialize qc as a bunch of falses; # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(p['n_levels'], dtype=bool) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isPressure = (z.mask==False) + isData = isTemperature & isPressure - for i in range(1,p['n_levels']-1): - if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t'), i-1, p) and main.dataPresent(('t'), i+1, p): + for i in range(1,len(t.data)-1): + if isData[i] & isTemperature[i-1] & isTemperature[i+1]: - isSlope = numpy.abs(t[i] - (t[i-1] + t[i+1])/2) + isSlope = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - if z[i] < 500: + if z.data[i] < 500: qc[i] = isSlope > 9.0 else: qc[i] = isSlope > 3.0 diff --git a/qctests/Argo_impossible_date_test.py b/qctests/Argo_impossible_date_test.py index f641a19..963736b 100644 --- a/qctests/Argo_impossible_date_test.py +++ b/qctests/Argo_impossible_date_test.py @@ -15,10 +15,10 @@ def test(p): """ # Get the year, month, day and time: - year = p['year'] - month = p['month'] - day = p['day'] - time = p['time'] + year = p.year() + month = p.month() + day = p.day() + time = p.time() # initialize qc as false: qc = numpy.zeros(1, dtype=bool) diff --git a/qctests/Argo_impossible_location_test.py b/qctests/Argo_impossible_location_test.py index bbd2321..8a2276f 100644 --- a/qctests/Argo_impossible_location_test.py +++ b/qctests/Argo_impossible_location_test.py @@ -13,8 +13,8 @@ def test(p): """ # Get the lat and long: - latitude = p['latitude'] - longitude = p['longitude'] + latitude = p.latitude() + longitude = p.longitude() # initialize qc as false: qc = numpy.zeros(1, dtype=bool) diff --git a/qctests/Argo_pressure_increasing_test.py b/qctests/Argo_pressure_increasing_test.py index 6a54d3c..6f25b89 100644 --- a/qctests/Argo_pressure_increasing_test.py +++ b/qctests/Argo_pressure_increasing_test.py @@ -8,7 +8,6 @@ import numpy as np from util import obs_utils -import util.main as main def test(p): """ @@ -16,35 +15,36 @@ def test(p): of quality control decisions with False where the data value has passed the check and True where it failed. """ - + # Get vertical coordinate values from the profile. - z = obs_utils.depth_to_pressure(np.asarray(p['z']), p['latitude']) - + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + # Make the quality control decisions. This should # return true where z decreases or stays the same. - qc = np.ndarray(p['n_levels'], dtype=bool) + qc = np.ndarray(p.n_levels(), dtype=bool) qc[:] = False iRef = -1 - for i in range(0, p['n_levels']): + for i in range(0, p.n_levels()): # Check if the data value is missing. - if main.dataPresent(('z'), i, p): + if z.mask[i] == True: + continue - # The first level with a z value is saved to use as a reference - # to compare to the next level. - if iRef == -1: - iRef = i - zRef = z[iRef] - continue + # The first level with a z value is saved to use as a reference + # to compare to the next level. + if iRef == -1: + iRef = i + zRef = z[iRef] + continue - # Check for non-increasing z. If z increases, update the reference. - if z[i] == zRef: - qc[i] = True - elif z[i] < zRef: - qc[iRef] = True - qc[i] = True - else: - iRef = i - zRef = z[iRef] + # Check for non-increasing z. If z increases, update the reference. + if z[i] == zRef: + qc[i] = True + elif z[i] < zRef: + qc[iRef] = True + qc[i] = True + else: + iRef = i + zRef = z[iRef] return qc diff --git a/qctests/Argo_regional_range_test.py b/qctests/Argo_regional_range_test.py index ddab536..3e2d89e 100644 --- a/qctests/Argo_regional_range_test.py +++ b/qctests/Argo_regional_range_test.py @@ -5,7 +5,6 @@ import numpy import pyproj from shapely.geometry import Polygon, Point -import util.main as main def test(p): """ @@ -21,18 +20,21 @@ def test(p): mediterraneanLong = [6., 40., 35., 20., 15., 5., 6.] # Get the lat and long and temp: - latitude = p['latitude'] - longitude = p['longitude'] - t = p['t'] - + latitude = p.latitude() + longitude = p.longitude() + t = p.t() + + # check for gaps in data + isTemperature = (t.mask==False) + # initialize qc as false (all pass) - qc = numpy.zeros(p['n_levels'], dtype=bool) + qc = numpy.zeros(len(t), dtype=bool) isInRedSea = isInRegion(latitude, longitude, redSeaLat, redSeaLong) isInMediterranean = isInRegion(latitude, longitude, mediterraneanLat, mediterraneanLong) - for i in range(p['n_levels']): - if main.dataPresent(('t'), i, p): + for i in range(p.n_levels()): + if isTemperature[i]: if isInRedSea: if t[i] < 21.7 or t[i] > 40.: qc[i] = True diff --git a/qctests/Argo_spike_test.py b/qctests/Argo_spike_test.py index f5881f5..a302571 100644 --- a/qctests/Argo_spike_test.py +++ b/qctests/Argo_spike_test.py @@ -4,7 +4,6 @@ import numpy from util import obs_utils -import util.main as main def test(p): """ @@ -14,18 +13,25 @@ def test(p): """ # Get temperature values from the profile. - t = p['t'] + t = p.t() # Get pressure values (db) from the profile. - z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) - + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' + # initialize qc as a bunch of falses; # implies all measurements pass when a spike can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(p['n_levels'], dtype=bool) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isPressure = (z.mask==False) + isData = isTemperature & isPressure - for i in range(1,p['n_levels']-1): - if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t'), i-1, p) and main.dataPresent(('t'), i+1, p): + for i in range(1,len(t.data)-1): + if isData[i] & isTemperature[i-1] & isTemperature[i+1]: - isSpike = numpy.abs(t[i] - (t[i-1] + t[i+1])/2) - numpy.abs((t[i+1] - t[i-1])/2) + isSpike = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - numpy.abs((t.data[i+1] - t.data[i-1])/2) if z.data[i] < 500: qc[i] = isSpike > 6.0 else: diff --git a/util/obs_utils.py b/util/obs_utils.py index cc8c3e5..0c4f83f 100644 --- a/util/obs_utils.py +++ b/util/obs_utils.py @@ -89,9 +89,9 @@ def depth_to_pressure(z, lat): lat: scalar or numpy array of latitude (deg).""" assert np.array(lat).size > 0 and np.array(z).size > 0, 'No value provided for z or lat' - + p = gsw.p_from_z(-z, lat) - + return p def pressure_to_depth(p, lat): From bc51dd23c3e9b9334d51dcee7e4574b82a822f35 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 31 Jul 2016 00:00:16 +0000 Subject: [PATCH 16/79] continuing to implement and validate full-profile db --- AutoQC.py | 12 +- qctests/Argo_global_range_check.py | 30 -- qctests/Argo_gradient_test.py | 41 -- qctests/Argo_impossible_date_test.py | 35 -- qctests/Argo_impossible_location_test.py | 27 -- qctests/Argo_pressure_increasing_test.py | 51 --- qctests/Argo_regional_range_test.py | 68 --- qctests/Argo_spike_test.py | 40 -- qctests/CSIRO_constant_bottom.py | 32 +- qctests/CSIRO_depth.py | 18 +- qctests/CSIRO_long_gradient.py | 32 +- qctests/CSIRO_short_gradient.py | 28 +- qctests/CSIRO_surface_spikes.py | 24 +- qctests/CSIRO_wire_break.py | 16 +- qctests/CoTeDe_Argo_density_inversion.py | 11 - qctests/CoTeDe_GTSPP_WOA_normbias.py | 11 - qctests/CoTeDe_GTSPP_global_range.py | 11 - qctests/CoTeDe_GTSPP_gradient.py | 11 - qctests/CoTeDe_GTSPP_profile_envelop.py | 11 - qctests/CoTeDe_GTSPP_spike_check.py | 11 - qctests/CoTeDe_WOA_normbias.py | 11 - qctests/CoTeDe_anomaly_detection.py | 11 - qctests/CoTeDe_digit_roll_over.py | 11 - qctests/CoTeDe_fuzzy_logic.py | 11 - qctests/CoTeDe_gradient.py | 11 - qctests/CoTeDe_location_at_sea_test.py | 11 - qctests/CoTeDe_rate_of_change.py | 11 - qctests/CoTeDe_spike.py | 11 - qctests/CoTeDe_tukey53H_norm.py | 11 - qctests/EN_background_available_check.py | 58 --- qctests/EN_background_check.py | 193 --------- qctests/EN_constant_value_check.py | 70 ---- qctests/EN_increasing_depth_check.py | 94 ----- qctests/EN_range_check.py | 23 - qctests/EN_spike_and_step_check.py | 202 --------- qctests/EN_spike_and_step_suspect.py | 7 - qctests/EN_stability_check.py | 176 -------- qctests/EN_std_lev_bkg_and_buddy_check.py | 369 ----------------- qctests/EN_track_check.py | 392 ------------------ qctests/ICDC_aqc_01_level_order.py | 111 ----- qctests/ICDC_aqc_02_crude_range.py | 68 --- qctests/ICDC_aqc_04_max_obs_depth.py | 54 --- qctests/ICDC_aqc_05_stuck_value.py | 71 ---- qctests/ICDC_aqc_06_n_temperature_extrema.py | 62 --- qctests/ICDC_aqc_07_spike_check.py | 75 ---- qctests/ICDC_aqc_08_gradient_check.py | 63 --- .../ICDC_aqc_09_local_climatology_check.py | 220 ---------- qctests/WOD_gradient_check.py | 45 -- qctests/WOD_range_check.py | 71 ---- qctests/loose_location_at_sea.py | 55 --- summarize-results.py | 2 +- 51 files changed, 92 insertions(+), 3008 deletions(-) delete mode 100644 qctests/Argo_global_range_check.py delete mode 100644 qctests/Argo_gradient_test.py delete mode 100644 qctests/Argo_impossible_date_test.py delete mode 100644 qctests/Argo_impossible_location_test.py delete mode 100644 qctests/Argo_pressure_increasing_test.py delete mode 100644 qctests/Argo_regional_range_test.py delete mode 100644 qctests/Argo_spike_test.py delete mode 100644 qctests/CoTeDe_Argo_density_inversion.py delete mode 100644 qctests/CoTeDe_GTSPP_WOA_normbias.py delete mode 100644 qctests/CoTeDe_GTSPP_global_range.py delete mode 100644 qctests/CoTeDe_GTSPP_gradient.py delete mode 100644 qctests/CoTeDe_GTSPP_profile_envelop.py delete mode 100644 qctests/CoTeDe_GTSPP_spike_check.py delete mode 100644 qctests/CoTeDe_WOA_normbias.py delete mode 100644 qctests/CoTeDe_anomaly_detection.py delete mode 100644 qctests/CoTeDe_digit_roll_over.py delete mode 100644 qctests/CoTeDe_fuzzy_logic.py delete mode 100644 qctests/CoTeDe_gradient.py delete mode 100644 qctests/CoTeDe_location_at_sea_test.py delete mode 100644 qctests/CoTeDe_rate_of_change.py delete mode 100644 qctests/CoTeDe_spike.py delete mode 100644 qctests/CoTeDe_tukey53H_norm.py delete mode 100644 qctests/EN_background_available_check.py delete mode 100644 qctests/EN_background_check.py delete mode 100644 qctests/EN_constant_value_check.py delete mode 100644 qctests/EN_increasing_depth_check.py delete mode 100644 qctests/EN_range_check.py delete mode 100644 qctests/EN_spike_and_step_check.py delete mode 100644 qctests/EN_spike_and_step_suspect.py delete mode 100644 qctests/EN_stability_check.py delete mode 100644 qctests/EN_std_lev_bkg_and_buddy_check.py delete mode 100644 qctests/EN_track_check.py delete mode 100644 qctests/ICDC_aqc_01_level_order.py delete mode 100644 qctests/ICDC_aqc_02_crude_range.py delete mode 100644 qctests/ICDC_aqc_04_max_obs_depth.py delete mode 100644 qctests/ICDC_aqc_05_stuck_value.py delete mode 100644 qctests/ICDC_aqc_06_n_temperature_extrema.py delete mode 100644 qctests/ICDC_aqc_07_spike_check.py delete mode 100644 qctests/ICDC_aqc_08_gradient_check.py delete mode 100644 qctests/ICDC_aqc_09_local_climatology_check.py delete mode 100644 qctests/WOD_gradient_check.py delete mode 100644 qctests/WOD_range_check.py delete mode 100644 qctests/loose_location_at_sea.py diff --git a/AutoQC.py b/AutoQC.py index a18afed..73a8017 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -98,13 +98,17 @@ def process_row(uid): profile = wod.WodProfile(fProfile) fProfile.close() - # data pre-validation - # ---tbd--- - + # Check that there are temperature data in the profile, otherwise skip. + if profile.var_index() is None: + return + main.catchFlags(profile) + if np.sum(profile.t().mask == False) == 0: + return + # run tests results = [row[0][1]] for itest, test in enumerate(testNames): - if test[0:4] != 'Argo': # testing on Argo suite for now + if test[0:5] != 'CSIRO': # testing on Argo suite for now continue result = run(test, [profile]) diff --git a/qctests/Argo_global_range_check.py b/qctests/Argo_global_range_check.py deleted file mode 100644 index f20cc95..0000000 --- a/qctests/Argo_global_range_check.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -Implements the global range check used in the Argo quality control -system. - -See Argo quality control manual (based on version 2.5). -""" - -from util import obs_utils - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get temperature and pressure values from the profile. - t = p.t() - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - # Make the quality control decisions. This should - # return true if the temperature is outside -2.5 deg C - # and 40 deg C or pressure is less than -5. - qct = (t.mask == False) & ((t.data < -2.5) | (t.data > 40.0)) - qcp = (z.mask == False) & (z.data < -5) - qc = qct | qcp - - return qc - - diff --git a/qctests/Argo_gradient_test.py b/qctests/Argo_gradient_test.py deleted file mode 100644 index 4daddf6..0000000 --- a/qctests/Argo_gradient_test.py +++ /dev/null @@ -1,41 +0,0 @@ -""" -Implements the gradient test on page 8 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf -""" - -import numpy -from util import obs_utils - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get temperature values from the profile. - t = p.t() - # Get depth values (m) from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' - - # initialize qc as a bunch of falses; - # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isPressure = (z.mask==False) - isData = isTemperature & isPressure - - for i in range(1,len(t.data)-1): - if isData[i] & isTemperature[i-1] & isTemperature[i+1]: - - isSlope = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - - if z.data[i] < 500: - qc[i] = isSlope > 9.0 - else: - qc[i] = isSlope > 3.0 - - return qc diff --git a/qctests/Argo_impossible_date_test.py b/qctests/Argo_impossible_date_test.py deleted file mode 100644 index 963736b..0000000 --- a/qctests/Argo_impossible_date_test.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -Implements the impossible date test on page 6 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf - -The date criterion has been altered so that the test can be applied to all data types. -""" - -import numpy -import calendar - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get the year, month, day and time: - year = p.year() - month = p.month() - day = p.day() - time = p.time() - - # initialize qc as false: - qc = numpy.zeros(1, dtype=bool) - - if year < 1700: - qc[0] = True - elif month not in range(1,13): - qc[0] = True - elif day not in range(1, calendar.monthrange(year, month)[1] + 1): - qc[0] = True - elif time is not None and (time < 0 or time >= 24): - qc[0] = True - - return qc diff --git a/qctests/Argo_impossible_location_test.py b/qctests/Argo_impossible_location_test.py deleted file mode 100644 index 8a2276f..0000000 --- a/qctests/Argo_impossible_location_test.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -Implements the impossible location test on page 6 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf -""" - -import numpy -import calendar - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get the lat and long: - latitude = p.latitude() - longitude = p.longitude() - - # initialize qc as false: - qc = numpy.zeros(1, dtype=bool) - - if isinstance(latitude, float) and latitude < -90 or latitude > 90: - qc[0] = True - elif isinstance(longitude, float) and longitude < -180 or longitude > 180: - qc[0] = True - - return qc diff --git a/qctests/Argo_pressure_increasing_test.py b/qctests/Argo_pressure_increasing_test.py deleted file mode 100644 index 6f25b89..0000000 --- a/qctests/Argo_pressure_increasing_test.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -Implements the pressure increasing check used in the Argo quality control -system. - -See Argo quality control manual (based on version 2.5), -http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf page 8. -""" - -import numpy as np -from util import obs_utils - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get vertical coordinate values from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - # Make the quality control decisions. This should - # return true where z decreases or stays the same. - qc = np.ndarray(p.n_levels(), dtype=bool) - qc[:] = False - iRef = -1 - for i in range(0, p.n_levels()): - # Check if the data value is missing. - if z.mask[i] == True: - continue - - # The first level with a z value is saved to use as a reference - # to compare to the next level. - if iRef == -1: - iRef = i - zRef = z[iRef] - continue - - # Check for non-increasing z. If z increases, update the reference. - if z[i] == zRef: - qc[i] = True - elif z[i] < zRef: - qc[iRef] = True - qc[i] = True - else: - iRef = i - zRef = z[iRef] - - return qc - - diff --git a/qctests/Argo_regional_range_test.py b/qctests/Argo_regional_range_test.py deleted file mode 100644 index 3e2d89e..0000000 --- a/qctests/Argo_regional_range_test.py +++ /dev/null @@ -1,68 +0,0 @@ -""" -Implements the regional range test on page 7 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf -""" - -import numpy -import pyproj -from shapely.geometry import Polygon, Point - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - redSeaLat = [10., 20., 30., 10.] - redSeaLong = [40., 50., 30., 40.] - - mediterraneanLat = [30., 30., 40., 42., 50., 40., 30] - mediterraneanLong = [6., 40., 35., 20., 15., 5., 6.] - - # Get the lat and long and temp: - latitude = p.latitude() - longitude = p.longitude() - t = p.t() - - # check for gaps in data - isTemperature = (t.mask==False) - - # initialize qc as false (all pass) - qc = numpy.zeros(len(t), dtype=bool) - - isInRedSea = isInRegion(latitude, longitude, redSeaLat, redSeaLong) - isInMediterranean = isInRegion(latitude, longitude, mediterraneanLat, mediterraneanLong) - - for i in range(p.n_levels()): - if isTemperature[i]: - if isInRedSea: - if t[i] < 21.7 or t[i] > 40.: - qc[i] = True - if isInMediterranean: - if t[i] < 10. or t[i] > 40.: - qc[i] = True - - return qc - -def isInRegion(lat, longitude, regionLat, regionLong): - ''' - determine if the point lat, longitude is in the region bounded by a polygon with vertices regionLat, regionLong - adapted from solution at http://gis.stackexchange.com/questions/79215/determine-if-point-is-within-an-irregular-polygon-using-python - ''' - - # WGS84 datum - wgs84 = pyproj.Proj(init='EPSG:4326') - - # Albers Equal Area Conic (aea) - nplaea = pyproj.Proj("+proj=laea +lat_0=90 +lon_0=-40 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs") - - # Transform polygon and test point coordinates to northern lat AEAC projection - poly_x, poly_y = pyproj.transform(wgs84, nplaea, regionLong, regionLat) - point_x, point_y = pyproj.transform(wgs84, nplaea, [longitude], [lat]) - - poly_proj = Polygon(zip(poly_x,poly_y)) - - testPoint = Point(point_x[0], point_y[0]) - return testPoint.within(poly_proj) - - diff --git a/qctests/Argo_spike_test.py b/qctests/Argo_spike_test.py deleted file mode 100644 index a302571..0000000 --- a/qctests/Argo_spike_test.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Implements the spike test on page 8 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf -""" - -import numpy -from util import obs_utils - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get temperature values from the profile. - t = p.t() - # Get pressure values (db) from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' - - # initialize qc as a bunch of falses; - # implies all measurements pass when a spike can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isPressure = (z.mask==False) - isData = isTemperature & isPressure - - for i in range(1,len(t.data)-1): - if isData[i] & isTemperature[i-1] & isTemperature[i+1]: - - isSpike = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - numpy.abs((t.data[i+1] - t.data[i-1])/2) - if z.data[i] < 500: - qc[i] = isSpike > 6.0 - else: - qc[i] = isSpike > 2.0 - - return qc diff --git a/qctests/CSIRO_constant_bottom.py b/qctests/CSIRO_constant_bottom.py index 95fb50b..1a0efde 100644 --- a/qctests/CSIRO_constant_bottom.py +++ b/qctests/CSIRO_constant_bottom.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -12,25 +11,30 @@ def test(p): of quality control decisions with False where the data value has passed the check and True where it failed. """ - + # Get temperature values from the profile. - t = p['t'] + t = p.t() # depths - d = p['z'] + d = p.z() # is this an xbt? - isXBT = p['probe_type'] == 2 - latitude = p['latitude'] - + isXBT = p.probe_type() == 2 + latitude = p.latitude() + # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t), dtype=bool) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isDepth = (d.mask==False) + isData = isTemperature & isDepth # need more than one level - if len(d) < 2: + if len(isData) < 2: return qc - + # constant temperature at bottom of profile, for latitude > -40 and bottom two depths at least 30m apart: - if main.dataPresent(('t', 'z'), -1, p) and main.dataPresent(('t', 'z'), -2, p) and isXBT: - if t[-1] == t[-2] and latitude > -40 and d[-1] - d[-2] > 30: + if isData[-1] and isData[-2] and isXBT: + if t.data[-1] == t.data[-2] and latitude > -40 and d.data[-1] - d.data[-2] > 30: qc[-1] = True - - return qc + + return qc \ No newline at end of file diff --git a/qctests/CSIRO_depth.py b/qctests/CSIRO_depth.py index af91825..d86d9d4 100644 --- a/qctests/CSIRO_depth.py +++ b/qctests/CSIRO_depth.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -14,18 +13,21 @@ def test(p): """ # Get depth values (m) from the profile. - d = p['z'] + d = p.z() # is this an xbt? - isXBT = p['probe_type'] == 2 + isXBT = p.probe_type() == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(p['n_levels'], dtype=bool) + qc = numpy.zeros(p.n_levels(), dtype=bool) - for i in range(p['n_levels']): - if main.dataPresent(('z'), i, p): + # check for gaps in data + isDepth = (d.mask==False) + + for i in range(p.n_levels()): + if isDepth[i]: # too-shallow temperatures on XBT probes # note we simply flag this profile for manual QC, in order to minimize false negatives. - if isXBT and d[i] < 3.6: + if isXBT and d.data[i] < 3.6: qc[i] = True - return qc + return qc \ No newline at end of file diff --git a/qctests/CSIRO_long_gradient.py b/qctests/CSIRO_long_gradient.py index 881c174..ad3308d 100644 --- a/qctests/CSIRO_long_gradient.py +++ b/qctests/CSIRO_long_gradient.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -14,35 +13,40 @@ def test(p): """ # depths - d = p['z'] + d = p.z() # temperatures - t = p['t'] + t = p.t() # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t), dtype=bool) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isDepth = (d.mask==False) + isTemperature = (t.mask==False) + isData = isTemperature & isDepth on_inv = False # are we currently in an inversion? - for i in range(0, p['n_levels']-1 ): - if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t', 'z'), i+1, p): + for i in range(0, p.n_levels()-1 ): + if isData[i] and isData[i+1]: # not interested below 5m: - if d[i] < 5: continue + if d.data[i] < 5: continue - if t[i+1] > t[i] and not on_inv: + if t.data[i+1] > t.data[i] and not on_inv: # entering an inversion - start_inv_temp = t[i] - start_inv_depth = d[i] + start_inv_temp = t.data[i] + start_inv_depth = d.data[i] potential_flag = i on_inv = True - if t[i+1] < t[i] and on_inv: + if t.data[i+1] < t.data[i] and on_inv: # exiting the inversion - end_inv_temp = t[i] - end_inv_depth = d[i] + end_inv_temp = t.data[i] + end_inv_depth = d.data[i] on_inv = False gradlong = (end_inv_depth - start_inv_depth) / (end_inv_temp - start_inv_depth) if abs(gradlong) < 4: qc[potential_flag] = True - return qc + return qc \ No newline at end of file diff --git a/qctests/CSIRO_short_gradient.py b/qctests/CSIRO_short_gradient.py index 0a79b7f..959756a 100644 --- a/qctests/CSIRO_short_gradient.py +++ b/qctests/CSIRO_short_gradient.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -14,22 +13,25 @@ def test(p): """ # depths - d = p['z'] + d = p.z() # temperatures - t = p['t'] - + t = p.t() + # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t), dtype=bool) - - for i in range(0, p['n_levels']-1 ): - if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t', 'z'), i+1, p): - deltaD = (d[i+1] - d[i]) - deltaT = (t[i+1] - t[i]) - if deltaT == 0: - continue + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isDepth = (d.mask==False) + isTemperature = (t.mask==False) + isData = isTemperature & isDepth + + for i in range(0, p.n_levels()-1 ): + if isData[i] and isData[i+1]: + deltaD = (d.data[i+1] - d.data[i]) + deltaT = (t.data[i+1] - t.data[i]) gradshort = deltaD / deltaT if (deltaT > 0.5 and deltaD < 30) or abs(gradshort) < 0.4 or (gradshort > 0 and gradshort < 12.5): if abs(deltaT) > 0.4: qc[i] = True - return qc + return qc \ No newline at end of file diff --git a/qctests/CSIRO_surface_spikes.py b/qctests/CSIRO_surface_spikes.py index ac2e3cc..f88c601 100644 --- a/qctests/CSIRO_surface_spikes.py +++ b/qctests/CSIRO_surface_spikes.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -14,23 +13,26 @@ def test(p): """ # depths - d = p['z'] + d = p.z() # is this an xbt? - isXBT = p['probe_type'] == 2 + isXBT = p.probe_type() == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(len(d), dtype=bool) + qc = numpy.zeros(len(d.data), dtype=bool) + + # check for gaps in data + isDepth = (d.mask==False) if not isXBT: return qc - + # flag any level that is shallower than 4m and is followed by a level shallower than 8m. - for i in range(p['n_levels']): - if main.dataPresent(('z'), i, p): - if d[i] < 4 and i < p['n_levels']-1: #only interested in depths less than 4m and not at the bottom of the profile. - if d[i+1] < 8: + for i in range(p.n_levels()): + if isDepth[i]: + if d.data[i] < 4 and i < p.n_levels()-1: #only interested in depths less than 4m and not at the bottom of the profile. + if d.data[i+1] < 8: qc[i] = True else: break - - return qc + + return qc \ No newline at end of file diff --git a/qctests/CSIRO_wire_break.py b/qctests/CSIRO_wire_break.py index f8196b6..68fc2e7 100644 --- a/qctests/CSIRO_wire_break.py +++ b/qctests/CSIRO_wire_break.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -14,16 +13,19 @@ def test(p): """ # Get temperature values from the profile. - t = p['t'] + t = p.t() # is this an xbt? - isXBT = p['probe_type'] == 2 + isXBT = p.probe_type() == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t), dtype=bool) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) # wire breaks at bottom of profile: - if main.dataPresent(('t'), -1, p) and isXBT: - if t[-1] < -2.8 or t[-1] > 36: + if isTemperature[-1] and isXBT: + if t.data[-1] < -2.8 or t.data[-1] > 36: qc[-1] = True - return qc + return qc \ No newline at end of file diff --git a/qctests/CoTeDe_Argo_density_inversion.py b/qctests/CoTeDe_Argo_density_inversion.py deleted file mode 100644 index 26b9493..0000000 --- a/qctests/CoTeDe_Argo_density_inversion.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the density inversion QC from the CoTeDe Argo config.''' - - config = 'argo' - testname = 'density_inversion' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_GTSPP_WOA_normbias.py b/qctests/CoTeDe_GTSPP_WOA_normbias.py deleted file mode 100644 index e040cd2..0000000 --- a/qctests/CoTeDe_GTSPP_WOA_normbias.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the WOA normbias QC from the CoTeDe GTSPP config.''' - - config = 'gtspp' - testname = 'woa_normbias' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_GTSPP_global_range.py b/qctests/CoTeDe_GTSPP_global_range.py deleted file mode 100644 index 4d4896d..0000000 --- a/qctests/CoTeDe_GTSPP_global_range.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the global range QC from the CoTeDe GTSPP config.''' - - config = 'gtspp' - testname = 'global_range' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_GTSPP_gradient.py b/qctests/CoTeDe_GTSPP_gradient.py deleted file mode 100644 index da97a9d..0000000 --- a/qctests/CoTeDe_GTSPP_gradient.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the gradient QC from the CoTeDe GTSPP config.''' - - config = 'gtspp' - testname = 'gradient' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_GTSPP_profile_envelop.py b/qctests/CoTeDe_GTSPP_profile_envelop.py deleted file mode 100644 index 1645451..0000000 --- a/qctests/CoTeDe_GTSPP_profile_envelop.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the profile_envelop QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'profile_envelop' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_GTSPP_spike_check.py b/qctests/CoTeDe_GTSPP_spike_check.py deleted file mode 100644 index eaa68fe..0000000 --- a/qctests/CoTeDe_GTSPP_spike_check.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the spike QC from the CoTeDe GTSPP config.''' - - config = 'gtspp' - testname = 'spike' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_WOA_normbias.py b/qctests/CoTeDe_WOA_normbias.py deleted file mode 100644 index 2b9bc1c..0000000 --- a/qctests/CoTeDe_WOA_normbias.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the WOA normbias QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'woa_normbias' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_anomaly_detection.py b/qctests/CoTeDe_anomaly_detection.py deleted file mode 100644 index d1c4f05..0000000 --- a/qctests/CoTeDe_anomaly_detection.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the CoTeDe Anomaly Detection QC.''' - - config = 'anomaly_detection' - testname = 'anomaly_detection' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_digit_roll_over.py b/qctests/CoTeDe_digit_roll_over.py deleted file mode 100644 index f1d0c0a..0000000 --- a/qctests/CoTeDe_digit_roll_over.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the digit roll over QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'digit_roll_over' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_fuzzy_logic.py b/qctests/CoTeDe_fuzzy_logic.py deleted file mode 100644 index 451464f..0000000 --- a/qctests/CoTeDe_fuzzy_logic.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the CoTeDe fuzzy logic QC.''' - - config = 'fuzzy' - testname = 'fuzzylogic' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_gradient.py b/qctests/CoTeDe_gradient.py deleted file mode 100644 index 820bf6c..0000000 --- a/qctests/CoTeDe_gradient.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the gradient QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'gradient' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_location_at_sea_test.py b/qctests/CoTeDe_location_at_sea_test.py deleted file mode 100644 index 48cb346..0000000 --- a/qctests/CoTeDe_location_at_sea_test.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the CoTeDe location at sea QC.''' - - config = 'cotede' - testname = 'location_at_sea' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_rate_of_change.py b/qctests/CoTeDe_rate_of_change.py deleted file mode 100644 index f852aa0..0000000 --- a/qctests/CoTeDe_rate_of_change.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the rate_of_change QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'rate_of_change' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_spike.py b/qctests/CoTeDe_spike.py deleted file mode 100644 index 004ebd2..0000000 --- a/qctests/CoTeDe_spike.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the spike QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'spike' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_tukey53H_norm.py b/qctests/CoTeDe_tukey53H_norm.py deleted file mode 100644 index a444708..0000000 --- a/qctests/CoTeDe_tukey53H_norm.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the tukey53H norm QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'tukey53H_norm' - - return get_qc(p, config, testname) - - diff --git a/qctests/EN_background_available_check.py b/qctests/EN_background_available_check.py deleted file mode 100644 index ca9f93e..0000000 --- a/qctests/EN_background_available_check.py +++ /dev/null @@ -1,58 +0,0 @@ -""" -The background check on reported levels from the EN quality control -system, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf, includes -setting the QC flags if the background is not available at a profile level. -This aspect is separated out in this check. -""" - -import numpy as np -from qctests.EN_background_check import auxParam -from qctests.EN_background_check import findGridCell - -def test(p, *args): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Define an array to hold results. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Find grid cell nearest to the observation. - ilon, ilat = findGridCell(p, auxParam['lon'], auxParam['lat']) - - # Extract the relevant auxiliary data. - imonth = p.month() - 1 - clim = auxParam['clim'][:, ilat, ilon, imonth] - depths = auxParam['depth'] - - # Remove missing data points. - iOK = (clim.mask == False) - if np.count_nonzero(iOK) == 0: - qc[:] = True - return qc - clim = clim[iOK] - depths = depths[iOK] - - # Find which levels have data. - t = p.t() - z = p.z() - isTemperature = (t.mask==False) - isDepth = (z.mask==False) - isData = isTemperature & isDepth - - # Loop over levels. - for iLevel in range(p.n_levels()): - if isData[iLevel] == False: continue - - # Get the climatology and error variance values at this level. - climLevel = np.interp(z[iLevel], depths, clim, right=99999) - if climLevel == 99999: - qc[iLevel] = True # This could reject some good data if the - # climatology is incomplete, but also can act as - # a check that the depth of the profile is - # consistent with the depth of the ocean. - - return qc - diff --git a/qctests/EN_background_check.py b/qctests/EN_background_check.py deleted file mode 100644 index af3f455..0000000 --- a/qctests/EN_background_check.py +++ /dev/null @@ -1,193 +0,0 @@ -""" -Implements the background check on reported levels from the EN quality control -system, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -import EN_spike_and_step_check -import numpy as np -import util.obs_utils as outils -from netCDF4 import Dataset - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Check if the QC of this profile was already done and if not - # run the QC. - if p.uid() != uid or p.uid() is None: - run_qc(p) - - # QC results are in the module variable. - return qc - -def run_qc(p): - """ - Performs the QC check. - """ - - global qc, uid, origLevels, ptLevels, bgLevels, bgStdLevels, bgevStdLevels - - # Define an array to hold results. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Create a record of the processing for use by the background - # and buddy checks on standard levels. - uid = p.uid() - origLevels = [] - ptLevels = [] - bgLevels = [] - - # Find grid cell nearest to the observation. - ilon, ilat = findGridCell(p, auxParam['lon'], auxParam['lat']) - - # Extract the relevant auxiliary data. - imonth = p.month() - 1 - clim = auxParam['clim'][:, ilat, ilon, imonth] - bgev = auxParam['bgev'][:, ilat, ilon] - bgStdLevels = clim # Save for use in another check. - bgevStdLevels = bgev # Save the full column for use by another check. - obev = auxParam['obev'] - depths = auxParam['depth'] - - # Remove missing data points. - iOK = (clim.mask == False) & (bgev.mask == False) - if np.count_nonzero(iOK) == 0: return qc - clim = clim[iOK] - bgev = bgev[iOK] - obev = obev[iOK] - depths = depths[iOK] - - # Find which levels have data. - t = p.t() - s = p.s() - z = p.z() - isTemperature = (t.mask==False) - isSalinity = (s.mask==False) - isDepth = (z.mask==False) - isData = isTemperature & isDepth - - # Use the EN_spike_and_step_check to find suspect values. - suspect = EN_spike_and_step_check.test(p, suspect=True) - - # Loop over levels. - for iLevel in range(p.n_levels()): - if isData[iLevel] == False: continue - - # Get the climatology and error variance values at this level. - climLevel = np.interp(z[iLevel], depths, clim, right=99999) - bgevLevel = np.interp(z[iLevel], depths, bgev, right=99999) - obevLevel = np.interp(z[iLevel], depths, obev, right=99999) - if climLevel == 99999: - continue - assert bgevLevel > 0, 'Background error variance <= 0' - assert obevLevel > 0, 'Observation error variance <= 0' - - # If at low latitudes the background error variance is increased. - # Also, because we are on reported levels instead of standard levels - # the variances are increased. NB multiplication factors are squared - # because we are working with error variances instead of standard - # deviations. - if np.abs(p.latitude()) < 10.0: bgevLevel *= 1.5**2 - bgevLevel *= 2.0**2 - - # Set up an initial estimate of probability of gross error. - pge = estimatePGE(p.probe_type(), suspect[iLevel]) - - # Calculate potential temperature. - if isSalinity[iLevel]: - sLevel = s[iLevel] - else: - sLevel = 35.0 - potm = outils.pottem(t[iLevel], sLevel, z[iLevel], lat=p.latitude()) - - # Do Bayesian calculation. - evLevel = obevLevel + bgevLevel - sdiff = (potm - climLevel)**2 / evLevel - pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) - pdTotal = 0.1 * pge + pdGood * (1.0 - pge) - pgebk = 0.1 * pge / pdTotal - - if pgebk >= 0.5: - qc[iLevel] = True - else: - # Store the results. - origLevels.append(iLevel) - ptLevels.append(potm) - bgLevels.append(climLevel) - - return None - -def findGridCell(p, gridLong, gridLat): - ''' - Find grid cell nearest to the observation p, - where gridLong and gridLat are lists of grid coordinates. - ''' - for i in range(1, len(gridLong)): - assert gridLong[i] - gridLong[i-1] == gridLong[1] - gridLong[0], 'longitude grid points must be evenly spaced' - lon = p.longitude() - grid = gridLong - nlon = len(grid) - ilon = int(np.mod(np.round((lon - grid[0]) / (grid[1] - grid[0])), nlon)) - for i in range(1, len(gridLat)): - assert gridLat[i] - gridLat[i-1] == gridLat[1] - gridLat[0], 'latitude grid points must be evenly spaced' - lat = p.latitude() - grid = gridLat - nlat = len(grid) - ilat = int(np.mod(np.round((lat - grid[0]) / (grid[1] - grid[0])), nlat)) - if ilat == nlat: ilat -= 1 # Checks for edge case where lat is ~90. - - assert ilon >=0 and ilon < nlon, 'Longitude is out of range: %f %i' % (lon, ilon) - assert ilat >=0 and ilat < nlat, 'Latitude is out of range: %f %i' % (lat, ilat) - - return ilon, ilat - - -def estimatePGE(probe_type, isSuspect): - ''' - Estimates the probability of gross error for a measurement taken by - the given probe_type. Information from the EN_spike_and_step_check - is used here to increase the initial estimate if the observation is suspect. - ''' - if probe_type in [1,2,3,13,16]: - pge = 0.05 - else: - pge = 0.01 - if isSuspect: - pge = 0.5 + 0.5 * pge - - return pge - -def readENBackgroundCheckAux(): - ''' - Reads auxiliary information needed by the EN background check. - ''' - - filename = 'data/EN_bgcheck_info.nc' - nc = Dataset(filename) - data = {} - data['lon'] = nc.variables['longitude'][:] - data['lat'] = nc.variables['latitude'][:] - data['depth'] = nc.variables['depth'][:] - data['month'] = nc.variables['month'][:] - data['clim'] = nc.variables['potm_climatology'][:] - data['bgev'] = nc.variables['bg_err_var'][:] - data['obev'] = nc.variables['ob_err_var'][:] - - return data - -#import parameters on load -auxParam = readENBackgroundCheckAux() - -# Initialise global variables to hold data needed for the -# EN background and buddy check on standard levels. -uid = None -qc = None -origLevels = [] -ptLevels = [] -bgLevels = [] -bgevStdLevels = [] -bgStdLevels = [] - diff --git a/qctests/EN_constant_value_check.py b/qctests/EN_constant_value_check.py deleted file mode 100644 index 82df764..0000000 --- a/qctests/EN_constant_value_check.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -Implements the constant value check used in the EN quality control -system, described on page 7 of http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -import numpy - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - if p.uid() != uid or p.uid() is None: - run_qc(p) - - # QC results are stored in the module variable. - return qc - -def run_qc(p): - - global qc, uid - - # Get temperature values from the profile. - t = p.t() - d = p.z() - - temperatures = {} - # initialize qc as a bunch of falses (pass by default) - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isDepth = (d.mask==False) - - #dictionary counts instances of each temperature value - for i in range(len(t.data)): - if isTemperature[i]: - if t.data[i] in temperatures: - temperatures[t.data[i]] += 1 - else: - temperatures[t.data[i]] = 1 - - for key in temperatures: - - if float(temperatures[key]) / float(len(t.data)) >= 0.9: - repeats = numpy.where(t.data == key)[0] - #drop the entries that don't have a depth associated with them; - #this triggers the 90% rule regardless of the presence of depth data, but - #ensures that depths are available to assess the range over which constant temps were observed. - repeatsWithDepth = [] - for j in range(len(repeats)): - if isDepth[repeats[j]]: - repeatsWithDepth.append(repeats[j]) - first = repeatsWithDepth[0] - last = repeatsWithDepth[-1] - - if d.data[last] - d.data[first] >= 100: - qc = numpy.ones(len(t.data), dtype=bool) #note everyhing is flagged by this test. - - uid = p.uid() - - return None - -uid = None -qc = None - - - diff --git a/qctests/EN_increasing_depth_check.py b/qctests/EN_increasing_depth_check.py deleted file mode 100644 index 68cf77d..0000000 --- a/qctests/EN_increasing_depth_check.py +++ /dev/null @@ -1,94 +0,0 @@ -""" -Implements the EN increasing depth check. -""" - -import EN_spike_and_step_check -import numpy as np -from collections import Counter - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - if p.uid() != uid or p.uid() is None: - run_qc(p) - - # QC results are in the module variable. - return qc - -def run_qc(p): - - global qc, uid - - # Get z values from the profile. - d = p.z() - mask = d.mask - n = p.n_levels() - - # Initialize qc array. - qc = np.zeros(n, dtype=bool) - - # if all the depths are the same, flag all levels and finish immediately - most_common_depth = Counter(d.data).most_common(1) - if most_common_depth[0][1] == len(d.data): - qc = np.ones(n, dtype=bool) - return None - - # Basic check on each level. - qc[d < 0] = True - qc[d > 11000] = True - - # Now check for inconsistencies in the depth levels. - comp = np.ndarray((n, n), dtype=int) - currentMax = 1 - while currentMax > 0: - # Comp gets set to 1 if there is not an increase in depth. - comp[:, :] = 0 - for i in range(n): - if qc[i] or mask[i]: continue - for j in range(n): - if qc[j] or mask[j] or (i == j): continue - if i < j: - if d[i] >= d[j]: comp[i, j] = 1 - else: - if d[i] <= d[j]: comp[i, j] = 1 - - # Check if comp was set to 1 anywhere and which level was - # most inconsistent with the others. - currentMax = 0 - currentLev = -1 - for i in range(n): - lineSum = np.sum(comp[:, i]) - if lineSum >= currentMax: - currentMax = lineSum - currentLev = i - - # Reject immediately if more than one inconsistency or - # investigate further if one inconsistency. - if currentMax > 1: - qc[currentLev] = True - elif currentMax == 1: - # Find out which level it is inconsistent with. - for i in range(n): - if comp[i, currentLev] == 1: otherLev = i - # Check if one was rejected by the spike and step - # check, otherwise reject both. - try: - spikeqc - except: - spikeqc = EN_spike_and_step_check.test(p) - if spikeqc[currentLev]: qc[currentLev] = True - if spikeqc[otherLev]: qc[otherLev] = True - if spikeqc[currentLev] == False and spikeqc[otherLev] == False: - qc[currentLev] = True - qc[otherLev] = True - - uid = p.uid() - - return None - -uid = None -qc = None diff --git a/qctests/EN_range_check.py b/qctests/EN_range_check.py deleted file mode 100644 index 95205be..0000000 --- a/qctests/EN_range_check.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -Implements the global range check used in the EN quality control -system. -""" - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get temperature values from the profile. - t = p.t() - - # Make the quality control decisions. This should - # return true if the temperature is outside -4 deg C - # and 40 deg C. - qc = (t.mask == False) & ((t.data < -4.0) | (t.data > 40.0)) - - return qc - - diff --git a/qctests/EN_spike_and_step_check.py b/qctests/EN_spike_and_step_check.py deleted file mode 100644 index b35ab7a..0000000 --- a/qctests/EN_spike_and_step_check.py +++ /dev/null @@ -1,202 +0,0 @@ -""" -Implements the spike and step check used in the EN quality control -system, pages 20-21 of http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf - -The EN quality control system does not directly reject levels that are marked as -steps, it marks them as suspect and then they are subjected to an extra test (a -background check) that can reprieve them. In the future it will be best to -remove these elements and include them within the background check code. -""" - -import numpy as np - -def test(p, suspect=False): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - - By default the test returns definite rejections. If the suspect keyword is - set to True the test instead returns suspect levels. - """ - - if p.uid() != uid or suspect != suspectSetting or p.uid() is None: - run_qc(p, suspect) - - # QC results are in the global variable. - return qc - -def run_qc(p, suspect): - - global uid, qc, suspectSetting - - # Define tolerances used. - tolD = np.array([0, 200, 300, 500, 600]) - tolDTrop = np.array([0, 300, 400, 500, 600]) - tolT = np.array([5.0, 5.0, 2.5, 2.0, 1.5]) - - # Define an array to hold results. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Get depth and temperature values from the profile. - z = p.z() - t = p.t() - - # Find which levels have data. - isTemperature = (t.mask==False) - isDepth = (z.mask==False) - isData = isTemperature & isDepth - - # Array to hold temperature differences between levels and gradients. - dt, gt = composeDT(t, z, p.n_levels()) - - # Spikes and steps detection. - for i in range(1, p.n_levels()): - if i >= 2: - if (isData[i-2] and isData[i-1] and isData[i]) == False: - continue - if z[i] - z[i-2] >= 5.0: - wt1 = (z[i-1] - z[i-2]) / (z[i] - z[i-2]) - else: - wt1 = 0.5 - else: - if (isData[i-1] and isData[i]) == False: - continue - wt1 = 0.5 - - dTTol = determineDepthTolerance(z[i-1], np.abs(p.latitude())) - gTTol = 0.05 - - # Check for low temperatures in the Tropics. - # This might be more appropriate to appear in a separate EN regional - # range check but is included here for now for consistency with the - # original code. - if (np.abs(p.latitude()) < 20.0 and z[i-1] < 1000.0 and - t[i-1] < 1.0): - dt[i] = np.ma.masked - if suspect == True: qc[i-1] = True - continue - - qc, dt = conditionA(dt, dTTol, qc, wt1, i, suspect) - qc, dt = conditionB(dt, dTTol, gTTol, qc, gt, i, suspect) - qc = conditionC(dt, dTTol, z, qc, t, i, suspect) - - # End of loop over levels. - - # Step or 0.0 at the bottom of a profile. - if isData[-1] and dt.mask[-1] == False: - dTTol = determineDepthTolerance(z[-1], np.abs(p.latitude())) - if np.abs(dt[-1]) > dTTol: - if suspect == True: qc[-1] = True - if isTemperature[-1]: - if t[-1] == 0.0: - if suspect == True: qc[-1] = True - - # If 4 levels or more than half the profile is rejected then reject all. - if suspect == False: - nRejects = np.count_nonzero(qc) - if nRejects >= 4 or nRejects > p.n_levels()/2: - qc[:] = True - - # Save details of the QC performed in module variables. - uid = p.uid() - suspectSetting = suspect - - return None - - -def composeDT(var, z, nLevels): - ''' - build the array of deltas for the variable provided - ''' - dt = np.ma.zeros(nLevels) - dt.mask = True - gt = dt.copy() - - for i in range(1, nLevels): - if ((z[i] - z[i-1]) <= 50.0 or (z[i] >= 350.0 and (z[i] - z[i-1]) <= 100.0)): - dt[i] = var[i] - var[i-1] - gt[i] = dt[i] / np.max([10.0, z[i] - z[i-1]]) - - - return dt, gt - - -def determineDepthTolerance(z, lattitude): - ''' - determine depth tolerance - ''' - - if (lattitude < 20.0): - depthTol = 300.0 - else: - depthTol = 200.0 - - if z > 600.0: - tTolFactor = 0.3 - elif z > 500.0: - tTolFactor = 0.4 - elif z > depthTol + 100.0: - tTolFactor = 0.5 - elif z > depthTol: - tTolFactor = 1.0 - 0.005 * (z - depthTol) - else: - tTolFactor = 1.0 - - return tTolFactor * 5.0 - -def conditionA(dt, dTTol, qc, wt1, i, suspect): - ''' - condition A (large spike check) - ''' - if (dt.mask[i-1] == False and dt.mask[i] == False and np.max(np.abs(dt[i-1:i+1])) > dTTol): - if np.abs(dt[i] + dt[i-1]) < 0.5*dTTol: - dt[i-1:i+1] = np.ma.masked - if suspect == False: qc[i-1] = True - elif np.abs((1.0-wt1) * dt[i-1] - wt1*dt[i]) < 0.5*dTTol: - # Likely to be a valid large temperature gradient. - dt[i-1:i+1] = np.ma.masked # Stops the levels being rechecked. - - return qc, dt - -def conditionB(dt, dTTol, gTTol, qc, gt, i, suspect): - ''' - condition B (small spike check) - ''' - if (dt.mask[i-1] == False and dt.mask[i] == False and - np.max(np.abs(dt[i-1:i+1])) > 0.5*dTTol and - np.max(np.abs(gt[i-1:i+1])) > gTTol and - np.abs(dt[i] + dt[i-1]) < 0.25*np.abs(dt[i] - dt[i-1])): - dt[i-1:i+1] = np.ma.masked - if suspect == False: qc[i-1] = True - - return qc, dt - -def conditionC(dt, dTTol, z, qc, t, i, suspect): - ''' - condition C (steps) - ''' - - if dt.mask[i-1] == False and np.abs(dt[i-1]) > dTTol: - if z[i-1] <= 250.0 and dt[i-1] < -dTTol and dt[i-1] > -3.0*dTTol: - # May be sharp thermocline, do not reject. - pass - elif i>1 and z[i] - z[i-2] > 0 and np.abs(t[i-1] - interpolate(z[i-1], z[i-2], z[i], t[i-2], t[i])) < 0.5*dTTol: - # consistent interpolation, do not reject - pass - else: - # mark both sides of the step - if suspect == True: qc[i-2:i] = True - - return qc - -def interpolate(depth, shallow, deep, shallowVal, deepVal): - ''' - interpolate values at - ''' - - return (depth - shallow) / (deep - shallow) * (deepVal - shallowVal) + shallowVal - -uid = None -qc = None -suspectSetting = None diff --git a/qctests/EN_spike_and_step_suspect.py b/qctests/EN_spike_and_step_suspect.py deleted file mode 100644 index e90dda4..0000000 --- a/qctests/EN_spike_and_step_suspect.py +++ /dev/null @@ -1,7 +0,0 @@ -'''Returns the suspect levels found by the EN spike and step check.''' - -import EN_spike_and_step_check - -def test(p): - - return EN_spike_and_step_check.test(p, suspect=True) diff --git a/qctests/EN_stability_check.py b/qctests/EN_stability_check.py deleted file mode 100644 index 2c8ee51..0000000 --- a/qctests/EN_stability_check.py +++ /dev/null @@ -1,176 +0,0 @@ -""" -Implements the stability check described on pages 8-9 of -http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -import math, numpy - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - if p.uid() != uid or p.uid() is None: - run_qc(p) - - # QC results are in the module variable. - return qc - -def run_qc(p): - - global uid, qc - - # Get temperature, salinity, pressure values from the profile. - t = p.t() - s = p.s() - P = p.p() - - # initialize qc as a bunch of falses; - qc = numpy.zeros(p.n_levels(), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isSalinity = (s.mask==False) - isPressure = (P.mask==False) - isData = isTemperature & isSalinity & isPressure - - # calculate potential temperatures - T = [] - for i in range(0, p.n_levels()): - T.append(potentialTemperature(s[i], t[i], P[i])) - - for i in range(2,len(t.data)-1): - if (isData[i] and isData[i-1] and isData[i-2]) == False: - continue - - delta_rho_k = mcdougallEOS(s[i], T[i], P[i]) - mcdougallEOS(s[i-1], T[i-1], P[i-1]) - if delta_rho_k >= -0.03: - continue; - - delta_rho_k_prev = mcdougallEOS(s[i-1], T[i-1], P[i-1]) - mcdougallEOS(s[i-2], T[i-2], P[i-2]) - - if abs(delta_rho_k_prev + delta_rho_k) < 0.25*abs(delta_rho_k_prev - delta_rho_k): - qc[i-1] = True - else: - if isData[i+1] == False: - continue - - delta_rho_k_next = mcdougallEOS(s[i+1], T[i+1], P[i+1]) - mcdougallEOS(s[i], T[i], P[i]) - if abs(delta_rho_k + delta_rho_k_next) < 0.25*abs(delta_rho_k - delta_rho_k_next): - qc[i] = True - else: - qc[i-1] = True - qc[i] = True - - #check bottom of profile - i = p.n_levels()-1 - if isData[i] and isData[i-1]: - delta_rho_k = mcdougallEOS(s[i], T[i], P[i]) - mcdougallEOS(s[i-1], T[i-1], P[i-1]) - if delta_rho_k < -0.03: - qc[i] = True - - #check for critical number of flags, flag all if so: - if sum(qc) >= max(2, len(t.data)/4.): - qc = numpy.ones(len(t.data), dtype=bool) - - uid = p.uid() - - return None - - -def mcdougallEOS(salinity, temperature, pressure): - ''' - equation of state defined in McDougall et al 2003 (http://journals.ametsoc.org/doi/pdf/10.1175/1520-0426%282003%2920%3C730%3AAACEAF%3E2.0.CO%3B2) - returns density in kg/m^3 - ''' - - p1CF = [ - 9.99843699e2, - 7.35212840e0, - -5.45928211e-2, - 3.98476704e-4, - 2.96938239e0, - -7.23268813e-3, - 2.12382341e-3, - 1.04004591e-2, - 1.03970529e-7, - 5.18761880e-6, - -3.24041825e-8, - -1.23869360e-11 - ] - - p2CF = [ - 1.0, - 7.28606739e-3, - -4.60835542e-5, - 3.68390573e-7, - 1.80809186e-10, - 2.14691708e-3, - -9.27062484e-6, - -1.78343643e-10, - 4.76534122e-6, - 1.63410736e-9, - 5.30848875e-6, - -3.03175128e-16, - -1.27934137e-17 - ] - - p1 = p1CF[0] - p1 += p1CF[1]*temperature - p1 += p1CF[2]*temperature*temperature - p1 += p1CF[3]*temperature*temperature*temperature - p1 += p1CF[4]*salinity - p1 += p1CF[5]*salinity*temperature - p1 += p1CF[6]*salinity*salinity - p1 += p1CF[7]*pressure - p1 += p1CF[8]*pressure*temperature*temperature - p1 += p1CF[9]*pressure*salinity - p1 += p1CF[10]*pressure*pressure - p1 += p1CF[11]*pressure*pressure*temperature*temperature - - p2 = p2CF[0] - p2 += p2CF[1]*temperature - p2 += p2CF[2]*temperature*temperature - p2 += p2CF[3]*temperature*temperature*temperature - p2 += p2CF[4]*temperature*temperature*temperature*temperature - p2 += p2CF[5]*salinity - p2 += p2CF[6]*salinity*temperature - p2 += p2CF[7]*salinity*temperature*temperature*temperature - p2 += p2CF[8]*math.pow(salinity, 1.5) - p2 += p2CF[9]*math.pow(salinity, 1.5)*temperature*temperature - p2 += p2CF[10]*pressure - p2 += p2CF[11]*pressure*pressure*temperature*temperature*temperature - p2 += p2CF[12]*pressure*pressure*pressure*temperature - - return p1/p2 - -def potentialTemperature(S, T, p): - # approximation for potential temperature given in McDougall et al 2003 (http://journals.ametsoc.org/doi/pdf/10.1175/1520-0426%282003%2920%3C730%3AAACEAF%3E2.0.CO%3B2) - # S in psu, T in degrees C, p in db - # note p_r = 0 for these fit values - - coef = [ - 0, - 1.067610e-5, - -1.434297e-6, - -7.566349e-9, - -8.535585e-6, - 3.074672e-8, - 1.918639e-8, - 1.788718e-10 - ] - - poly = coef[1] - poly += coef[2]*S - poly += coef[3]*p - poly += coef[4]*T - poly += coef[5]*S*T - poly += coef[6]*T*T - poly += coef[7]*T*p - - return T + p*poly - -uid = None -qc = None diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py deleted file mode 100644 index 44bdff2..0000000 --- a/qctests/EN_std_lev_bkg_and_buddy_check.py +++ /dev/null @@ -1,369 +0,0 @@ -""" -Implements the background check on standard levels and the buddy check -from the EN quality control system, -http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -from cotede.qctests.possible_speed import haversine -import datetime -import EN_background_check -import EN_constant_value_check -import EN_increasing_depth_check -import EN_range_check -import EN_spike_and_step_check -import EN_stability_check -import util.main as main -import data.ds -import numpy as np - -def test(p, allow_level_reinstating=True): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - - If allow_level_reinstating is set to True then rejected levels can be - reprieved by comparing with levels above and below. NB this is done by - default in EN processing. - """ - - # Define an array to hold results. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Obtain the obs minus background differences on standard levels. - result = stdLevelData(p) - if result is None: return qc - - # Unpack the results. - levels, origLevels, assocLevels = result - # Retrieve the background and observation error variances and - # the background values. - bgsl = EN_background_check.bgStdLevels - slev = EN_background_check.auxParam['depth'] - bgev = EN_background_check.bgevStdLevels - obev = EN_background_check.auxParam['obev'] - - #find initial pge - pgeData = determine_pge(levels, bgev, obev, p) - - # Find buddy. - profiles = data.ds.profiles - minDist = 1000000000.0 - iMinDist = None - for iProfile, profile in enumerate(profiles): - pDist = assessBuddyDistance(p, profile) - if pDist is not None and pDist < minDist: - minDist = pDist - iMinDist = iProfile - - # Check if we have found a buddy and process if so. - if minDist <= 400000: - fid = None - pBuddy, currentFile, fid = main.profileData(profiles[iMinDist], '', fid) - fid.close() - - # buddy vetos - Fail = False - if pBuddy.var_index() is None: - Fail = True - if Fail == False: - main.catchFlags(pBuddy) - if np.sum(pBuddy.t().mask == False) == 0: - Fail = True - - if Fail == False: - result = stdLevelData(pBuddy) - if result is not None: - levelsBuddy, origLevelsBuddy, assocLevelsBuddy = result - bgevBuddy = EN_background_check.bgevStdLevels - pgeBuddy = determine_pge(levels, bgevBuddy, obev, pBuddy) - pgeData = update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, p, pBuddy, obev, bgev, bgevBuddy) - - # Check if levels should be reinstated. - if allow_level_reinstating: - if np.abs(p.latitude()) < 20.0: - depthTol = 300.0 - else: - depthTol = 200.0 - stdLevelFlags = pgeData >= 0.5 - for i, slflag in enumerate(stdLevelFlags): - if slflag: - # Check for non rejected surrounding levels. - okbelow = False - if i > 0: - if stdLevelFlags[i - 1] == False and levels.mask[i - 1] == False and bgsl.mask[i - 1] == False: - okbelow = True - okabove = False - nsl = len(stdLevelFlags) - if i < nsl - 1: - if stdLevelFlags[i + 1] == False and levels.mask[i + 1] == False and bgsl.mask[i + 1] == False: - okabove = True - # Work out tolerances. - if slev[i] > depthTol + 100: - tolFactor = 0.5 - elif slev[i] > depthTol: - tolFactor = 1.0 - 0.005 * (slev[i] - depthTol) - else: - tolFactor = 1.0 - ttol = 0.5 * tolFactor - if okbelow == True and okabove == True: - xmax = levels[i - 1] + bgsl[i - 1] + ttol - xmin = levels[i + 1] + bgsl[i + 1] - ttol - elif okbelow == True: - xmax = levels[i - 1] + bgsl[i - 1] + ttol - xmin = levels[i - 1] + bgsl[i - 1] - ttol - elif okabove == True: - xmax = levels[i + 1] + bgsl[i + 1] + ttol - xmin = levels[i + 1] + bgsl[i + 1] - ttol - else: - continue - # Reassign PGE if level is within the tolerances. - if levels[i] + bgsl[i] >= xmin and levels[i] + bgsl[i] <= xmax: - pgeData[i] = 0.49 - - # Assign the QC flags to original levels. - for i, pge in enumerate(pgeData): - if pgeData.mask[i]: continue - if pge < 0.5: continue - for j, assocLevel in enumerate(assocLevels): - if assocLevel == i: - origLevel = origLevels[j] - qc[origLevel] = True - - return qc - -def determine_pge(levels, bgev, obev, profile): - ''' - determine the probability of gross error per level given: - levels: a list of observed - background temperatures per level (ie the first return of stdLevelData) - bgev: list of background error variance per level - obev: list of observational error variances per level - profile: the wodpy profile object in question - ''' - pge = np.ma.array(np.ndarray(len(levels))) - pge.mask = True - - for iLevel, level in enumerate(levels): - if levels.mask[iLevel] or bgev.mask[iLevel]: continue - bgevLevel = bgev[iLevel] - if np.abs(profile.latitude()) < 10.0: bgevLevel *= 1.5**2 - obevLevel = obev[iLevel] - pge_est = EN_background_check.estimatePGE(profile.probe_type(), False) - - kappa = 0.1 - evLevel = obevLevel + bgevLevel #V from the text - sdiff = level**2 / evLevel - pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) - pdTotal = kappa * pge_est + pdGood * (1.0 - pge_est) - pge[iLevel] = kappa * pge_est / pdTotal - - return pge - -def buddyCovariance(minDist, profile, buddyProfile, meso_ev_a, meso_ev_b, syn_ev_a, syn_ev_b): - ''' - coavariance formula for buddy profiles, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf pp.11 - meso_ev_a == mesoscale error variance for profile a, etc. - ''' - - corScaleA = 100.0 # In km. - corScaleB = 400.0 # In km. - corScaleT = 432000.0 # 5 days in secs. - mesSDist = minDist / (1000.0 * corScaleA) - synSDist = minDist / (1000.0 * corScaleB) - - timeDiff2 = timeDiff(profile, buddyProfile) - if timeDiff2 is None: - return None - timeDiff2 = (timeDiff2 / corScaleT)**2 - - covar = (np.sqrt(meso_ev_a * meso_ev_b) * - (1.0 + mesSDist) * np.exp(-mesSDist - timeDiff2) + - np.sqrt(syn_ev_a * syn_ev_b) * - (1.0 + synSDist) * np.exp(-synSDist - timeDiff2)) - - return covar - -def update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, profile, buddyProfile, obev, bgev, bgevBuddy): - ''' - update the PGE for the profile in question using the buddy pge. - ''' - - for iLevel in range(len(levelsBuddy)): - if levels.mask[iLevel] or levelsBuddy.mask[iLevel]: continue - - # For simplicity, going to assume that length scales - # are isotropic and the same everywhere; in the EN - # processing length scales are stretched in E/W direction - # near the equator and this functionality could be added - # later. - - covar = buddyCovariance(minDist, profile, buddyProfile, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0) - if covar is None: - continue; - - errVarA = obev[iLevel] + bgev[iLevel] - errVarB = obev[iLevel] + bgevBuddy[iLevel] - rho2 = covar**2 / (errVarA + errVarB) - expArg = (-(0.5 * rho2 / (1.0 - rho2)) * - (levels[iLevel]**2 / errVarA + - levelsBuddy[iLevel]**2 / errVarB - - 2.0 * levels[iLevel] * levelsBuddy[iLevel] / covar)) - expArg = -0.5 * np.log(1.0 - rho2) + expArg - expArg = min(80.0, max(-80.0, expArg)) - Z = 1.0 / (1.0 - (1.0 - pgeData[iLevel]) * - (1.0 - pgeBuddy[iLevel]) * (1.0 - expArg)) - if Z < 0.0: Z = 1.0 # In case of rounding errors. - Z = Z**0.5 - pgeData[iLevel] = pgeData[iLevel] * Z - - return pgeData - -def stdLevelData(p): - """ - Combines data that have passed other QC checks to create a - set of observation minus background data on standard levels. - """ - - # Combine other QC results. - preQC = (EN_background_check.test(p) | - EN_constant_value_check.test(p) | - EN_increasing_depth_check.test(p) | - EN_range_check.test(p) | - EN_spike_and_step_check.test(p) | - EN_stability_check.test(p)) - - # Get the data stored by the EN background check. - # As it was run above we know that the data held by the - # module corresponds to the correct profile. - origLevels = np.array(EN_background_check.origLevels) - diffLevels = (np.array(EN_background_check.ptLevels) - - np.array(EN_background_check.bgLevels)) - nLevels = len(origLevels) - if nLevels == 0: return None # Nothing more to do. - - # Remove any levels that failed previous QC. - nLevels, origLevels, diffLevels = filterLevels(preQC, origLevels, diffLevels) - if nLevels == 0: return None - - levels, assocLevs = meanDifferencesAtStandardLevels(origLevels, diffLevels, p.z()) - - return levels, origLevels, assocLevs - -def filterLevels(preQC, origLevels, diffLevels): - ''' - preQC: list or array of bools indicating a QC state for each level, determined from other tests - origLevels: list of level indices that passed EN_background - diffLevels: correpsonding to origLevels. - return (nLevels, origLevels, diffLevels) with all elements corresponding to a True entry in preQC removed. - ''' - - nLevels = len(origLevels) - use = np.ones(nLevels, dtype=bool) - for i, origLevel in enumerate(origLevels): - if preQC[origLevel]: use[i] = False - nLevels = np.count_nonzero(use) - origLevels = origLevels[use] - diffLevels = diffLevels[use] - - return nLevels, origLevels, diffLevels - -def meanDifferencesAtStandardLevels(origLevels, diffLevels, depths): - ''' - origLevels: list of level indices under consideration - diffLevels: list of differences corresponding to origLevels - depths: list of depths of all levels in profile. - returns (levels, assocLevs), where - levels == a masked array of mean differences at each standard level - assocLevs == a list of the indices of the closest standard levels to the levels indicated in origLevels - ''' - - # Get the set of standard levels. - stdLevels = EN_background_check.auxParam['depth'] - - # Create arrays to hold the standard level data and aggregate. - nStdLevels = len(stdLevels) - levels = np.zeros(nStdLevels) - nPerLev = np.zeros(nStdLevels) - assocLevs = [] - for i, origLevel in enumerate(origLevels): - # Find the closest standard level. - j = np.argmin(np.abs(depths[origLevel] - stdLevels)) - assocLevs.append(j) - levels[j] += diffLevels[i] - nPerLev[j] += 1 - - # Average the standard levels where there are data. - iGT1 = nPerLev > 1 - levels[iGT1] /= nPerLev[iGT1] - levels = np.ma.array(levels) - levels.mask = False - levels.mask[nPerLev == 0] = True - - return levels, assocLevs - - -def assessBuddyDistance(p, buddy): - """ - given a profile

and a possible buddy profile , - return None if is not a valid buddy, or the distance - to

if it is. - """ - - # Check that it is not the same profile and that they - # are near in time. The time criteria matches the EN - # processing but would probably be better if it checked - # that the profiles were within a time threshold. The - # cruise is compared as two profiles from the same instrument - # should not be compared. - if (buddy.uid() == p.uid() or - buddy.year() != p.year() or - buddy.month() != p.month() or - buddy.cruise() == p.cruise()): return None - lat = p.latitude() - lon = p.longitude() - latComp = buddy.latitude() - lonComp = buddy.longitude() - # Do a rough check of distance. - latDiff = np.abs(latComp - lat) - if latDiff > 5: return None - # Do a more detailed check of distance. - # Check in case they are either side of the edge of the map. - if np.abs(lonComp - lon) > 180: - if lonComp < lon: - lonComp += 360.0 - else: - lonComp -= 360.0 - # Calculate distance and return. - return haversine(lat, lon, latComp, lonComp) - -def timeDiff(p1, p2): - ''' - returns the time difference, in seconds, between two profiles - returns None if the year, month or day in either profile is invalid - ''' - - dts = [] - for prof in [p1, p2]: - year = prof.year() - month = prof.month() - day = prof.day() - if not (year > 0) or not (1 <= month <= 12) or not (1 <= day <= 31): - return None - time = prof.time() - if time is None or time < 0 or time >= 24: - hours = 0 - minutes = 0 - seconds = 0 - else: - hours = int(time) - minutesf = (time - hours) * 60 - minutes = int(minutesf) - seconds = int((minutesf - minutes) * 60) - - dts.append(datetime.datetime(year, month, day, hours, minutes, seconds)) - - diff = dts[0] - dts[1] - - return np.abs(diff.total_seconds()) - - diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py deleted file mode 100644 index 52342ee..0000000 --- a/qctests/EN_track_check.py +++ /dev/null @@ -1,392 +0,0 @@ -""" -Implements the EN track check, described on pp 7 and 21 of -http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -import numpy as np -import data.ds as ds -import util.main as main -import util.geo as geo -import copy -import datetime -import math - -# module constants -DistRes = 20000. # meters -TimeRes = 600. # seconds - -EN_track_headers = {} -EN_track_results = {} -threadFile = {} - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - global EN_track_headers - global EN_track_results - global threadFile - - cruise = p.cruise() - uid = p.uid() - - # don't bother if cruise == 0 or None - if cruise in [0, None]: - return np.zeros(1, dtype=bool); - - # The headers from an entire cruise must be analyzed all at once; - # we'll write the results to the global data store, in a dictionary - # with ntuple keys (cruise, uid), and values as single element - # numpy arrays, containing either a true or a false (per all the other - # qc return objects) - - # check if this profile has been examined already - if (cruise, uid) in EN_track_results.keys(): - return EN_track_results[(cruise, uid)] - - # some detector types cannot be assessed by this test; do not raise flag. - if p.probe_type in [None]: - return np.zeros(1, dtype=bool) - - # the first time this test is run, sort ds.threadProfiles into a cruise-keyed dictionary: - if ds.threadFile != threadFile: - EN_track_headers = main.sort_headers(ds.threadProfiles) - threadFile = ds.threadFile - - # since we didn't find an answer already calculated, - # we still need to do the calculation for this cruise; - # all the relevant headers are sitting in the EN_track_headers list. - headers = EN_track_headers[cruise] - - # start all as passing by default: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())] = np.zeros(1, dtype=bool) - - # copy the list of headers; - # remove entries as they are flagged. - passedHeaders = copy.deepcopy(headers) - rejects = findOutlier(passedHeaders) - while rejects != []: - passedIndex = [x for x in range(len(passedHeaders)) if x not in rejects ] - passedHeaders = [passedHeaders[index] for index in passedIndex ] - rejects = findOutlier(passedHeaders) - - # if more than half got rejected, reject everyone - if len(passedHeaders) < len(headers) / 2: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())][0] = True - - return EN_track_results[(cruise, uid)] - -def findOutlier(headers): - ''' - given a list of , find the fastest one; - if it's too fast, reject it or the one before it, return a list of rejected indices; - once the fastest is within limits, return []. - ''' - - maxShipSpeed = 15. # m/s - maxBuoySpeed = 2. # m/s - - if headers == []: - return [] - - # determine speeds and angles for list of headers - speeds, angles = calculateTraj(headers) - - # decide if something needs to be flagged - maxSpeed = maxShipSpeed - if isBuoy(headers[0]): - maxSpeed = maxBuoySpeed - iMax = speeds.index(max(speeds)) - flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) - - # decide which profile to reject, flag it, and return a list of indices rejected at this step. - if flag: - rejects = chooseReject(headers, speeds, angles, iMax, maxSpeed) - - for reject in rejects: - EN_track_results[(headers[reject].cruise(), headers[reject].uid())][0] = True - return rejects - else: - return [] - -def chooseReject(headers, speeds, angles, index, maxSpeed): - ''' - decide which profile to reject, headers[index] or headers[index-1], or both, - and return a list of indices to reject. - ''' - - # chain of tests breaks when a reject is found: - reject = condition_a(headers, speeds, angles, index, maxSpeed)[0] - - # condition i needs to run at the end of the chain in all cases: - # if no decision, reject both: - if reject == -1: - reject = [index-1, index] - # if excessive speed is created by removing the flag, reject both instead - # can't create new excessive speed by removing last profile. - elif reject < len(headers)-1: - newHeaders = copy.deepcopy(headers) - del newHeaders[reject] - newSpeeds, newAngles = calculateTraj(newHeaders) - flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) - if flag: - reject = [index-1, index] - else: - reject = [reject] - else: - reject = [reject] - - return reject - -def calculateTraj(headers): - ''' - return a list of speeds and a list of angles describing the trajectory of the track described - by the time-ordered list of . - ''' - - speeds = [None] - angles = [None] - - # Find speed and angle for all profiles remaining in the list - for i in range(1, len(headers)): - - speeds.append(None) - angles.append(None) - - speeds[i] = trackSpeed(headers[i-1], headers[i]) - if i < len(headers)-1: # can't do angle on last point - angles[i] = abs(math.pi - geo.haversineAngle(headers[i-1], headers[i], headers[i+1])) - - return speeds, angles - -def isBuoy(header): - ''' - decide if header belongs to a buoy-based measurement - ''' - - return header.probe_type in [4,7,9,10,11,12,13,15] - -def detectExcessiveSpeed(speeds, angles, index, maxSpeed): - ''' - decide if there was an excessive speed at in the lists and - ''' - - flag = speeds[index] > maxSpeed - - if index > 0: - flag = flag or ( (speeds[index] > 0.8*maxSpeed) and (angles[index]>math.pi/2 or angles[index-1]>math.pi/2) ) - - return flag - -def meanSpeed(speeds, headers, maxSpeed): - ''' - determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) - ''' - - meanSpeed = 0 - speedCount = 0 - for iSpeed, speed in enumerate(speeds): - if speed == None or iSpeed == 0: - #missing values - continue - elif iSpeed > 0 and geo.deltaTime(headers[iSpeed-1], headers[iSpeed]) < 3600.: - #too close together in time - continue - elif speed > maxSpeed: - #too fast - continue - else: - meanSpeed += speed - speedCount += 1 - - if speedCount > 0: - meanSpeed = meanSpeed / speedCount - - return meanSpeed - - -def trackSpeed(prevHeader, header): - ''' - computes the speed, including rounding tolerance from the reference, - for the track at

. - return None if some necessary data is missing - ''' - - # check that all required data is present: - if None in [header.latitude(), header.longitude(), prevHeader.latitude(), prevHeader.longitude()]: - return None - if None in [header.year(), header.month(), header.day(), header.time(), prevHeader.year(), prevHeader.month(), prevHeader.day(), prevHeader.time()]: - return None - - dist = geo.haversineDistance(prevHeader, header) - DTime = geo.deltaTime(prevHeader, header) - speed = (dist - DistRes) / max(DTime, TimeRes) - - return speed - -def condition_a(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (a) from the text - ''' - - if index == 1 and len(headers) == 2: - return 0, 'a' - elif index == 1 and len(headers) > 2: # note 'M' in the text seems to count from 1, not 0. - impliedSpeed = trackSpeed(headers[0], headers[2]) - if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): - return 1, 'a' - else: - return 0, 'a' - elif index == len(headers)-1 and len(headers)>3: # why not >=? seems to cause problems, investigate. - impliedSpeed = trackSpeed(headers[-3], headers[-1]) - if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): - return index-1, 'a' - else: - return index, 'a' - else: - return condition_b(headers, speeds, angles, index, maxSpeed) - -def condition_b(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (b) from the text - ''' - if speeds[index-1] > maxSpeed: - return index-1, 'b' - elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: - return index, 'b' - - return condition_c(headers, speeds, angles, index, maxSpeed) - -def condition_c(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (c) from the text - ''' - - if index < len(headers)-1 and index > 0: - impliedSpeed = trackSpeed(headers[index-1], headers[index+1]) - if impliedSpeed > maxSpeed: - return index-1, 'c' - - if index > 1: - impliedSpeed = trackSpeed(headers[index-2], headers[index]) - if impliedSpeed > maxSpeed: - return index, 'c' - - return condition_d(headers, speeds, angles, index, maxSpeed) - - -def condition_d(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (d) from the text - ''' - - if None not in [angles[index-1], angles[index]] and angles[index-1] > 45./180.*math.pi + angles[index]: - return index-1, 'd' - - if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: - return index, 'd' - - return condition_e(headers, speeds, angles, index, maxSpeed) - -def condition_e(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (e) from the text - ''' - - if len(headers) > max(2, index+1): - - if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: - return index-1, 'e' - - if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: - return index, 'e' - - return condition_f(headers, speeds, angles, index, maxSpeed) - -def condition_f(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (f) from the text - ''' - - if index>0 and index < len(speeds)-1: - - ms = meanSpeed(speeds, headers, maxSpeed) - - if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): - return index-1, 'f' - - if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): - return index, 'f' - - return condition_g(headers, speeds, angles, index, maxSpeed) - -def condition_g(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (g) from the text - ''' - - if index > 1 and index < len(headers) - 1: - - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) - - distTol = geo.haversineDistance(headers[index-1], headers[index-2]) - distTol += geo.haversineDistance(headers[index], headers[index-1]) - distTol += geo.haversineDistance(headers[index+1], headers[index]) - distTol = max(DistRes, 0.1*distTol) - - if dist1 < dist2 - distTol: - return index-1, 'g' - - if dist2 < dist1 - distTol: - return index, 'g' - - return condition_h(headers, speeds, angles, index, maxSpeed) - -def condition_h(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (h) from the text - typeo in text, implementation incomplete - ''' - - if index > 1 and index < len(headers) - 1: - - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) - - PD1 = geo.haversineDistance(headers[index-1], headers[index-2]) / dist2 - PD2 = geo.haversineDistance(headers[index], headers[index-2]) / dist1 - - PT1 = geo.deltaTime(headers[index-2], headers[index-1]) / geo.deltaTime(headers[index-2], headers[index+1]) - PT2 = geo.deltaTime(headers[index-2], headers[index]) / geo.deltaTime(headers[index-2], headers[index+1]) - - if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): - return index-1, 'h' - if abs(PD2 - PT2) > 0.1 + abs(PD1 - PT1): - return index, 'h' - - return -1, 'i' - -def checkOrder(profiles): - ''' - check that a list of profiles is properly time ordered - ''' - - dates = [] - for pro in profiles: - if pro.time() is not None: - hour, minute, second = geo.parseTime(pro.time()) - else: - hour = 0 - minute = 0 - second = 0 - date = datetime.datetime(year=pro.year(), month=pro.month(), day=pro.day(), hour=hour, minute=minute, second=second ) - dates.append(date) - - for i in range(len(dates)-1): - assert dates[i] <= dates [i+1], 'dates out of order %s %s' % (dates[i], dates[i+1]) diff --git a/qctests/ICDC_aqc_01_level_order.py b/qctests/ICDC_aqc_01_level_order.py deleted file mode 100644 index b64688c..0000000 --- a/qctests/ICDC_aqc_01_level_order.py +++ /dev/null @@ -1,111 +0,0 @@ -''' -Python version of check_aqc_01_level_order.f with input/output -adjusted to work with the AutoQC testing suite. Details of the -original code are: - -c/ DATE: JANUARY 14 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: check_aqc_01_levels_order - -c/ PURPOSE: -c to check the original level order; -c if necessary to bring the original levels to increasing order -''' - -import numpy as np - -# Global variables to hold data to avoid having to recalculate order -# repeatedly for the same profile. -uid = None -nlevels = 0 -origlevels = None -zr = None -tr = None -qc = None - -def test(p): - '''Return a set of QC decisions. This corresponds to levels with - negative depths. - ''' - - level_order(p) - - return qc - -def reordered_data(p): - '''Return number levels and depth, temperature in depth order. - Only non-rejected levels are returned. - ''' - - level_order(p) - - return nlevels, zr, tr - -def revert_order(p, data): - '''Return data in the original profile order. Data rejected in - the level_order function are returned as missing data. - ''' - - level_order(p) - - datar = np.ma.array(np.ndarray(p.n_levels()), - dtype = data.dtype) - datar.mask = True - - for i, datum in enumerate(data): - datar[origlevels[i]] = datum - - return datar - -def revert_qc_order(p, qc): - '''Return QC array. Missing data values are set to False.''' - - qcr = revert_order(p, qc) - qcr[qcr.mask] = False - return qcr - -def level_order(p): - '''Reorders data into depth order and rejects levels with - negative depth. - ''' - global uid, nlevels, origlevels, zr, tr, qc - - # Check if the module already holds the results for this profile. - if uid == p.uid() and uid is not None: - return None - - # Extract data and define the index for each level. - z = p.z() - t = p.t() - origlevels = np.arange(p.n_levels()) - - # Implement the QC. For this test we only reject negative depths. - qc = z < 0 - - # Remove occurrences of no data at a level and rejected obs. - use = (z.mask == False) & (t.mask == False) & (qc == False) - z = z[use] - t = t[use] - origlevels = origlevels[use] - nlevels = np.count_nonzero(use) - - if nlevels > 1: - # Sort the data. Using mergesort keeps levels with the same depth - # in the same order. - isort = np.argsort(z, kind='mergesort') - zr = z[isort] - tr = t[isort] - origlevels = origlevels[isort] - else: - zr = z - tr = t - - return None - - diff --git a/qctests/ICDC_aqc_02_crude_range.py b/qctests/ICDC_aqc_02_crude_range.py deleted file mode 100644 index 18e560f..0000000 --- a/qctests/ICDC_aqc_02_crude_range.py +++ /dev/null @@ -1,68 +0,0 @@ -''' -Python version of check_aqc_02_crude_range.f. Details of the -original code are: - -c/ DATE: JANUARY 19 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: check_aqc_02_crude_range - -c/ PURPOSE: -c to check weather the temperature value is within the crude range -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np - -def test(p): - '''Return a set of QC decisions. - ''' - - nlevels, z, t = ICDC.reordered_data(p) - - qc = (t < parminover) | (t > parmaxover) - - for i, tval in enumerate(t): - if qc[i]: continue # Already rejected. - - zval = z[i] - - if np.any((tval >= tcrude1) & (tval <= tcrude2) & - (zval <= zcrude1) & (zval >= zcrude2)): - qc[i] = True - - return ICDC.revert_qc_order(p, qc) - -# Ranges: -tcrude1 = np.array( - [-3.5,-2.5,-2.3,-2.0,-1.4,-1.0,-0.8,-0.5,-0.4,3.0, - 5.0,5.5,6.0,7.0,7.5,8.8,9.5,10.0,11.0,12.0,12.8,13.5, - 14.75,15.0,16.0,17.5,18.5,19.0,20.0,21.4,22.4,23.0,24.0, - 26.0,28.0,31.0,32.0]) - -tcrude2 = np.array( - [-2.5,-2.3,-2.0,-1.4,-1.0,-0.8,-0.5,-0.4,3.0, - 5.0,5.5,6.0,7.0,7.5,8.8,9.5,10.0,11.0,12.0,12.8,13.5, - 14.75,15.0,16.0,17.5,18.5,19.0,20.0,21.4,22.4,23.0,24.0, - 26.0,28.0,31.0,32.0,35.0]) - -zcrude1 = np.ndarray(37) -zcrude1[:] = 9000.0 - -zcrude2 = np.array( - [ 0., 500.,1200.,2000.,3800.,4200., - 5000.,6000.,9000.,7500.,4400.,1950., - 1900.,1800.,1700.,2200.,1700.,5200., - 1600.,1400.,3600.,5200.,1000., 800., - 1800., 800., 600., 400., 350.,2400., - 400., 350., 300., 250., 200., 100., 50.]) - -parminover = -2.3 -parmaxover = 33.0 - - diff --git a/qctests/ICDC_aqc_04_max_obs_depth.py b/qctests/ICDC_aqc_04_max_obs_depth.py deleted file mode 100644 index 878ce31..0000000 --- a/qctests/ICDC_aqc_04_max_obs_depth.py +++ /dev/null @@ -1,54 +0,0 @@ -''' -Python version of check_aqc_04_instrument_type_max_obs_depth.f. Details of the -original code are: - -c/ DATE: JANUARY 20 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - - -c/ TITLE: check_aqc_04_instrument_type_max_obs_depth - -c/ PURPOSE: -c compare observed depths with unstrument type maximum observed depth -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np -from util.wod import wod_database - -def test(p): - '''Return quality control decisions. - ''' - - # Get WOD database. - db = wod_database(p) - - # Set maximum allowed depth. If not defined, it is set to the highest - # possible float. - if db == 'OSD': - zlast = 9000.0 - elif db == 'CTD': - zlast = 9000.0 - elif db == 'PFL': - zlast = 2020.0 - elif db == 'APB': - zlast = 1200.0 - elif db == 'MBT' and p.primary_header['Country code'] == 'JP': - zlast = 295.00001 - elif db == 'XBT': - zlast = 1900.0 - else: - zlast = np.finfo(dtype=float).max - - # Set QC flags. - qc = p.z() >= zlast - - return qc - - - diff --git a/qctests/ICDC_aqc_05_stuck_value.py b/qctests/ICDC_aqc_05_stuck_value.py deleted file mode 100644 index 4c70829..0000000 --- a/qctests/ICDC_aqc_05_stuck_value.py +++ /dev/null @@ -1,71 +0,0 @@ -''' -Python version of check_aqc_05_stuck_value.f. Details of the original code are: - -c/ DATE: JANUARY 20 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: check_aqc_05_stuck_value - -c/ PURPOSE: -c to check temperature profile for stuck value/unrealistically thick thermostad -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np -from util.wod import wod_database - -def test(p): - '''Return quality control decisions. - ''' - - # Default set of QC flags to return. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Set minimum allowed levels. - db = wod_database(p) - if db == 'OSD': - minlevs = 7 - elif db == 'CTD': - minlevs = 50 - elif db == 'PFL': - minlevs = 20 - elif db == 'APB': - minlevs = 20 - elif db == 'MBT': - minlevs = 7 - elif db == 'XBT': - minlevs = 20 - else: - return qc # Do not have the information to QC other types. - - # Check that we have the levels we need. - nlevels, z, t = ICDC.reordered_data(p) - if nlevels <= minlevs: return qc - - # Count stuck values. - n = np.ones(nlevels, dtype=int) - for i in range(nlevels - minlevs): - for j in range(i + 1, nlevels): - diff = np.abs(t[i] - t[j]) - if diff > 0.0001: break - n[i] += 1 - - # Find the largest stuck value range. - i = np.argmax(n) - if n[i] < minlevs: return qc - thick = z[i + n[i] - 1] - z[i] - if thick >= 200.0: - # If setting the QC flags we need to be careful about level order. - qclo = qc[0:nlevels] - qclo[i:i+n[i]] = True - qc = ICDC.revert_qc_order(p, qclo) - - return qc - - - diff --git a/qctests/ICDC_aqc_06_n_temperature_extrema.py b/qctests/ICDC_aqc_06_n_temperature_extrema.py deleted file mode 100644 index 8e4bbee..0000000 --- a/qctests/ICDC_aqc_06_n_temperature_extrema.py +++ /dev/null @@ -1,62 +0,0 @@ -''' -Python version of check_aqc_06_number_of_temperature_extrema.f. -Details of the original code are: - -c/ DATE: JANUARY 20 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: check_aqc_06_number_of_temperature_extrema - -c/ PURPOSE: -c find profiles with unrealistically large number of temperature extrema -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np - -def test(p): - '''Return quality control decisions. - ''' - - # Initialise data. - qc = np.zeros(p.n_levels(), dtype=bool) - parminover = -2.3 - parmaxover = 33.0 - levminext = 6 - deltaext = 0.5 - maxextre = 4 - - # Check that we have the levels we need. - nlevels, z, t = ICDC.reordered_data(p) - if nlevels <= levminext: return qc - - # Exclude data outside allowed range. - use = (t > parminover) & (t <= parmaxover) - nuse = np.count_nonzero(use) - if nuse < levminext: return qc - z = z[use] - t = t[use] - - # Find and count the extrema. - ima = 0 - for i in range(1, nuse - 1): - pcent = t[i] - pa = np.abs(pcent - t[i - 1]) - pb = np.abs(pcent - t[i + 1]) - pmin = min(pa, pb) - if pcent > t[i - 1] and pcent > t[i + 1] and pmin > deltaext: - ima += 1 - if pcent < t[i - 1] and pcent < t[i + 1] and pmin > deltaext: - ima += 1 - if ima > maxextre: - qc[:] = True - - return qc - - - diff --git a/qctests/ICDC_aqc_07_spike_check.py b/qctests/ICDC_aqc_07_spike_check.py deleted file mode 100644 index 5be4abc..0000000 --- a/qctests/ICDC_aqc_07_spike_check.py +++ /dev/null @@ -1,75 +0,0 @@ -''' -Python version of check_aqc_07_spike_check.f. -Details of the original code are: - -c/ DATE: JANUARY 25 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - - -c/ TITLE: check_aqc_07_spike_check - -c/ PURPOSE: -c to check temperature profile for spikes -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np - -def test(p): - '''Return quality control decisions. - ''' - - # The test is run on re-ordered data. - nlevels, z, t = ICDC.reordered_data(p) - qc = np.zeros(nlevels, dtype=bool) - if nlevels < 3: return qc # Not enough levels to check. - - # Ignore any levels outside of limits. - parminover = -2.3 - parmaxover = 33.0 - use = (t > parminover) & (t < parmaxover) - nuse = np.count_nonzero(use) - if nuse < 3: return qc - zuse = z[use] - tuse = t[use] - origlevels = (np.arange(nlevels))[use] - - # Extract sections of the arrays. We are QCing the values - # in the z2 and v3 arrays. - z1 = zuse[0:-2] - z2 = zuse[1:-1] - z3 = zuse[2:] - v1 = tuse[0:-2] - v2 = tuse[1:-1] - v3 = tuse[2:] - ol = origlevels[1:-1] - - # Calculate the level of 'spike'. - z13 = z3 - z1 - z12 = z2 - z1 - z23 = z3 - z2 - - a = 0.5 * (v1 + v3) - q1 = np.abs(v2 - a) - q2 = np.abs(0.5 * (v3 - v1)) - - spike = q1 - q2 - - # Define the threshold at each level. - spikemax = np.ndarray(nuse - 2) - spikemax[:] = 4.0 - spikemax[z2 > 1000.0] = 3.0 - spikemax[z2 > 2000.0] = 2.0 - - # Set QC flags. - qc[ol[spike > spikemax]] = True - - return ICDC.revert_qc_order(p, qc) - - - diff --git a/qctests/ICDC_aqc_08_gradient_check.py b/qctests/ICDC_aqc_08_gradient_check.py deleted file mode 100644 index 4f463bc..0000000 --- a/qctests/ICDC_aqc_08_gradient_check.py +++ /dev/null @@ -1,63 +0,0 @@ -''' -Python version of check_aqc_08_gradient_check.f. -Details of the original code are: - -c/ DATE: JANUARY 28 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: check_aqc_08_gradient_check - -c/ PURPOSE: -c to check temperature profile for unrealistic vertical gradients -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np - -def test(p): - '''Return quality control decisions. - ''' - - # Global ranges - data outside these bounds are ignored. - parminover = -2.3 - parmaxover = 33.0 - - # The test is run on re-ordered data. - nlevels, z, t = ICDC.reordered_data(p) - qc = np.zeros(nlevels, dtype=bool) - - # Calculate gradients and thresholds. - z0 = z[0:-1] - z1 = z[1:] - t0 = t[0:-1] - t1 = t[1:] - - gradients = (t1 - t0) / (z1 - z0) - zmean = 0.5 * (z0 + z1) - zmean[zmean < 1.0] = 1.0 - - gradmin = -150.0 / zmean - 0.010 - gradmin[gradmin < -4.0] = -4.0 - - gradmax = 100.0 / zmean + 0.015 - gradmax[gradmax > 1.5] = 1.5 - - # Find where the gradients and outside the thresholds. - result = np.where(((gradients < gradmin) | (gradients > gradmax)) & - (t0 > parminover) & (t1 > parminover) & - (t0 < parmaxover) & (t1 < parmaxover))[0] - - # Both levels that form the gradient have to be rejected. - if len(result) > 0: - qc[result] = True - qc[result + 1] = True - - return ICDC.revert_qc_order(p, qc) - - - diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py deleted file mode 100644 index b53224c..0000000 --- a/qctests/ICDC_aqc_09_local_climatology_check.py +++ /dev/null @@ -1,220 +0,0 @@ -''' -Python version of check_aqc_09_gradient_check.f. -Details of the original code are: - -c/ DATE: FEBRUARY 4 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: local_climatological_range_check - check_aqc_09_climatological_range - -c/ PURPOSE: -c to check wheather temperature value is within the local climatological range - -c/ Local temperature median and absolute median deviation are calculated on the basis -c/ of the OSD, CTD, and PFL temperature profiles from the WOD13 (updates as of December 2015) -c/ The median and the amd are calculated on a regular 0.5x0.5 lat/lon grid at 60 depth levels -c/ with level spacing increasing with depth. -c/ Variable influence area size is used with the target number of 500 profiles within the influence -c/ area. This number is not achieved in the data sparse regions or nn the deep levels. - -c local climatological ranges for the level k are defined as: -c tminlocal(k)=tmedian(k) - rnumamd*tamd(k) -c tmaxlocal(k)=tmedian(k) + rnumamd*tamd(k) -''' - -import ICDC_aqc_01_level_order as ICDC -from netCDF4 import Dataset -import numpy as np -import os -import time - -def test(p): - '''Return quality control decisions. - ''' - - # The test is run on re-ordered data. - nlevels, z, t = ICDC.reordered_data(p) - - # Define default QC. - defaultqc = np.zeros(p.n_levels(), dtype=bool) - - # No check for the Caspian Sea or Great Lakes. - lat = p.latitude() - lon = p.longitude() - if ((lat >= 35.0 and lat <= 45.0 and lon >= 45.0 and lon <= 60.0) or - (lat >= 40.0 and lat <= 50.0 and lon >= -95.0 and lon <= -75.0)): - return defaultqc - - # Get range. - ranges = get_climatology_range(nlevels, z, lat, lon, p.month()) - if ranges is None: - return defaultqc - - # Perform the QC. - tmin, tmax = ranges - qc = ((t < tmin) | (t > tmax)) & (tmin != fillValue) & (tmax != fillValue) - - return ICDC.revert_qc_order(p, qc) - -def get_climatology_range(nlevels, z, lat, lon, month): - - # Define arrays for the results. - tmin = np.ndarray(nlevels) - tmax = np.ndarray(nlevels) - tmin[:] = fillValue - tmax[:] = fillValue - - # Calculate grid indices. - iy = int(np.floor((90.0 - lat) / 0.5)) - ix = int(np.floor((lon + 180.0) / 0.5)) - if (iy < 0 or iy > 360 or ix < 0 or ix > 720): - return None - - # Find the climatology range. - for k in range(nlevels): - # Find the corresponding climatology level. - arg = np.argwhere((z[k] >= zedqc[:-1]) & (z[k] < zedqc[1:])) - if len(arg) > 0: - kisel = arg[0] - else: - continue # No level found. - # Check if using monthly or annual fields. - if kisel <= 15: - useAnnual = False - else: - useAnnual = True - if month is None: useAnnual = True - # Extract the temperature. - if useAnnual == False: - amd = tamdM[ix, iy, kisel, month - 1] - if amd < 0.0: - useAnnual = True - else: - tmedian = tmedM[ix, iy, kisel, month - 1] - if tmedian < parminover: - useAnnual = True - if useAnnual: - amd = tamdA[ix, iy, kisel] - if amd < 0.0: - continue - else: - tmedian = tmedA[ix, iy, kisel] - if tmedian < parminover: - continue - if amd > 0.0 and amd < 0.05: amd = 0.05 - - rnumamd = 3.0 - tmaxa = tmedian + rnumamd * amd - tmina = tmedian - rnumamd * amd - if tmina < parminover: tmina = parminover - if tmaxa > parmaxover: tmaxa = parmaxover - - tmin[k] = tmina - tmax[k] = tmaxa - - return tmin, tmax - -def read_ascii_and_convert_to_netcdf(): - '''Coverts the ASCII data file to netCDF on first read. - This is much faster to access. - ''' - global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue - - # Load the data. - tmedM = np.ndarray([721, 361, 16, 12]) - tamdM = np.ndarray([721, 361, 16, 12]) - tmedA = np.ndarray([721, 361, 60]) - tamdA = np.ndarray([721, 361, 60]) - zedqc = np.ndarray(60) - # Do not use masked arrays to save on memory use. - fillValue = -9.0 # Has to be a negative number. - tmedM[:, :, :, :] = fillValue - tamdM[:, :, :, :] = fillValue - tmedA[:, :, :] = fillValue - tamdA[:, :, :] = fillValue - with open('data/climatological_t_median_and_amd_for_aqc.dat') as f: - for line in f: - vals = line.split() - m = int(vals[0]) - 1 - j = int(vals[1]) - 1 - i = int(vals[3]) - 1 - k = int(vals[5]) - 1 - z = float(vals[6]) - tmedian = float(vals[7]) - absmeddev = float(vals[8]) - - if m < 12 and k < 16: - tmedM[i, j, k, m] = tmedian - tamdM[i, j, k, m] = absmeddev - elif m == 12: - tmedA[i, j, k] = tmedian - tamdA[i, j, k] = absmeddev - zedqc[k] = z - - # Create the netCDF version. - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'w') - idim = nc.createDimension('i', 721) - jdim = nc.createDimension('j', 361) - kmdim = nc.createDimension('km', 16) - kadim = nc.createDimension('ka', 60) - mdim = nc.createDimension('m', 12) - - sf = 0.0001 - tmedav = nc.createVariable('tmedA', 'i4', ('i', 'j', 'ka'), zlib=True) - tmedav.add_offset = 0.0 - tmedav.scale_factor = sf - tmedav[:, :, :] = tmedA - - tamdav = nc.createVariable('tamdA', 'i4', ('i', 'j', 'ka'), zlib=True) - tamdav.add_offset = 0.0 - tamdav.scale_factor = sf - tamdav[:, :, :] = tamdA - - tmedmv = nc.createVariable('tmedM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) - tmedmv.add_offset = 0.0 - tmedmv.scale_factor = sf - tmedmv[:, :, :, :] = tmedM - - tamdmv = nc.createVariable('tamdM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) - tamdmv.add_offset = 0.0 - tamdmv.scale_factor = sf - tamdmv[:, :, :, :] = tamdM - - zedqcv = nc.createVariable('zedqc', 'f4', ('ka',)) - zedqcv[:] = zedqc - - nc.fillValue = fillValue - nc.history = 'Created ' + time.ctime(time.time()) + ' from climatological_t_median_and_amd_for_aqc.dat provided by Viktor Gouretski, Integrated Climate Data Center, University of Hamburg, Hamburg, Germany, February 2016' - nc.close() - -def read_netcdf(): - '''Read climatological data from netCDF. - ''' - global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue - - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') - tmedA = nc.variables['tmedA'][:, :, :] - tamdA = nc.variables['tamdA'][:, :, :] - tmedM = nc.variables['tmedM'][:, :, :, :] - tamdM = nc.variables['tamdM'][:, :, :, :] - zedqc = nc.variables['zedqc'][:] - fillValue = nc.fillValue - nc.close() - -# Global ranges - data outside these bounds are assumed not valid. -parminover = -2.3 -parmaxover = 33.0 - -# Read data. -if os.path.isfile('data/climatological_t_median_and_amd_for_aqc.nc'): - read_netcdf() -else: - read_ascii_and_convert_to_netcdf() - - - diff --git a/qctests/WOD_gradient_check.py b/qctests/WOD_gradient_check.py deleted file mode 100644 index a982c61..0000000 --- a/qctests/WOD_gradient_check.py +++ /dev/null @@ -1,45 +0,0 @@ -""" -Implements the excessive gradient test on page 47 of http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf -""" - -import numpy - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get temperature values from the profile. - t = p.t() - # Get depth values (m) from the profile. - d = p.z() - - assert len(t.data) == len(d.data), 'Number of temperature measurements does not equal number of depth measurements.' - - # initialize qc as a bunch of falses; - # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isDepth = (d.mask==False) - isData = isTemperature & isDepth - - for i in range(0,len(t.data)-1): - if isData[i] & isData[i+1] & (d.data[i+1] - d.data[i] > 0): - - gradient = (t.data[i+1] - t.data[i]) / max([ (d.data[i+1] - d.data[i]) , 3.0]) - - # gradient & inversion check - qc[i] = (gradient > 0.3) or (gradient < -0.7) or qc[i] # in case qc[i] was set true by the zero sensitivity indicator in the previous step - qc[i+1] = (gradient > 0.3) or (gradient < -0.7) - - # zero sensitivity indicator - # flags data if temperature drops to 0 too abruptly, indicating a missing value. - if t.data[i+1] == 0: - if -1.0 * gradient > 5.0 * 0.7: - qc[i+1] = True - - return qc diff --git a/qctests/WOD_range_check.py b/qctests/WOD_range_check.py deleted file mode 100644 index 86a8941..0000000 --- a/qctests/WOD_range_check.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -Implements the WOD range check, -pp 46 http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf -""" -import numpy -import data.ds as ds - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - - - # Get data from the profile. - t = p.t() - d = p.z() - latitude = p.latitude() - longitude = p.longitude() - - temperatures = {} - # initialize qc as a bunch of falses (pass by default) - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isDepth = (d.mask==False) - isData = isTemperature & isDepth - isLat = isinstance(latitude, float) - isLong = isinstance(longitude, float) - - if not isLat or not isLong: - return qc - - depths = ds.WODtempRanges['depths'] - gLat, gLong = nearestGrid(latitude, longitude) - cellCode = ds.cellCodes[(gLat, gLong)] - region = ds.regionCodes[cellCode] - minima = ds.WODtempRanges[region]['min'] - maxima = ds.WODtempRanges[region]['max'] - - for i in range(1, p.n_levels()): - if isData[i] == False: continue - - # find depth bin - iDepth = 0 - while d[i] > depths[iDepth] and iDepth <= len(depths): - iDepth += 1 - - minTemp = minima[iDepth] - maxTemp = maxima[iDepth] - - if t[i] < minTemp or t[i] > maxTemp: - qc[i] = True - - return qc - - -def nearestGrid(lat, lng): - ''' - find the nearest grid point to lat, lng. - grid st. lat is on [-89.5, 89.5] in steps of 1 - and long is on [-179.5, 179.5] in steps of 1 - ''' - - gLat = (numpy.round(lat - 0.5) + 0.5 + 90) % 180 - 90 - gLong = (numpy.round(lng - 0.5) + 0.5 + 180) % 360 - 180 - - return gLat, gLong diff --git a/qctests/loose_location_at_sea.py b/qctests/loose_location_at_sea.py deleted file mode 100644 index 0aa8357..0000000 --- a/qctests/loose_location_at_sea.py +++ /dev/null @@ -1,55 +0,0 @@ -'''Checks the profile location against a global relief dataset to check it is in the ocean. - It is similar CoTeDe's location at sea test but instead of interpolating to the position - the surrounding points are checked to see if any are ocean points. This allows for - errors in the global relief data or imprecise locations close to the coast. This makes it - similar to the way the ICDC and EN tests work. -''' - -from netCDF4 import Dataset -import numpy as np - -# Define the area either side of the closest global relief point that is -# checked for ocean points. -width = 2 - -# Load data into memory. Include a halo so that we can handle points next the data line. -nc = Dataset('data/etopo5.nc') -etopx = nc.variables['ETOPO05_X'][:] -etopy = nc.variables['ETOPO05_Y'][:] -etoph = np.ndarray([len(etopy) + width * 2, len(etopx) + width * 2]) -etoph[:, :] = -1 # Default is ocean points. -etoph[width:-width, width:-width] = nc.variables['ROSE'][:, :] -etoph[width:-width, 0:width] = etoph[width:-width, -2*width:-width] -etoph[width:-width, -width:] = etoph[width:-width, width:2*width] -nc.close() - -def test(p): - '''Return an array of QC decisions. There is a QC result per level but these - are all set to the same value, determined by the location. - ''' - - qc = np.zeros(p.n_levels(), dtype=bool) - - # Ensure that lon is in the range -180 to 180 or 0 to 360 and lat is from -90 to 90. - lat = p.latitude() - lon = p.longitude() - if lat is None or lon is None: - return qc - if lon < -180 or lon >=360 or lat < -90 or lat > 90: - qc[:] = True - return qc - if lon < 0: lon += 360 # Needs to be in range 0 to 360. - - # Find closest global relief point and extract section of the array. - ilat = np.argmin(np.abs(etopy - lat)) + width # Add on the halo width. - ilon = np.argmin(np.abs(etopx - lon)) + width - data = etoph[ilat - width:ilat + width + 1, ilon - width:ilon + width + 1] - - # If any point is an ocean point then do not reject. - if np.all(data >= 0): - qc[:] = True - - return qc - - - diff --git a/summarize-results.py b/summarize-results.py index 4d5348a..c536010 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -5,7 +5,7 @@ testNames = main.importQC('qctests') testNames.sort() -testNames = [test for test in testNames if test[0:4] == 'Argo'] +testNames = [test for test in testNames if test[0:5] == 'CSIRO'] # connect to database conn = psycopg2.connect("dbname='root' user='root'") From f62fbdc2175511da5f4c3f6f8d3a9e54ab6829d4 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 31 Jul 2016 00:00:41 +0000 Subject: [PATCH 17/79] continuing to implement and validate full-profile db --- qctests/Argo_global_range_check.py | 30 ++ qctests/Argo_gradient_test.py | 41 ++ qctests/Argo_impossible_date_test.py | 35 ++ qctests/Argo_impossible_location_test.py | 27 ++ qctests/Argo_pressure_increasing_test.py | 51 +++ qctests/Argo_regional_range_test.py | 68 +++ qctests/Argo_spike_test.py | 40 ++ qctests/CoTeDe_Argo_density_inversion.py | 11 + qctests/CoTeDe_GTSPP_WOA_normbias.py | 11 + qctests/CoTeDe_GTSPP_global_range.py | 11 + qctests/CoTeDe_GTSPP_gradient.py | 11 + qctests/CoTeDe_GTSPP_profile_envelop.py | 11 + qctests/CoTeDe_GTSPP_spike_check.py | 11 + qctests/CoTeDe_WOA_normbias.py | 11 + qctests/CoTeDe_anomaly_detection.py | 11 + qctests/CoTeDe_digit_roll_over.py | 11 + qctests/CoTeDe_fuzzy_logic.py | 11 + qctests/CoTeDe_gradient.py | 11 + qctests/CoTeDe_location_at_sea_test.py | 11 + qctests/CoTeDe_rate_of_change.py | 11 + qctests/CoTeDe_spike.py | 11 + qctests/CoTeDe_tukey53H_norm.py | 11 + qctests/EN_background_available_check.py | 58 +++ qctests/EN_background_check.py | 193 +++++++++ qctests/EN_constant_value_check.py | 70 ++++ qctests/EN_increasing_depth_check.py | 94 +++++ qctests/EN_range_check.py | 23 + qctests/EN_spike_and_step_check.py | 202 +++++++++ qctests/EN_spike_and_step_suspect.py | 7 + qctests/EN_stability_check.py | 176 ++++++++ qctests/EN_std_lev_bkg_and_buddy_check.py | 369 +++++++++++++++++ qctests/EN_track_check.py | 392 ++++++++++++++++++ qctests/ICDC_aqc_01_level_order.py | 111 +++++ qctests/ICDC_aqc_02_crude_range.py | 68 +++ qctests/ICDC_aqc_04_max_obs_depth.py | 54 +++ qctests/ICDC_aqc_05_stuck_value.py | 71 ++++ qctests/ICDC_aqc_06_n_temperature_extrema.py | 62 +++ qctests/ICDC_aqc_07_spike_check.py | 75 ++++ qctests/ICDC_aqc_08_gradient_check.py | 63 +++ .../ICDC_aqc_09_local_climatology_check.py | 220 ++++++++++ qctests/WOD_gradient_check.py | 45 ++ qctests/WOD_range_check.py | 71 ++++ qctests/loose_location_at_sea.py | 55 +++ 43 files changed, 2936 insertions(+) create mode 100644 qctests/Argo_global_range_check.py create mode 100644 qctests/Argo_gradient_test.py create mode 100644 qctests/Argo_impossible_date_test.py create mode 100644 qctests/Argo_impossible_location_test.py create mode 100644 qctests/Argo_pressure_increasing_test.py create mode 100644 qctests/Argo_regional_range_test.py create mode 100644 qctests/Argo_spike_test.py create mode 100644 qctests/CoTeDe_Argo_density_inversion.py create mode 100644 qctests/CoTeDe_GTSPP_WOA_normbias.py create mode 100644 qctests/CoTeDe_GTSPP_global_range.py create mode 100644 qctests/CoTeDe_GTSPP_gradient.py create mode 100644 qctests/CoTeDe_GTSPP_profile_envelop.py create mode 100644 qctests/CoTeDe_GTSPP_spike_check.py create mode 100644 qctests/CoTeDe_WOA_normbias.py create mode 100644 qctests/CoTeDe_anomaly_detection.py create mode 100644 qctests/CoTeDe_digit_roll_over.py create mode 100644 qctests/CoTeDe_fuzzy_logic.py create mode 100644 qctests/CoTeDe_gradient.py create mode 100644 qctests/CoTeDe_location_at_sea_test.py create mode 100644 qctests/CoTeDe_rate_of_change.py create mode 100644 qctests/CoTeDe_spike.py create mode 100644 qctests/CoTeDe_tukey53H_norm.py create mode 100644 qctests/EN_background_available_check.py create mode 100644 qctests/EN_background_check.py create mode 100644 qctests/EN_constant_value_check.py create mode 100644 qctests/EN_increasing_depth_check.py create mode 100644 qctests/EN_range_check.py create mode 100644 qctests/EN_spike_and_step_check.py create mode 100644 qctests/EN_spike_and_step_suspect.py create mode 100644 qctests/EN_stability_check.py create mode 100644 qctests/EN_std_lev_bkg_and_buddy_check.py create mode 100644 qctests/EN_track_check.py create mode 100644 qctests/ICDC_aqc_01_level_order.py create mode 100644 qctests/ICDC_aqc_02_crude_range.py create mode 100644 qctests/ICDC_aqc_04_max_obs_depth.py create mode 100644 qctests/ICDC_aqc_05_stuck_value.py create mode 100644 qctests/ICDC_aqc_06_n_temperature_extrema.py create mode 100644 qctests/ICDC_aqc_07_spike_check.py create mode 100644 qctests/ICDC_aqc_08_gradient_check.py create mode 100644 qctests/ICDC_aqc_09_local_climatology_check.py create mode 100644 qctests/WOD_gradient_check.py create mode 100644 qctests/WOD_range_check.py create mode 100644 qctests/loose_location_at_sea.py diff --git a/qctests/Argo_global_range_check.py b/qctests/Argo_global_range_check.py new file mode 100644 index 0000000..f20cc95 --- /dev/null +++ b/qctests/Argo_global_range_check.py @@ -0,0 +1,30 @@ +""" +Implements the global range check used in the Argo quality control +system. + +See Argo quality control manual (based on version 2.5). +""" + +from util import obs_utils + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get temperature and pressure values from the profile. + t = p.t() + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + # Make the quality control decisions. This should + # return true if the temperature is outside -2.5 deg C + # and 40 deg C or pressure is less than -5. + qct = (t.mask == False) & ((t.data < -2.5) | (t.data > 40.0)) + qcp = (z.mask == False) & (z.data < -5) + qc = qct | qcp + + return qc + + diff --git a/qctests/Argo_gradient_test.py b/qctests/Argo_gradient_test.py new file mode 100644 index 0000000..4daddf6 --- /dev/null +++ b/qctests/Argo_gradient_test.py @@ -0,0 +1,41 @@ +""" +Implements the gradient test on page 8 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf +""" + +import numpy +from util import obs_utils + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get temperature values from the profile. + t = p.t() + # Get depth values (m) from the profile. + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' + + # initialize qc as a bunch of falses; + # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isPressure = (z.mask==False) + isData = isTemperature & isPressure + + for i in range(1,len(t.data)-1): + if isData[i] & isTemperature[i-1] & isTemperature[i+1]: + + isSlope = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) + + if z.data[i] < 500: + qc[i] = isSlope > 9.0 + else: + qc[i] = isSlope > 3.0 + + return qc diff --git a/qctests/Argo_impossible_date_test.py b/qctests/Argo_impossible_date_test.py new file mode 100644 index 0000000..963736b --- /dev/null +++ b/qctests/Argo_impossible_date_test.py @@ -0,0 +1,35 @@ +""" +Implements the impossible date test on page 6 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf + +The date criterion has been altered so that the test can be applied to all data types. +""" + +import numpy +import calendar + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get the year, month, day and time: + year = p.year() + month = p.month() + day = p.day() + time = p.time() + + # initialize qc as false: + qc = numpy.zeros(1, dtype=bool) + + if year < 1700: + qc[0] = True + elif month not in range(1,13): + qc[0] = True + elif day not in range(1, calendar.monthrange(year, month)[1] + 1): + qc[0] = True + elif time is not None and (time < 0 or time >= 24): + qc[0] = True + + return qc diff --git a/qctests/Argo_impossible_location_test.py b/qctests/Argo_impossible_location_test.py new file mode 100644 index 0000000..8a2276f --- /dev/null +++ b/qctests/Argo_impossible_location_test.py @@ -0,0 +1,27 @@ +""" +Implements the impossible location test on page 6 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf +""" + +import numpy +import calendar + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get the lat and long: + latitude = p.latitude() + longitude = p.longitude() + + # initialize qc as false: + qc = numpy.zeros(1, dtype=bool) + + if isinstance(latitude, float) and latitude < -90 or latitude > 90: + qc[0] = True + elif isinstance(longitude, float) and longitude < -180 or longitude > 180: + qc[0] = True + + return qc diff --git a/qctests/Argo_pressure_increasing_test.py b/qctests/Argo_pressure_increasing_test.py new file mode 100644 index 0000000..6f25b89 --- /dev/null +++ b/qctests/Argo_pressure_increasing_test.py @@ -0,0 +1,51 @@ +""" +Implements the pressure increasing check used in the Argo quality control +system. + +See Argo quality control manual (based on version 2.5), +http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf page 8. +""" + +import numpy as np +from util import obs_utils + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get vertical coordinate values from the profile. + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + # Make the quality control decisions. This should + # return true where z decreases or stays the same. + qc = np.ndarray(p.n_levels(), dtype=bool) + qc[:] = False + iRef = -1 + for i in range(0, p.n_levels()): + # Check if the data value is missing. + if z.mask[i] == True: + continue + + # The first level with a z value is saved to use as a reference + # to compare to the next level. + if iRef == -1: + iRef = i + zRef = z[iRef] + continue + + # Check for non-increasing z. If z increases, update the reference. + if z[i] == zRef: + qc[i] = True + elif z[i] < zRef: + qc[iRef] = True + qc[i] = True + else: + iRef = i + zRef = z[iRef] + + return qc + + diff --git a/qctests/Argo_regional_range_test.py b/qctests/Argo_regional_range_test.py new file mode 100644 index 0000000..3e2d89e --- /dev/null +++ b/qctests/Argo_regional_range_test.py @@ -0,0 +1,68 @@ +""" +Implements the regional range test on page 7 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf +""" + +import numpy +import pyproj +from shapely.geometry import Polygon, Point + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + redSeaLat = [10., 20., 30., 10.] + redSeaLong = [40., 50., 30., 40.] + + mediterraneanLat = [30., 30., 40., 42., 50., 40., 30] + mediterraneanLong = [6., 40., 35., 20., 15., 5., 6.] + + # Get the lat and long and temp: + latitude = p.latitude() + longitude = p.longitude() + t = p.t() + + # check for gaps in data + isTemperature = (t.mask==False) + + # initialize qc as false (all pass) + qc = numpy.zeros(len(t), dtype=bool) + + isInRedSea = isInRegion(latitude, longitude, redSeaLat, redSeaLong) + isInMediterranean = isInRegion(latitude, longitude, mediterraneanLat, mediterraneanLong) + + for i in range(p.n_levels()): + if isTemperature[i]: + if isInRedSea: + if t[i] < 21.7 or t[i] > 40.: + qc[i] = True + if isInMediterranean: + if t[i] < 10. or t[i] > 40.: + qc[i] = True + + return qc + +def isInRegion(lat, longitude, regionLat, regionLong): + ''' + determine if the point lat, longitude is in the region bounded by a polygon with vertices regionLat, regionLong + adapted from solution at http://gis.stackexchange.com/questions/79215/determine-if-point-is-within-an-irregular-polygon-using-python + ''' + + # WGS84 datum + wgs84 = pyproj.Proj(init='EPSG:4326') + + # Albers Equal Area Conic (aea) + nplaea = pyproj.Proj("+proj=laea +lat_0=90 +lon_0=-40 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs") + + # Transform polygon and test point coordinates to northern lat AEAC projection + poly_x, poly_y = pyproj.transform(wgs84, nplaea, regionLong, regionLat) + point_x, point_y = pyproj.transform(wgs84, nplaea, [longitude], [lat]) + + poly_proj = Polygon(zip(poly_x,poly_y)) + + testPoint = Point(point_x[0], point_y[0]) + return testPoint.within(poly_proj) + + diff --git a/qctests/Argo_spike_test.py b/qctests/Argo_spike_test.py new file mode 100644 index 0000000..a302571 --- /dev/null +++ b/qctests/Argo_spike_test.py @@ -0,0 +1,40 @@ +""" +Implements the spike test on page 8 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf +""" + +import numpy +from util import obs_utils + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get temperature values from the profile. + t = p.t() + # Get pressure values (db) from the profile. + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' + + # initialize qc as a bunch of falses; + # implies all measurements pass when a spike can't be calculated, such as at edges & gaps in data: + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isPressure = (z.mask==False) + isData = isTemperature & isPressure + + for i in range(1,len(t.data)-1): + if isData[i] & isTemperature[i-1] & isTemperature[i+1]: + + isSpike = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - numpy.abs((t.data[i+1] - t.data[i-1])/2) + if z.data[i] < 500: + qc[i] = isSpike > 6.0 + else: + qc[i] = isSpike > 2.0 + + return qc diff --git a/qctests/CoTeDe_Argo_density_inversion.py b/qctests/CoTeDe_Argo_density_inversion.py new file mode 100644 index 0000000..26b9493 --- /dev/null +++ b/qctests/CoTeDe_Argo_density_inversion.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the density inversion QC from the CoTeDe Argo config.''' + + config = 'argo' + testname = 'density_inversion' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_GTSPP_WOA_normbias.py b/qctests/CoTeDe_GTSPP_WOA_normbias.py new file mode 100644 index 0000000..e040cd2 --- /dev/null +++ b/qctests/CoTeDe_GTSPP_WOA_normbias.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the WOA normbias QC from the CoTeDe GTSPP config.''' + + config = 'gtspp' + testname = 'woa_normbias' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_GTSPP_global_range.py b/qctests/CoTeDe_GTSPP_global_range.py new file mode 100644 index 0000000..4d4896d --- /dev/null +++ b/qctests/CoTeDe_GTSPP_global_range.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the global range QC from the CoTeDe GTSPP config.''' + + config = 'gtspp' + testname = 'global_range' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_GTSPP_gradient.py b/qctests/CoTeDe_GTSPP_gradient.py new file mode 100644 index 0000000..da97a9d --- /dev/null +++ b/qctests/CoTeDe_GTSPP_gradient.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the gradient QC from the CoTeDe GTSPP config.''' + + config = 'gtspp' + testname = 'gradient' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_GTSPP_profile_envelop.py b/qctests/CoTeDe_GTSPP_profile_envelop.py new file mode 100644 index 0000000..1645451 --- /dev/null +++ b/qctests/CoTeDe_GTSPP_profile_envelop.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the profile_envelop QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'profile_envelop' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_GTSPP_spike_check.py b/qctests/CoTeDe_GTSPP_spike_check.py new file mode 100644 index 0000000..eaa68fe --- /dev/null +++ b/qctests/CoTeDe_GTSPP_spike_check.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the spike QC from the CoTeDe GTSPP config.''' + + config = 'gtspp' + testname = 'spike' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_WOA_normbias.py b/qctests/CoTeDe_WOA_normbias.py new file mode 100644 index 0000000..2b9bc1c --- /dev/null +++ b/qctests/CoTeDe_WOA_normbias.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the WOA normbias QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'woa_normbias' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_anomaly_detection.py b/qctests/CoTeDe_anomaly_detection.py new file mode 100644 index 0000000..d1c4f05 --- /dev/null +++ b/qctests/CoTeDe_anomaly_detection.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the CoTeDe Anomaly Detection QC.''' + + config = 'anomaly_detection' + testname = 'anomaly_detection' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_digit_roll_over.py b/qctests/CoTeDe_digit_roll_over.py new file mode 100644 index 0000000..f1d0c0a --- /dev/null +++ b/qctests/CoTeDe_digit_roll_over.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the digit roll over QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'digit_roll_over' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_fuzzy_logic.py b/qctests/CoTeDe_fuzzy_logic.py new file mode 100644 index 0000000..451464f --- /dev/null +++ b/qctests/CoTeDe_fuzzy_logic.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the CoTeDe fuzzy logic QC.''' + + config = 'fuzzy' + testname = 'fuzzylogic' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_gradient.py b/qctests/CoTeDe_gradient.py new file mode 100644 index 0000000..820bf6c --- /dev/null +++ b/qctests/CoTeDe_gradient.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the gradient QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'gradient' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_location_at_sea_test.py b/qctests/CoTeDe_location_at_sea_test.py new file mode 100644 index 0000000..48cb346 --- /dev/null +++ b/qctests/CoTeDe_location_at_sea_test.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the CoTeDe location at sea QC.''' + + config = 'cotede' + testname = 'location_at_sea' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_rate_of_change.py b/qctests/CoTeDe_rate_of_change.py new file mode 100644 index 0000000..f852aa0 --- /dev/null +++ b/qctests/CoTeDe_rate_of_change.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the rate_of_change QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'rate_of_change' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_spike.py b/qctests/CoTeDe_spike.py new file mode 100644 index 0000000..004ebd2 --- /dev/null +++ b/qctests/CoTeDe_spike.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the spike QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'spike' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_tukey53H_norm.py b/qctests/CoTeDe_tukey53H_norm.py new file mode 100644 index 0000000..a444708 --- /dev/null +++ b/qctests/CoTeDe_tukey53H_norm.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the tukey53H norm QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'tukey53H_norm' + + return get_qc(p, config, testname) + + diff --git a/qctests/EN_background_available_check.py b/qctests/EN_background_available_check.py new file mode 100644 index 0000000..ca9f93e --- /dev/null +++ b/qctests/EN_background_available_check.py @@ -0,0 +1,58 @@ +""" +The background check on reported levels from the EN quality control +system, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf, includes +setting the QC flags if the background is not available at a profile level. +This aspect is separated out in this check. +""" + +import numpy as np +from qctests.EN_background_check import auxParam +from qctests.EN_background_check import findGridCell + +def test(p, *args): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Define an array to hold results. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Find grid cell nearest to the observation. + ilon, ilat = findGridCell(p, auxParam['lon'], auxParam['lat']) + + # Extract the relevant auxiliary data. + imonth = p.month() - 1 + clim = auxParam['clim'][:, ilat, ilon, imonth] + depths = auxParam['depth'] + + # Remove missing data points. + iOK = (clim.mask == False) + if np.count_nonzero(iOK) == 0: + qc[:] = True + return qc + clim = clim[iOK] + depths = depths[iOK] + + # Find which levels have data. + t = p.t() + z = p.z() + isTemperature = (t.mask==False) + isDepth = (z.mask==False) + isData = isTemperature & isDepth + + # Loop over levels. + for iLevel in range(p.n_levels()): + if isData[iLevel] == False: continue + + # Get the climatology and error variance values at this level. + climLevel = np.interp(z[iLevel], depths, clim, right=99999) + if climLevel == 99999: + qc[iLevel] = True # This could reject some good data if the + # climatology is incomplete, but also can act as + # a check that the depth of the profile is + # consistent with the depth of the ocean. + + return qc + diff --git a/qctests/EN_background_check.py b/qctests/EN_background_check.py new file mode 100644 index 0000000..af3f455 --- /dev/null +++ b/qctests/EN_background_check.py @@ -0,0 +1,193 @@ +""" +Implements the background check on reported levels from the EN quality control +system, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +import EN_spike_and_step_check +import numpy as np +import util.obs_utils as outils +from netCDF4 import Dataset + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Check if the QC of this profile was already done and if not + # run the QC. + if p.uid() != uid or p.uid() is None: + run_qc(p) + + # QC results are in the module variable. + return qc + +def run_qc(p): + """ + Performs the QC check. + """ + + global qc, uid, origLevels, ptLevels, bgLevels, bgStdLevels, bgevStdLevels + + # Define an array to hold results. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Create a record of the processing for use by the background + # and buddy checks on standard levels. + uid = p.uid() + origLevels = [] + ptLevels = [] + bgLevels = [] + + # Find grid cell nearest to the observation. + ilon, ilat = findGridCell(p, auxParam['lon'], auxParam['lat']) + + # Extract the relevant auxiliary data. + imonth = p.month() - 1 + clim = auxParam['clim'][:, ilat, ilon, imonth] + bgev = auxParam['bgev'][:, ilat, ilon] + bgStdLevels = clim # Save for use in another check. + bgevStdLevels = bgev # Save the full column for use by another check. + obev = auxParam['obev'] + depths = auxParam['depth'] + + # Remove missing data points. + iOK = (clim.mask == False) & (bgev.mask == False) + if np.count_nonzero(iOK) == 0: return qc + clim = clim[iOK] + bgev = bgev[iOK] + obev = obev[iOK] + depths = depths[iOK] + + # Find which levels have data. + t = p.t() + s = p.s() + z = p.z() + isTemperature = (t.mask==False) + isSalinity = (s.mask==False) + isDepth = (z.mask==False) + isData = isTemperature & isDepth + + # Use the EN_spike_and_step_check to find suspect values. + suspect = EN_spike_and_step_check.test(p, suspect=True) + + # Loop over levels. + for iLevel in range(p.n_levels()): + if isData[iLevel] == False: continue + + # Get the climatology and error variance values at this level. + climLevel = np.interp(z[iLevel], depths, clim, right=99999) + bgevLevel = np.interp(z[iLevel], depths, bgev, right=99999) + obevLevel = np.interp(z[iLevel], depths, obev, right=99999) + if climLevel == 99999: + continue + assert bgevLevel > 0, 'Background error variance <= 0' + assert obevLevel > 0, 'Observation error variance <= 0' + + # If at low latitudes the background error variance is increased. + # Also, because we are on reported levels instead of standard levels + # the variances are increased. NB multiplication factors are squared + # because we are working with error variances instead of standard + # deviations. + if np.abs(p.latitude()) < 10.0: bgevLevel *= 1.5**2 + bgevLevel *= 2.0**2 + + # Set up an initial estimate of probability of gross error. + pge = estimatePGE(p.probe_type(), suspect[iLevel]) + + # Calculate potential temperature. + if isSalinity[iLevel]: + sLevel = s[iLevel] + else: + sLevel = 35.0 + potm = outils.pottem(t[iLevel], sLevel, z[iLevel], lat=p.latitude()) + + # Do Bayesian calculation. + evLevel = obevLevel + bgevLevel + sdiff = (potm - climLevel)**2 / evLevel + pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) + pdTotal = 0.1 * pge + pdGood * (1.0 - pge) + pgebk = 0.1 * pge / pdTotal + + if pgebk >= 0.5: + qc[iLevel] = True + else: + # Store the results. + origLevels.append(iLevel) + ptLevels.append(potm) + bgLevels.append(climLevel) + + return None + +def findGridCell(p, gridLong, gridLat): + ''' + Find grid cell nearest to the observation p, + where gridLong and gridLat are lists of grid coordinates. + ''' + for i in range(1, len(gridLong)): + assert gridLong[i] - gridLong[i-1] == gridLong[1] - gridLong[0], 'longitude grid points must be evenly spaced' + lon = p.longitude() + grid = gridLong + nlon = len(grid) + ilon = int(np.mod(np.round((lon - grid[0]) / (grid[1] - grid[0])), nlon)) + for i in range(1, len(gridLat)): + assert gridLat[i] - gridLat[i-1] == gridLat[1] - gridLat[0], 'latitude grid points must be evenly spaced' + lat = p.latitude() + grid = gridLat + nlat = len(grid) + ilat = int(np.mod(np.round((lat - grid[0]) / (grid[1] - grid[0])), nlat)) + if ilat == nlat: ilat -= 1 # Checks for edge case where lat is ~90. + + assert ilon >=0 and ilon < nlon, 'Longitude is out of range: %f %i' % (lon, ilon) + assert ilat >=0 and ilat < nlat, 'Latitude is out of range: %f %i' % (lat, ilat) + + return ilon, ilat + + +def estimatePGE(probe_type, isSuspect): + ''' + Estimates the probability of gross error for a measurement taken by + the given probe_type. Information from the EN_spike_and_step_check + is used here to increase the initial estimate if the observation is suspect. + ''' + if probe_type in [1,2,3,13,16]: + pge = 0.05 + else: + pge = 0.01 + if isSuspect: + pge = 0.5 + 0.5 * pge + + return pge + +def readENBackgroundCheckAux(): + ''' + Reads auxiliary information needed by the EN background check. + ''' + + filename = 'data/EN_bgcheck_info.nc' + nc = Dataset(filename) + data = {} + data['lon'] = nc.variables['longitude'][:] + data['lat'] = nc.variables['latitude'][:] + data['depth'] = nc.variables['depth'][:] + data['month'] = nc.variables['month'][:] + data['clim'] = nc.variables['potm_climatology'][:] + data['bgev'] = nc.variables['bg_err_var'][:] + data['obev'] = nc.variables['ob_err_var'][:] + + return data + +#import parameters on load +auxParam = readENBackgroundCheckAux() + +# Initialise global variables to hold data needed for the +# EN background and buddy check on standard levels. +uid = None +qc = None +origLevels = [] +ptLevels = [] +bgLevels = [] +bgevStdLevels = [] +bgStdLevels = [] + diff --git a/qctests/EN_constant_value_check.py b/qctests/EN_constant_value_check.py new file mode 100644 index 0000000..82df764 --- /dev/null +++ b/qctests/EN_constant_value_check.py @@ -0,0 +1,70 @@ +""" +Implements the constant value check used in the EN quality control +system, described on page 7 of http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +import numpy + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + if p.uid() != uid or p.uid() is None: + run_qc(p) + + # QC results are stored in the module variable. + return qc + +def run_qc(p): + + global qc, uid + + # Get temperature values from the profile. + t = p.t() + d = p.z() + + temperatures = {} + # initialize qc as a bunch of falses (pass by default) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isDepth = (d.mask==False) + + #dictionary counts instances of each temperature value + for i in range(len(t.data)): + if isTemperature[i]: + if t.data[i] in temperatures: + temperatures[t.data[i]] += 1 + else: + temperatures[t.data[i]] = 1 + + for key in temperatures: + + if float(temperatures[key]) / float(len(t.data)) >= 0.9: + repeats = numpy.where(t.data == key)[0] + #drop the entries that don't have a depth associated with them; + #this triggers the 90% rule regardless of the presence of depth data, but + #ensures that depths are available to assess the range over which constant temps were observed. + repeatsWithDepth = [] + for j in range(len(repeats)): + if isDepth[repeats[j]]: + repeatsWithDepth.append(repeats[j]) + first = repeatsWithDepth[0] + last = repeatsWithDepth[-1] + + if d.data[last] - d.data[first] >= 100: + qc = numpy.ones(len(t.data), dtype=bool) #note everyhing is flagged by this test. + + uid = p.uid() + + return None + +uid = None +qc = None + + + diff --git a/qctests/EN_increasing_depth_check.py b/qctests/EN_increasing_depth_check.py new file mode 100644 index 0000000..68cf77d --- /dev/null +++ b/qctests/EN_increasing_depth_check.py @@ -0,0 +1,94 @@ +""" +Implements the EN increasing depth check. +""" + +import EN_spike_and_step_check +import numpy as np +from collections import Counter + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + if p.uid() != uid or p.uid() is None: + run_qc(p) + + # QC results are in the module variable. + return qc + +def run_qc(p): + + global qc, uid + + # Get z values from the profile. + d = p.z() + mask = d.mask + n = p.n_levels() + + # Initialize qc array. + qc = np.zeros(n, dtype=bool) + + # if all the depths are the same, flag all levels and finish immediately + most_common_depth = Counter(d.data).most_common(1) + if most_common_depth[0][1] == len(d.data): + qc = np.ones(n, dtype=bool) + return None + + # Basic check on each level. + qc[d < 0] = True + qc[d > 11000] = True + + # Now check for inconsistencies in the depth levels. + comp = np.ndarray((n, n), dtype=int) + currentMax = 1 + while currentMax > 0: + # Comp gets set to 1 if there is not an increase in depth. + comp[:, :] = 0 + for i in range(n): + if qc[i] or mask[i]: continue + for j in range(n): + if qc[j] or mask[j] or (i == j): continue + if i < j: + if d[i] >= d[j]: comp[i, j] = 1 + else: + if d[i] <= d[j]: comp[i, j] = 1 + + # Check if comp was set to 1 anywhere and which level was + # most inconsistent with the others. + currentMax = 0 + currentLev = -1 + for i in range(n): + lineSum = np.sum(comp[:, i]) + if lineSum >= currentMax: + currentMax = lineSum + currentLev = i + + # Reject immediately if more than one inconsistency or + # investigate further if one inconsistency. + if currentMax > 1: + qc[currentLev] = True + elif currentMax == 1: + # Find out which level it is inconsistent with. + for i in range(n): + if comp[i, currentLev] == 1: otherLev = i + # Check if one was rejected by the spike and step + # check, otherwise reject both. + try: + spikeqc + except: + spikeqc = EN_spike_and_step_check.test(p) + if spikeqc[currentLev]: qc[currentLev] = True + if spikeqc[otherLev]: qc[otherLev] = True + if spikeqc[currentLev] == False and spikeqc[otherLev] == False: + qc[currentLev] = True + qc[otherLev] = True + + uid = p.uid() + + return None + +uid = None +qc = None diff --git a/qctests/EN_range_check.py b/qctests/EN_range_check.py new file mode 100644 index 0000000..95205be --- /dev/null +++ b/qctests/EN_range_check.py @@ -0,0 +1,23 @@ +""" +Implements the global range check used in the EN quality control +system. +""" + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get temperature values from the profile. + t = p.t() + + # Make the quality control decisions. This should + # return true if the temperature is outside -4 deg C + # and 40 deg C. + qc = (t.mask == False) & ((t.data < -4.0) | (t.data > 40.0)) + + return qc + + diff --git a/qctests/EN_spike_and_step_check.py b/qctests/EN_spike_and_step_check.py new file mode 100644 index 0000000..b35ab7a --- /dev/null +++ b/qctests/EN_spike_and_step_check.py @@ -0,0 +1,202 @@ +""" +Implements the spike and step check used in the EN quality control +system, pages 20-21 of http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf + +The EN quality control system does not directly reject levels that are marked as +steps, it marks them as suspect and then they are subjected to an extra test (a +background check) that can reprieve them. In the future it will be best to +remove these elements and include them within the background check code. +""" + +import numpy as np + +def test(p, suspect=False): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + + By default the test returns definite rejections. If the suspect keyword is + set to True the test instead returns suspect levels. + """ + + if p.uid() != uid or suspect != suspectSetting or p.uid() is None: + run_qc(p, suspect) + + # QC results are in the global variable. + return qc + +def run_qc(p, suspect): + + global uid, qc, suspectSetting + + # Define tolerances used. + tolD = np.array([0, 200, 300, 500, 600]) + tolDTrop = np.array([0, 300, 400, 500, 600]) + tolT = np.array([5.0, 5.0, 2.5, 2.0, 1.5]) + + # Define an array to hold results. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Get depth and temperature values from the profile. + z = p.z() + t = p.t() + + # Find which levels have data. + isTemperature = (t.mask==False) + isDepth = (z.mask==False) + isData = isTemperature & isDepth + + # Array to hold temperature differences between levels and gradients. + dt, gt = composeDT(t, z, p.n_levels()) + + # Spikes and steps detection. + for i in range(1, p.n_levels()): + if i >= 2: + if (isData[i-2] and isData[i-1] and isData[i]) == False: + continue + if z[i] - z[i-2] >= 5.0: + wt1 = (z[i-1] - z[i-2]) / (z[i] - z[i-2]) + else: + wt1 = 0.5 + else: + if (isData[i-1] and isData[i]) == False: + continue + wt1 = 0.5 + + dTTol = determineDepthTolerance(z[i-1], np.abs(p.latitude())) + gTTol = 0.05 + + # Check for low temperatures in the Tropics. + # This might be more appropriate to appear in a separate EN regional + # range check but is included here for now for consistency with the + # original code. + if (np.abs(p.latitude()) < 20.0 and z[i-1] < 1000.0 and + t[i-1] < 1.0): + dt[i] = np.ma.masked + if suspect == True: qc[i-1] = True + continue + + qc, dt = conditionA(dt, dTTol, qc, wt1, i, suspect) + qc, dt = conditionB(dt, dTTol, gTTol, qc, gt, i, suspect) + qc = conditionC(dt, dTTol, z, qc, t, i, suspect) + + # End of loop over levels. + + # Step or 0.0 at the bottom of a profile. + if isData[-1] and dt.mask[-1] == False: + dTTol = determineDepthTolerance(z[-1], np.abs(p.latitude())) + if np.abs(dt[-1]) > dTTol: + if suspect == True: qc[-1] = True + if isTemperature[-1]: + if t[-1] == 0.0: + if suspect == True: qc[-1] = True + + # If 4 levels or more than half the profile is rejected then reject all. + if suspect == False: + nRejects = np.count_nonzero(qc) + if nRejects >= 4 or nRejects > p.n_levels()/2: + qc[:] = True + + # Save details of the QC performed in module variables. + uid = p.uid() + suspectSetting = suspect + + return None + + +def composeDT(var, z, nLevels): + ''' + build the array of deltas for the variable provided + ''' + dt = np.ma.zeros(nLevels) + dt.mask = True + gt = dt.copy() + + for i in range(1, nLevels): + if ((z[i] - z[i-1]) <= 50.0 or (z[i] >= 350.0 and (z[i] - z[i-1]) <= 100.0)): + dt[i] = var[i] - var[i-1] + gt[i] = dt[i] / np.max([10.0, z[i] - z[i-1]]) + + + return dt, gt + + +def determineDepthTolerance(z, lattitude): + ''' + determine depth tolerance + ''' + + if (lattitude < 20.0): + depthTol = 300.0 + else: + depthTol = 200.0 + + if z > 600.0: + tTolFactor = 0.3 + elif z > 500.0: + tTolFactor = 0.4 + elif z > depthTol + 100.0: + tTolFactor = 0.5 + elif z > depthTol: + tTolFactor = 1.0 - 0.005 * (z - depthTol) + else: + tTolFactor = 1.0 + + return tTolFactor * 5.0 + +def conditionA(dt, dTTol, qc, wt1, i, suspect): + ''' + condition A (large spike check) + ''' + if (dt.mask[i-1] == False and dt.mask[i] == False and np.max(np.abs(dt[i-1:i+1])) > dTTol): + if np.abs(dt[i] + dt[i-1]) < 0.5*dTTol: + dt[i-1:i+1] = np.ma.masked + if suspect == False: qc[i-1] = True + elif np.abs((1.0-wt1) * dt[i-1] - wt1*dt[i]) < 0.5*dTTol: + # Likely to be a valid large temperature gradient. + dt[i-1:i+1] = np.ma.masked # Stops the levels being rechecked. + + return qc, dt + +def conditionB(dt, dTTol, gTTol, qc, gt, i, suspect): + ''' + condition B (small spike check) + ''' + if (dt.mask[i-1] == False and dt.mask[i] == False and + np.max(np.abs(dt[i-1:i+1])) > 0.5*dTTol and + np.max(np.abs(gt[i-1:i+1])) > gTTol and + np.abs(dt[i] + dt[i-1]) < 0.25*np.abs(dt[i] - dt[i-1])): + dt[i-1:i+1] = np.ma.masked + if suspect == False: qc[i-1] = True + + return qc, dt + +def conditionC(dt, dTTol, z, qc, t, i, suspect): + ''' + condition C (steps) + ''' + + if dt.mask[i-1] == False and np.abs(dt[i-1]) > dTTol: + if z[i-1] <= 250.0 and dt[i-1] < -dTTol and dt[i-1] > -3.0*dTTol: + # May be sharp thermocline, do not reject. + pass + elif i>1 and z[i] - z[i-2] > 0 and np.abs(t[i-1] - interpolate(z[i-1], z[i-2], z[i], t[i-2], t[i])) < 0.5*dTTol: + # consistent interpolation, do not reject + pass + else: + # mark both sides of the step + if suspect == True: qc[i-2:i] = True + + return qc + +def interpolate(depth, shallow, deep, shallowVal, deepVal): + ''' + interpolate values at + ''' + + return (depth - shallow) / (deep - shallow) * (deepVal - shallowVal) + shallowVal + +uid = None +qc = None +suspectSetting = None diff --git a/qctests/EN_spike_and_step_suspect.py b/qctests/EN_spike_and_step_suspect.py new file mode 100644 index 0000000..e90dda4 --- /dev/null +++ b/qctests/EN_spike_and_step_suspect.py @@ -0,0 +1,7 @@ +'''Returns the suspect levels found by the EN spike and step check.''' + +import EN_spike_and_step_check + +def test(p): + + return EN_spike_and_step_check.test(p, suspect=True) diff --git a/qctests/EN_stability_check.py b/qctests/EN_stability_check.py new file mode 100644 index 0000000..2c8ee51 --- /dev/null +++ b/qctests/EN_stability_check.py @@ -0,0 +1,176 @@ +""" +Implements the stability check described on pages 8-9 of +http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +import math, numpy + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + if p.uid() != uid or p.uid() is None: + run_qc(p) + + # QC results are in the module variable. + return qc + +def run_qc(p): + + global uid, qc + + # Get temperature, salinity, pressure values from the profile. + t = p.t() + s = p.s() + P = p.p() + + # initialize qc as a bunch of falses; + qc = numpy.zeros(p.n_levels(), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isSalinity = (s.mask==False) + isPressure = (P.mask==False) + isData = isTemperature & isSalinity & isPressure + + # calculate potential temperatures + T = [] + for i in range(0, p.n_levels()): + T.append(potentialTemperature(s[i], t[i], P[i])) + + for i in range(2,len(t.data)-1): + if (isData[i] and isData[i-1] and isData[i-2]) == False: + continue + + delta_rho_k = mcdougallEOS(s[i], T[i], P[i]) - mcdougallEOS(s[i-1], T[i-1], P[i-1]) + if delta_rho_k >= -0.03: + continue; + + delta_rho_k_prev = mcdougallEOS(s[i-1], T[i-1], P[i-1]) - mcdougallEOS(s[i-2], T[i-2], P[i-2]) + + if abs(delta_rho_k_prev + delta_rho_k) < 0.25*abs(delta_rho_k_prev - delta_rho_k): + qc[i-1] = True + else: + if isData[i+1] == False: + continue + + delta_rho_k_next = mcdougallEOS(s[i+1], T[i+1], P[i+1]) - mcdougallEOS(s[i], T[i], P[i]) + if abs(delta_rho_k + delta_rho_k_next) < 0.25*abs(delta_rho_k - delta_rho_k_next): + qc[i] = True + else: + qc[i-1] = True + qc[i] = True + + #check bottom of profile + i = p.n_levels()-1 + if isData[i] and isData[i-1]: + delta_rho_k = mcdougallEOS(s[i], T[i], P[i]) - mcdougallEOS(s[i-1], T[i-1], P[i-1]) + if delta_rho_k < -0.03: + qc[i] = True + + #check for critical number of flags, flag all if so: + if sum(qc) >= max(2, len(t.data)/4.): + qc = numpy.ones(len(t.data), dtype=bool) + + uid = p.uid() + + return None + + +def mcdougallEOS(salinity, temperature, pressure): + ''' + equation of state defined in McDougall et al 2003 (http://journals.ametsoc.org/doi/pdf/10.1175/1520-0426%282003%2920%3C730%3AAACEAF%3E2.0.CO%3B2) + returns density in kg/m^3 + ''' + + p1CF = [ + 9.99843699e2, + 7.35212840e0, + -5.45928211e-2, + 3.98476704e-4, + 2.96938239e0, + -7.23268813e-3, + 2.12382341e-3, + 1.04004591e-2, + 1.03970529e-7, + 5.18761880e-6, + -3.24041825e-8, + -1.23869360e-11 + ] + + p2CF = [ + 1.0, + 7.28606739e-3, + -4.60835542e-5, + 3.68390573e-7, + 1.80809186e-10, + 2.14691708e-3, + -9.27062484e-6, + -1.78343643e-10, + 4.76534122e-6, + 1.63410736e-9, + 5.30848875e-6, + -3.03175128e-16, + -1.27934137e-17 + ] + + p1 = p1CF[0] + p1 += p1CF[1]*temperature + p1 += p1CF[2]*temperature*temperature + p1 += p1CF[3]*temperature*temperature*temperature + p1 += p1CF[4]*salinity + p1 += p1CF[5]*salinity*temperature + p1 += p1CF[6]*salinity*salinity + p1 += p1CF[7]*pressure + p1 += p1CF[8]*pressure*temperature*temperature + p1 += p1CF[9]*pressure*salinity + p1 += p1CF[10]*pressure*pressure + p1 += p1CF[11]*pressure*pressure*temperature*temperature + + p2 = p2CF[0] + p2 += p2CF[1]*temperature + p2 += p2CF[2]*temperature*temperature + p2 += p2CF[3]*temperature*temperature*temperature + p2 += p2CF[4]*temperature*temperature*temperature*temperature + p2 += p2CF[5]*salinity + p2 += p2CF[6]*salinity*temperature + p2 += p2CF[7]*salinity*temperature*temperature*temperature + p2 += p2CF[8]*math.pow(salinity, 1.5) + p2 += p2CF[9]*math.pow(salinity, 1.5)*temperature*temperature + p2 += p2CF[10]*pressure + p2 += p2CF[11]*pressure*pressure*temperature*temperature*temperature + p2 += p2CF[12]*pressure*pressure*pressure*temperature + + return p1/p2 + +def potentialTemperature(S, T, p): + # approximation for potential temperature given in McDougall et al 2003 (http://journals.ametsoc.org/doi/pdf/10.1175/1520-0426%282003%2920%3C730%3AAACEAF%3E2.0.CO%3B2) + # S in psu, T in degrees C, p in db + # note p_r = 0 for these fit values + + coef = [ + 0, + 1.067610e-5, + -1.434297e-6, + -7.566349e-9, + -8.535585e-6, + 3.074672e-8, + 1.918639e-8, + 1.788718e-10 + ] + + poly = coef[1] + poly += coef[2]*S + poly += coef[3]*p + poly += coef[4]*T + poly += coef[5]*S*T + poly += coef[6]*T*T + poly += coef[7]*T*p + + return T + p*poly + +uid = None +qc = None diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py new file mode 100644 index 0000000..44bdff2 --- /dev/null +++ b/qctests/EN_std_lev_bkg_and_buddy_check.py @@ -0,0 +1,369 @@ +""" +Implements the background check on standard levels and the buddy check +from the EN quality control system, +http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +from cotede.qctests.possible_speed import haversine +import datetime +import EN_background_check +import EN_constant_value_check +import EN_increasing_depth_check +import EN_range_check +import EN_spike_and_step_check +import EN_stability_check +import util.main as main +import data.ds +import numpy as np + +def test(p, allow_level_reinstating=True): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + + If allow_level_reinstating is set to True then rejected levels can be + reprieved by comparing with levels above and below. NB this is done by + default in EN processing. + """ + + # Define an array to hold results. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Obtain the obs minus background differences on standard levels. + result = stdLevelData(p) + if result is None: return qc + + # Unpack the results. + levels, origLevels, assocLevels = result + # Retrieve the background and observation error variances and + # the background values. + bgsl = EN_background_check.bgStdLevels + slev = EN_background_check.auxParam['depth'] + bgev = EN_background_check.bgevStdLevels + obev = EN_background_check.auxParam['obev'] + + #find initial pge + pgeData = determine_pge(levels, bgev, obev, p) + + # Find buddy. + profiles = data.ds.profiles + minDist = 1000000000.0 + iMinDist = None + for iProfile, profile in enumerate(profiles): + pDist = assessBuddyDistance(p, profile) + if pDist is not None and pDist < minDist: + minDist = pDist + iMinDist = iProfile + + # Check if we have found a buddy and process if so. + if minDist <= 400000: + fid = None + pBuddy, currentFile, fid = main.profileData(profiles[iMinDist], '', fid) + fid.close() + + # buddy vetos + Fail = False + if pBuddy.var_index() is None: + Fail = True + if Fail == False: + main.catchFlags(pBuddy) + if np.sum(pBuddy.t().mask == False) == 0: + Fail = True + + if Fail == False: + result = stdLevelData(pBuddy) + if result is not None: + levelsBuddy, origLevelsBuddy, assocLevelsBuddy = result + bgevBuddy = EN_background_check.bgevStdLevels + pgeBuddy = determine_pge(levels, bgevBuddy, obev, pBuddy) + pgeData = update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, p, pBuddy, obev, bgev, bgevBuddy) + + # Check if levels should be reinstated. + if allow_level_reinstating: + if np.abs(p.latitude()) < 20.0: + depthTol = 300.0 + else: + depthTol = 200.0 + stdLevelFlags = pgeData >= 0.5 + for i, slflag in enumerate(stdLevelFlags): + if slflag: + # Check for non rejected surrounding levels. + okbelow = False + if i > 0: + if stdLevelFlags[i - 1] == False and levels.mask[i - 1] == False and bgsl.mask[i - 1] == False: + okbelow = True + okabove = False + nsl = len(stdLevelFlags) + if i < nsl - 1: + if stdLevelFlags[i + 1] == False and levels.mask[i + 1] == False and bgsl.mask[i + 1] == False: + okabove = True + # Work out tolerances. + if slev[i] > depthTol + 100: + tolFactor = 0.5 + elif slev[i] > depthTol: + tolFactor = 1.0 - 0.005 * (slev[i] - depthTol) + else: + tolFactor = 1.0 + ttol = 0.5 * tolFactor + if okbelow == True and okabove == True: + xmax = levels[i - 1] + bgsl[i - 1] + ttol + xmin = levels[i + 1] + bgsl[i + 1] - ttol + elif okbelow == True: + xmax = levels[i - 1] + bgsl[i - 1] + ttol + xmin = levels[i - 1] + bgsl[i - 1] - ttol + elif okabove == True: + xmax = levels[i + 1] + bgsl[i + 1] + ttol + xmin = levels[i + 1] + bgsl[i + 1] - ttol + else: + continue + # Reassign PGE if level is within the tolerances. + if levels[i] + bgsl[i] >= xmin and levels[i] + bgsl[i] <= xmax: + pgeData[i] = 0.49 + + # Assign the QC flags to original levels. + for i, pge in enumerate(pgeData): + if pgeData.mask[i]: continue + if pge < 0.5: continue + for j, assocLevel in enumerate(assocLevels): + if assocLevel == i: + origLevel = origLevels[j] + qc[origLevel] = True + + return qc + +def determine_pge(levels, bgev, obev, profile): + ''' + determine the probability of gross error per level given: + levels: a list of observed - background temperatures per level (ie the first return of stdLevelData) + bgev: list of background error variance per level + obev: list of observational error variances per level + profile: the wodpy profile object in question + ''' + pge = np.ma.array(np.ndarray(len(levels))) + pge.mask = True + + for iLevel, level in enumerate(levels): + if levels.mask[iLevel] or bgev.mask[iLevel]: continue + bgevLevel = bgev[iLevel] + if np.abs(profile.latitude()) < 10.0: bgevLevel *= 1.5**2 + obevLevel = obev[iLevel] + pge_est = EN_background_check.estimatePGE(profile.probe_type(), False) + + kappa = 0.1 + evLevel = obevLevel + bgevLevel #V from the text + sdiff = level**2 / evLevel + pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) + pdTotal = kappa * pge_est + pdGood * (1.0 - pge_est) + pge[iLevel] = kappa * pge_est / pdTotal + + return pge + +def buddyCovariance(minDist, profile, buddyProfile, meso_ev_a, meso_ev_b, syn_ev_a, syn_ev_b): + ''' + coavariance formula for buddy profiles, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf pp.11 + meso_ev_a == mesoscale error variance for profile a, etc. + ''' + + corScaleA = 100.0 # In km. + corScaleB = 400.0 # In km. + corScaleT = 432000.0 # 5 days in secs. + mesSDist = minDist / (1000.0 * corScaleA) + synSDist = minDist / (1000.0 * corScaleB) + + timeDiff2 = timeDiff(profile, buddyProfile) + if timeDiff2 is None: + return None + timeDiff2 = (timeDiff2 / corScaleT)**2 + + covar = (np.sqrt(meso_ev_a * meso_ev_b) * + (1.0 + mesSDist) * np.exp(-mesSDist - timeDiff2) + + np.sqrt(syn_ev_a * syn_ev_b) * + (1.0 + synSDist) * np.exp(-synSDist - timeDiff2)) + + return covar + +def update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, profile, buddyProfile, obev, bgev, bgevBuddy): + ''' + update the PGE for the profile in question using the buddy pge. + ''' + + for iLevel in range(len(levelsBuddy)): + if levels.mask[iLevel] or levelsBuddy.mask[iLevel]: continue + + # For simplicity, going to assume that length scales + # are isotropic and the same everywhere; in the EN + # processing length scales are stretched in E/W direction + # near the equator and this functionality could be added + # later. + + covar = buddyCovariance(minDist, profile, buddyProfile, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0) + if covar is None: + continue; + + errVarA = obev[iLevel] + bgev[iLevel] + errVarB = obev[iLevel] + bgevBuddy[iLevel] + rho2 = covar**2 / (errVarA + errVarB) + expArg = (-(0.5 * rho2 / (1.0 - rho2)) * + (levels[iLevel]**2 / errVarA + + levelsBuddy[iLevel]**2 / errVarB - + 2.0 * levels[iLevel] * levelsBuddy[iLevel] / covar)) + expArg = -0.5 * np.log(1.0 - rho2) + expArg + expArg = min(80.0, max(-80.0, expArg)) + Z = 1.0 / (1.0 - (1.0 - pgeData[iLevel]) * + (1.0 - pgeBuddy[iLevel]) * (1.0 - expArg)) + if Z < 0.0: Z = 1.0 # In case of rounding errors. + Z = Z**0.5 + pgeData[iLevel] = pgeData[iLevel] * Z + + return pgeData + +def stdLevelData(p): + """ + Combines data that have passed other QC checks to create a + set of observation minus background data on standard levels. + """ + + # Combine other QC results. + preQC = (EN_background_check.test(p) | + EN_constant_value_check.test(p) | + EN_increasing_depth_check.test(p) | + EN_range_check.test(p) | + EN_spike_and_step_check.test(p) | + EN_stability_check.test(p)) + + # Get the data stored by the EN background check. + # As it was run above we know that the data held by the + # module corresponds to the correct profile. + origLevels = np.array(EN_background_check.origLevels) + diffLevels = (np.array(EN_background_check.ptLevels) - + np.array(EN_background_check.bgLevels)) + nLevels = len(origLevels) + if nLevels == 0: return None # Nothing more to do. + + # Remove any levels that failed previous QC. + nLevels, origLevels, diffLevels = filterLevels(preQC, origLevels, diffLevels) + if nLevels == 0: return None + + levels, assocLevs = meanDifferencesAtStandardLevels(origLevels, diffLevels, p.z()) + + return levels, origLevels, assocLevs + +def filterLevels(preQC, origLevels, diffLevels): + ''' + preQC: list or array of bools indicating a QC state for each level, determined from other tests + origLevels: list of level indices that passed EN_background + diffLevels: correpsonding to origLevels. + return (nLevels, origLevels, diffLevels) with all elements corresponding to a True entry in preQC removed. + ''' + + nLevels = len(origLevels) + use = np.ones(nLevels, dtype=bool) + for i, origLevel in enumerate(origLevels): + if preQC[origLevel]: use[i] = False + nLevels = np.count_nonzero(use) + origLevels = origLevels[use] + diffLevels = diffLevels[use] + + return nLevels, origLevels, diffLevels + +def meanDifferencesAtStandardLevels(origLevels, diffLevels, depths): + ''' + origLevels: list of level indices under consideration + diffLevels: list of differences corresponding to origLevels + depths: list of depths of all levels in profile. + returns (levels, assocLevs), where + levels == a masked array of mean differences at each standard level + assocLevs == a list of the indices of the closest standard levels to the levels indicated in origLevels + ''' + + # Get the set of standard levels. + stdLevels = EN_background_check.auxParam['depth'] + + # Create arrays to hold the standard level data and aggregate. + nStdLevels = len(stdLevels) + levels = np.zeros(nStdLevels) + nPerLev = np.zeros(nStdLevels) + assocLevs = [] + for i, origLevel in enumerate(origLevels): + # Find the closest standard level. + j = np.argmin(np.abs(depths[origLevel] - stdLevels)) + assocLevs.append(j) + levels[j] += diffLevels[i] + nPerLev[j] += 1 + + # Average the standard levels where there are data. + iGT1 = nPerLev > 1 + levels[iGT1] /= nPerLev[iGT1] + levels = np.ma.array(levels) + levels.mask = False + levels.mask[nPerLev == 0] = True + + return levels, assocLevs + + +def assessBuddyDistance(p, buddy): + """ + given a profile

and a possible buddy profile , + return None if is not a valid buddy, or the distance + to

if it is. + """ + + # Check that it is not the same profile and that they + # are near in time. The time criteria matches the EN + # processing but would probably be better if it checked + # that the profiles were within a time threshold. The + # cruise is compared as two profiles from the same instrument + # should not be compared. + if (buddy.uid() == p.uid() or + buddy.year() != p.year() or + buddy.month() != p.month() or + buddy.cruise() == p.cruise()): return None + lat = p.latitude() + lon = p.longitude() + latComp = buddy.latitude() + lonComp = buddy.longitude() + # Do a rough check of distance. + latDiff = np.abs(latComp - lat) + if latDiff > 5: return None + # Do a more detailed check of distance. + # Check in case they are either side of the edge of the map. + if np.abs(lonComp - lon) > 180: + if lonComp < lon: + lonComp += 360.0 + else: + lonComp -= 360.0 + # Calculate distance and return. + return haversine(lat, lon, latComp, lonComp) + +def timeDiff(p1, p2): + ''' + returns the time difference, in seconds, between two profiles + returns None if the year, month or day in either profile is invalid + ''' + + dts = [] + for prof in [p1, p2]: + year = prof.year() + month = prof.month() + day = prof.day() + if not (year > 0) or not (1 <= month <= 12) or not (1 <= day <= 31): + return None + time = prof.time() + if time is None or time < 0 or time >= 24: + hours = 0 + minutes = 0 + seconds = 0 + else: + hours = int(time) + minutesf = (time - hours) * 60 + minutes = int(minutesf) + seconds = int((minutesf - minutes) * 60) + + dts.append(datetime.datetime(year, month, day, hours, minutes, seconds)) + + diff = dts[0] - dts[1] + + return np.abs(diff.total_seconds()) + + diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py new file mode 100644 index 0000000..52342ee --- /dev/null +++ b/qctests/EN_track_check.py @@ -0,0 +1,392 @@ +""" +Implements the EN track check, described on pp 7 and 21 of +http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +import numpy as np +import data.ds as ds +import util.main as main +import util.geo as geo +import copy +import datetime +import math + +# module constants +DistRes = 20000. # meters +TimeRes = 600. # seconds + +EN_track_headers = {} +EN_track_results = {} +threadFile = {} + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + global EN_track_headers + global EN_track_results + global threadFile + + cruise = p.cruise() + uid = p.uid() + + # don't bother if cruise == 0 or None + if cruise in [0, None]: + return np.zeros(1, dtype=bool); + + # The headers from an entire cruise must be analyzed all at once; + # we'll write the results to the global data store, in a dictionary + # with ntuple keys (cruise, uid), and values as single element + # numpy arrays, containing either a true or a false (per all the other + # qc return objects) + + # check if this profile has been examined already + if (cruise, uid) in EN_track_results.keys(): + return EN_track_results[(cruise, uid)] + + # some detector types cannot be assessed by this test; do not raise flag. + if p.probe_type in [None]: + return np.zeros(1, dtype=bool) + + # the first time this test is run, sort ds.threadProfiles into a cruise-keyed dictionary: + if ds.threadFile != threadFile: + EN_track_headers = main.sort_headers(ds.threadProfiles) + threadFile = ds.threadFile + + # since we didn't find an answer already calculated, + # we still need to do the calculation for this cruise; + # all the relevant headers are sitting in the EN_track_headers list. + headers = EN_track_headers[cruise] + + # start all as passing by default: + for i in range(len(headers)): + EN_track_results[(headers[i].cruise(), headers[i].uid())] = np.zeros(1, dtype=bool) + + # copy the list of headers; + # remove entries as they are flagged. + passedHeaders = copy.deepcopy(headers) + rejects = findOutlier(passedHeaders) + while rejects != []: + passedIndex = [x for x in range(len(passedHeaders)) if x not in rejects ] + passedHeaders = [passedHeaders[index] for index in passedIndex ] + rejects = findOutlier(passedHeaders) + + # if more than half got rejected, reject everyone + if len(passedHeaders) < len(headers) / 2: + for i in range(len(headers)): + EN_track_results[(headers[i].cruise(), headers[i].uid())][0] = True + + return EN_track_results[(cruise, uid)] + +def findOutlier(headers): + ''' + given a list of , find the fastest one; + if it's too fast, reject it or the one before it, return a list of rejected indices; + once the fastest is within limits, return []. + ''' + + maxShipSpeed = 15. # m/s + maxBuoySpeed = 2. # m/s + + if headers == []: + return [] + + # determine speeds and angles for list of headers + speeds, angles = calculateTraj(headers) + + # decide if something needs to be flagged + maxSpeed = maxShipSpeed + if isBuoy(headers[0]): + maxSpeed = maxBuoySpeed + iMax = speeds.index(max(speeds)) + flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) + + # decide which profile to reject, flag it, and return a list of indices rejected at this step. + if flag: + rejects = chooseReject(headers, speeds, angles, iMax, maxSpeed) + + for reject in rejects: + EN_track_results[(headers[reject].cruise(), headers[reject].uid())][0] = True + return rejects + else: + return [] + +def chooseReject(headers, speeds, angles, index, maxSpeed): + ''' + decide which profile to reject, headers[index] or headers[index-1], or both, + and return a list of indices to reject. + ''' + + # chain of tests breaks when a reject is found: + reject = condition_a(headers, speeds, angles, index, maxSpeed)[0] + + # condition i needs to run at the end of the chain in all cases: + # if no decision, reject both: + if reject == -1: + reject = [index-1, index] + # if excessive speed is created by removing the flag, reject both instead + # can't create new excessive speed by removing last profile. + elif reject < len(headers)-1: + newHeaders = copy.deepcopy(headers) + del newHeaders[reject] + newSpeeds, newAngles = calculateTraj(newHeaders) + flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) + if flag: + reject = [index-1, index] + else: + reject = [reject] + else: + reject = [reject] + + return reject + +def calculateTraj(headers): + ''' + return a list of speeds and a list of angles describing the trajectory of the track described + by the time-ordered list of . + ''' + + speeds = [None] + angles = [None] + + # Find speed and angle for all profiles remaining in the list + for i in range(1, len(headers)): + + speeds.append(None) + angles.append(None) + + speeds[i] = trackSpeed(headers[i-1], headers[i]) + if i < len(headers)-1: # can't do angle on last point + angles[i] = abs(math.pi - geo.haversineAngle(headers[i-1], headers[i], headers[i+1])) + + return speeds, angles + +def isBuoy(header): + ''' + decide if header belongs to a buoy-based measurement + ''' + + return header.probe_type in [4,7,9,10,11,12,13,15] + +def detectExcessiveSpeed(speeds, angles, index, maxSpeed): + ''' + decide if there was an excessive speed at in the lists and + ''' + + flag = speeds[index] > maxSpeed + + if index > 0: + flag = flag or ( (speeds[index] > 0.8*maxSpeed) and (angles[index]>math.pi/2 or angles[index-1]>math.pi/2) ) + + return flag + +def meanSpeed(speeds, headers, maxSpeed): + ''' + determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) + ''' + + meanSpeed = 0 + speedCount = 0 + for iSpeed, speed in enumerate(speeds): + if speed == None or iSpeed == 0: + #missing values + continue + elif iSpeed > 0 and geo.deltaTime(headers[iSpeed-1], headers[iSpeed]) < 3600.: + #too close together in time + continue + elif speed > maxSpeed: + #too fast + continue + else: + meanSpeed += speed + speedCount += 1 + + if speedCount > 0: + meanSpeed = meanSpeed / speedCount + + return meanSpeed + + +def trackSpeed(prevHeader, header): + ''' + computes the speed, including rounding tolerance from the reference, + for the track at

. + return None if some necessary data is missing + ''' + + # check that all required data is present: + if None in [header.latitude(), header.longitude(), prevHeader.latitude(), prevHeader.longitude()]: + return None + if None in [header.year(), header.month(), header.day(), header.time(), prevHeader.year(), prevHeader.month(), prevHeader.day(), prevHeader.time()]: + return None + + dist = geo.haversineDistance(prevHeader, header) + DTime = geo.deltaTime(prevHeader, header) + speed = (dist - DistRes) / max(DTime, TimeRes) + + return speed + +def condition_a(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (a) from the text + ''' + + if index == 1 and len(headers) == 2: + return 0, 'a' + elif index == 1 and len(headers) > 2: # note 'M' in the text seems to count from 1, not 0. + impliedSpeed = trackSpeed(headers[0], headers[2]) + if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): + return 1, 'a' + else: + return 0, 'a' + elif index == len(headers)-1 and len(headers)>3: # why not >=? seems to cause problems, investigate. + impliedSpeed = trackSpeed(headers[-3], headers[-1]) + if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): + return index-1, 'a' + else: + return index, 'a' + else: + return condition_b(headers, speeds, angles, index, maxSpeed) + +def condition_b(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (b) from the text + ''' + if speeds[index-1] > maxSpeed: + return index-1, 'b' + elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: + return index, 'b' + + return condition_c(headers, speeds, angles, index, maxSpeed) + +def condition_c(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (c) from the text + ''' + + if index < len(headers)-1 and index > 0: + impliedSpeed = trackSpeed(headers[index-1], headers[index+1]) + if impliedSpeed > maxSpeed: + return index-1, 'c' + + if index > 1: + impliedSpeed = trackSpeed(headers[index-2], headers[index]) + if impliedSpeed > maxSpeed: + return index, 'c' + + return condition_d(headers, speeds, angles, index, maxSpeed) + + +def condition_d(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (d) from the text + ''' + + if None not in [angles[index-1], angles[index]] and angles[index-1] > 45./180.*math.pi + angles[index]: + return index-1, 'd' + + if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: + return index, 'd' + + return condition_e(headers, speeds, angles, index, maxSpeed) + +def condition_e(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (e) from the text + ''' + + if len(headers) > max(2, index+1): + + if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: + return index-1, 'e' + + if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: + return index, 'e' + + return condition_f(headers, speeds, angles, index, maxSpeed) + +def condition_f(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (f) from the text + ''' + + if index>0 and index < len(speeds)-1: + + ms = meanSpeed(speeds, headers, maxSpeed) + + if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): + return index-1, 'f' + + if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): + return index, 'f' + + return condition_g(headers, speeds, angles, index, maxSpeed) + +def condition_g(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (g) from the text + ''' + + if index > 1 and index < len(headers) - 1: + + dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) + dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + + distTol = geo.haversineDistance(headers[index-1], headers[index-2]) + distTol += geo.haversineDistance(headers[index], headers[index-1]) + distTol += geo.haversineDistance(headers[index+1], headers[index]) + distTol = max(DistRes, 0.1*distTol) + + if dist1 < dist2 - distTol: + return index-1, 'g' + + if dist2 < dist1 - distTol: + return index, 'g' + + return condition_h(headers, speeds, angles, index, maxSpeed) + +def condition_h(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (h) from the text + typeo in text, implementation incomplete + ''' + + if index > 1 and index < len(headers) - 1: + + dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) + dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + + PD1 = geo.haversineDistance(headers[index-1], headers[index-2]) / dist2 + PD2 = geo.haversineDistance(headers[index], headers[index-2]) / dist1 + + PT1 = geo.deltaTime(headers[index-2], headers[index-1]) / geo.deltaTime(headers[index-2], headers[index+1]) + PT2 = geo.deltaTime(headers[index-2], headers[index]) / geo.deltaTime(headers[index-2], headers[index+1]) + + if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): + return index-1, 'h' + if abs(PD2 - PT2) > 0.1 + abs(PD1 - PT1): + return index, 'h' + + return -1, 'i' + +def checkOrder(profiles): + ''' + check that a list of profiles is properly time ordered + ''' + + dates = [] + for pro in profiles: + if pro.time() is not None: + hour, minute, second = geo.parseTime(pro.time()) + else: + hour = 0 + minute = 0 + second = 0 + date = datetime.datetime(year=pro.year(), month=pro.month(), day=pro.day(), hour=hour, minute=minute, second=second ) + dates.append(date) + + for i in range(len(dates)-1): + assert dates[i] <= dates [i+1], 'dates out of order %s %s' % (dates[i], dates[i+1]) diff --git a/qctests/ICDC_aqc_01_level_order.py b/qctests/ICDC_aqc_01_level_order.py new file mode 100644 index 0000000..b64688c --- /dev/null +++ b/qctests/ICDC_aqc_01_level_order.py @@ -0,0 +1,111 @@ +''' +Python version of check_aqc_01_level_order.f with input/output +adjusted to work with the AutoQC testing suite. Details of the +original code are: + +c/ DATE: JANUARY 14 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: check_aqc_01_levels_order + +c/ PURPOSE: +c to check the original level order; +c if necessary to bring the original levels to increasing order +''' + +import numpy as np + +# Global variables to hold data to avoid having to recalculate order +# repeatedly for the same profile. +uid = None +nlevels = 0 +origlevels = None +zr = None +tr = None +qc = None + +def test(p): + '''Return a set of QC decisions. This corresponds to levels with + negative depths. + ''' + + level_order(p) + + return qc + +def reordered_data(p): + '''Return number levels and depth, temperature in depth order. + Only non-rejected levels are returned. + ''' + + level_order(p) + + return nlevels, zr, tr + +def revert_order(p, data): + '''Return data in the original profile order. Data rejected in + the level_order function are returned as missing data. + ''' + + level_order(p) + + datar = np.ma.array(np.ndarray(p.n_levels()), + dtype = data.dtype) + datar.mask = True + + for i, datum in enumerate(data): + datar[origlevels[i]] = datum + + return datar + +def revert_qc_order(p, qc): + '''Return QC array. Missing data values are set to False.''' + + qcr = revert_order(p, qc) + qcr[qcr.mask] = False + return qcr + +def level_order(p): + '''Reorders data into depth order and rejects levels with + negative depth. + ''' + global uid, nlevels, origlevels, zr, tr, qc + + # Check if the module already holds the results for this profile. + if uid == p.uid() and uid is not None: + return None + + # Extract data and define the index for each level. + z = p.z() + t = p.t() + origlevels = np.arange(p.n_levels()) + + # Implement the QC. For this test we only reject negative depths. + qc = z < 0 + + # Remove occurrences of no data at a level and rejected obs. + use = (z.mask == False) & (t.mask == False) & (qc == False) + z = z[use] + t = t[use] + origlevels = origlevels[use] + nlevels = np.count_nonzero(use) + + if nlevels > 1: + # Sort the data. Using mergesort keeps levels with the same depth + # in the same order. + isort = np.argsort(z, kind='mergesort') + zr = z[isort] + tr = t[isort] + origlevels = origlevels[isort] + else: + zr = z + tr = t + + return None + + diff --git a/qctests/ICDC_aqc_02_crude_range.py b/qctests/ICDC_aqc_02_crude_range.py new file mode 100644 index 0000000..18e560f --- /dev/null +++ b/qctests/ICDC_aqc_02_crude_range.py @@ -0,0 +1,68 @@ +''' +Python version of check_aqc_02_crude_range.f. Details of the +original code are: + +c/ DATE: JANUARY 19 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: check_aqc_02_crude_range + +c/ PURPOSE: +c to check weather the temperature value is within the crude range +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np + +def test(p): + '''Return a set of QC decisions. + ''' + + nlevels, z, t = ICDC.reordered_data(p) + + qc = (t < parminover) | (t > parmaxover) + + for i, tval in enumerate(t): + if qc[i]: continue # Already rejected. + + zval = z[i] + + if np.any((tval >= tcrude1) & (tval <= tcrude2) & + (zval <= zcrude1) & (zval >= zcrude2)): + qc[i] = True + + return ICDC.revert_qc_order(p, qc) + +# Ranges: +tcrude1 = np.array( + [-3.5,-2.5,-2.3,-2.0,-1.4,-1.0,-0.8,-0.5,-0.4,3.0, + 5.0,5.5,6.0,7.0,7.5,8.8,9.5,10.0,11.0,12.0,12.8,13.5, + 14.75,15.0,16.0,17.5,18.5,19.0,20.0,21.4,22.4,23.0,24.0, + 26.0,28.0,31.0,32.0]) + +tcrude2 = np.array( + [-2.5,-2.3,-2.0,-1.4,-1.0,-0.8,-0.5,-0.4,3.0, + 5.0,5.5,6.0,7.0,7.5,8.8,9.5,10.0,11.0,12.0,12.8,13.5, + 14.75,15.0,16.0,17.5,18.5,19.0,20.0,21.4,22.4,23.0,24.0, + 26.0,28.0,31.0,32.0,35.0]) + +zcrude1 = np.ndarray(37) +zcrude1[:] = 9000.0 + +zcrude2 = np.array( + [ 0., 500.,1200.,2000.,3800.,4200., + 5000.,6000.,9000.,7500.,4400.,1950., + 1900.,1800.,1700.,2200.,1700.,5200., + 1600.,1400.,3600.,5200.,1000., 800., + 1800., 800., 600., 400., 350.,2400., + 400., 350., 300., 250., 200., 100., 50.]) + +parminover = -2.3 +parmaxover = 33.0 + + diff --git a/qctests/ICDC_aqc_04_max_obs_depth.py b/qctests/ICDC_aqc_04_max_obs_depth.py new file mode 100644 index 0000000..878ce31 --- /dev/null +++ b/qctests/ICDC_aqc_04_max_obs_depth.py @@ -0,0 +1,54 @@ +''' +Python version of check_aqc_04_instrument_type_max_obs_depth.f. Details of the +original code are: + +c/ DATE: JANUARY 20 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + + +c/ TITLE: check_aqc_04_instrument_type_max_obs_depth + +c/ PURPOSE: +c compare observed depths with unstrument type maximum observed depth +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np +from util.wod import wod_database + +def test(p): + '''Return quality control decisions. + ''' + + # Get WOD database. + db = wod_database(p) + + # Set maximum allowed depth. If not defined, it is set to the highest + # possible float. + if db == 'OSD': + zlast = 9000.0 + elif db == 'CTD': + zlast = 9000.0 + elif db == 'PFL': + zlast = 2020.0 + elif db == 'APB': + zlast = 1200.0 + elif db == 'MBT' and p.primary_header['Country code'] == 'JP': + zlast = 295.00001 + elif db == 'XBT': + zlast = 1900.0 + else: + zlast = np.finfo(dtype=float).max + + # Set QC flags. + qc = p.z() >= zlast + + return qc + + + diff --git a/qctests/ICDC_aqc_05_stuck_value.py b/qctests/ICDC_aqc_05_stuck_value.py new file mode 100644 index 0000000..4c70829 --- /dev/null +++ b/qctests/ICDC_aqc_05_stuck_value.py @@ -0,0 +1,71 @@ +''' +Python version of check_aqc_05_stuck_value.f. Details of the original code are: + +c/ DATE: JANUARY 20 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: check_aqc_05_stuck_value + +c/ PURPOSE: +c to check temperature profile for stuck value/unrealistically thick thermostad +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np +from util.wod import wod_database + +def test(p): + '''Return quality control decisions. + ''' + + # Default set of QC flags to return. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Set minimum allowed levels. + db = wod_database(p) + if db == 'OSD': + minlevs = 7 + elif db == 'CTD': + minlevs = 50 + elif db == 'PFL': + minlevs = 20 + elif db == 'APB': + minlevs = 20 + elif db == 'MBT': + minlevs = 7 + elif db == 'XBT': + minlevs = 20 + else: + return qc # Do not have the information to QC other types. + + # Check that we have the levels we need. + nlevels, z, t = ICDC.reordered_data(p) + if nlevels <= minlevs: return qc + + # Count stuck values. + n = np.ones(nlevels, dtype=int) + for i in range(nlevels - minlevs): + for j in range(i + 1, nlevels): + diff = np.abs(t[i] - t[j]) + if diff > 0.0001: break + n[i] += 1 + + # Find the largest stuck value range. + i = np.argmax(n) + if n[i] < minlevs: return qc + thick = z[i + n[i] - 1] - z[i] + if thick >= 200.0: + # If setting the QC flags we need to be careful about level order. + qclo = qc[0:nlevels] + qclo[i:i+n[i]] = True + qc = ICDC.revert_qc_order(p, qclo) + + return qc + + + diff --git a/qctests/ICDC_aqc_06_n_temperature_extrema.py b/qctests/ICDC_aqc_06_n_temperature_extrema.py new file mode 100644 index 0000000..8e4bbee --- /dev/null +++ b/qctests/ICDC_aqc_06_n_temperature_extrema.py @@ -0,0 +1,62 @@ +''' +Python version of check_aqc_06_number_of_temperature_extrema.f. +Details of the original code are: + +c/ DATE: JANUARY 20 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: check_aqc_06_number_of_temperature_extrema + +c/ PURPOSE: +c find profiles with unrealistically large number of temperature extrema +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np + +def test(p): + '''Return quality control decisions. + ''' + + # Initialise data. + qc = np.zeros(p.n_levels(), dtype=bool) + parminover = -2.3 + parmaxover = 33.0 + levminext = 6 + deltaext = 0.5 + maxextre = 4 + + # Check that we have the levels we need. + nlevels, z, t = ICDC.reordered_data(p) + if nlevels <= levminext: return qc + + # Exclude data outside allowed range. + use = (t > parminover) & (t <= parmaxover) + nuse = np.count_nonzero(use) + if nuse < levminext: return qc + z = z[use] + t = t[use] + + # Find and count the extrema. + ima = 0 + for i in range(1, nuse - 1): + pcent = t[i] + pa = np.abs(pcent - t[i - 1]) + pb = np.abs(pcent - t[i + 1]) + pmin = min(pa, pb) + if pcent > t[i - 1] and pcent > t[i + 1] and pmin > deltaext: + ima += 1 + if pcent < t[i - 1] and pcent < t[i + 1] and pmin > deltaext: + ima += 1 + if ima > maxextre: + qc[:] = True + + return qc + + + diff --git a/qctests/ICDC_aqc_07_spike_check.py b/qctests/ICDC_aqc_07_spike_check.py new file mode 100644 index 0000000..5be4abc --- /dev/null +++ b/qctests/ICDC_aqc_07_spike_check.py @@ -0,0 +1,75 @@ +''' +Python version of check_aqc_07_spike_check.f. +Details of the original code are: + +c/ DATE: JANUARY 25 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + + +c/ TITLE: check_aqc_07_spike_check + +c/ PURPOSE: +c to check temperature profile for spikes +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np + +def test(p): + '''Return quality control decisions. + ''' + + # The test is run on re-ordered data. + nlevels, z, t = ICDC.reordered_data(p) + qc = np.zeros(nlevels, dtype=bool) + if nlevels < 3: return qc # Not enough levels to check. + + # Ignore any levels outside of limits. + parminover = -2.3 + parmaxover = 33.0 + use = (t > parminover) & (t < parmaxover) + nuse = np.count_nonzero(use) + if nuse < 3: return qc + zuse = z[use] + tuse = t[use] + origlevels = (np.arange(nlevels))[use] + + # Extract sections of the arrays. We are QCing the values + # in the z2 and v3 arrays. + z1 = zuse[0:-2] + z2 = zuse[1:-1] + z3 = zuse[2:] + v1 = tuse[0:-2] + v2 = tuse[1:-1] + v3 = tuse[2:] + ol = origlevels[1:-1] + + # Calculate the level of 'spike'. + z13 = z3 - z1 + z12 = z2 - z1 + z23 = z3 - z2 + + a = 0.5 * (v1 + v3) + q1 = np.abs(v2 - a) + q2 = np.abs(0.5 * (v3 - v1)) + + spike = q1 - q2 + + # Define the threshold at each level. + spikemax = np.ndarray(nuse - 2) + spikemax[:] = 4.0 + spikemax[z2 > 1000.0] = 3.0 + spikemax[z2 > 2000.0] = 2.0 + + # Set QC flags. + qc[ol[spike > spikemax]] = True + + return ICDC.revert_qc_order(p, qc) + + + diff --git a/qctests/ICDC_aqc_08_gradient_check.py b/qctests/ICDC_aqc_08_gradient_check.py new file mode 100644 index 0000000..4f463bc --- /dev/null +++ b/qctests/ICDC_aqc_08_gradient_check.py @@ -0,0 +1,63 @@ +''' +Python version of check_aqc_08_gradient_check.f. +Details of the original code are: + +c/ DATE: JANUARY 28 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: check_aqc_08_gradient_check + +c/ PURPOSE: +c to check temperature profile for unrealistic vertical gradients +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np + +def test(p): + '''Return quality control decisions. + ''' + + # Global ranges - data outside these bounds are ignored. + parminover = -2.3 + parmaxover = 33.0 + + # The test is run on re-ordered data. + nlevels, z, t = ICDC.reordered_data(p) + qc = np.zeros(nlevels, dtype=bool) + + # Calculate gradients and thresholds. + z0 = z[0:-1] + z1 = z[1:] + t0 = t[0:-1] + t1 = t[1:] + + gradients = (t1 - t0) / (z1 - z0) + zmean = 0.5 * (z0 + z1) + zmean[zmean < 1.0] = 1.0 + + gradmin = -150.0 / zmean - 0.010 + gradmin[gradmin < -4.0] = -4.0 + + gradmax = 100.0 / zmean + 0.015 + gradmax[gradmax > 1.5] = 1.5 + + # Find where the gradients and outside the thresholds. + result = np.where(((gradients < gradmin) | (gradients > gradmax)) & + (t0 > parminover) & (t1 > parminover) & + (t0 < parmaxover) & (t1 < parmaxover))[0] + + # Both levels that form the gradient have to be rejected. + if len(result) > 0: + qc[result] = True + qc[result + 1] = True + + return ICDC.revert_qc_order(p, qc) + + + diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py new file mode 100644 index 0000000..b53224c --- /dev/null +++ b/qctests/ICDC_aqc_09_local_climatology_check.py @@ -0,0 +1,220 @@ +''' +Python version of check_aqc_09_gradient_check.f. +Details of the original code are: + +c/ DATE: FEBRUARY 4 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: local_climatological_range_check - check_aqc_09_climatological_range + +c/ PURPOSE: +c to check wheather temperature value is within the local climatological range + +c/ Local temperature median and absolute median deviation are calculated on the basis +c/ of the OSD, CTD, and PFL temperature profiles from the WOD13 (updates as of December 2015) +c/ The median and the amd are calculated on a regular 0.5x0.5 lat/lon grid at 60 depth levels +c/ with level spacing increasing with depth. +c/ Variable influence area size is used with the target number of 500 profiles within the influence +c/ area. This number is not achieved in the data sparse regions or nn the deep levels. + +c local climatological ranges for the level k are defined as: +c tminlocal(k)=tmedian(k) - rnumamd*tamd(k) +c tmaxlocal(k)=tmedian(k) + rnumamd*tamd(k) +''' + +import ICDC_aqc_01_level_order as ICDC +from netCDF4 import Dataset +import numpy as np +import os +import time + +def test(p): + '''Return quality control decisions. + ''' + + # The test is run on re-ordered data. + nlevels, z, t = ICDC.reordered_data(p) + + # Define default QC. + defaultqc = np.zeros(p.n_levels(), dtype=bool) + + # No check for the Caspian Sea or Great Lakes. + lat = p.latitude() + lon = p.longitude() + if ((lat >= 35.0 and lat <= 45.0 and lon >= 45.0 and lon <= 60.0) or + (lat >= 40.0 and lat <= 50.0 and lon >= -95.0 and lon <= -75.0)): + return defaultqc + + # Get range. + ranges = get_climatology_range(nlevels, z, lat, lon, p.month()) + if ranges is None: + return defaultqc + + # Perform the QC. + tmin, tmax = ranges + qc = ((t < tmin) | (t > tmax)) & (tmin != fillValue) & (tmax != fillValue) + + return ICDC.revert_qc_order(p, qc) + +def get_climatology_range(nlevels, z, lat, lon, month): + + # Define arrays for the results. + tmin = np.ndarray(nlevels) + tmax = np.ndarray(nlevels) + tmin[:] = fillValue + tmax[:] = fillValue + + # Calculate grid indices. + iy = int(np.floor((90.0 - lat) / 0.5)) + ix = int(np.floor((lon + 180.0) / 0.5)) + if (iy < 0 or iy > 360 or ix < 0 or ix > 720): + return None + + # Find the climatology range. + for k in range(nlevels): + # Find the corresponding climatology level. + arg = np.argwhere((z[k] >= zedqc[:-1]) & (z[k] < zedqc[1:])) + if len(arg) > 0: + kisel = arg[0] + else: + continue # No level found. + # Check if using monthly or annual fields. + if kisel <= 15: + useAnnual = False + else: + useAnnual = True + if month is None: useAnnual = True + # Extract the temperature. + if useAnnual == False: + amd = tamdM[ix, iy, kisel, month - 1] + if amd < 0.0: + useAnnual = True + else: + tmedian = tmedM[ix, iy, kisel, month - 1] + if tmedian < parminover: + useAnnual = True + if useAnnual: + amd = tamdA[ix, iy, kisel] + if amd < 0.0: + continue + else: + tmedian = tmedA[ix, iy, kisel] + if tmedian < parminover: + continue + if amd > 0.0 and amd < 0.05: amd = 0.05 + + rnumamd = 3.0 + tmaxa = tmedian + rnumamd * amd + tmina = tmedian - rnumamd * amd + if tmina < parminover: tmina = parminover + if tmaxa > parmaxover: tmaxa = parmaxover + + tmin[k] = tmina + tmax[k] = tmaxa + + return tmin, tmax + +def read_ascii_and_convert_to_netcdf(): + '''Coverts the ASCII data file to netCDF on first read. + This is much faster to access. + ''' + global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue + + # Load the data. + tmedM = np.ndarray([721, 361, 16, 12]) + tamdM = np.ndarray([721, 361, 16, 12]) + tmedA = np.ndarray([721, 361, 60]) + tamdA = np.ndarray([721, 361, 60]) + zedqc = np.ndarray(60) + # Do not use masked arrays to save on memory use. + fillValue = -9.0 # Has to be a negative number. + tmedM[:, :, :, :] = fillValue + tamdM[:, :, :, :] = fillValue + tmedA[:, :, :] = fillValue + tamdA[:, :, :] = fillValue + with open('data/climatological_t_median_and_amd_for_aqc.dat') as f: + for line in f: + vals = line.split() + m = int(vals[0]) - 1 + j = int(vals[1]) - 1 + i = int(vals[3]) - 1 + k = int(vals[5]) - 1 + z = float(vals[6]) + tmedian = float(vals[7]) + absmeddev = float(vals[8]) + + if m < 12 and k < 16: + tmedM[i, j, k, m] = tmedian + tamdM[i, j, k, m] = absmeddev + elif m == 12: + tmedA[i, j, k] = tmedian + tamdA[i, j, k] = absmeddev + zedqc[k] = z + + # Create the netCDF version. + nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'w') + idim = nc.createDimension('i', 721) + jdim = nc.createDimension('j', 361) + kmdim = nc.createDimension('km', 16) + kadim = nc.createDimension('ka', 60) + mdim = nc.createDimension('m', 12) + + sf = 0.0001 + tmedav = nc.createVariable('tmedA', 'i4', ('i', 'j', 'ka'), zlib=True) + tmedav.add_offset = 0.0 + tmedav.scale_factor = sf + tmedav[:, :, :] = tmedA + + tamdav = nc.createVariable('tamdA', 'i4', ('i', 'j', 'ka'), zlib=True) + tamdav.add_offset = 0.0 + tamdav.scale_factor = sf + tamdav[:, :, :] = tamdA + + tmedmv = nc.createVariable('tmedM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) + tmedmv.add_offset = 0.0 + tmedmv.scale_factor = sf + tmedmv[:, :, :, :] = tmedM + + tamdmv = nc.createVariable('tamdM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) + tamdmv.add_offset = 0.0 + tamdmv.scale_factor = sf + tamdmv[:, :, :, :] = tamdM + + zedqcv = nc.createVariable('zedqc', 'f4', ('ka',)) + zedqcv[:] = zedqc + + nc.fillValue = fillValue + nc.history = 'Created ' + time.ctime(time.time()) + ' from climatological_t_median_and_amd_for_aqc.dat provided by Viktor Gouretski, Integrated Climate Data Center, University of Hamburg, Hamburg, Germany, February 2016' + nc.close() + +def read_netcdf(): + '''Read climatological data from netCDF. + ''' + global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue + + nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') + tmedA = nc.variables['tmedA'][:, :, :] + tamdA = nc.variables['tamdA'][:, :, :] + tmedM = nc.variables['tmedM'][:, :, :, :] + tamdM = nc.variables['tamdM'][:, :, :, :] + zedqc = nc.variables['zedqc'][:] + fillValue = nc.fillValue + nc.close() + +# Global ranges - data outside these bounds are assumed not valid. +parminover = -2.3 +parmaxover = 33.0 + +# Read data. +if os.path.isfile('data/climatological_t_median_and_amd_for_aqc.nc'): + read_netcdf() +else: + read_ascii_and_convert_to_netcdf() + + + diff --git a/qctests/WOD_gradient_check.py b/qctests/WOD_gradient_check.py new file mode 100644 index 0000000..a982c61 --- /dev/null +++ b/qctests/WOD_gradient_check.py @@ -0,0 +1,45 @@ +""" +Implements the excessive gradient test on page 47 of http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf +""" + +import numpy + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get temperature values from the profile. + t = p.t() + # Get depth values (m) from the profile. + d = p.z() + + assert len(t.data) == len(d.data), 'Number of temperature measurements does not equal number of depth measurements.' + + # initialize qc as a bunch of falses; + # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isDepth = (d.mask==False) + isData = isTemperature & isDepth + + for i in range(0,len(t.data)-1): + if isData[i] & isData[i+1] & (d.data[i+1] - d.data[i] > 0): + + gradient = (t.data[i+1] - t.data[i]) / max([ (d.data[i+1] - d.data[i]) , 3.0]) + + # gradient & inversion check + qc[i] = (gradient > 0.3) or (gradient < -0.7) or qc[i] # in case qc[i] was set true by the zero sensitivity indicator in the previous step + qc[i+1] = (gradient > 0.3) or (gradient < -0.7) + + # zero sensitivity indicator + # flags data if temperature drops to 0 too abruptly, indicating a missing value. + if t.data[i+1] == 0: + if -1.0 * gradient > 5.0 * 0.7: + qc[i+1] = True + + return qc diff --git a/qctests/WOD_range_check.py b/qctests/WOD_range_check.py new file mode 100644 index 0000000..86a8941 --- /dev/null +++ b/qctests/WOD_range_check.py @@ -0,0 +1,71 @@ +""" +Implements the WOD range check, +pp 46 http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf +""" +import numpy +import data.ds as ds + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + + + # Get data from the profile. + t = p.t() + d = p.z() + latitude = p.latitude() + longitude = p.longitude() + + temperatures = {} + # initialize qc as a bunch of falses (pass by default) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isDepth = (d.mask==False) + isData = isTemperature & isDepth + isLat = isinstance(latitude, float) + isLong = isinstance(longitude, float) + + if not isLat or not isLong: + return qc + + depths = ds.WODtempRanges['depths'] + gLat, gLong = nearestGrid(latitude, longitude) + cellCode = ds.cellCodes[(gLat, gLong)] + region = ds.regionCodes[cellCode] + minima = ds.WODtempRanges[region]['min'] + maxima = ds.WODtempRanges[region]['max'] + + for i in range(1, p.n_levels()): + if isData[i] == False: continue + + # find depth bin + iDepth = 0 + while d[i] > depths[iDepth] and iDepth <= len(depths): + iDepth += 1 + + minTemp = minima[iDepth] + maxTemp = maxima[iDepth] + + if t[i] < minTemp or t[i] > maxTemp: + qc[i] = True + + return qc + + +def nearestGrid(lat, lng): + ''' + find the nearest grid point to lat, lng. + grid st. lat is on [-89.5, 89.5] in steps of 1 + and long is on [-179.5, 179.5] in steps of 1 + ''' + + gLat = (numpy.round(lat - 0.5) + 0.5 + 90) % 180 - 90 + gLong = (numpy.round(lng - 0.5) + 0.5 + 180) % 360 - 180 + + return gLat, gLong diff --git a/qctests/loose_location_at_sea.py b/qctests/loose_location_at_sea.py new file mode 100644 index 0000000..0aa8357 --- /dev/null +++ b/qctests/loose_location_at_sea.py @@ -0,0 +1,55 @@ +'''Checks the profile location against a global relief dataset to check it is in the ocean. + It is similar CoTeDe's location at sea test but instead of interpolating to the position + the surrounding points are checked to see if any are ocean points. This allows for + errors in the global relief data or imprecise locations close to the coast. This makes it + similar to the way the ICDC and EN tests work. +''' + +from netCDF4 import Dataset +import numpy as np + +# Define the area either side of the closest global relief point that is +# checked for ocean points. +width = 2 + +# Load data into memory. Include a halo so that we can handle points next the data line. +nc = Dataset('data/etopo5.nc') +etopx = nc.variables['ETOPO05_X'][:] +etopy = nc.variables['ETOPO05_Y'][:] +etoph = np.ndarray([len(etopy) + width * 2, len(etopx) + width * 2]) +etoph[:, :] = -1 # Default is ocean points. +etoph[width:-width, width:-width] = nc.variables['ROSE'][:, :] +etoph[width:-width, 0:width] = etoph[width:-width, -2*width:-width] +etoph[width:-width, -width:] = etoph[width:-width, width:2*width] +nc.close() + +def test(p): + '''Return an array of QC decisions. There is a QC result per level but these + are all set to the same value, determined by the location. + ''' + + qc = np.zeros(p.n_levels(), dtype=bool) + + # Ensure that lon is in the range -180 to 180 or 0 to 360 and lat is from -90 to 90. + lat = p.latitude() + lon = p.longitude() + if lat is None or lon is None: + return qc + if lon < -180 or lon >=360 or lat < -90 or lat > 90: + qc[:] = True + return qc + if lon < 0: lon += 360 # Needs to be in range 0 to 360. + + # Find closest global relief point and extract section of the array. + ilat = np.argmin(np.abs(etopy - lat)) + width # Add on the halo width. + ilon = np.argmin(np.abs(etopx - lon)) + width + data = etoph[ilat - width:ilat + width + 1, ilon - width:ilon + width + 1] + + # If any point is an ocean point then do not reject. + if np.all(data >= 0): + qc[:] = True + + return qc + + + From f2409dd23fd699be2c04eb848c82986d677693dd Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 31 Jul 2016 00:13:33 +0000 Subject: [PATCH 18/79] nominally functioning database backend --- AutoQC.py | 10 +- build-db.py | 2 +- qctests/EN_std_lev_bkg_and_buddy_check.py | 369 -------------------- qctests/EN_track_check.py | 392 ---------------------- summarize-results.py | 4 +- 5 files changed, 6 insertions(+), 771 deletions(-) delete mode 100644 qctests/EN_std_lev_bkg_and_buddy_check.py delete mode 100644 qctests/EN_track_check.py diff --git a/AutoQC.py b/AutoQC.py index 73a8017..87430db 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -90,7 +90,7 @@ def process_row(uid): '''run all tests on the ith database row''' # extract profile - cur.execute('SELECT * FROM demo WHERE uid = ' + str(uid) ) + cur.execute('SELECT * FROM validate WHERE uid = ' + str(uid) ) row = cur.fetchall() fProfile = tempfile.TemporaryFile() fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row @@ -108,11 +108,9 @@ def process_row(uid): # run tests results = [row[0][1]] for itest, test in enumerate(testNames): - if test[0:5] != 'CSIRO': # testing on Argo suite for now - continue - + result = run(test, [profile]) - query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" + query = "UPDATE validate SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) print profile.uid() @@ -120,7 +118,7 @@ def process_row(uid): # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() - cur.execute('SELECT uid FROM demo') + cur.execute('SELECT uid FROM validate') uids = cur.fetchall() # launch async processes diff --git a/build-db.py b/build-db.py index 94ccdc9..a929936 100644 --- a/build-db.py +++ b/build-db.py @@ -37,7 +37,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) -while True: +for i in range(10): # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py deleted file mode 100644 index 44bdff2..0000000 --- a/qctests/EN_std_lev_bkg_and_buddy_check.py +++ /dev/null @@ -1,369 +0,0 @@ -""" -Implements the background check on standard levels and the buddy check -from the EN quality control system, -http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -from cotede.qctests.possible_speed import haversine -import datetime -import EN_background_check -import EN_constant_value_check -import EN_increasing_depth_check -import EN_range_check -import EN_spike_and_step_check -import EN_stability_check -import util.main as main -import data.ds -import numpy as np - -def test(p, allow_level_reinstating=True): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - - If allow_level_reinstating is set to True then rejected levels can be - reprieved by comparing with levels above and below. NB this is done by - default in EN processing. - """ - - # Define an array to hold results. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Obtain the obs minus background differences on standard levels. - result = stdLevelData(p) - if result is None: return qc - - # Unpack the results. - levels, origLevels, assocLevels = result - # Retrieve the background and observation error variances and - # the background values. - bgsl = EN_background_check.bgStdLevels - slev = EN_background_check.auxParam['depth'] - bgev = EN_background_check.bgevStdLevels - obev = EN_background_check.auxParam['obev'] - - #find initial pge - pgeData = determine_pge(levels, bgev, obev, p) - - # Find buddy. - profiles = data.ds.profiles - minDist = 1000000000.0 - iMinDist = None - for iProfile, profile in enumerate(profiles): - pDist = assessBuddyDistance(p, profile) - if pDist is not None and pDist < minDist: - minDist = pDist - iMinDist = iProfile - - # Check if we have found a buddy and process if so. - if minDist <= 400000: - fid = None - pBuddy, currentFile, fid = main.profileData(profiles[iMinDist], '', fid) - fid.close() - - # buddy vetos - Fail = False - if pBuddy.var_index() is None: - Fail = True - if Fail == False: - main.catchFlags(pBuddy) - if np.sum(pBuddy.t().mask == False) == 0: - Fail = True - - if Fail == False: - result = stdLevelData(pBuddy) - if result is not None: - levelsBuddy, origLevelsBuddy, assocLevelsBuddy = result - bgevBuddy = EN_background_check.bgevStdLevels - pgeBuddy = determine_pge(levels, bgevBuddy, obev, pBuddy) - pgeData = update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, p, pBuddy, obev, bgev, bgevBuddy) - - # Check if levels should be reinstated. - if allow_level_reinstating: - if np.abs(p.latitude()) < 20.0: - depthTol = 300.0 - else: - depthTol = 200.0 - stdLevelFlags = pgeData >= 0.5 - for i, slflag in enumerate(stdLevelFlags): - if slflag: - # Check for non rejected surrounding levels. - okbelow = False - if i > 0: - if stdLevelFlags[i - 1] == False and levels.mask[i - 1] == False and bgsl.mask[i - 1] == False: - okbelow = True - okabove = False - nsl = len(stdLevelFlags) - if i < nsl - 1: - if stdLevelFlags[i + 1] == False and levels.mask[i + 1] == False and bgsl.mask[i + 1] == False: - okabove = True - # Work out tolerances. - if slev[i] > depthTol + 100: - tolFactor = 0.5 - elif slev[i] > depthTol: - tolFactor = 1.0 - 0.005 * (slev[i] - depthTol) - else: - tolFactor = 1.0 - ttol = 0.5 * tolFactor - if okbelow == True and okabove == True: - xmax = levels[i - 1] + bgsl[i - 1] + ttol - xmin = levels[i + 1] + bgsl[i + 1] - ttol - elif okbelow == True: - xmax = levels[i - 1] + bgsl[i - 1] + ttol - xmin = levels[i - 1] + bgsl[i - 1] - ttol - elif okabove == True: - xmax = levels[i + 1] + bgsl[i + 1] + ttol - xmin = levels[i + 1] + bgsl[i + 1] - ttol - else: - continue - # Reassign PGE if level is within the tolerances. - if levels[i] + bgsl[i] >= xmin and levels[i] + bgsl[i] <= xmax: - pgeData[i] = 0.49 - - # Assign the QC flags to original levels. - for i, pge in enumerate(pgeData): - if pgeData.mask[i]: continue - if pge < 0.5: continue - for j, assocLevel in enumerate(assocLevels): - if assocLevel == i: - origLevel = origLevels[j] - qc[origLevel] = True - - return qc - -def determine_pge(levels, bgev, obev, profile): - ''' - determine the probability of gross error per level given: - levels: a list of observed - background temperatures per level (ie the first return of stdLevelData) - bgev: list of background error variance per level - obev: list of observational error variances per level - profile: the wodpy profile object in question - ''' - pge = np.ma.array(np.ndarray(len(levels))) - pge.mask = True - - for iLevel, level in enumerate(levels): - if levels.mask[iLevel] or bgev.mask[iLevel]: continue - bgevLevel = bgev[iLevel] - if np.abs(profile.latitude()) < 10.0: bgevLevel *= 1.5**2 - obevLevel = obev[iLevel] - pge_est = EN_background_check.estimatePGE(profile.probe_type(), False) - - kappa = 0.1 - evLevel = obevLevel + bgevLevel #V from the text - sdiff = level**2 / evLevel - pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) - pdTotal = kappa * pge_est + pdGood * (1.0 - pge_est) - pge[iLevel] = kappa * pge_est / pdTotal - - return pge - -def buddyCovariance(minDist, profile, buddyProfile, meso_ev_a, meso_ev_b, syn_ev_a, syn_ev_b): - ''' - coavariance formula for buddy profiles, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf pp.11 - meso_ev_a == mesoscale error variance for profile a, etc. - ''' - - corScaleA = 100.0 # In km. - corScaleB = 400.0 # In km. - corScaleT = 432000.0 # 5 days in secs. - mesSDist = minDist / (1000.0 * corScaleA) - synSDist = minDist / (1000.0 * corScaleB) - - timeDiff2 = timeDiff(profile, buddyProfile) - if timeDiff2 is None: - return None - timeDiff2 = (timeDiff2 / corScaleT)**2 - - covar = (np.sqrt(meso_ev_a * meso_ev_b) * - (1.0 + mesSDist) * np.exp(-mesSDist - timeDiff2) + - np.sqrt(syn_ev_a * syn_ev_b) * - (1.0 + synSDist) * np.exp(-synSDist - timeDiff2)) - - return covar - -def update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, profile, buddyProfile, obev, bgev, bgevBuddy): - ''' - update the PGE for the profile in question using the buddy pge. - ''' - - for iLevel in range(len(levelsBuddy)): - if levels.mask[iLevel] or levelsBuddy.mask[iLevel]: continue - - # For simplicity, going to assume that length scales - # are isotropic and the same everywhere; in the EN - # processing length scales are stretched in E/W direction - # near the equator and this functionality could be added - # later. - - covar = buddyCovariance(minDist, profile, buddyProfile, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0) - if covar is None: - continue; - - errVarA = obev[iLevel] + bgev[iLevel] - errVarB = obev[iLevel] + bgevBuddy[iLevel] - rho2 = covar**2 / (errVarA + errVarB) - expArg = (-(0.5 * rho2 / (1.0 - rho2)) * - (levels[iLevel]**2 / errVarA + - levelsBuddy[iLevel]**2 / errVarB - - 2.0 * levels[iLevel] * levelsBuddy[iLevel] / covar)) - expArg = -0.5 * np.log(1.0 - rho2) + expArg - expArg = min(80.0, max(-80.0, expArg)) - Z = 1.0 / (1.0 - (1.0 - pgeData[iLevel]) * - (1.0 - pgeBuddy[iLevel]) * (1.0 - expArg)) - if Z < 0.0: Z = 1.0 # In case of rounding errors. - Z = Z**0.5 - pgeData[iLevel] = pgeData[iLevel] * Z - - return pgeData - -def stdLevelData(p): - """ - Combines data that have passed other QC checks to create a - set of observation minus background data on standard levels. - """ - - # Combine other QC results. - preQC = (EN_background_check.test(p) | - EN_constant_value_check.test(p) | - EN_increasing_depth_check.test(p) | - EN_range_check.test(p) | - EN_spike_and_step_check.test(p) | - EN_stability_check.test(p)) - - # Get the data stored by the EN background check. - # As it was run above we know that the data held by the - # module corresponds to the correct profile. - origLevels = np.array(EN_background_check.origLevels) - diffLevels = (np.array(EN_background_check.ptLevels) - - np.array(EN_background_check.bgLevels)) - nLevels = len(origLevels) - if nLevels == 0: return None # Nothing more to do. - - # Remove any levels that failed previous QC. - nLevels, origLevels, diffLevels = filterLevels(preQC, origLevels, diffLevels) - if nLevels == 0: return None - - levels, assocLevs = meanDifferencesAtStandardLevels(origLevels, diffLevels, p.z()) - - return levels, origLevels, assocLevs - -def filterLevels(preQC, origLevels, diffLevels): - ''' - preQC: list or array of bools indicating a QC state for each level, determined from other tests - origLevels: list of level indices that passed EN_background - diffLevels: correpsonding to origLevels. - return (nLevels, origLevels, diffLevels) with all elements corresponding to a True entry in preQC removed. - ''' - - nLevels = len(origLevels) - use = np.ones(nLevels, dtype=bool) - for i, origLevel in enumerate(origLevels): - if preQC[origLevel]: use[i] = False - nLevels = np.count_nonzero(use) - origLevels = origLevels[use] - diffLevels = diffLevels[use] - - return nLevels, origLevels, diffLevels - -def meanDifferencesAtStandardLevels(origLevels, diffLevels, depths): - ''' - origLevels: list of level indices under consideration - diffLevels: list of differences corresponding to origLevels - depths: list of depths of all levels in profile. - returns (levels, assocLevs), where - levels == a masked array of mean differences at each standard level - assocLevs == a list of the indices of the closest standard levels to the levels indicated in origLevels - ''' - - # Get the set of standard levels. - stdLevels = EN_background_check.auxParam['depth'] - - # Create arrays to hold the standard level data and aggregate. - nStdLevels = len(stdLevels) - levels = np.zeros(nStdLevels) - nPerLev = np.zeros(nStdLevels) - assocLevs = [] - for i, origLevel in enumerate(origLevels): - # Find the closest standard level. - j = np.argmin(np.abs(depths[origLevel] - stdLevels)) - assocLevs.append(j) - levels[j] += diffLevels[i] - nPerLev[j] += 1 - - # Average the standard levels where there are data. - iGT1 = nPerLev > 1 - levels[iGT1] /= nPerLev[iGT1] - levels = np.ma.array(levels) - levels.mask = False - levels.mask[nPerLev == 0] = True - - return levels, assocLevs - - -def assessBuddyDistance(p, buddy): - """ - given a profile

and a possible buddy profile , - return None if is not a valid buddy, or the distance - to

if it is. - """ - - # Check that it is not the same profile and that they - # are near in time. The time criteria matches the EN - # processing but would probably be better if it checked - # that the profiles were within a time threshold. The - # cruise is compared as two profiles from the same instrument - # should not be compared. - if (buddy.uid() == p.uid() or - buddy.year() != p.year() or - buddy.month() != p.month() or - buddy.cruise() == p.cruise()): return None - lat = p.latitude() - lon = p.longitude() - latComp = buddy.latitude() - lonComp = buddy.longitude() - # Do a rough check of distance. - latDiff = np.abs(latComp - lat) - if latDiff > 5: return None - # Do a more detailed check of distance. - # Check in case they are either side of the edge of the map. - if np.abs(lonComp - lon) > 180: - if lonComp < lon: - lonComp += 360.0 - else: - lonComp -= 360.0 - # Calculate distance and return. - return haversine(lat, lon, latComp, lonComp) - -def timeDiff(p1, p2): - ''' - returns the time difference, in seconds, between two profiles - returns None if the year, month or day in either profile is invalid - ''' - - dts = [] - for prof in [p1, p2]: - year = prof.year() - month = prof.month() - day = prof.day() - if not (year > 0) or not (1 <= month <= 12) or not (1 <= day <= 31): - return None - time = prof.time() - if time is None or time < 0 or time >= 24: - hours = 0 - minutes = 0 - seconds = 0 - else: - hours = int(time) - minutesf = (time - hours) * 60 - minutes = int(minutesf) - seconds = int((minutesf - minutes) * 60) - - dts.append(datetime.datetime(year, month, day, hours, minutes, seconds)) - - diff = dts[0] - dts[1] - - return np.abs(diff.total_seconds()) - - diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py deleted file mode 100644 index 52342ee..0000000 --- a/qctests/EN_track_check.py +++ /dev/null @@ -1,392 +0,0 @@ -""" -Implements the EN track check, described on pp 7 and 21 of -http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -import numpy as np -import data.ds as ds -import util.main as main -import util.geo as geo -import copy -import datetime -import math - -# module constants -DistRes = 20000. # meters -TimeRes = 600. # seconds - -EN_track_headers = {} -EN_track_results = {} -threadFile = {} - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - global EN_track_headers - global EN_track_results - global threadFile - - cruise = p.cruise() - uid = p.uid() - - # don't bother if cruise == 0 or None - if cruise in [0, None]: - return np.zeros(1, dtype=bool); - - # The headers from an entire cruise must be analyzed all at once; - # we'll write the results to the global data store, in a dictionary - # with ntuple keys (cruise, uid), and values as single element - # numpy arrays, containing either a true or a false (per all the other - # qc return objects) - - # check if this profile has been examined already - if (cruise, uid) in EN_track_results.keys(): - return EN_track_results[(cruise, uid)] - - # some detector types cannot be assessed by this test; do not raise flag. - if p.probe_type in [None]: - return np.zeros(1, dtype=bool) - - # the first time this test is run, sort ds.threadProfiles into a cruise-keyed dictionary: - if ds.threadFile != threadFile: - EN_track_headers = main.sort_headers(ds.threadProfiles) - threadFile = ds.threadFile - - # since we didn't find an answer already calculated, - # we still need to do the calculation for this cruise; - # all the relevant headers are sitting in the EN_track_headers list. - headers = EN_track_headers[cruise] - - # start all as passing by default: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())] = np.zeros(1, dtype=bool) - - # copy the list of headers; - # remove entries as they are flagged. - passedHeaders = copy.deepcopy(headers) - rejects = findOutlier(passedHeaders) - while rejects != []: - passedIndex = [x for x in range(len(passedHeaders)) if x not in rejects ] - passedHeaders = [passedHeaders[index] for index in passedIndex ] - rejects = findOutlier(passedHeaders) - - # if more than half got rejected, reject everyone - if len(passedHeaders) < len(headers) / 2: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())][0] = True - - return EN_track_results[(cruise, uid)] - -def findOutlier(headers): - ''' - given a list of , find the fastest one; - if it's too fast, reject it or the one before it, return a list of rejected indices; - once the fastest is within limits, return []. - ''' - - maxShipSpeed = 15. # m/s - maxBuoySpeed = 2. # m/s - - if headers == []: - return [] - - # determine speeds and angles for list of headers - speeds, angles = calculateTraj(headers) - - # decide if something needs to be flagged - maxSpeed = maxShipSpeed - if isBuoy(headers[0]): - maxSpeed = maxBuoySpeed - iMax = speeds.index(max(speeds)) - flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) - - # decide which profile to reject, flag it, and return a list of indices rejected at this step. - if flag: - rejects = chooseReject(headers, speeds, angles, iMax, maxSpeed) - - for reject in rejects: - EN_track_results[(headers[reject].cruise(), headers[reject].uid())][0] = True - return rejects - else: - return [] - -def chooseReject(headers, speeds, angles, index, maxSpeed): - ''' - decide which profile to reject, headers[index] or headers[index-1], or both, - and return a list of indices to reject. - ''' - - # chain of tests breaks when a reject is found: - reject = condition_a(headers, speeds, angles, index, maxSpeed)[0] - - # condition i needs to run at the end of the chain in all cases: - # if no decision, reject both: - if reject == -1: - reject = [index-1, index] - # if excessive speed is created by removing the flag, reject both instead - # can't create new excessive speed by removing last profile. - elif reject < len(headers)-1: - newHeaders = copy.deepcopy(headers) - del newHeaders[reject] - newSpeeds, newAngles = calculateTraj(newHeaders) - flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) - if flag: - reject = [index-1, index] - else: - reject = [reject] - else: - reject = [reject] - - return reject - -def calculateTraj(headers): - ''' - return a list of speeds and a list of angles describing the trajectory of the track described - by the time-ordered list of . - ''' - - speeds = [None] - angles = [None] - - # Find speed and angle for all profiles remaining in the list - for i in range(1, len(headers)): - - speeds.append(None) - angles.append(None) - - speeds[i] = trackSpeed(headers[i-1], headers[i]) - if i < len(headers)-1: # can't do angle on last point - angles[i] = abs(math.pi - geo.haversineAngle(headers[i-1], headers[i], headers[i+1])) - - return speeds, angles - -def isBuoy(header): - ''' - decide if header belongs to a buoy-based measurement - ''' - - return header.probe_type in [4,7,9,10,11,12,13,15] - -def detectExcessiveSpeed(speeds, angles, index, maxSpeed): - ''' - decide if there was an excessive speed at in the lists and - ''' - - flag = speeds[index] > maxSpeed - - if index > 0: - flag = flag or ( (speeds[index] > 0.8*maxSpeed) and (angles[index]>math.pi/2 or angles[index-1]>math.pi/2) ) - - return flag - -def meanSpeed(speeds, headers, maxSpeed): - ''' - determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) - ''' - - meanSpeed = 0 - speedCount = 0 - for iSpeed, speed in enumerate(speeds): - if speed == None or iSpeed == 0: - #missing values - continue - elif iSpeed > 0 and geo.deltaTime(headers[iSpeed-1], headers[iSpeed]) < 3600.: - #too close together in time - continue - elif speed > maxSpeed: - #too fast - continue - else: - meanSpeed += speed - speedCount += 1 - - if speedCount > 0: - meanSpeed = meanSpeed / speedCount - - return meanSpeed - - -def trackSpeed(prevHeader, header): - ''' - computes the speed, including rounding tolerance from the reference, - for the track at

. - return None if some necessary data is missing - ''' - - # check that all required data is present: - if None in [header.latitude(), header.longitude(), prevHeader.latitude(), prevHeader.longitude()]: - return None - if None in [header.year(), header.month(), header.day(), header.time(), prevHeader.year(), prevHeader.month(), prevHeader.day(), prevHeader.time()]: - return None - - dist = geo.haversineDistance(prevHeader, header) - DTime = geo.deltaTime(prevHeader, header) - speed = (dist - DistRes) / max(DTime, TimeRes) - - return speed - -def condition_a(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (a) from the text - ''' - - if index == 1 and len(headers) == 2: - return 0, 'a' - elif index == 1 and len(headers) > 2: # note 'M' in the text seems to count from 1, not 0. - impliedSpeed = trackSpeed(headers[0], headers[2]) - if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): - return 1, 'a' - else: - return 0, 'a' - elif index == len(headers)-1 and len(headers)>3: # why not >=? seems to cause problems, investigate. - impliedSpeed = trackSpeed(headers[-3], headers[-1]) - if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): - return index-1, 'a' - else: - return index, 'a' - else: - return condition_b(headers, speeds, angles, index, maxSpeed) - -def condition_b(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (b) from the text - ''' - if speeds[index-1] > maxSpeed: - return index-1, 'b' - elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: - return index, 'b' - - return condition_c(headers, speeds, angles, index, maxSpeed) - -def condition_c(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (c) from the text - ''' - - if index < len(headers)-1 and index > 0: - impliedSpeed = trackSpeed(headers[index-1], headers[index+1]) - if impliedSpeed > maxSpeed: - return index-1, 'c' - - if index > 1: - impliedSpeed = trackSpeed(headers[index-2], headers[index]) - if impliedSpeed > maxSpeed: - return index, 'c' - - return condition_d(headers, speeds, angles, index, maxSpeed) - - -def condition_d(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (d) from the text - ''' - - if None not in [angles[index-1], angles[index]] and angles[index-1] > 45./180.*math.pi + angles[index]: - return index-1, 'd' - - if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: - return index, 'd' - - return condition_e(headers, speeds, angles, index, maxSpeed) - -def condition_e(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (e) from the text - ''' - - if len(headers) > max(2, index+1): - - if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: - return index-1, 'e' - - if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: - return index, 'e' - - return condition_f(headers, speeds, angles, index, maxSpeed) - -def condition_f(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (f) from the text - ''' - - if index>0 and index < len(speeds)-1: - - ms = meanSpeed(speeds, headers, maxSpeed) - - if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): - return index-1, 'f' - - if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): - return index, 'f' - - return condition_g(headers, speeds, angles, index, maxSpeed) - -def condition_g(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (g) from the text - ''' - - if index > 1 and index < len(headers) - 1: - - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) - - distTol = geo.haversineDistance(headers[index-1], headers[index-2]) - distTol += geo.haversineDistance(headers[index], headers[index-1]) - distTol += geo.haversineDistance(headers[index+1], headers[index]) - distTol = max(DistRes, 0.1*distTol) - - if dist1 < dist2 - distTol: - return index-1, 'g' - - if dist2 < dist1 - distTol: - return index, 'g' - - return condition_h(headers, speeds, angles, index, maxSpeed) - -def condition_h(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (h) from the text - typeo in text, implementation incomplete - ''' - - if index > 1 and index < len(headers) - 1: - - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) - - PD1 = geo.haversineDistance(headers[index-1], headers[index-2]) / dist2 - PD2 = geo.haversineDistance(headers[index], headers[index-2]) / dist1 - - PT1 = geo.deltaTime(headers[index-2], headers[index-1]) / geo.deltaTime(headers[index-2], headers[index+1]) - PT2 = geo.deltaTime(headers[index-2], headers[index]) / geo.deltaTime(headers[index-2], headers[index+1]) - - if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): - return index-1, 'h' - if abs(PD2 - PT2) > 0.1 + abs(PD1 - PT1): - return index, 'h' - - return -1, 'i' - -def checkOrder(profiles): - ''' - check that a list of profiles is properly time ordered - ''' - - dates = [] - for pro in profiles: - if pro.time() is not None: - hour, minute, second = geo.parseTime(pro.time()) - else: - hour = 0 - minute = 0 - second = 0 - date = datetime.datetime(year=pro.year(), month=pro.month(), day=pro.day(), hour=hour, minute=minute, second=second ) - dates.append(date) - - for i in range(len(dates)-1): - assert dates[i] <= dates [i+1], 'dates out of order %s %s' % (dates[i], dates[i+1]) diff --git a/summarize-results.py b/summarize-results.py index c536010..5c1e5b3 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -5,8 +5,6 @@ testNames = main.importQC('qctests') testNames.sort() -testNames = [test for test in testNames if test[0:5] == 'CSIRO'] - # connect to database conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() @@ -15,7 +13,7 @@ query = 'SELECT truth' for test in testNames: query += ', ' + test.lower() -query += ' FROM demo' +query += ' FROM validate' cur.execute(query) rawresults = cur.fetchall() From e3494e799ac314fb290f87d3f9d8f6f62d43cd75 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 31 Jul 2016 00:47:13 +0000 Subject: [PATCH 19/79] cleanups to new database method before final debug & validation --- AutoQC.py | 59 +--- build-db.py | 1 + datafiles.json | 3 - qctests/EN_std_lev_bkg_and_buddy_check.py | 369 ++++++++++++++++++++ qctests/EN_track_check.py | 392 ++++++++++++++++++++++ summarize-results.py | 3 + tests/main_tests.py | 223 ------------ tests/wod_tests.py | 42 --- util/main.py | 213 ------------ 9 files changed, 768 insertions(+), 537 deletions(-) delete mode 100644 datafiles.json create mode 100644 qctests/EN_std_lev_bkg_and_buddy_check.py create mode 100644 qctests/EN_track_check.py delete mode 100644 tests/wod_tests.py diff --git a/AutoQC.py b/AutoQC.py index 87430db..4cacb39 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -1,7 +1,7 @@ from wodpy import wod import glob, time import numpy as np -import sys, os, json, data.ds +import sys, os, data.ds import util.main as main import pandas, psycopg2 from multiprocessing import Pool @@ -25,50 +25,6 @@ def run(test, profiles): verbose.append(result) return [qcResults, verbose] -def processFile(fName): - # run each test on each profile, and record its summary & verbose performance - testResults = [] - testVerbose = [] - trueResults = [] - trueVerbose = [] - profileIDs = [] - firstProfile = True - currentFile = '' - f = None - - # keep a list of only the profiles in this thread - data.ds.threadProfiles = main.extractProfiles([fName]) - data.ds.threadFile = fName - - for iprofile, pinfo in enumerate(data.ds.threadProfiles): - # Load the profile data. - p, currentFile, f = main.profileData(pinfo, currentFile, f) - # Check that there are temperature data in the profile, otherwise skip. - if p.var_index() is None: - continue - main.catchFlags(p) - if np.sum(p.t().mask == False) == 0: - continue - # Run each test. - for itest, test in enumerate(testNames): - result = run(test, [p]) - if firstProfile: - testResults.append(result[0]) - testVerbose.append(result[1]) - else: - testResults[itest].append(result[0][0]) - testVerbose[itest].append(result[1][0]) - firstProfile = False - # Read the reference result. - truth = main.referenceResults([p]) - trueResults.append(truth[0][0]) - trueVerbose.append(truth[1][0]) - profileIDs.append(p.uid()) - # testResults[i][j] now contains a flag indicating the exception raised by test i on profile j - - return trueResults, testResults, profileIDs - - ######################################## # main ######################################## @@ -77,6 +33,8 @@ def processFile(fName): # Identify and import tests testNames = main.importQC('qctests') testNames.sort() + testNames.remove('EN_std_lev_bkg_and_buddy_check') + testNames.remove('EN_track_check') print('{} quality control checks have been found'.format(len(testNames))) testNames = main.checkQCTestRequirements(testNames) print('{} quality control checks are able to be run:'.format(len(testNames))) @@ -113,8 +71,6 @@ def process_row(uid): query = "UPDATE validate SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) - print profile.uid() - # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() @@ -130,15 +86,6 @@ def process_row(uid): conn.commit() - - # ------------------------------------------- - - # # Recombine results - # truth, results, profileIDs = main.combineArrays(parallel_result) - - # # Print summary statistics and write output file. - # main.printSummary(truth, results, testNames) - # main.generateCSV(truth, results, testNames, profileIDs, sys.argv[1]) else: print 'Please add command line arguments to name your output file and set parallelization:' print 'python AutoQC myFile 4' diff --git a/build-db.py b/build-db.py index a929936..8e9ad5c 100644 --- a/build-db.py +++ b/build-db.py @@ -37,6 +37,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) +#while True: for i in range(10): # extract profile as wodpy object and raw text start = fid.tell() diff --git a/datafiles.json b/datafiles.json deleted file mode 100644 index 9b4ba6a..0000000 --- a/datafiles.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "data/quota_subset.dat" -] diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py new file mode 100644 index 0000000..44bdff2 --- /dev/null +++ b/qctests/EN_std_lev_bkg_and_buddy_check.py @@ -0,0 +1,369 @@ +""" +Implements the background check on standard levels and the buddy check +from the EN quality control system, +http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +from cotede.qctests.possible_speed import haversine +import datetime +import EN_background_check +import EN_constant_value_check +import EN_increasing_depth_check +import EN_range_check +import EN_spike_and_step_check +import EN_stability_check +import util.main as main +import data.ds +import numpy as np + +def test(p, allow_level_reinstating=True): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + + If allow_level_reinstating is set to True then rejected levels can be + reprieved by comparing with levels above and below. NB this is done by + default in EN processing. + """ + + # Define an array to hold results. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Obtain the obs minus background differences on standard levels. + result = stdLevelData(p) + if result is None: return qc + + # Unpack the results. + levels, origLevels, assocLevels = result + # Retrieve the background and observation error variances and + # the background values. + bgsl = EN_background_check.bgStdLevels + slev = EN_background_check.auxParam['depth'] + bgev = EN_background_check.bgevStdLevels + obev = EN_background_check.auxParam['obev'] + + #find initial pge + pgeData = determine_pge(levels, bgev, obev, p) + + # Find buddy. + profiles = data.ds.profiles + minDist = 1000000000.0 + iMinDist = None + for iProfile, profile in enumerate(profiles): + pDist = assessBuddyDistance(p, profile) + if pDist is not None and pDist < minDist: + minDist = pDist + iMinDist = iProfile + + # Check if we have found a buddy and process if so. + if minDist <= 400000: + fid = None + pBuddy, currentFile, fid = main.profileData(profiles[iMinDist], '', fid) + fid.close() + + # buddy vetos + Fail = False + if pBuddy.var_index() is None: + Fail = True + if Fail == False: + main.catchFlags(pBuddy) + if np.sum(pBuddy.t().mask == False) == 0: + Fail = True + + if Fail == False: + result = stdLevelData(pBuddy) + if result is not None: + levelsBuddy, origLevelsBuddy, assocLevelsBuddy = result + bgevBuddy = EN_background_check.bgevStdLevels + pgeBuddy = determine_pge(levels, bgevBuddy, obev, pBuddy) + pgeData = update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, p, pBuddy, obev, bgev, bgevBuddy) + + # Check if levels should be reinstated. + if allow_level_reinstating: + if np.abs(p.latitude()) < 20.0: + depthTol = 300.0 + else: + depthTol = 200.0 + stdLevelFlags = pgeData >= 0.5 + for i, slflag in enumerate(stdLevelFlags): + if slflag: + # Check for non rejected surrounding levels. + okbelow = False + if i > 0: + if stdLevelFlags[i - 1] == False and levels.mask[i - 1] == False and bgsl.mask[i - 1] == False: + okbelow = True + okabove = False + nsl = len(stdLevelFlags) + if i < nsl - 1: + if stdLevelFlags[i + 1] == False and levels.mask[i + 1] == False and bgsl.mask[i + 1] == False: + okabove = True + # Work out tolerances. + if slev[i] > depthTol + 100: + tolFactor = 0.5 + elif slev[i] > depthTol: + tolFactor = 1.0 - 0.005 * (slev[i] - depthTol) + else: + tolFactor = 1.0 + ttol = 0.5 * tolFactor + if okbelow == True and okabove == True: + xmax = levels[i - 1] + bgsl[i - 1] + ttol + xmin = levels[i + 1] + bgsl[i + 1] - ttol + elif okbelow == True: + xmax = levels[i - 1] + bgsl[i - 1] + ttol + xmin = levels[i - 1] + bgsl[i - 1] - ttol + elif okabove == True: + xmax = levels[i + 1] + bgsl[i + 1] + ttol + xmin = levels[i + 1] + bgsl[i + 1] - ttol + else: + continue + # Reassign PGE if level is within the tolerances. + if levels[i] + bgsl[i] >= xmin and levels[i] + bgsl[i] <= xmax: + pgeData[i] = 0.49 + + # Assign the QC flags to original levels. + for i, pge in enumerate(pgeData): + if pgeData.mask[i]: continue + if pge < 0.5: continue + for j, assocLevel in enumerate(assocLevels): + if assocLevel == i: + origLevel = origLevels[j] + qc[origLevel] = True + + return qc + +def determine_pge(levels, bgev, obev, profile): + ''' + determine the probability of gross error per level given: + levels: a list of observed - background temperatures per level (ie the first return of stdLevelData) + bgev: list of background error variance per level + obev: list of observational error variances per level + profile: the wodpy profile object in question + ''' + pge = np.ma.array(np.ndarray(len(levels))) + pge.mask = True + + for iLevel, level in enumerate(levels): + if levels.mask[iLevel] or bgev.mask[iLevel]: continue + bgevLevel = bgev[iLevel] + if np.abs(profile.latitude()) < 10.0: bgevLevel *= 1.5**2 + obevLevel = obev[iLevel] + pge_est = EN_background_check.estimatePGE(profile.probe_type(), False) + + kappa = 0.1 + evLevel = obevLevel + bgevLevel #V from the text + sdiff = level**2 / evLevel + pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) + pdTotal = kappa * pge_est + pdGood * (1.0 - pge_est) + pge[iLevel] = kappa * pge_est / pdTotal + + return pge + +def buddyCovariance(minDist, profile, buddyProfile, meso_ev_a, meso_ev_b, syn_ev_a, syn_ev_b): + ''' + coavariance formula for buddy profiles, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf pp.11 + meso_ev_a == mesoscale error variance for profile a, etc. + ''' + + corScaleA = 100.0 # In km. + corScaleB = 400.0 # In km. + corScaleT = 432000.0 # 5 days in secs. + mesSDist = minDist / (1000.0 * corScaleA) + synSDist = minDist / (1000.0 * corScaleB) + + timeDiff2 = timeDiff(profile, buddyProfile) + if timeDiff2 is None: + return None + timeDiff2 = (timeDiff2 / corScaleT)**2 + + covar = (np.sqrt(meso_ev_a * meso_ev_b) * + (1.0 + mesSDist) * np.exp(-mesSDist - timeDiff2) + + np.sqrt(syn_ev_a * syn_ev_b) * + (1.0 + synSDist) * np.exp(-synSDist - timeDiff2)) + + return covar + +def update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, profile, buddyProfile, obev, bgev, bgevBuddy): + ''' + update the PGE for the profile in question using the buddy pge. + ''' + + for iLevel in range(len(levelsBuddy)): + if levels.mask[iLevel] or levelsBuddy.mask[iLevel]: continue + + # For simplicity, going to assume that length scales + # are isotropic and the same everywhere; in the EN + # processing length scales are stretched in E/W direction + # near the equator and this functionality could be added + # later. + + covar = buddyCovariance(minDist, profile, buddyProfile, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0) + if covar is None: + continue; + + errVarA = obev[iLevel] + bgev[iLevel] + errVarB = obev[iLevel] + bgevBuddy[iLevel] + rho2 = covar**2 / (errVarA + errVarB) + expArg = (-(0.5 * rho2 / (1.0 - rho2)) * + (levels[iLevel]**2 / errVarA + + levelsBuddy[iLevel]**2 / errVarB - + 2.0 * levels[iLevel] * levelsBuddy[iLevel] / covar)) + expArg = -0.5 * np.log(1.0 - rho2) + expArg + expArg = min(80.0, max(-80.0, expArg)) + Z = 1.0 / (1.0 - (1.0 - pgeData[iLevel]) * + (1.0 - pgeBuddy[iLevel]) * (1.0 - expArg)) + if Z < 0.0: Z = 1.0 # In case of rounding errors. + Z = Z**0.5 + pgeData[iLevel] = pgeData[iLevel] * Z + + return pgeData + +def stdLevelData(p): + """ + Combines data that have passed other QC checks to create a + set of observation minus background data on standard levels. + """ + + # Combine other QC results. + preQC = (EN_background_check.test(p) | + EN_constant_value_check.test(p) | + EN_increasing_depth_check.test(p) | + EN_range_check.test(p) | + EN_spike_and_step_check.test(p) | + EN_stability_check.test(p)) + + # Get the data stored by the EN background check. + # As it was run above we know that the data held by the + # module corresponds to the correct profile. + origLevels = np.array(EN_background_check.origLevels) + diffLevels = (np.array(EN_background_check.ptLevels) - + np.array(EN_background_check.bgLevels)) + nLevels = len(origLevels) + if nLevels == 0: return None # Nothing more to do. + + # Remove any levels that failed previous QC. + nLevels, origLevels, diffLevels = filterLevels(preQC, origLevels, diffLevels) + if nLevels == 0: return None + + levels, assocLevs = meanDifferencesAtStandardLevels(origLevels, diffLevels, p.z()) + + return levels, origLevels, assocLevs + +def filterLevels(preQC, origLevels, diffLevels): + ''' + preQC: list or array of bools indicating a QC state for each level, determined from other tests + origLevels: list of level indices that passed EN_background + diffLevels: correpsonding to origLevels. + return (nLevels, origLevels, diffLevels) with all elements corresponding to a True entry in preQC removed. + ''' + + nLevels = len(origLevels) + use = np.ones(nLevels, dtype=bool) + for i, origLevel in enumerate(origLevels): + if preQC[origLevel]: use[i] = False + nLevels = np.count_nonzero(use) + origLevels = origLevels[use] + diffLevels = diffLevels[use] + + return nLevels, origLevels, diffLevels + +def meanDifferencesAtStandardLevels(origLevels, diffLevels, depths): + ''' + origLevels: list of level indices under consideration + diffLevels: list of differences corresponding to origLevels + depths: list of depths of all levels in profile. + returns (levels, assocLevs), where + levels == a masked array of mean differences at each standard level + assocLevs == a list of the indices of the closest standard levels to the levels indicated in origLevels + ''' + + # Get the set of standard levels. + stdLevels = EN_background_check.auxParam['depth'] + + # Create arrays to hold the standard level data and aggregate. + nStdLevels = len(stdLevels) + levels = np.zeros(nStdLevels) + nPerLev = np.zeros(nStdLevels) + assocLevs = [] + for i, origLevel in enumerate(origLevels): + # Find the closest standard level. + j = np.argmin(np.abs(depths[origLevel] - stdLevels)) + assocLevs.append(j) + levels[j] += diffLevels[i] + nPerLev[j] += 1 + + # Average the standard levels where there are data. + iGT1 = nPerLev > 1 + levels[iGT1] /= nPerLev[iGT1] + levels = np.ma.array(levels) + levels.mask = False + levels.mask[nPerLev == 0] = True + + return levels, assocLevs + + +def assessBuddyDistance(p, buddy): + """ + given a profile

and a possible buddy profile , + return None if is not a valid buddy, or the distance + to

if it is. + """ + + # Check that it is not the same profile and that they + # are near in time. The time criteria matches the EN + # processing but would probably be better if it checked + # that the profiles were within a time threshold. The + # cruise is compared as two profiles from the same instrument + # should not be compared. + if (buddy.uid() == p.uid() or + buddy.year() != p.year() or + buddy.month() != p.month() or + buddy.cruise() == p.cruise()): return None + lat = p.latitude() + lon = p.longitude() + latComp = buddy.latitude() + lonComp = buddy.longitude() + # Do a rough check of distance. + latDiff = np.abs(latComp - lat) + if latDiff > 5: return None + # Do a more detailed check of distance. + # Check in case they are either side of the edge of the map. + if np.abs(lonComp - lon) > 180: + if lonComp < lon: + lonComp += 360.0 + else: + lonComp -= 360.0 + # Calculate distance and return. + return haversine(lat, lon, latComp, lonComp) + +def timeDiff(p1, p2): + ''' + returns the time difference, in seconds, between two profiles + returns None if the year, month or day in either profile is invalid + ''' + + dts = [] + for prof in [p1, p2]: + year = prof.year() + month = prof.month() + day = prof.day() + if not (year > 0) or not (1 <= month <= 12) or not (1 <= day <= 31): + return None + time = prof.time() + if time is None or time < 0 or time >= 24: + hours = 0 + minutes = 0 + seconds = 0 + else: + hours = int(time) + minutesf = (time - hours) * 60 + minutes = int(minutesf) + seconds = int((minutesf - minutes) * 60) + + dts.append(datetime.datetime(year, month, day, hours, minutes, seconds)) + + diff = dts[0] - dts[1] + + return np.abs(diff.total_seconds()) + + diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py new file mode 100644 index 0000000..52342ee --- /dev/null +++ b/qctests/EN_track_check.py @@ -0,0 +1,392 @@ +""" +Implements the EN track check, described on pp 7 and 21 of +http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +import numpy as np +import data.ds as ds +import util.main as main +import util.geo as geo +import copy +import datetime +import math + +# module constants +DistRes = 20000. # meters +TimeRes = 600. # seconds + +EN_track_headers = {} +EN_track_results = {} +threadFile = {} + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + global EN_track_headers + global EN_track_results + global threadFile + + cruise = p.cruise() + uid = p.uid() + + # don't bother if cruise == 0 or None + if cruise in [0, None]: + return np.zeros(1, dtype=bool); + + # The headers from an entire cruise must be analyzed all at once; + # we'll write the results to the global data store, in a dictionary + # with ntuple keys (cruise, uid), and values as single element + # numpy arrays, containing either a true or a false (per all the other + # qc return objects) + + # check if this profile has been examined already + if (cruise, uid) in EN_track_results.keys(): + return EN_track_results[(cruise, uid)] + + # some detector types cannot be assessed by this test; do not raise flag. + if p.probe_type in [None]: + return np.zeros(1, dtype=bool) + + # the first time this test is run, sort ds.threadProfiles into a cruise-keyed dictionary: + if ds.threadFile != threadFile: + EN_track_headers = main.sort_headers(ds.threadProfiles) + threadFile = ds.threadFile + + # since we didn't find an answer already calculated, + # we still need to do the calculation for this cruise; + # all the relevant headers are sitting in the EN_track_headers list. + headers = EN_track_headers[cruise] + + # start all as passing by default: + for i in range(len(headers)): + EN_track_results[(headers[i].cruise(), headers[i].uid())] = np.zeros(1, dtype=bool) + + # copy the list of headers; + # remove entries as they are flagged. + passedHeaders = copy.deepcopy(headers) + rejects = findOutlier(passedHeaders) + while rejects != []: + passedIndex = [x for x in range(len(passedHeaders)) if x not in rejects ] + passedHeaders = [passedHeaders[index] for index in passedIndex ] + rejects = findOutlier(passedHeaders) + + # if more than half got rejected, reject everyone + if len(passedHeaders) < len(headers) / 2: + for i in range(len(headers)): + EN_track_results[(headers[i].cruise(), headers[i].uid())][0] = True + + return EN_track_results[(cruise, uid)] + +def findOutlier(headers): + ''' + given a list of , find the fastest one; + if it's too fast, reject it or the one before it, return a list of rejected indices; + once the fastest is within limits, return []. + ''' + + maxShipSpeed = 15. # m/s + maxBuoySpeed = 2. # m/s + + if headers == []: + return [] + + # determine speeds and angles for list of headers + speeds, angles = calculateTraj(headers) + + # decide if something needs to be flagged + maxSpeed = maxShipSpeed + if isBuoy(headers[0]): + maxSpeed = maxBuoySpeed + iMax = speeds.index(max(speeds)) + flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) + + # decide which profile to reject, flag it, and return a list of indices rejected at this step. + if flag: + rejects = chooseReject(headers, speeds, angles, iMax, maxSpeed) + + for reject in rejects: + EN_track_results[(headers[reject].cruise(), headers[reject].uid())][0] = True + return rejects + else: + return [] + +def chooseReject(headers, speeds, angles, index, maxSpeed): + ''' + decide which profile to reject, headers[index] or headers[index-1], or both, + and return a list of indices to reject. + ''' + + # chain of tests breaks when a reject is found: + reject = condition_a(headers, speeds, angles, index, maxSpeed)[0] + + # condition i needs to run at the end of the chain in all cases: + # if no decision, reject both: + if reject == -1: + reject = [index-1, index] + # if excessive speed is created by removing the flag, reject both instead + # can't create new excessive speed by removing last profile. + elif reject < len(headers)-1: + newHeaders = copy.deepcopy(headers) + del newHeaders[reject] + newSpeeds, newAngles = calculateTraj(newHeaders) + flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) + if flag: + reject = [index-1, index] + else: + reject = [reject] + else: + reject = [reject] + + return reject + +def calculateTraj(headers): + ''' + return a list of speeds and a list of angles describing the trajectory of the track described + by the time-ordered list of . + ''' + + speeds = [None] + angles = [None] + + # Find speed and angle for all profiles remaining in the list + for i in range(1, len(headers)): + + speeds.append(None) + angles.append(None) + + speeds[i] = trackSpeed(headers[i-1], headers[i]) + if i < len(headers)-1: # can't do angle on last point + angles[i] = abs(math.pi - geo.haversineAngle(headers[i-1], headers[i], headers[i+1])) + + return speeds, angles + +def isBuoy(header): + ''' + decide if header belongs to a buoy-based measurement + ''' + + return header.probe_type in [4,7,9,10,11,12,13,15] + +def detectExcessiveSpeed(speeds, angles, index, maxSpeed): + ''' + decide if there was an excessive speed at in the lists and + ''' + + flag = speeds[index] > maxSpeed + + if index > 0: + flag = flag or ( (speeds[index] > 0.8*maxSpeed) and (angles[index]>math.pi/2 or angles[index-1]>math.pi/2) ) + + return flag + +def meanSpeed(speeds, headers, maxSpeed): + ''' + determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) + ''' + + meanSpeed = 0 + speedCount = 0 + for iSpeed, speed in enumerate(speeds): + if speed == None or iSpeed == 0: + #missing values + continue + elif iSpeed > 0 and geo.deltaTime(headers[iSpeed-1], headers[iSpeed]) < 3600.: + #too close together in time + continue + elif speed > maxSpeed: + #too fast + continue + else: + meanSpeed += speed + speedCount += 1 + + if speedCount > 0: + meanSpeed = meanSpeed / speedCount + + return meanSpeed + + +def trackSpeed(prevHeader, header): + ''' + computes the speed, including rounding tolerance from the reference, + for the track at

. + return None if some necessary data is missing + ''' + + # check that all required data is present: + if None in [header.latitude(), header.longitude(), prevHeader.latitude(), prevHeader.longitude()]: + return None + if None in [header.year(), header.month(), header.day(), header.time(), prevHeader.year(), prevHeader.month(), prevHeader.day(), prevHeader.time()]: + return None + + dist = geo.haversineDistance(prevHeader, header) + DTime = geo.deltaTime(prevHeader, header) + speed = (dist - DistRes) / max(DTime, TimeRes) + + return speed + +def condition_a(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (a) from the text + ''' + + if index == 1 and len(headers) == 2: + return 0, 'a' + elif index == 1 and len(headers) > 2: # note 'M' in the text seems to count from 1, not 0. + impliedSpeed = trackSpeed(headers[0], headers[2]) + if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): + return 1, 'a' + else: + return 0, 'a' + elif index == len(headers)-1 and len(headers)>3: # why not >=? seems to cause problems, investigate. + impliedSpeed = trackSpeed(headers[-3], headers[-1]) + if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): + return index-1, 'a' + else: + return index, 'a' + else: + return condition_b(headers, speeds, angles, index, maxSpeed) + +def condition_b(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (b) from the text + ''' + if speeds[index-1] > maxSpeed: + return index-1, 'b' + elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: + return index, 'b' + + return condition_c(headers, speeds, angles, index, maxSpeed) + +def condition_c(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (c) from the text + ''' + + if index < len(headers)-1 and index > 0: + impliedSpeed = trackSpeed(headers[index-1], headers[index+1]) + if impliedSpeed > maxSpeed: + return index-1, 'c' + + if index > 1: + impliedSpeed = trackSpeed(headers[index-2], headers[index]) + if impliedSpeed > maxSpeed: + return index, 'c' + + return condition_d(headers, speeds, angles, index, maxSpeed) + + +def condition_d(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (d) from the text + ''' + + if None not in [angles[index-1], angles[index]] and angles[index-1] > 45./180.*math.pi + angles[index]: + return index-1, 'd' + + if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: + return index, 'd' + + return condition_e(headers, speeds, angles, index, maxSpeed) + +def condition_e(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (e) from the text + ''' + + if len(headers) > max(2, index+1): + + if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: + return index-1, 'e' + + if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: + return index, 'e' + + return condition_f(headers, speeds, angles, index, maxSpeed) + +def condition_f(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (f) from the text + ''' + + if index>0 and index < len(speeds)-1: + + ms = meanSpeed(speeds, headers, maxSpeed) + + if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): + return index-1, 'f' + + if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): + return index, 'f' + + return condition_g(headers, speeds, angles, index, maxSpeed) + +def condition_g(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (g) from the text + ''' + + if index > 1 and index < len(headers) - 1: + + dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) + dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + + distTol = geo.haversineDistance(headers[index-1], headers[index-2]) + distTol += geo.haversineDistance(headers[index], headers[index-1]) + distTol += geo.haversineDistance(headers[index+1], headers[index]) + distTol = max(DistRes, 0.1*distTol) + + if dist1 < dist2 - distTol: + return index-1, 'g' + + if dist2 < dist1 - distTol: + return index, 'g' + + return condition_h(headers, speeds, angles, index, maxSpeed) + +def condition_h(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (h) from the text + typeo in text, implementation incomplete + ''' + + if index > 1 and index < len(headers) - 1: + + dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) + dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + + PD1 = geo.haversineDistance(headers[index-1], headers[index-2]) / dist2 + PD2 = geo.haversineDistance(headers[index], headers[index-2]) / dist1 + + PT1 = geo.deltaTime(headers[index-2], headers[index-1]) / geo.deltaTime(headers[index-2], headers[index+1]) + PT2 = geo.deltaTime(headers[index-2], headers[index]) / geo.deltaTime(headers[index-2], headers[index+1]) + + if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): + return index-1, 'h' + if abs(PD2 - PT2) > 0.1 + abs(PD1 - PT1): + return index, 'h' + + return -1, 'i' + +def checkOrder(profiles): + ''' + check that a list of profiles is properly time ordered + ''' + + dates = [] + for pro in profiles: + if pro.time() is not None: + hour, minute, second = geo.parseTime(pro.time()) + else: + hour = 0 + minute = 0 + second = 0 + date = datetime.datetime(year=pro.year(), month=pro.month(), day=pro.day(), hour=hour, minute=minute, second=second ) + dates.append(date) + + for i in range(len(dates)-1): + assert dates[i] <= dates [i+1], 'dates out of order %s %s' % (dates[i], dates[i+1]) diff --git a/summarize-results.py b/summarize-results.py index 5c1e5b3..9b5eea9 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -4,6 +4,9 @@ # what tests are available testNames = main.importQC('qctests') testNames.sort() +testNames.remove('EN_std_lev_bkg_and_buddy_check') +testNames.remove('EN_track_check') + # connect to database conn = psycopg2.connect("dbname='root' user='root'") diff --git a/tests/main_tests.py b/tests/main_tests.py index e63b88e..f17ace8 100644 --- a/tests/main_tests.py +++ b/tests/main_tests.py @@ -1,125 +1,7 @@ import util.main as main import os -from wodpy import wod -import numpy, pandas -from pandas.util.testing import assert_frame_equal -import util.testingProfile class TestClass(): - def setUp(self): - - #create an incorrectly formatted list of input files - file = open("notalist.json", "w") - file.write('{"not": "alist"}') - file.close() - - #create a list of input files that does not exist - file = open("dne.json", "w") - file.write('["data/doesnotexist.dat"]') - file.close() - - #create an artificial profile to trigger the temperature flag - #sets first temperature to 99.9; otherwise identical to data/example.dat - file = open("temp.dat", "w") - file.write('C41303567064US5112031934 8 744210374426193562-17227140 6110101201013011182205814\n') - file.write('01118220291601118220291901024721 8STOCS85A3 41032151032165-500632175-50023218273\n') - file.write('18117709500110134401427143303931722076210220602291107291110329977020133023846181\n') - file.write('24421800132207614110217330103192220521322011216442103723077095001101818115508527\n') - file.write('20012110000133312500021011060022022068002272214830228442684000230770421200000191\n') - file.write('15507911800121100001333125000151105002103302270022022068002274411816302284426840\n') - file.write('00230770426500000191155069459001211000013331250001511050021033011300220220680022\n') - file.write('73319043022844268400023077042620000019116601596680012110000133312500021022016002\n') - file.write('17110100220220680022733112830228442684000230770435700000181155088803001211000013\n') - file.write('33125000210220160022022068002273311283022844268400023077042120000019115508880300\n') - file.write('12110000133312500015110200210330535002202206800227441428030228442684000230770421\n') - file.write('20000019115508880300121100001333125000152204300210220320022022068002273312563022\n') - file.write('84426840002307704212000001911550853710012110000133312500015110200210220160022022\n') - file.write('06800227331128302284426840002307704212000001100001319990044230900033267500222650\n') - file.write('03312050033281000220100033289500442309000332670002227100331123003328100022025002\n') - file.write('22900044231910033286200222900033115400332810002205000342-12300442324100332728003\n') - file.write('32117003312560033280500 \n') - file.close() - - - return - - def tearDown(self): - os.remove('notalist.json') - os.remove('dne.json') - os.remove('temp.dat') - return - - def readInput_list_test(self): - ''' - main.readInput should assert it gets a list back - ''' - - try: - main.readInput('notalist.json') - except AssertionError: - assert True - return - - assert False, "readInput failed to raise an exception when given json that wasn't a list" - - def reatInput_dne_test(self): - ''' - main.readInput should raise exceptions if listed files don't exist - ''' - - try: - main.readInput('dne.json') - except AssertionError: - assert True - return - - assert False, "readInput failed to raise an exception when a listed data file was not found." - - def extractProfiles_test(self): - ''' - simple check to make sure only WodProfile objects are getting returned - ''' - - profiles = main.extractProfiles(["data/quota_subset.dat"]) - for i in profiles: - assert isinstance(i, wod.WodProfile), i + ' is not a WodProfile' - - def extractProfiles_example_test(self): - ''' - check the example from pp 137 of - http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf - is extracted correctly. - data is in `data/example.dat` - ''' - - profile = main.extractProfiles(['data/example.dat'])[0] - - assert profile.latitude() == 61.930, 'incorrect latitude extraction' - assert profile.longitude() == -172.270, 'incorrect longitude extraction' - assert profile.uid() == 67064, 'incorrect UID extraction' - assert profile.n_levels() == 4, 'incorrect # levels extraction' - assert profile.year() == 1934, 'incorrect year extraction' - assert profile.month() == 8, 'incorrect month extraction' - assert profile.day() == 7, 'incorrect day extraction' - assert profile.time() == 10.37, 'incorrect time extraction' - assert profile.probe_type() == 7, 'incorrect probe type extraction' - - def profileData_example_test(self): - ''' - continue examining data extracted from pp 137 of - http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf - ''' - - profile = main.extractProfiles(['data/example.dat'])[0] - current = '' - p, current, f = main.profileData(profile, current, None) - - assert numpy.array_equal(p.z(), [0.0, 10.0, 25.0, 50.0]) - assert numpy.array_equal(p.z_level_qc(), [0,0,0,0]) - assert numpy.array_equal(p.t(), [8.960, 8.950, 0.900, -1.230]) - assert numpy.array_equal(p.t_level_qc(), [0,0,0,0]) - assert numpy.array_equal(p.s(), [30.900, 30.900, 31.910, 32.410]) - assert numpy.array_equal(p.s_level_qc(), [0,0,0,0]) def importQC_test(self): ''' @@ -132,111 +14,6 @@ def importQC_test(self): for test in tests: assert os.path.isfile('qctests/'+test+'.py'), 'test ' + test + ' is not found.' - def catchFlags_example_test(self): - ''' - make sure main.catchFlags is flagging temperatures of 99.9 as missing, - using the artificial data generated in temp.dat above. - ''' - - profile = main.extractProfiles(['temp.dat'])[0] - current = '' - p, current, f = main.profileData(profile, current, None) - - main.catchFlags(p) - - assert p.profile_data[0]['variables'][0]['Missing'], 'failed to flag a temperature of 99.9 as a missing value' - - def referenceResults_example_test(self): - ''' - make sure main.referenceResults is extacting the correct references from data/example.dat - ''' - - profile = main.extractProfiles(['data/example.dat'])[0] - current = '' - p, current, f = main.profileData(profile, current, None) - - ref = main.referenceResults([p]) - - assert ref[0][0] == False, 'incorrect extraction of overall reference result for data/example.dat' - assert numpy.array_equal(ref[1][0], [False, False, False, False] ), 'incorrect extraction of verbose reference results for data/example.dat' - - def generateCSV_test(self): - ''' - make sure things are being packed into dataframes correctly; - assumes Pandas writes dataframes to csv correctly. - ''' - - truth = [True, False, False] - results = [ - [False, False, False], - [True, True, True] - ] - tests = ['x', 'y'] - keys = [1000,1001,1002] - - df = main.generateCSV(truth, results, tests, keys, 'test') - dfTrue = pandas.DataFrame([[True, False, True],[False, False, True],[False, False, True]], index=keys, columns=['True Flags', 'x', 'y']) - - assert_frame_equal(df, dfTrue, check_names=True) - - def parallelization_test(self): - ''' - simple test to check parallelization infrastructure - ''' - - dummy.parallel = main.parallel_function(dummy) - parallel_result = dummy.parallel([1,2]) - - assert numpy.array_equal(parallel_result[0][0], [2,3]) - assert numpy.array_equal(parallel_result[0][1], [4,5]) - assert numpy.array_equal(parallel_result[1][0], [4,6]) - assert numpy.array_equal(parallel_result[1][1], [8,10]) - - def combineArrays_test(self): - ''' - spotcheck combineArrays - ''' - - parallel = [ - [[0,1],[[100,101],[102,103],[104,105]], [992,993]], - [[2,3],[[200,201],[202,203],[204,205]], [994,995]], - [[4,5],[[300,301],[302,303],[304,305]], [996,997]], - [[6,7],[[400,401],[402,403],[404,405]], [998,999]] - ] - - truth, results, ids = main.combineArrays(parallel) - - assert numpy.array_equal(truth, [0,1,2,3,4,5,6,7]) - assert numpy.array_equal(results, [ [100,101, 200,201, 300,301, 400,401], [102,103, 202,203, 302,303, 402,403], [104,105, 204,205, 304,305, 404,405] ]) - assert numpy.array_equal(ids, [992, 993, 994, 995, 996, 997, 998, 999]) - - def sortHeaders_test(self): - ''' - check basic behavior of header sorting - ''' - - p = [] - - p.append(util.testingProfile.fakeProfile([0], [0], date=[2004, 3, 17, 11.3], cruise=1)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2004, 3, 17, 22.6], cruise=1)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2004, 3, 17, 1.1], cruise=1)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2004, 3, 17, 15.9], cruise=1)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2005, 1, 11, 11.5], cruise=2)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2005, 1, 11, 22.2], cruise=2)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2005, 1, 11, 1.0], cruise=2)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2005, 1, 11, 16.0], cruise=2)) - - sortedProfiles = main.sort_headers(p) - - truth = {1: [p[2], p[0], p[3], p[1]], - 2: [p[6], p[4], p[7], p[5]], - } - - assert sortedProfiles == truth, 'incorrectly sorted profiles' - -def dummy(x): - return [2*x, 3*x], [4*x, 5*x] - diff --git a/tests/wod_tests.py b/tests/wod_tests.py deleted file mode 100644 index 564e29a..0000000 --- a/tests/wod_tests.py +++ /dev/null @@ -1,42 +0,0 @@ -import util.main as main -from wodpy import wod - -class TestClass: - def setUp(self): - filenames = ["data/quota_subset.dat"] - profiles = main.extractProfiles(filenames) - - # identify and import tests - testNames = main.importQC('qctests') - testNames.sort() - for testName in testNames: - exec('from qctests import ' + testName) - - # Set up any keyword arguments needed by tests. - kwargs = {'profiles' : profiles} - - testResults = [] - testVerbose = [] - trueResults = [] - trueVerbose = [] - firstProfile = True - delete = [] - currentFile = '' - self.profiles = [] - for iprofile, pinfo in enumerate(profiles): - # Load the profile data. - if pinfo.file_name != currentFile: - if currentFile != '': f.close() - currentFile = pinfo.file_name - f = open(currentFile) - if f.tell() != pinfo.file_position: f.seek(pinfo.file_position) - self.profiles.append(wod.WodProfile(f)) - - - def tearDown(self): - return - - def test_check_time_type(self): - for p in self.profiles: - time = p.time() - assert type(time) is float or time is None, 'profile time should be either a float or None.' \ No newline at end of file diff --git a/util/main.py b/util/main.py index 16c078d..e004728 100644 --- a/util/main.py +++ b/util/main.py @@ -7,49 +7,6 @@ import testingProfile from numbers import Number -def readInput(JSONlist): - '''Create a list of data file names from a json array.''' - datafiles = json.loads(open(JSONlist).read()) - - # assert that a list of data files is found, and all those files exist: - assert type(datafiles) is list, 'Failed to read a list from the specified file.' - for i in datafiles: - assert os.path.isfile(i), 'datafile ' + i + ' is not found.' - - return datafiles - -def extractProfiles(filenames): - ''' - Read all profiles from the files and store in a list. Only the profile - descriptions are read, not the profile data, in order to avoid using - too much memory. - ''' - profiles = [] - for filename in filenames: - with open(filename) as f: - profiles.append(wod.WodProfile(f, load_profile_data=False)) - while profiles[-1].is_last_profile_in_file(f) == False: - profiles.append(wod.WodProfile(f, load_profile_data=False)) - - # assert all elements of profiles are WodProfiles - for i in profiles: - assert isinstance(i, wod.WodProfile), i + ' is not a WodProfile' - - return profiles - -def profileData(pinfo, currentFile, f): - ''' - takes a profile info stub as returned by extractProfiles and extracts the whole profile - from file f. - ''' - - if pinfo.file_name != currentFile: - if currentFile != '': f.close() - currentFile = pinfo.file_name - f = open(currentFile) - if f.tell() != pinfo.file_position: f.seek(pinfo.file_position) - return wod.WodProfile(f), currentFile, f - def importQC(dir): ''' return a list of names of tests found in : @@ -73,58 +30,6 @@ def catchFlags(profile): if profile.profile_data[i]['variables'][index]['Value'] == 99.9: profile.profile_data[i]['variables'][index]['Missing'] = True -def referenceResults(profiles): - ''' - extract the summary reference result for each profile: DEPRECATED - ''' - refResult = [] - verbose = [] - for profile in profiles: - refAssessment = profile.t_level_qc(originator=True) >= 3 - - #demand reference results returned bools, or masked constants for missing values: - for i in refAssessment: - assert isinstance(i, np.bool_) or isinstance(i, np.ma.core.MaskedConstant), str(i) + ' in reference result list is of type ' + str(type(i)) - - refResult.append(np.ma.any(refAssessment)) - verbose.append(refAssessment) - return [refResult, verbose] - - -def generateCSV(truth, results, tests, primaryKeys, name): - ''' - log resuls as a CSV, columns for tests, rows for profiles. - ''' - - d = {} - for i, testName in enumerate(tests): - d[testName] = results[i] - - df = pandas.DataFrame(d, index=primaryKeys) - - df.insert(0, 'True Flags', truth) - - df.to_csv('results-' + name + '.csv') - - return df # for testing - -def parallel_function(f, nfold=2): - ''' - thanks http://scottsievert.github.io/blog/2014/07/30/simple-python-parallelism/ DEPRECATED - ''' - def easy_parallize(f, sequence): - """ assumes f takes sequence as input, easy w/ Python's scope """ - from multiprocessing import Pool - pool = Pool(processes=int(nfold)) # depends on available cores - result = pool.map(f, sequence) # for i in sequence: result[i] = f(i) - cleaned = [x for x in result if not x is None] # getting results - cleaned = np.asarray(cleaned) - pool.close() # not optimal! but easy - pool.join() - return cleaned - from functools import partial - return partial(easy_parallize, f) - def checkQCTestRequirements(checks): '''Reads set of requirements from qctest_requirements.json and checks each QC test to see if their requirements are met. @@ -219,121 +124,3 @@ def calcRates(testResults, trueResults): tnr = nPP * 100.0 / nTruePasses return tpr, fpr, fnr, tnr - -def printSummary(truth, results, testNames): - - nProfiles = len(truth) - print('Number of profiles tested was %i\n' % nProfiles) - print('%35s %7s %7s %7s %7s %7s' % ('NAME OF TEST', 'FAILS', 'TPR', 'FPR', 'TNR', 'FNR')) - overallResults = np.zeros(nProfiles, dtype=bool) - for i in range (0, len(testNames)): - overallResults = np.logical_or(overallResults, results[i]) - tpr, fpr, fnr, tnr = calcRates(results[i], truth) - print('%35s %7i %6.1f%1s %6.1f%1s %6.1f%1s %6.1f%1s' % (testNames[i], np.sum(results[i]), tpr, '%', fpr, '%', tnr, '%', fnr, '%')) - tpr, fpr, fnr, tnr = calcRates(overallResults, truth) - print('%35s %7i %6.1f%1s %6.1f%1s %6.1f%1s %6.1f%1s' % ('RESULT OF OR OF ALL:', np.sum(overallResults), tpr, '%', fpr, '%', tnr, '%', fnr, '%')) - - -def combineArrays(parallelResults): - ''' - given the results of processFile() run in parallel on several datasets, - recombine the results into a single set of lists for output to CSV. - ''' - - truth = parallelResults[0][0] - results = parallelResults[0][1] - profileIDs = parallelResults[0][2] - for pr in parallelResults[1:]: - truth += pr[0] - for itr, tr in enumerate(pr[1]): - results[itr] += tr - profileIDs += pr[2] - - return truth, results, profileIDs - -def sort_headers(headers): - ''' - takes a list of headers, and sorts them into a dictionary keyed by cruise number - containing a list of corresponding headers; - header lists are then time sorted. DEPRECATED - ''' - - sortedHeaders = {} - - for header in headers: - if header.cruise() not in sortedHeaders.keys(): - sortedHeaders[header.cruise()] = [header] - else: - sortedHeaders[header.cruise()].append(header) - - for key in sortedHeaders.keys(): - sortedHeaders[key] = sorted(sortedHeaders[key], key=lambda header: (header.year(), header.month(), header.day(), header.time()) ) - - return sortedHeaders - -def mock_wodpy(row): - ''' - given a single row from a postgres cursor, return an object that mocks - a wodpy object with the same values - ''' - - return testingProfile.fakeProfile(row[10], row[9], latitude=row[0], longitude=row[1], date=[row[4], row[5], row[6], row[7]], probe_type=row[8], salinities=row[11], pressures=None, uid=row[2], cruise=row[3], qcflag=row[12]) - -def row2dict(row): - ''' - given a single row from a postgres cursor, return a dictionary containing the row's info, keyed as a wodpy object - ''' - - profile = { - 'latitude': row[0], - 'longitude': row[1], - 'uid': row[2], - 'cruise': row[3], - 'year': row[4], - 'month': row[5], - 'day': row[6], - 'time': row[7], - 'probe_type': row[8], - 'z': row[9], - 't': row[10], - 's': row[11], - 'qcflag': row[12], - 'n_levels': row[13] - } - - return profile - -def dataPresent(keys, level, profile): - ''' - keys: tuple of key names found in the return object of row2dict - level: index number of level in question - profile: return object from row2dict - returns true if all the listed keys have a sensible value in the provided profile at the indicated level; - false otherwise. - ''' - - present = True - - for key in keys: - if key in ['latitude', 'longitude', 'time']: - # must be float - present = present and isinstance(profile[key], Number) - - elif key in ['uid', 'cruise', 'year', 'month', 'day', 'probe_type', 'n_levels']: - # muse be int - present = present and isinstance(profile[key], (int, long)) - - elif key in ['z', 't', 's']: - # must be float at given level - if level >= len(profile[key]): - return False - present = present and isinstance(profile[key][level], Number) - if key == 't': - # t = 99.9 indicates missing value - present = present and profile[key][level] != 99.9 - - elif key in ['qcflag']: - # must be bool - present = present and isinstance(profile[key], bool) - - return present From 0f68b970da2d1eb2b0add25d348e45265470fab6 Mon Sep 17 00:00:00 2001 From: s-good Date: Mon, 1 Aug 2016 22:16:59 +0100 Subject: [PATCH 20/79] Added functionality to use sqlite database plus tidied up setting table name, added usage instructions. --- AutoQC.py | 26 ++++++--- build-db.py | 124 ++++++++++++++++++++++++------------------- summarize-results.py | 60 +++++++++++++-------- 3 files changed, 125 insertions(+), 85 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 4cacb39..e2d00f3 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -3,7 +3,16 @@ import numpy as np import sys, os, data.ds import util.main as main -import pandas, psycopg2 +import pandas +try: + import psycopg2 as db + dbtype = 'postgres' + concom = "dbname='root' user='root'" +except: + import sqlite3 as db + concom = 'qcresults.sqlite' + dbtype = 'sqlite' +print('Database type is ' + dbtype) from multiprocessing import Pool import tempfile @@ -48,7 +57,7 @@ def process_row(uid): '''run all tests on the ith database row''' # extract profile - cur.execute('SELECT * FROM validate WHERE uid = ' + str(uid) ) + cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) row = cur.fetchall() fProfile = tempfile.TemporaryFile() fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row @@ -68,13 +77,16 @@ def process_row(uid): for itest, test in enumerate(testNames): result = run(test, [profile]) - query = "UPDATE validate SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" + query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(int(result[0][0])) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) + if dbtype == 'sqlite': + # Seem to need to do this after every update for sqlite database. + conn.commit() # connect to database & fetch list of all uids - conn = psycopg2.connect("dbname='root' user='root'") + conn = db.connect(concom) cur = conn.cursor() - cur.execute('SELECT uid FROM validate') + cur.execute('SELECT uid FROM ' + sys.argv[1]) uids = cur.fetchall() # launch async processes @@ -88,5 +100,5 @@ def process_row(uid): else: print 'Please add command line arguments to name your output file and set parallelization:' - print 'python AutoQC myFile 4' - print 'will result in output written to results-myFile.csv, and will run the calculation parallelized across 4 cores.' + print 'python AutoQC databasetable 4' + print 'will result in output written to table in the database, and will run the calculation parallelized across 4 cores.' diff --git a/build-db.py b/build-db.py index 8e9ad5c..3aec5bd 100644 --- a/build-db.py +++ b/build-db.py @@ -1,69 +1,83 @@ # usage: python build-db.py
-import psycopg2 +try: + import psycopg2 as db + dbtype = 'postgres' + concom = "dbname='root' user='root'" +except: + import sqlite3 as db + concom = 'qcresults.sqlite' + dbtype = 'sqlite' +print('Database type is ' + dbtype) from wodpy import wod import sys import util.main as main -# connect to database and create a cursor by which to interact with it. -try: - conn = psycopg2.connect("dbname='root' user='root'") -except: - print "I am unable to connect to the database" +if len(sys.argv) == 3: -cur = conn.cursor() + # connect to database and create a cursor by which to interact with it. + try: + conn = db.connect(concom) + except: + print "I am unable to connect to the database" -# Identify tests -testNames = main.importQC('qctests') -testNames.sort() + cur = conn.cursor() -# set up our table -query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( - raw text, - truth boolean, - uid integer, - lat real, - long real, - cruise integer, - """ -for i in range(len(testNames)): - query += testNames[i].lower() + ' boolean' - if i= 3) >= 1 + # populate table from wod-ascii data + fid = open(sys.argv[1]) + #while True: + for i in range(10): + # extract profile as wodpy object and raw text + start = fid.tell() + profile = wod.WodProfile(fid) + end = fid.tell() + fid.seek(start) + raw = fid.read(end-start) + fid.seek(end) + + # set up dictionary for populating query string + wodDict = profile.npdict() + wodDict['raw'] = "'" + raw + "'" + wodDict['truth'] = int(sum(profile.t_level_qc(originator=True) >= 3) >= 1) - query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, lat, long, cruise) " + """ VALUES( - {p[raw]}, - {p[truth]}, - {p[uid]}, - {p[latitude]}, - {p[longitude]}, - {p[cruise]} - )""".format(p=wodDict) - query = query.replace('--', 'NULL') - query = query.replace('None', 'NULL') - cur.execute(query) - if profile.is_last_profile_in_file(fid) == True: - break + query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, lat, long, cruise) " + """ VALUES( + {p[raw]}, + {p[truth]}, + {p[uid]}, + {p[latitude]}, + {p[longitude]}, + {p[cruise]} + )""".format(p=wodDict) + query = query.replace('--', 'NULL') + query = query.replace('None', 'NULL') + cur.execute(query) + if profile.is_last_profile_in_file(fid) == True: + break + + conn.commit() + +else: -conn.commit() + print('Usage: python build-db.py inputdatafile databasetable') diff --git a/summarize-results.py b/summarize-results.py index 9b5eea9..597f899 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -1,31 +1,45 @@ import util.main as main -import psycopg2, pandas +import pandas +import sys +try: + import psycopg2 as db + dbtype = 'postgres' + concom = "dbname='root' user='root'" +except: + import sqlite3 as db + concom = 'qcresults.sqlite' + dbtype = 'sqlite' +print('Database type is ' + dbtype) -# what tests are available -testNames = main.importQC('qctests') -testNames.sort() -testNames.remove('EN_std_lev_bkg_and_buddy_check') -testNames.remove('EN_track_check') +if len(sys.argv) == 2: + # what tests are available + testNames = main.importQC('qctests') + testNames.sort() + testNames.remove('EN_std_lev_bkg_and_buddy_check') + testNames.remove('EN_track_check') -# connect to database -conn = psycopg2.connect("dbname='root' user='root'") -cur = conn.cursor() + # connect to database + conn = db.connect(concom) + cur = conn.cursor() -# extract matrix of test results and true flags into a dataframe -query = 'SELECT truth' -for test in testNames: - query += ', ' + test.lower() -query += ' FROM validate' + # extract matrix of test results and true flags into a dataframe + query = 'SELECT truth' + for test in testNames: + query += ', ' + test.lower() + query += ' FROM ' + sys.argv[1] -cur.execute(query) -rawresults = cur.fetchall() + cur.execute(query) + rawresults = cur.fetchall() + df = pandas.DataFrame(rawresults).astype('bool') + df.columns = ['Truth'] + testNames -df = pandas.DataFrame(rawresults) -df.columns = ['Truth'] + testNames + # summarize results + print('%35s %7s %7s %7s %7s %7s' % ('NAME OF TEST', 'FAILS', 'TPR', 'FPR', 'TNR', 'FNR')) + for test in testNames: + tpr, fpr, fnr, tnr = main.calcRates(df[test].tolist(), df['Truth'].tolist()) + print('%35s %7i %6.1f%1s %6.1f%1s %6.1f%1s %6.1f%1s' % (test, sum(df[test].tolist()), tpr, '%', fpr, '%', tnr, '%', fnr, '%')) -# summarize results -print('%35s %7s %7s %7s %7s %7s' % ('NAME OF TEST', 'FAILS', 'TPR', 'FPR', 'TNR', 'FNR')) -for test in testNames: - tpr, fpr, fnr, tnr = main.calcRates(df[test].tolist(), df['Truth'].tolist()) - print('%35s %7i %6.1f%1s %6.1f%1s %6.1f%1s %6.1f%1s' % (test, sum(df[test].tolist()), tpr, '%', fpr, '%', tnr, '%', fnr, '%')) +else: + + print('Usage: python summarize-results.py databasetable') From a55665eaee9b2e47e670bf43ad82c7cebddba3d3 Mon Sep 17 00:00:00 2001 From: s-good Date: Tue, 2 Aug 2016 00:10:00 +0100 Subject: [PATCH 21/79] Version with EN std level check and tests working with the database. --- AutoQC.py | 11 +---- build-db.py | 13 +++--- qctests/EN_std_lev_bkg_and_buddy_check.py | 43 ++++++++++++++----- summarize-results.py | 2 - ...N_std_level_background_check_validation.py | 42 ++++++++++++------ util/main.py | 15 +++++++ 6 files changed, 85 insertions(+), 41 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index e2d00f3..88e1241 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -12,7 +12,6 @@ import sqlite3 as db concom = 'qcresults.sqlite' dbtype = 'sqlite' -print('Database type is ' + dbtype) from multiprocessing import Pool import tempfile @@ -42,7 +41,6 @@ def run(test, profiles): # Identify and import tests testNames = main.importQC('qctests') testNames.sort() - testNames.remove('EN_std_lev_bkg_and_buddy_check') testNames.remove('EN_track_check') print('{} quality control checks have been found'.format(len(testNames))) testNames = main.checkQCTestRequirements(testNames) @@ -57,13 +55,7 @@ def process_row(uid): '''run all tests on the ith database row''' # extract profile - cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) - row = cur.fetchall() - fProfile = tempfile.TemporaryFile() - fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row - fProfile.seek(0) - profile = wod.WodProfile(fProfile) - fProfile.close() + profile = main.get_profile_from_db(cur, uid) # Check that there are temperature data in the profile, otherwise skip. if profile.var_index() is None: @@ -73,7 +65,6 @@ def process_row(uid): return # run tests - results = [row[0][1]] for itest, test in enumerate(testNames): result = run(test, [profile]) diff --git a/build-db.py b/build-db.py index 3aec5bd..050759e 100644 --- a/build-db.py +++ b/build-db.py @@ -30,14 +30,16 @@ # set up our table query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( raw text, - truth boolean, + truth integer, uid integer, + year integer, + month integer, lat real, long real, cruise integer, """ for i in range(len(testNames)): - query += testNames[i].lower() + ' boolean' + query += testNames[i].lower() + ' integer' if i= 3) >= 1) - query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, lat, long, cruise) " + """ VALUES( + query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, year, month, lat, long, cruise) " + """ VALUES( {p[raw]}, {p[truth]}, {p[uid]}, + {p[year]}, + {p[month]}, {p[latitude]}, {p[longitude]}, {p[cruise]} diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py index 44bdff2..c728c2d 100644 --- a/qctests/EN_std_lev_bkg_and_buddy_check.py +++ b/qctests/EN_std_lev_bkg_and_buddy_check.py @@ -15,6 +15,15 @@ import util.main as main import data.ds import numpy as np +try: + import psycopg2 as db + dbtype = 'postgres' + concom = "dbname='root' user='root'" +except: + import sqlite3 as db + concom = 'qcresults.sqlite' + dbtype = 'sqlite' +import sys def test(p, allow_level_reinstating=True): """ @@ -47,7 +56,7 @@ def test(p, allow_level_reinstating=True): pgeData = determine_pge(levels, bgev, obev, p) # Find buddy. - profiles = data.ds.profiles + profiles = get_profile_info() minDist = 1000000000.0 iMinDist = None for iProfile, profile in enumerate(profiles): @@ -58,9 +67,7 @@ def test(p, allow_level_reinstating=True): # Check if we have found a buddy and process if so. if minDist <= 400000: - fid = None - pBuddy, currentFile, fid = main.profileData(profiles[iMinDist], '', fid) - fid.close() + pBuddy = main.get_profile_from_db(cur, profiles[iMinDist][0]) # buddy vetos Fail = False @@ -315,14 +322,14 @@ def assessBuddyDistance(p, buddy): # that the profiles were within a time threshold. The # cruise is compared as two profiles from the same instrument # should not be compared. - if (buddy.uid() == p.uid() or - buddy.year() != p.year() or - buddy.month() != p.month() or - buddy.cruise() == p.cruise()): return None + if (buddy[0] == p.uid() or + buddy[1] != p.year() or + buddy[2] != p.month() or + buddy[3] == p.cruise()): return None lat = p.latitude() lon = p.longitude() - latComp = buddy.latitude() - lonComp = buddy.longitude() + latComp = buddy[4] + lonComp = buddy[5] # Do a rough check of distance. latDiff = np.abs(latComp - lat) if latDiff > 5: return None @@ -366,4 +373,18 @@ def timeDiff(p1, p2): return np.abs(diff.total_seconds()) - +def get_profile_info(): + # Gets information about the profiles from the database. + # This is only done once and the results saved in the global variable. + # NB this could be done on module load but this would make it difficult + # to implement code tests. + global profiles_info_list, cur + if len(profiles_info_list) == 0: + conn = db.connect(concom) + cur = conn.cursor() + cur.execute('SELECT uid,year,month,cruise,lat,long FROM ' + sys.argv[1]) + profiles_info_list = cur.fetchall() + return profiles_info_list + +profiles_info_list = [] +cur = None diff --git a/summarize-results.py b/summarize-results.py index 597f899..9d63ab5 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -9,14 +9,12 @@ import sqlite3 as db concom = 'qcresults.sqlite' dbtype = 'sqlite' -print('Database type is ' + dbtype) if len(sys.argv) == 2: # what tests are available testNames = main.importQC('qctests') testNames.sort() - testNames.remove('EN_std_lev_bkg_and_buddy_check') testNames.remove('EN_track_check') # connect to database diff --git a/tests/EN_std_level_background_check_validation.py b/tests/EN_std_level_background_check_validation.py index 4918cc9..ffcba14 100644 --- a/tests/EN_std_level_background_check_validation.py +++ b/tests/EN_std_level_background_check_validation.py @@ -10,21 +10,33 @@ # work on a testing profile. def dummycatchflagsfunc(arg): pass -def dummyprofiledatafunc(p, dummy1, dummy2): - fid = open('data/quota_subset.dat') # Need an open file handle for program to close. - return p, '', fid realcatchflagsfunc = main.catchFlags -realprofiledatafunc = main.profileData +realgetproffunc = main.get_profile_from_db + +# Set up the profile information for the check to work using the information put into the data.ds module. +def profile_to_info_list(p): + return (p.uid(),p.year(),p.month(),p.cruise(),p.latitude(),p.longitude()) + +def get_profiles_info_list(): + ps = [] + for p in data.ds.profiles: + ps.append(profile_to_info_list(p)) + return ps + +def dummy_get_profile_from_db(cur, uid): + for profile in data.ds.profiles: + if profile.uid() == uid: + return profile ##### EN_std_lev_bkg_and_buddy_check --------------------------------------------------- def setUp(): main.catchFlags = dummycatchflagsfunc - main.profileData = dummyprofiledatafunc + main.get_profile_from_db = dummy_get_profile_from_db def tearDown(): main.catchFlags = realcatchflagsfunc - main.profileData = realprofiledatafunc + main.get_profile_from_db = realgetproffunc def test_EN_std_level_bkg_and_buddy_check_temperature(): ''' @@ -33,6 +45,7 @@ def test_EN_std_level_bkg_and_buddy_check_temperature(): p = util.testingProfile.fakeProfile([1.8, 1.8, 1.8, 7.1], [0.0, 2.5, 5.0, 7.5], latitude=55.6, longitude=12.9, date=[1900, 01, 15, 0], probe_type=7) data.ds.profiles = [p] + qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() qc = qctests.EN_std_lev_bkg_and_buddy_check.test(p) expected = [False, False, False, False] print qc @@ -134,23 +147,23 @@ def test_assessBuddyDistance_invalid_buddies(): p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 13], uid=0, cruise=2) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) is None, 'accepted buddies with same uid' + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) is None, 'accepted buddies with same uid' p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) - p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], date=[1901, 1, 1, 13], uid=1, cruise=2) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) is None, 'accepted buddies with different year' + p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1901, 1, 1, 13], uid=1, cruise=2) + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) is None, 'accepted buddies with different year' p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 2, 1, 13], uid=1, cruise=2) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) is None, 'accepted buddies with different month' + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) is None, 'accepted buddies with different month' p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 13], uid=1, cruise=1) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) is None, 'accepted buddies with same cruise' + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) is None, 'accepted buddies with same cruise' p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 5.01, 0, date=[1900, 1, 1, 13], uid=1, cruise=2) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) is None, 'accepted buddies too far apart in latitude' + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) is None, 'accepted buddies too far apart in latitude' def test_assessBuddyDistance_haversine(): ''' @@ -159,7 +172,7 @@ def test_assessBuddyDistance_haversine(): p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 1, 1, date=[1900, 1, 1, 13], uid=1, cruise=2) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) == haversine(0,0,1,1), 'haversine calculation inconsistent with cotede.qctests.possible_speed.haversine' + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) == haversine(0,0,1,1), 'haversine calculation inconsistent with cotede.qctests.possible_speed.haversine' def test_timeDiff(): @@ -189,6 +202,7 @@ def test_EN_std_level_bkg_and_buddy_real_profiles_1(): ''' data.ds.profiles = [realProfile1] + qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile1) assert numpy.array_equal(qc, truthQC1), 'mismatch between qc results and expected values' @@ -199,6 +213,7 @@ def test_EN_std_level_bkg_and_buddy_real_profiles_2(): ''' data.ds.profiles = [realProfile2, realProfile3] + qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile2, allow_level_reinstating=False) assert numpy.array_equal(qc, truthQC2), 'mismatch between qc results and expected values' @@ -209,6 +224,7 @@ def test_EN_std_level_bkg_and_buddy_real_profiles_3(): ''' data.ds.profiles = [realProfile2, realProfile3] + qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile2) assert numpy.all(qc == False), 'mismatch between qc results and expected values' diff --git a/util/main.py b/util/main.py index e004728..f48990f 100644 --- a/util/main.py +++ b/util/main.py @@ -6,6 +6,9 @@ from netCDF4 import Dataset import testingProfile from numbers import Number +import sys +import tempfile +from wodpy import wod def importQC(dir): ''' @@ -124,3 +127,15 @@ def calcRates(testResults, trueResults): tnr = nPP * 100.0 / nTruePasses return tpr, fpr, fnr, tnr + +def get_profile_from_db(cur, uid): + # Given the database cursor and a unique id, return a WodPy profile object. + cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) + row = cur.fetchall() + fProfile = tempfile.TemporaryFile() + fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row + fProfile.seek(0) + profile = wod.WodProfile(fProfile) + fProfile.close() + return profile + From 243b2297c365eb62e29c2a4ead01b85b6d6e71c5 Mon Sep 17 00:00:00 2001 From: s-good Date: Tue, 2 Aug 2016 22:06:45 +0100 Subject: [PATCH 22/79] Catch problem with missing data when creating the database. --- build-db.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/build-db.py b/build-db.py index 050759e..d5d7eeb 100644 --- a/build-db.py +++ b/build-db.py @@ -61,8 +61,15 @@ # set up dictionary for populating query string wodDict = profile.npdict() wodDict['raw'] = "'" + raw + "'" - wodDict['truth'] = int(sum(profile.t_level_qc(originator=True) >= 3) >= 1) - + # Below avoids failures if all profile data are missing. + # We have no use for this profile in that case so skip it. + try: + wodDict['truth'] = int(sum(profile.t_level_qc(originator=True) >= 3) >= 1) + except: + if profile.is_last_profile_in_file(fid) == True: + break + continue + query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, year, month, lat, long, cruise) " + """ VALUES( {p[raw]}, {p[truth]}, From 425fa459a47713a30af0f8a137f14858435cc502 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Tue, 2 Aug 2016 22:40:49 +0000 Subject: [PATCH 23/79] consolidating standard level updates --- AutoQC.py | 14 ++------------ build-db.py | 17 ++++------------- qctests/EN_std_lev_bkg_and_buddy_check.py | 13 ++----------- summarize-results.py | 12 ++---------- util/main.py | 19 +++++++++---------- 5 files changed, 19 insertions(+), 56 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 88e1241..94cbcc4 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -4,14 +4,7 @@ import sys, os, data.ds import util.main as main import pandas -try: - import psycopg2 as db - dbtype = 'postgres' - concom = "dbname='root' user='root'" -except: - import sqlite3 as db - concom = 'qcresults.sqlite' - dbtype = 'sqlite' +import psycopg2 from multiprocessing import Pool import tempfile @@ -70,12 +63,9 @@ def process_row(uid): result = run(test, [profile]) query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(int(result[0][0])) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) - if dbtype == 'sqlite': - # Seem to need to do this after every update for sqlite database. - conn.commit() # connect to database & fetch list of all uids - conn = db.connect(concom) + conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() cur.execute('SELECT uid FROM ' + sys.argv[1]) uids = cur.fetchall() diff --git a/build-db.py b/build-db.py index d5d7eeb..fcceaec 100644 --- a/build-db.py +++ b/build-db.py @@ -1,23 +1,14 @@ # usage: python build-db.py
-try: - import psycopg2 as db - dbtype = 'postgres' - concom = "dbname='root' user='root'" -except: - import sqlite3 as db - concom = 'qcresults.sqlite' - dbtype = 'sqlite' -print('Database type is ' + dbtype) from wodpy import wod -import sys +import sys, psycopg2 import util.main as main if len(sys.argv) == 3: # connect to database and create a cursor by which to interact with it. try: - conn = db.connect(concom) + conn = psycopg2.connect("dbname='root' user='root'") except: print "I am unable to connect to the database" @@ -49,7 +40,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) - while True: + for xx in range(10): # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) @@ -90,4 +81,4 @@ else: - print('Usage: python build-db.py inputdatafile databasetable') + print 'Usage: python build-db.py inputdatafile databasetable' diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py index c728c2d..84c7fca 100644 --- a/qctests/EN_std_lev_bkg_and_buddy_check.py +++ b/qctests/EN_std_lev_bkg_and_buddy_check.py @@ -5,7 +5,7 @@ """ from cotede.qctests.possible_speed import haversine -import datetime +import datetime, psycopg2 import EN_background_check import EN_constant_value_check import EN_increasing_depth_check @@ -13,16 +13,7 @@ import EN_spike_and_step_check import EN_stability_check import util.main as main -import data.ds import numpy as np -try: - import psycopg2 as db - dbtype = 'postgres' - concom = "dbname='root' user='root'" -except: - import sqlite3 as db - concom = 'qcresults.sqlite' - dbtype = 'sqlite' import sys def test(p, allow_level_reinstating=True): @@ -380,7 +371,7 @@ def get_profile_info(): # to implement code tests. global profiles_info_list, cur if len(profiles_info_list) == 0: - conn = db.connect(concom) + conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() cur.execute('SELECT uid,year,month,cruise,lat,long FROM ' + sys.argv[1]) profiles_info_list = cur.fetchall() diff --git a/summarize-results.py b/summarize-results.py index 9d63ab5..ae726ab 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -1,14 +1,6 @@ import util.main as main import pandas -import sys -try: - import psycopg2 as db - dbtype = 'postgres' - concom = "dbname='root' user='root'" -except: - import sqlite3 as db - concom = 'qcresults.sqlite' - dbtype = 'sqlite' +import sys, psycopg2 if len(sys.argv) == 2: @@ -18,7 +10,7 @@ testNames.remove('EN_track_check') # connect to database - conn = db.connect(concom) + conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() # extract matrix of test results and true flags into a dataframe diff --git a/util/main.py b/util/main.py index f48990f..5102f4c 100644 --- a/util/main.py +++ b/util/main.py @@ -8,7 +8,6 @@ from numbers import Number import sys import tempfile -from wodpy import wod def importQC(dir): ''' @@ -129,13 +128,13 @@ def calcRates(testResults, trueResults): return tpr, fpr, fnr, tnr def get_profile_from_db(cur, uid): - # Given the database cursor and a unique id, return a WodPy profile object. - cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) - row = cur.fetchall() - fProfile = tempfile.TemporaryFile() - fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row - fProfile.seek(0) - profile = wod.WodProfile(fProfile) - fProfile.close() - return profile + # Given the database cursor and a unique id, return a WodPy profile object. + cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) + row = cur.fetchall() + fProfile = tempfile.TemporaryFile() + fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row + fProfile.seek(0) + profile = wod.WodProfile(fProfile) + fProfile.close() + return profile From 42ba1dc96572bcc6a5b572e48ef03fa98047a22a Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Wed, 3 Aug 2016 03:18:21 +0000 Subject: [PATCH 24/79] nominal port of track check to database backend --- AutoQC.py | 8 +- build-db.py | 12 +- qctests/EN_track_check.py | 264 +++++++++++++++++--------------------- summarize-results.py | 1 - util/geo.py | 2 +- util/main.py | 31 ++++- 6 files changed, 161 insertions(+), 157 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 94cbcc4..22830f5 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -34,7 +34,6 @@ def run(test, profiles): # Identify and import tests testNames = main.importQC('qctests') testNames.sort() - testNames.remove('EN_track_check') print('{} quality control checks have been found'.format(len(testNames))) testNames = main.checkQCTestRequirements(testNames) print('{} quality control checks are able to be run:'.format(len(testNames))) @@ -45,8 +44,8 @@ def run(test, profiles): print('\nPlease wait while QC is performed\n') def process_row(uid): - '''run all tests on the ith database row''' - + '''run all tests on the indicated database row''' + # extract profile profile = main.get_profile_from_db(cur, uid) @@ -59,9 +58,8 @@ def process_row(uid): # run tests for itest, test in enumerate(testNames): - result = run(test, [profile]) - query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(int(result[0][0])) + " WHERE uid = " + str(profile.uid()) + ";" + query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) # connect to database & fetch list of all uids diff --git a/build-db.py b/build-db.py index fcceaec..814d711 100644 --- a/build-db.py +++ b/build-db.py @@ -21,16 +21,18 @@ # set up our table query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( raw text, - truth integer, + truth boolean, uid integer, year integer, month integer, + day integer, + time real, lat real, long real, cruise integer, """ for i in range(len(testNames)): - query += testNames[i].lower() + ' integer' + query += testNames[i].lower() + ' boolean' if i= 3) >= 1) + wodDict['truth'] = sum(profile.t_level_qc(originator=True) >= 3) >= 1 except: if profile.is_last_profile_in_file(fid) == True: break continue - query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, year, month, lat, long, cruise) " + """ VALUES( + query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, year, month, day, time, lat, long, cruise) " + """ VALUES( {p[raw]}, {p[truth]}, {p[uid]}, {p[year]}, {p[month]}, + {p[day]}, + {p[time]}, {p[latitude]}, {p[longitude]}, {p[cruise]} diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index 52342ee..827b03c 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -4,124 +4,117 @@ """ import numpy as np -import data.ds as ds import util.main as main import util.geo as geo -import copy -import datetime -import math +import copy, datetime, math, psycopg2 +import sys # module constants DistRes = 20000. # meters TimeRes = 600. # seconds -EN_track_headers = {} -EN_track_results = {} -threadFile = {} - def test(p): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has passed the check and True where it failed. """ - - global EN_track_headers - global EN_track_results - global threadFile - + + conn = psycopg2.connect("dbname='root' user='root'") + cur = conn.cursor() + cruise = p.cruise() uid = p.uid() - + # don't bother if cruise == 0 or None if cruise in [0, None]: - return np.zeros(1, dtype=bool); - - # The headers from an entire cruise must be analyzed all at once; - # we'll write the results to the global data store, in a dictionary - # with ntuple keys (cruise, uid), and values as single element - # numpy arrays, containing either a true or a false (per all the other - # qc return objects) - - # check if this profile has been examined already - if (cruise, uid) in EN_track_results.keys(): - return EN_track_results[(cruise, uid)] + return np.zeros(1, dtype=bool) + + # don't bother if this has already been analyzed + cur.execute('SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';') + en_track_result = cur.fetchall() + if en_track_result[0][0] is not None: + result = np.zeros(1, dtype=bool) + result[0] = en_track_result[0][0] + return result # some detector types cannot be assessed by this test; do not raise flag. if p.probe_type in [None]: return np.zeros(1, dtype=bool) - - # the first time this test is run, sort ds.threadProfiles into a cruise-keyed dictionary: - if ds.threadFile != threadFile: - EN_track_headers = main.sort_headers(ds.threadProfiles) - threadFile = ds.threadFile - - # since we didn't find an answer already calculated, - # we still need to do the calculation for this cruise; - # all the relevant headers are sitting in the EN_track_headers list. - headers = EN_track_headers[cruise] - + + # fetch all profiles on track, sorted chronologically, earliest first (None sorted as highest) + cur.execute('SELECT raw, cruise, uid, year, month, day, time, lat, long FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + 'ORDER BY year, month, day, time ASC;') + track_rows = cur.fetchall() + track_rows = main.dictify(track_rows, ('raw', 'cruise', 'uid', 'year', 'month', 'day', 'time', 'lat', 'long')) + # start all as passing by default: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())] = np.zeros(1, dtype=bool) - + EN_track_results = {} + for i in range(len(track_rows)): + EN_track_results[track_rows[i]['uid']] = np.zeros(1, dtype=bool) + # copy the list of headers; # remove entries as they are flagged. - passedHeaders = copy.deepcopy(headers) - rejects = findOutlier(passedHeaders) + passed_rows = copy.deepcopy(track_rows) + rejects = findOutlier(passed_rows, EN_track_results) + while rejects != []: - passedIndex = [x for x in range(len(passedHeaders)) if x not in rejects ] - passedHeaders = [passedHeaders[index] for index in passedIndex ] - rejects = findOutlier(passedHeaders) - + passed_index = [x for x in range(len(passed_rows)) if x not in rejects ] + passed_rows = [passed_rows[index] for index in passed_index ] + rejects = findOutlier(passed_rows, EN_track_results) + # if more than half got rejected, reject everyone - if len(passedHeaders) < len(headers) / 2: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())][0] = True + if len(passed_rows) < len(track_rows) / 2: + for i in range(len(track_rows)): + EN_track_results[track_rows[i]['uid']][0] = True + + # write all to db + for i in range(len(track_rows)): + query = "UPDATE " + sys.argv[1] + " SET en_track_check " + " = " + str(EN_track_results[track_rows[i]['uid']][0]) + " WHERE uid = " + str(track_rows[i]['uid']) + ";" + cur.execute(query) + conn.commit() - return EN_track_results[(cruise, uid)] + return EN_track_results[uid] -def findOutlier(headers): +def findOutlier(rows, results): ''' - given a list of , find the fastest one; + given a list of dictified db rows, find the fastest one; if it's too fast, reject it or the one before it, return a list of rejected indices; once the fastest is within limits, return []. ''' - + maxShipSpeed = 15. # m/s maxBuoySpeed = 2. # m/s - if headers == []: + if rows == []: return [] # determine speeds and angles for list of headers - speeds, angles = calculateTraj(headers) + speeds, angles = calculateTraj(rows) # decide if something needs to be flagged maxSpeed = maxShipSpeed - if isBuoy(headers[0]): + if isBuoy(rows[0]): maxSpeed = maxBuoySpeed iMax = speeds.index(max(speeds)) flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) - + # decide which profile to reject, flag it, and return a list of indices rejected at this step. if flag: - rejects = chooseReject(headers, speeds, angles, iMax, maxSpeed) - + rejects = chooseReject(rows, speeds, angles, iMax, maxSpeed) for reject in rejects: - EN_track_results[(headers[reject].cruise(), headers[reject].uid())][0] = True + results[rows[reject]['uid']][0] = True return rejects else: return [] -def chooseReject(headers, speeds, angles, index, maxSpeed): +def chooseReject(rows, speeds, angles, index, maxSpeed): ''' - decide which profile to reject, headers[index] or headers[index-1], or both, + decide which profile to reject, rows[index] or rows[index-1], or both, and return a list of indices to reject. ''' # chain of tests breaks when a reject is found: - reject = condition_a(headers, speeds, angles, index, maxSpeed)[0] + reject = condition_a(rows, speeds, angles, index, maxSpeed)[0] # condition i needs to run at the end of the chain in all cases: # if no decision, reject both: @@ -129,10 +122,10 @@ def chooseReject(headers, speeds, angles, index, maxSpeed): reject = [index-1, index] # if excessive speed is created by removing the flag, reject both instead # can't create new excessive speed by removing last profile. - elif reject < len(headers)-1: - newHeaders = copy.deepcopy(headers) - del newHeaders[reject] - newSpeeds, newAngles = calculateTraj(newHeaders) + elif reject < len(rows)-1: + new_rows = copy.deepcopy(rows) + del new_rows[reject] + newSpeeds, newAngles = calculateTraj(new_rows) flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) if flag: reject = [index-1, index] @@ -143,33 +136,35 @@ def chooseReject(headers, speeds, angles, index, maxSpeed): return reject -def calculateTraj(headers): +def calculateTraj(rows): ''' return a list of speeds and a list of angles describing the trajectory of the track described - by the time-ordered list of . + by the time-ordered list of dictified rows. ''' - + speeds = [None] angles = [None] # Find speed and angle for all profiles remaining in the list - for i in range(1, len(headers)): + for i in range(1, len(rows)): speeds.append(None) angles.append(None) - - speeds[i] = trackSpeed(headers[i-1], headers[i]) - if i < len(headers)-1: # can't do angle on last point - angles[i] = abs(math.pi - geo.haversineAngle(headers[i-1], headers[i], headers[i+1])) - + speeds[i] = trackSpeed(rows[i-1], rows[i]) + + if i < len(rows)-1: # can't do angle on last point + angles[i] = abs(math.pi - geo.haversineAngle(main.text2wod(rows[i-1]['raw']), main.text2wod(rows[i]['raw']), main.text2wod(rows[i+1]['raw']))) + return speeds, angles -def isBuoy(header): +def isBuoy(row): ''' - decide if header belongs to a buoy-based measurement + decide if row belongs to a buoy-based measurement ''' - return header.probe_type in [4,7,9,10,11,12,13,15] + profile = main.text2wod(row['raw']) + + return profile.probe_type() in [4,7,9,10,11,12,13,15] def detectExcessiveSpeed(speeds, angles, index, maxSpeed): ''' @@ -183,7 +178,7 @@ def detectExcessiveSpeed(speeds, angles, index, maxSpeed): return flag -def meanSpeed(speeds, headers, maxSpeed): +def meanSpeed(speeds, rows, maxSpeed): ''' determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) ''' @@ -194,7 +189,7 @@ def meanSpeed(speeds, headers, maxSpeed): if speed == None or iSpeed == 0: #missing values continue - elif iSpeed > 0 and geo.deltaTime(headers[iSpeed-1], headers[iSpeed]) < 3600.: + elif iSpeed > 0 and geo.deltaTime(main.text2wod(rows[iSpeed-1]['raw']), main.text2wod(rows[iSpeed]['raw'])) < 3600.: #too close together in time continue elif speed > maxSpeed: @@ -210,77 +205,78 @@ def meanSpeed(speeds, headers, maxSpeed): return meanSpeed -def trackSpeed(prevHeader, header): +def trackSpeed(prev_row, row): ''' computes the speed, including rounding tolerance from the reference, - for the track at
. + for the track at . return None if some necessary data is missing ''' # check that all required data is present: - if None in [header.latitude(), header.longitude(), prevHeader.latitude(), prevHeader.longitude()]: + if None in [row['lat'], row['long'], prev_row['lat'], prev_row['long']]: return None - if None in [header.year(), header.month(), header.day(), header.time(), prevHeader.year(), prevHeader.month(), prevHeader.day(), prevHeader.time()]: + if None in [row['year'], row['month'], row['day'], row['time'], prev_row['year'], prev_row['month'], prev_row['day'], prev_row['time']]: return None - dist = geo.haversineDistance(prevHeader, header) - DTime = geo.deltaTime(prevHeader, header) + dist = geo.haversineDistance(main.text2wod(prev_row['raw']), main.text2wod(row['raw'])) + DTime = geo.deltaTime(main.text2wod(prev_row['raw']), main.text2wod(row['raw'])) speed = (dist - DistRes) / max(DTime, TimeRes) return speed -def condition_a(headers, speeds, angles, index, maxSpeed): +def condition_a(rows, speeds, angles, index, maxSpeed): ''' assess condition (a) from the text ''' - if index == 1 and len(headers) == 2: + if index == 1 and len(rows) == 2: return 0, 'a' - elif index == 1 and len(headers) > 2: # note 'M' in the text seems to count from 1, not 0. - impliedSpeed = trackSpeed(headers[0], headers[2]) + elif index == 1 and len(rows) > 2: # note 'M' in the text seems to count from 1, not 0. + impliedSpeed = trackSpeed(rows[0], rows[2]) if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): return 1, 'a' else: return 0, 'a' - elif index == len(headers)-1 and len(headers)>3: # why not >=? seems to cause problems, investigate. - impliedSpeed = trackSpeed(headers[-3], headers[-1]) + elif index == len(rows)-1 and len(rows)>3: # why not >=? seems to cause problems, investigate. + impliedSpeed = trackSpeed(rows[-3], rows[-1]) if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): return index-1, 'a' else: return index, 'a' else: - return condition_b(headers, speeds, angles, index, maxSpeed) + return condition_b(rows, speeds, angles, index, maxSpeed) -def condition_b(headers, speeds, angles, index, maxSpeed): +def condition_b(rows, speeds, angles, index, maxSpeed): ''' assess condition (b) from the text ''' + if speeds[index-1] > maxSpeed: return index-1, 'b' elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: return index, 'b' - return condition_c(headers, speeds, angles, index, maxSpeed) + return condition_c(rows, speeds, angles, index, maxSpeed) -def condition_c(headers, speeds, angles, index, maxSpeed): +def condition_c(rows, speeds, angles, index, maxSpeed): ''' assess condition (c) from the text ''' - if index < len(headers)-1 and index > 0: - impliedSpeed = trackSpeed(headers[index-1], headers[index+1]) + if index < len(rows)-1 and index > 0: + impliedSpeed = trackSpeed(rows[index-1], rows[index+1]) if impliedSpeed > maxSpeed: return index-1, 'c' if index > 1: - impliedSpeed = trackSpeed(headers[index-2], headers[index]) + impliedSpeed = trackSpeed(rows[index-2], rows[index]) if impliedSpeed > maxSpeed: return index, 'c' - return condition_d(headers, speeds, angles, index, maxSpeed) + return condition_d(rows, speeds, angles, index, maxSpeed) -def condition_d(headers, speeds, angles, index, maxSpeed): +def condition_d(rows, speeds, angles, index, maxSpeed): ''' assess condition (d) from the text ''' @@ -291,14 +287,14 @@ def condition_d(headers, speeds, angles, index, maxSpeed): if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: return index, 'd' - return condition_e(headers, speeds, angles, index, maxSpeed) + return condition_e(rows, speeds, angles, index, maxSpeed) -def condition_e(headers, speeds, angles, index, maxSpeed): +def condition_e(rows, speeds, angles, index, maxSpeed): ''' assess condition (e) from the text ''' - if len(headers) > max(2, index+1): + if len(rows) > max(2, index+1): if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: return index-1, 'e' @@ -306,16 +302,16 @@ def condition_e(headers, speeds, angles, index, maxSpeed): if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: return index, 'e' - return condition_f(headers, speeds, angles, index, maxSpeed) + return condition_f(rows, speeds, angles, index, maxSpeed) -def condition_f(headers, speeds, angles, index, maxSpeed): +def condition_f(rows, speeds, angles, index, maxSpeed): ''' assess condition (f) from the text ''' if index>0 and index < len(speeds)-1: - ms = meanSpeed(speeds, headers, maxSpeed) + ms = meanSpeed(speeds, rows, maxSpeed) if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): return index-1, 'f' @@ -323,21 +319,21 @@ def condition_f(headers, speeds, angles, index, maxSpeed): if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): return index, 'f' - return condition_g(headers, speeds, angles, index, maxSpeed) + return condition_g(rows, speeds, angles, index, maxSpeed) -def condition_g(headers, speeds, angles, index, maxSpeed): +def condition_g(rows, speeds, angles, index, maxSpeed): ''' assess condition (g) from the text ''' - if index > 1 and index < len(headers) - 1: + if index > 1 and index < len(rows) - 1: - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + dist1 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index]['raw'])) + dist2 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index-1]['raw'])) - distTol = geo.haversineDistance(headers[index-1], headers[index-2]) - distTol += geo.haversineDistance(headers[index], headers[index-1]) - distTol += geo.haversineDistance(headers[index+1], headers[index]) + distTol = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) + distTol += geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-1]['raw'])) + distTol += geo.haversineDistance(main.text2wod(rows[index+1]['raw']), main.text2wod(rows[index]['raw'])) distTol = max(DistRes, 0.1*distTol) if dist1 < dist2 - distTol: @@ -346,24 +342,23 @@ def condition_g(headers, speeds, angles, index, maxSpeed): if dist2 < dist1 - distTol: return index, 'g' - return condition_h(headers, speeds, angles, index, maxSpeed) + return condition_h(rows, speeds, angles, index, maxSpeed) -def condition_h(headers, speeds, angles, index, maxSpeed): +def condition_h(rows, speeds, angles, index, maxSpeed): ''' assess condition (h) from the text - typeo in text, implementation incomplete ''' - if index > 1 and index < len(headers) - 1: + if index > 1 and index < len(rows) - 1: - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + dist1 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index]['raw'])) + dist2 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index-1]['raw'])) - PD1 = geo.haversineDistance(headers[index-1], headers[index-2]) / dist2 - PD2 = geo.haversineDistance(headers[index], headers[index-2]) / dist1 + PD1 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) / dist2 + PD2 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) / dist1 - PT1 = geo.deltaTime(headers[index-2], headers[index-1]) / geo.deltaTime(headers[index-2], headers[index+1]) - PT2 = geo.deltaTime(headers[index-2], headers[index]) / geo.deltaTime(headers[index-2], headers[index+1]) + PT1 = geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index-1]['raw'])) / geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index+1]['raw'])) + PT2 = geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index]['raw'])) / geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index+1]['raw'])) if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): return index-1, 'h' @@ -371,22 +366,3 @@ def condition_h(headers, speeds, angles, index, maxSpeed): return index, 'h' return -1, 'i' - -def checkOrder(profiles): - ''' - check that a list of profiles is properly time ordered - ''' - - dates = [] - for pro in profiles: - if pro.time() is not None: - hour, minute, second = geo.parseTime(pro.time()) - else: - hour = 0 - minute = 0 - second = 0 - date = datetime.datetime(year=pro.year(), month=pro.month(), day=pro.day(), hour=hour, minute=minute, second=second ) - dates.append(date) - - for i in range(len(dates)-1): - assert dates[i] <= dates [i+1], 'dates out of order %s %s' % (dates[i], dates[i+1]) diff --git a/summarize-results.py b/summarize-results.py index ae726ab..a01f2d6 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -7,7 +7,6 @@ # what tests are available testNames = main.importQC('qctests') testNames.sort() - testNames.remove('EN_track_check') # connect to database conn = psycopg2.connect("dbname='root' user='root'") diff --git a/util/geo.py b/util/geo.py index f17b315..8ad3be6 100644 --- a/util/geo.py +++ b/util/geo.py @@ -50,7 +50,7 @@ def haversineAngle(pro1, pro2, pro3): with that passing through pro2 and pro3 (all the pro* are WOD profiles or headers) return None if any required information is missing. ''' - + if None in [pro1.latitude(), pro1.longitude()]: return None if None in [pro2.latitude(), pro2.longitude()]: diff --git a/util/main.py b/util/main.py index 5102f4c..3ebd8dd 100644 --- a/util/main.py +++ b/util/main.py @@ -128,13 +128,40 @@ def calcRates(testResults, trueResults): return tpr, fpr, fnr, tnr def get_profile_from_db(cur, uid): - # Given the database cursor and a unique id, return a WodPy profile object. + ''' + Given the database cursor and a unique id, return a WodPy profile object. + ''' + cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) row = cur.fetchall() + return text2wod(row[0][0]) + +def text2wod(raw): + ''' + given the raw text of a wod ascii profile, return a wodpy object representing the same. + ''' + fProfile = tempfile.TemporaryFile() - fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row + fProfile.write(raw) # a file-like object containing only the profile from the queried row fProfile.seek(0) profile = wod.WodProfile(fProfile) fProfile.close() + return profile +def dictify(rows, keys): + ''' + given a list of rows from the db, return a list of dicts in the same order + representing the same information keyed by the key names found in the tuple + ''' + + dicts = [] + + for i in range(len(rows)): + d = {} + for j in range(len(keys)): + d[keys[j]] = rows[i][j] + + dicts.append(d) + + return dicts From 65c43755f51af01eec07da9326c123590dab8d20 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Wed, 3 Aug 2016 23:51:22 +0000 Subject: [PATCH 25/79] all tests running quickly under new database scheme --- AutoQC.py | 4 +- qctests/EN_track_check.py | 20 +- .../ICDC_aqc_09_local_climatology_check.py | 200 ++++++++++-------- ...t_sea.py => Misc_loose_location_at_sea.py} | 0 4 files changed, 120 insertions(+), 104 deletions(-) rename qctests/{loose_location_at_sea.py => Misc_loose_location_at_sea.py} (100%) diff --git a/AutoQC.py b/AutoQC.py index 22830f5..5bbd7c0 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -79,5 +79,5 @@ def process_row(uid): else: print 'Please add command line arguments to name your output file and set parallelization:' - print 'python AutoQC databasetable 4' - print 'will result in output written to table in the database, and will run the calculation parallelized across 4 cores.' + print 'python AutoQC ' + print 'will write qc results to in the database, and run the calculation parallelized across cores.' diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index 827b03c..d28ee89 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -31,12 +31,12 @@ def test(p): return np.zeros(1, dtype=bool) # don't bother if this has already been analyzed - cur.execute('SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';') - en_track_result = cur.fetchall() - if en_track_result[0][0] is not None: - result = np.zeros(1, dtype=bool) - result[0] = en_track_result[0][0] - return result + # cur.execute('SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';') + # en_track_result = cur.fetchall() + # if en_track_result[0][0] is not None: + # result = np.zeros(1, dtype=bool) + # result[0] = en_track_result[0][0] + # return result # some detector types cannot be assessed by this test; do not raise flag. if p.probe_type in [None]: @@ -68,10 +68,10 @@ def test(p): EN_track_results[track_rows[i]['uid']][0] = True # write all to db - for i in range(len(track_rows)): - query = "UPDATE " + sys.argv[1] + " SET en_track_check " + " = " + str(EN_track_results[track_rows[i]['uid']][0]) + " WHERE uid = " + str(track_rows[i]['uid']) + ";" - cur.execute(query) - conn.commit() + # for i in range(len(track_rows)): + # query = "UPDATE " + sys.argv[1] + " SET en_track_check " + " = " + str(EN_track_results[track_rows[i]['uid']][0]) + " WHERE uid = " + str(track_rows[i]['uid']) + ";" + # cur.execute(query) + # conn.commit() return EN_track_results[uid] diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py index b53224c..5308036 100644 --- a/qctests/ICDC_aqc_09_local_climatology_check.py +++ b/qctests/ICDC_aqc_09_local_climatology_check.py @@ -69,6 +69,20 @@ def get_climatology_range(nlevels, z, lat, lon, month): tmin[:] = fillValue tmax[:] = fillValue + # parameters + nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') + tmedA = nc.variables['tmedA'][:, :, :] + tamdA = nc.variables['tamdA'][:, :, :] + tmedM = nc.variables['tmedM'][:, :, :, :] + tamdM = nc.variables['tamdM'][:, :, :, :] + zedqc = nc.variables['zedqc'][:] + fillValue = nc.fillValue + nc.close() + + # Global ranges - data outside these bounds are assumed not valid. + parminover = -2.3 + parmaxover = 33.0 + # Calculate grid indices. iy = int(np.floor((90.0 - lat) / 0.5)) ix = int(np.floor((lon + 180.0) / 0.5)) @@ -119,102 +133,104 @@ def get_climatology_range(nlevels, z, lat, lon, month): return tmin, tmax -def read_ascii_and_convert_to_netcdf(): - '''Coverts the ASCII data file to netCDF on first read. - This is much faster to access. - ''' - global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue - - # Load the data. - tmedM = np.ndarray([721, 361, 16, 12]) - tamdM = np.ndarray([721, 361, 16, 12]) - tmedA = np.ndarray([721, 361, 60]) - tamdA = np.ndarray([721, 361, 60]) - zedqc = np.ndarray(60) - # Do not use masked arrays to save on memory use. - fillValue = -9.0 # Has to be a negative number. - tmedM[:, :, :, :] = fillValue - tamdM[:, :, :, :] = fillValue - tmedA[:, :, :] = fillValue - tamdA[:, :, :] = fillValue - with open('data/climatological_t_median_and_amd_for_aqc.dat') as f: - for line in f: - vals = line.split() - m = int(vals[0]) - 1 - j = int(vals[1]) - 1 - i = int(vals[3]) - 1 - k = int(vals[5]) - 1 - z = float(vals[6]) - tmedian = float(vals[7]) - absmeddev = float(vals[8]) - - if m < 12 and k < 16: - tmedM[i, j, k, m] = tmedian - tamdM[i, j, k, m] = absmeddev - elif m == 12: - tmedA[i, j, k] = tmedian - tamdA[i, j, k] = absmeddev - zedqc[k] = z - - # Create the netCDF version. - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'w') - idim = nc.createDimension('i', 721) - jdim = nc.createDimension('j', 361) - kmdim = nc.createDimension('km', 16) - kadim = nc.createDimension('ka', 60) - mdim = nc.createDimension('m', 12) - - sf = 0.0001 - tmedav = nc.createVariable('tmedA', 'i4', ('i', 'j', 'ka'), zlib=True) - tmedav.add_offset = 0.0 - tmedav.scale_factor = sf - tmedav[:, :, :] = tmedA - - tamdav = nc.createVariable('tamdA', 'i4', ('i', 'j', 'ka'), zlib=True) - tamdav.add_offset = 0.0 - tamdav.scale_factor = sf - tamdav[:, :, :] = tamdA - - tmedmv = nc.createVariable('tmedM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) - tmedmv.add_offset = 0.0 - tmedmv.scale_factor = sf - tmedmv[:, :, :, :] = tmedM - - tamdmv = nc.createVariable('tamdM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) - tamdmv.add_offset = 0.0 - tamdmv.scale_factor = sf - tamdmv[:, :, :, :] = tamdM - - zedqcv = nc.createVariable('zedqc', 'f4', ('ka',)) - zedqcv[:] = zedqc - - nc.fillValue = fillValue - nc.history = 'Created ' + time.ctime(time.time()) + ' from climatological_t_median_and_amd_for_aqc.dat provided by Viktor Gouretski, Integrated Climate Data Center, University of Hamburg, Hamburg, Germany, February 2016' - nc.close() - -def read_netcdf(): - '''Read climatological data from netCDF. - ''' - global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue - - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') - tmedA = nc.variables['tmedA'][:, :, :] - tamdA = nc.variables['tamdA'][:, :, :] - tmedM = nc.variables['tmedM'][:, :, :, :] - tamdM = nc.variables['tamdM'][:, :, :, :] - zedqc = nc.variables['zedqc'][:] - fillValue = nc.fillValue - nc.close() +# def read_ascii_and_convert_to_netcdf(): +# '''Coverts the ASCII data file to netCDF on first read. +# This is much faster to access. +# ''' +# global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue + +# # Load the data. +# tmedM = np.ndarray([721, 361, 16, 12]) +# tamdM = np.ndarray([721, 361, 16, 12]) +# tmedA = np.ndarray([721, 361, 60]) +# tamdA = np.ndarray([721, 361, 60]) +# zedqc = np.ndarray(60) +# # Do not use masked arrays to save on memory use. +# fillValue = -9.0 # Has to be a negative number. +# tmedM[:, :, :, :] = fillValue +# tamdM[:, :, :, :] = fillValue +# tmedA[:, :, :] = fillValue +# tamdA[:, :, :] = fillValue +# with open('data/climatological_t_median_and_amd_for_aqc.dat') as f: +# for line in f: +# vals = line.split() +# m = int(vals[0]) - 1 +# j = int(vals[1]) - 1 +# i = int(vals[3]) - 1 +# k = int(vals[5]) - 1 +# z = float(vals[6]) +# tmedian = float(vals[7]) +# absmeddev = float(vals[8]) + +# if m < 12 and k < 16: +# tmedM[i, j, k, m] = tmedian +# tamdM[i, j, k, m] = absmeddev +# elif m == 12: +# tmedA[i, j, k] = tmedian +# tamdA[i, j, k] = absmeddev +# zedqc[k] = z + +# # Create the netCDF version. +# nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'w') +# idim = nc.createDimension('i', 721) +# jdim = nc.createDimension('j', 361) +# kmdim = nc.createDimension('km', 16) +# kadim = nc.createDimension('ka', 60) +# mdim = nc.createDimension('m', 12) + +# sf = 0.0001 +# tmedav = nc.createVariable('tmedA', 'i4', ('i', 'j', 'ka'), zlib=True) +# tmedav.add_offset = 0.0 +# tmedav.scale_factor = sf +# tmedav[:, :, :] = tmedA + +# tamdav = nc.createVariable('tamdA', 'i4', ('i', 'j', 'ka'), zlib=True) +# tamdav.add_offset = 0.0 +# tamdav.scale_factor = sf +# tamdav[:, :, :] = tamdA + +# tmedmv = nc.createVariable('tmedM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) +# tmedmv.add_offset = 0.0 +# tmedmv.scale_factor = sf +# tmedmv[:, :, :, :] = tmedM + +# tamdmv = nc.createVariable('tamdM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) +# tamdmv.add_offset = 0.0 +# tamdmv.scale_factor = sf +# tamdmv[:, :, :, :] = tamdM + +# zedqcv = nc.createVariable('zedqc', 'f4', ('ka',)) +# zedqcv[:] = zedqc + +# nc.fillValue = fillValue +# nc.history = 'Created ' + time.ctime(time.time()) + ' from climatological_t_median_and_amd_for_aqc.dat provided by Viktor Gouretski, Integrated Climate Data Center, University of Hamburg, Hamburg, Germany, February 2016' +# nc.close() + +# def read_netcdf(): +# '''Read climatological data from netCDF. +# ''' +# global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue + +# nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') +# tmedA = nc.variables['tmedA'][:, :, :] +# tamdA = nc.variables['tamdA'][:, :, :] +# tmedM = nc.variables['tmedM'][:, :, :, :] +# tamdM = nc.variables['tamdM'][:, :, :, :] +# zedqc = nc.variables['zedqc'][:] +# fillValue = nc.fillValue +# nc.close() # Global ranges - data outside these bounds are assumed not valid. -parminover = -2.3 -parmaxover = 33.0 +#parminover = -2.3 +#parmaxover = 33.0 # Read data. -if os.path.isfile('data/climatological_t_median_and_amd_for_aqc.nc'): - read_netcdf() -else: - read_ascii_and_convert_to_netcdf() +# if os.path.isfile('data/climatological_t_median_and_amd_for_aqc.nc'): +# print 1 +# read_netcdf() +# print 11 +# else: +# read_ascii_and_convert_to_netcdf() diff --git a/qctests/loose_location_at_sea.py b/qctests/Misc_loose_location_at_sea.py similarity index 100% rename from qctests/loose_location_at_sea.py rename to qctests/Misc_loose_location_at_sea.py From b692082e27356c464bb487b7c72542c24c682174 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 4 Aug 2016 17:42:01 +0000 Subject: [PATCH 26/79] order of operations fix for ICDC-9 --- .../ICDC_aqc_09_local_climatology_check.py | 25 +++++++++++-------- ...c_09_local_climatology_check_validation.py | 5 +++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py index 5308036..daee6f1 100644 --- a/qctests/ICDC_aqc_09_local_climatology_check.py +++ b/qctests/ICDC_aqc_09_local_climatology_check.py @@ -50,34 +50,37 @@ def test(p): (lat >= 40.0 and lat <= 50.0 and lon >= -95.0 and lon <= -75.0)): return defaultqc + # parameters + nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') + # Get range. - ranges = get_climatology_range(nlevels, z, lat, lon, p.month()) + ranges = get_climatology_range(nlevels, z, lat, lon, p.month(), nc) if ranges is None: return defaultqc # Perform the QC. tmin, tmax = ranges - qc = ((t < tmin) | (t > tmax)) & (tmin != fillValue) & (tmax != fillValue) + qc = ((t < tmin) | (t > tmax)) & (tmin != nc.fillValue) & (tmax != nc.fillValue) + + nc.close() return ICDC.revert_qc_order(p, qc) -def get_climatology_range(nlevels, z, lat, lon, month): - - # Define arrays for the results. - tmin = np.ndarray(nlevels) - tmax = np.ndarray(nlevels) - tmin[:] = fillValue - tmax[:] = fillValue +def get_climatology_range(nlevels, z, lat, lon, month, nc): # parameters - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') tmedA = nc.variables['tmedA'][:, :, :] tamdA = nc.variables['tamdA'][:, :, :] tmedM = nc.variables['tmedM'][:, :, :, :] tamdM = nc.variables['tamdM'][:, :, :, :] zedqc = nc.variables['zedqc'][:] fillValue = nc.fillValue - nc.close() + + # Define arrays for the results. + tmin = np.ndarray(nlevels) + tmax = np.ndarray(nlevels) + tmin[:] = fillValue + tmax[:] = fillValue # Global ranges - data outside these bounds are assumed not valid. parminover = -2.3 diff --git a/tests/ICDC_aqc_09_local_climatology_check_validation.py b/tests/ICDC_aqc_09_local_climatology_check_validation.py index 5f15946..a488a3e 100644 --- a/tests/ICDC_aqc_09_local_climatology_check_validation.py +++ b/tests/ICDC_aqc_09_local_climatology_check_validation.py @@ -3,6 +3,7 @@ import util.testingProfile import numpy as np +from netCDF4 import Dataset ##### ICDC local climatology check. ##### -------------------------------------------------- @@ -13,6 +14,7 @@ def test_ICDC_local_climatology_check(): ''' lines = data.splitlines() + nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') for i, line in enumerate(lines): if line[0:2] == 'HH': header = line.split() @@ -49,7 +51,8 @@ def test_ICDC_local_climatology_check(): z, lat, lon, - p.month()) + p.month(), + nc) assert np.max(np.abs(tmin - climmin)) < 0.001, 'TMIN failed for profile with header ' + line assert np.max(np.abs(tmax - climmax)) < 0.001, 'TMAX failed for profile with header ' + line From da9967f9ccbbef242a77aa46e03d5493ddcc67cb Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 4 Aug 2016 19:00:54 +0000 Subject: [PATCH 27/79] remove redundant unpacking from en_track --- AutoQC.py | 1 + qctests/EN_track_check.py | 187 +++++++++++++++++++------------------- 2 files changed, 93 insertions(+), 95 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 5bbd7c0..0c0b937 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -57,6 +57,7 @@ def process_row(uid): return # run tests + print uid for itest, test in enumerate(testNames): result = run(test, [profile]) query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index d28ee89..7900415 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -29,7 +29,7 @@ def test(p): # don't bother if cruise == 0 or None if cruise in [0, None]: return np.zeros(1, dtype=bool) - + # don't bother if this has already been analyzed # cur.execute('SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';') # en_track_result = cur.fetchall() @@ -41,31 +41,31 @@ def test(p): # some detector types cannot be assessed by this test; do not raise flag. if p.probe_type in [None]: return np.zeros(1, dtype=bool) - + # fetch all profiles on track, sorted chronologically, earliest first (None sorted as highest) - cur.execute('SELECT raw, cruise, uid, year, month, day, time, lat, long FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + 'ORDER BY year, month, day, time ASC;') + cur.execute('SELECT raw FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + 'ORDER BY year, month, day, time ASC;') track_rows = cur.fetchall() - track_rows = main.dictify(track_rows, ('raw', 'cruise', 'uid', 'year', 'month', 'day', 'time', 'lat', 'long')) - + track_profiles = [main.text2wod(raw[0]) for raw in track_rows] + # start all as passing by default: EN_track_results = {} - for i in range(len(track_rows)): - EN_track_results[track_rows[i]['uid']] = np.zeros(1, dtype=bool) - + for i in range(len(track_profiles)): + EN_track_results[track_profiles[i].uid()] = np.zeros(1, dtype=bool) + # copy the list of headers; # remove entries as they are flagged. - passed_rows = copy.deepcopy(track_rows) - rejects = findOutlier(passed_rows, EN_track_results) - - while rejects != []: - passed_index = [x for x in range(len(passed_rows)) if x not in rejects ] - passed_rows = [passed_rows[index] for index in passed_index ] - rejects = findOutlier(passed_rows, EN_track_results) + passed_profiles = copy.deepcopy(track_profiles) + rejects = findOutlier(passed_profiles, EN_track_results) + while rejects != []: + passed_index = [x for x in range(len(passed_profiles)) if x not in rejects ] + passed_profiles = [passed_profiles[index] for index in passed_index ] + rejects = findOutlier(passed_profiles, EN_track_results) + # if more than half got rejected, reject everyone - if len(passed_rows) < len(track_rows) / 2: - for i in range(len(track_rows)): - EN_track_results[track_rows[i]['uid']][0] = True + if len(passed_profiles) < len(track_rows) / 2: + for i in range(len(track_profiles)): + EN_track_results[track_profiles[i].uid()][0] = True # write all to db # for i in range(len(track_rows)): @@ -75,46 +75,46 @@ def test(p): return EN_track_results[uid] -def findOutlier(rows, results): +def findOutlier(profiles, results): ''' - given a list of dictified db rows, find the fastest one; + given a list of profiles, find the fastest one; if it's too fast, reject it or the one before it, return a list of rejected indices; once the fastest is within limits, return []. ''' - + maxShipSpeed = 15. # m/s maxBuoySpeed = 2. # m/s - if rows == []: + if profiles == []: return [] # determine speeds and angles for list of headers - speeds, angles = calculateTraj(rows) - + speeds, angles = calculateTraj(profiles) + # decide if something needs to be flagged maxSpeed = maxShipSpeed - if isBuoy(rows[0]): + if isBuoy(profiles[0]): maxSpeed = maxBuoySpeed iMax = speeds.index(max(speeds)) flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) - + # decide which profile to reject, flag it, and return a list of indices rejected at this step. if flag: - rejects = chooseReject(rows, speeds, angles, iMax, maxSpeed) + rejects = chooseReject(profiles, speeds, angles, iMax, maxSpeed) for reject in rejects: - results[rows[reject]['uid']][0] = True + results[profiles[reject].uid()][0] = True return rejects else: return [] -def chooseReject(rows, speeds, angles, index, maxSpeed): +def chooseReject(profiles, speeds, angles, index, maxSpeed): ''' - decide which profile to reject, rows[index] or rows[index-1], or both, + decide which profile to reject, profiles[index] or profiles[index-1], or both, and return a list of indices to reject. ''' # chain of tests breaks when a reject is found: - reject = condition_a(rows, speeds, angles, index, maxSpeed)[0] + reject = condition_a(profiles, speeds, angles, index, maxSpeed)[0] # condition i needs to run at the end of the chain in all cases: # if no decision, reject both: @@ -122,10 +122,10 @@ def chooseReject(rows, speeds, angles, index, maxSpeed): reject = [index-1, index] # if excessive speed is created by removing the flag, reject both instead # can't create new excessive speed by removing last profile. - elif reject < len(rows)-1: - new_rows = copy.deepcopy(rows) - del new_rows[reject] - newSpeeds, newAngles = calculateTraj(new_rows) + elif reject < len(profiles)-1: + new_profiles = copy.deepcopy(profiles) + del new_profiles[reject] + newSpeeds, newAngles = calculateTraj(new_profiles) flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) if flag: reject = [index-1, index] @@ -136,34 +136,31 @@ def chooseReject(rows, speeds, angles, index, maxSpeed): return reject -def calculateTraj(rows): +def calculateTraj(profiles): ''' return a list of speeds and a list of angles describing the trajectory of the track described - by the time-ordered list of dictified rows. + by the time-ordered list of profiles. ''' - + speeds = [None] angles = [None] # Find speed and angle for all profiles remaining in the list - for i in range(1, len(rows)): + for i in range(1, len(profiles)): speeds.append(None) angles.append(None) - speeds[i] = trackSpeed(rows[i-1], rows[i]) - - if i < len(rows)-1: # can't do angle on last point - angles[i] = abs(math.pi - geo.haversineAngle(main.text2wod(rows[i-1]['raw']), main.text2wod(rows[i]['raw']), main.text2wod(rows[i+1]['raw']))) - + speeds[i] = trackSpeed(profiles[i-1], profiles[i]) + + if i < len(profiles)-1: # can't do angle on last point + angles[i] = abs(math.pi - geo.haversineAngle(profiles[i-1], profiles[i], profiles[i+1])) + return speeds, angles -def isBuoy(row): +def isBuoy(profile): ''' - decide if row belongs to a buoy-based measurement + decide if profile belongs to a buoy-based measurement ''' - - profile = main.text2wod(row['raw']) - return profile.probe_type() in [4,7,9,10,11,12,13,15] def detectExcessiveSpeed(speeds, angles, index, maxSpeed): @@ -178,7 +175,7 @@ def detectExcessiveSpeed(speeds, angles, index, maxSpeed): return flag -def meanSpeed(speeds, rows, maxSpeed): +def meanSpeed(speeds, profiles, maxSpeed): ''' determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) ''' @@ -189,7 +186,7 @@ def meanSpeed(speeds, rows, maxSpeed): if speed == None or iSpeed == 0: #missing values continue - elif iSpeed > 0 and geo.deltaTime(main.text2wod(rows[iSpeed-1]['raw']), main.text2wod(rows[iSpeed]['raw'])) < 3600.: + elif iSpeed > 0 and geo.deltaTime(profiles[iSpeed-1], profiles[iSpeed]) < 3600.: #too close together in time continue elif speed > maxSpeed: @@ -205,48 +202,48 @@ def meanSpeed(speeds, rows, maxSpeed): return meanSpeed -def trackSpeed(prev_row, row): +def trackSpeed(prev_profile, profile): ''' computes the speed, including rounding tolerance from the reference, - for the track at . + for the track at . return None if some necessary data is missing ''' # check that all required data is present: - if None in [row['lat'], row['long'], prev_row['lat'], prev_row['long']]: + if None in [profile.latitude(), profile.longitude(), prev_profile.latitude(), prev_profile.longitude()]: return None - if None in [row['year'], row['month'], row['day'], row['time'], prev_row['year'], prev_row['month'], prev_row['day'], prev_row['time']]: + if None in [profile.year(), profile.month(), profile.day(), profile.time(), prev_profile.year(), prev_profile.month(), prev_profile.day(), prev_profile.time()]: return None - dist = geo.haversineDistance(main.text2wod(prev_row['raw']), main.text2wod(row['raw'])) - DTime = geo.deltaTime(main.text2wod(prev_row['raw']), main.text2wod(row['raw'])) + dist = geo.haversineDistance(prev_profile, profile) + DTime = geo.deltaTime(prev_profile, profile) speed = (dist - DistRes) / max(DTime, TimeRes) return speed -def condition_a(rows, speeds, angles, index, maxSpeed): +def condition_a(profiles, speeds, angles, index, maxSpeed): ''' assess condition (a) from the text ''' - if index == 1 and len(rows) == 2: + if index == 1 and len(profiles) == 2: return 0, 'a' - elif index == 1 and len(rows) > 2: # note 'M' in the text seems to count from 1, not 0. - impliedSpeed = trackSpeed(rows[0], rows[2]) + elif index == 1 and len(profiles) > 2: # note 'M' in the text seems to count from 1, not 0. + impliedSpeed = trackSpeed(profiles[0], profiles[2]) if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): return 1, 'a' else: return 0, 'a' - elif index == len(rows)-1 and len(rows)>3: # why not >=? seems to cause problems, investigate. - impliedSpeed = trackSpeed(rows[-3], rows[-1]) + elif index == len(profiles)-1 and len(profiles)>3: # why not >=? seems to cause problems, investigate. + impliedSpeed = trackSpeed(profiles[-3], profiles[-1]) if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): return index-1, 'a' else: return index, 'a' else: - return condition_b(rows, speeds, angles, index, maxSpeed) + return condition_b(profiles, speeds, angles, index, maxSpeed) -def condition_b(rows, speeds, angles, index, maxSpeed): +def condition_b(profiles, speeds, angles, index, maxSpeed): ''' assess condition (b) from the text ''' @@ -256,27 +253,27 @@ def condition_b(rows, speeds, angles, index, maxSpeed): elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: return index, 'b' - return condition_c(rows, speeds, angles, index, maxSpeed) + return condition_c(profiles, speeds, angles, index, maxSpeed) -def condition_c(rows, speeds, angles, index, maxSpeed): +def condition_c(profiles, speeds, angles, index, maxSpeed): ''' assess condition (c) from the text ''' - if index < len(rows)-1 and index > 0: - impliedSpeed = trackSpeed(rows[index-1], rows[index+1]) + if index < len(profiles)-1 and index > 0: + impliedSpeed = trackSpeed(profiles[index-1], profiles[index+1]) if impliedSpeed > maxSpeed: return index-1, 'c' if index > 1: - impliedSpeed = trackSpeed(rows[index-2], rows[index]) + impliedSpeed = trackSpeed(profiles[index-2], profiles[index]) if impliedSpeed > maxSpeed: return index, 'c' - return condition_d(rows, speeds, angles, index, maxSpeed) + return condition_d(profiles, speeds, angles, index, maxSpeed) -def condition_d(rows, speeds, angles, index, maxSpeed): +def condition_d(profiles, speeds, angles, index, maxSpeed): ''' assess condition (d) from the text ''' @@ -287,14 +284,14 @@ def condition_d(rows, speeds, angles, index, maxSpeed): if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: return index, 'd' - return condition_e(rows, speeds, angles, index, maxSpeed) + return condition_e(profiles, speeds, angles, index, maxSpeed) -def condition_e(rows, speeds, angles, index, maxSpeed): +def condition_e(profiles, speeds, angles, index, maxSpeed): ''' assess condition (e) from the text ''' - if len(rows) > max(2, index+1): + if len(profiles) > max(2, index+1): if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: return index-1, 'e' @@ -302,16 +299,16 @@ def condition_e(rows, speeds, angles, index, maxSpeed): if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: return index, 'e' - return condition_f(rows, speeds, angles, index, maxSpeed) + return condition_f(profiles, speeds, angles, index, maxSpeed) -def condition_f(rows, speeds, angles, index, maxSpeed): +def condition_f(profiles, speeds, angles, index, maxSpeed): ''' assess condition (f) from the text ''' if index>0 and index < len(speeds)-1: - ms = meanSpeed(speeds, rows, maxSpeed) + ms = meanSpeed(speeds, profiles, maxSpeed) if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): return index-1, 'f' @@ -319,21 +316,21 @@ def condition_f(rows, speeds, angles, index, maxSpeed): if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): return index, 'f' - return condition_g(rows, speeds, angles, index, maxSpeed) + return condition_g(profiles, speeds, angles, index, maxSpeed) -def condition_g(rows, speeds, angles, index, maxSpeed): +def condition_g(profiles, speeds, angles, index, maxSpeed): ''' assess condition (g) from the text ''' - if index > 1 and index < len(rows) - 1: + if index > 1 and index < len(profiles) - 1: - dist1 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index]['raw'])) - dist2 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index-1]['raw'])) + dist1 = geo.haversineDistance(profiles[index], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index]) + dist2 = geo.haversineDistance(profiles[index-1], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index-1]) - distTol = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) - distTol += geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-1]['raw'])) - distTol += geo.haversineDistance(main.text2wod(rows[index+1]['raw']), main.text2wod(rows[index]['raw'])) + distTol = geo.haversineDistance(profiles[index-1], profiles[index-2]) + distTol += geo.haversineDistance(profiles[index], profiles[index-1]) + distTol += geo.haversineDistance(profiles[index+1], profiles[index]) distTol = max(DistRes, 0.1*distTol) if dist1 < dist2 - distTol: @@ -342,23 +339,23 @@ def condition_g(rows, speeds, angles, index, maxSpeed): if dist2 < dist1 - distTol: return index, 'g' - return condition_h(rows, speeds, angles, index, maxSpeed) + return condition_h(profiles, speeds, angles, index, maxSpeed) -def condition_h(rows, speeds, angles, index, maxSpeed): +def condition_h(profiles, speeds, angles, index, maxSpeed): ''' assess condition (h) from the text ''' - if index > 1 and index < len(rows) - 1: + if index > 1 and index < len(profiles) - 1: - dist1 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index]['raw'])) - dist2 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index-1]['raw'])) + dist1 = geo.haversineDistance(profiles[index], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index]) + dist2 = geo.haversineDistance(profiles[index-1], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index-1]) - PD1 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) / dist2 - PD2 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) / dist1 + PD1 = geo.haversineDistance(profiles[index-1], profiles[index-2]) / dist2 + PD2 = geo.haversineDistance(profiles[index], profiles[index-2]) / dist1 - PT1 = geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index-1]['raw'])) / geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index+1]['raw'])) - PT2 = geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index]['raw'])) / geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index+1]['raw'])) + PT1 = geo.deltaTime(profiles[index-2], profiles[index-1]) / geo.deltaTime(profiles[index-2], profiles[index+1]) + PT2 = geo.deltaTime(profiles[index-2], profiles[index]) / geo.deltaTime(profiles[index-2], profiles[index+1]) if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): return index-1, 'h' From 95d190a083b3cb559caf0dde9182d218c5744b1b Mon Sep 17 00:00:00 2001 From: BillMills Date: Thu, 4 Aug 2016 15:15:03 -0400 Subject: [PATCH 28/79] suppress en_track integration testing until dummy wod ascii generation is available --- tests/EN_track_validation.py | 1097 +++++++++++++++++----------------- 1 file changed, 549 insertions(+), 548 deletions(-) diff --git a/tests/EN_track_validation.py b/tests/EN_track_validation.py index 44f4ab4..7565344 100644 --- a/tests/EN_track_validation.py +++ b/tests/EN_track_validation.py @@ -461,555 +461,556 @@ def condition_h_test(self): ############################ # Integration Tests + # Integration tests rely on being able to generate raw wod ascii text for dummy testing profiles - tbd ############################ - def all_for_one_test(self): - ''' - 10 profiles in a straight slow line should pass - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) - - # pass in any arbitrary profiles should catch all of them - qctests.EN_track_check.test(ds.threadProfiles[3]) - truth = {} - - for i in range(1,11): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'all profiles on a nominal profile should pass no matter which one is provided to EN_track' - - def multi_track_test(self): - ''' - a wild outlier on a different track shouldn't hurt anything - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=10, date=[1999, 12, 31, 9.5], cruise=1001, uid=11)) - - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) - - qctests.EN_track_check.test(ds.threadProfiles[3]) - truth = {} - - for i in range(1,11): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'profiles from a different track should not cause failures' - - def wild_outlier_test(self): - ''' - flag an extreme outlier - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=10, date=[1999, 12, 31, 9.5], cruise=1000, uid=11)) - - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) - - qctests.EN_track_check.test(ds.threadProfiles[3]) - - assert numpy.array_equal(numpy.ones(1, dtype=bool), qctests.EN_track_check.EN_track_results[(1000,11)]), 'should reject wild outlier' - - def condition_i_gap_test(self): - ''' - if removing a profile makes an excessive speed between m-1 and m+1, remove both m and m-1. - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 30, 7], cruise=1000, uid=3)) - - #end of first pass: reject on (i) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - - #first pass: reject on (b) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) - - qctests.EN_track_check.test(ds.threadProfiles[7]) - - truth = {} - for i in range(1,11): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 4)] = numpy.ones(1, dtype=bool) - truth[(1000, 5)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (b) & (i) reject' - - - def condition_c_integration_test(self): - ''' - track passes until condition c - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) - #first pass: reject profile[2] on (c) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) - #inital speed check: flag profile[3] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - - qctests.EN_track_check.test(ds.threadProfiles[3]) - - truth = {} - for i in range(1,7): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 3)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (c) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] - assert flag == 'c', 'Correct profile flagged, but not by the expected step.' - - def condition_d_integration_test(self): - ''' - track passes until condition d - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) - #initial speed check: flag profile[3] - #first pass: reject profile[3] on (d) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - - qctests.EN_track_check.test(ds.threadProfiles[5]) - - truth = {} - for i in range(1,7): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 4)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (d) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] - assert flag == 'd', 'Correct profile flagged, but not by the expected step.' - - def condition_e_integration_test(self): - ''' - track passes until condition e - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 30, 7], cruise=1000, uid=3)) - #first pass: reject profile[3] on (e) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - #initial speed check: flag profile[4] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=15.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=15, longitude=90, date=[2000, 01, 01, 10], cruise=1000, uid=6)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=14.5, longitude=90, date=[2000, 01, 01, 11], cruise=1000, uid=7)) - - qctests.EN_track_check.test(ds.threadProfiles[5]) - - truth = {} - for i in range(1,8): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 4)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (e) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 4, 15)[1] - assert flag == 'e', 'Correct profile flagged, but not by the expected step.' - - def condition_f_integration_test(self): - ''' - track passes until condition f - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 3], cruise=1000, uid=2)) - #first pass: reject profile[2] on (f) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=3)) - #initial speed check: flag profile[3] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=5)) - - qctests.EN_track_check.test(ds.threadProfiles[4]) - - truth = {} - for i in range(1,6): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 3)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (f) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] - print flag - assert flag == 'f', 'Correct profile flagged, but not by the expected step.' - - def condition_g_integration_test(self): - ''' - track passes until condition g - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1998, 12, 31, 1], cruise=1000, uid=1)) - #first pass: reject profile[1] on (g) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=89, date=[1999, 12, 31, 1], cruise=1000, uid=2)) - #inital speed check: flag profile[2] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 2], cruise=1000, uid=3)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[2000, 12, 31, 3], cruise=1000, uid=4)) - - qctests.EN_track_check.test(ds.threadProfiles[3]) - - truth = {} - for i in range(1,5): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 2)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (g) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 2, 15)[1] - assert flag == 'g', 'Correct profile flagged, but not by the expected step.' - - def condition_h_integration_test(self): - ''' - track passes until condition h - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 15], cruise=1000, uid=3)) - #initial speed check: flag profile [3] - #first pass: reject profile[3] on (h) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 16], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 20], cruise=1000, uid=5)) - #PD1: 1/3 - #PD2: 2/3 - #PT1: 3/8 - #PT2: 1/2 - - qctests.EN_track_check.test(ds.threadProfiles[4]) - - truth = {} - for i in range(1,6): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 4)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (h) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] - assert flag == 'h', 'Correct profile flagged, but not by the expected step.' - - def unusual_case_one_prof_test(self): - ''' - spot check on handling of cruise with only one profile. - ''' - - # Some fake profiles - ds.threadProfiles = [] - - # Only one profile available. - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) - - assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle single profile' - - def unusual_case_no_time_test(self): - ''' - spot check on handling of profiles with incomplete data (missing time) - ''' - - # Some fake profiles - ds.threadProfiles = [] - - # Time is missing. - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=2)) - ds.threadProfiles[0].primary_header['Time'] = None - - assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle missing time' - - def unusual_case_identical_positions_test(self): - ''' - spot check on handling of profiles with incomplete data (identical positions) - ''' - - # Some fake profiles - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=2)) - - assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle identical positions' - - def unusual_case_identical_times_test(self): - ''' - spot check on handling of profiles with incomplete data (identical times) - ''' + # def all_for_one_test(self): + # ''' + # 10 profiles in a straight slow line should pass + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) - # Some fake profiles - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=2)) - - assert qctests.EN_track_check.test(ds.threadProfiles[0]) == True, 'Failed to handle identical times' - - def real_case_1_test(self): - ''' - A real instance of a series of a track with a failed track check reject. - ''' - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 3, 12.000000], cruise=45, uid=72, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.050000, longitude=12.000000, date=[1925, 6, 5, 12.000000], cruise=45, uid=112, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.470000, longitude=11.080000, date=[1925, 6, 6, 12.000000], cruise=45, uid=130, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.470000, longitude=12.000000, date=[1925, 6, 6, 12.000000], cruise=45, uid=134, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.130000, longitude=12.000000, date=[1925, 6, 6, 12.000000], cruise=45, uid=137, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.930000, longitude=-52.680000, date=[1925, 6, 9, 12.000000], cruise=45, uid=189, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.230000, date=[1925, 6, 15, 12.000000], cruise=45, uid=301, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.220000, date=[1925, 6, 15, 12.000000], cruise=45, uid=303, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.650000, date=[1925, 6, 16, 12.000000], cruise=45, uid=316, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=68.830000, longitude=-52.800000, date=[1925, 6, 22, 12.000000], cruise=45, uid=489, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.030000, longitude=-52.620000, date=[1925, 6, 28, 12.000000], cruise=45, uid=577, probe_type=7)) - qc= [False, False, False, False, True, False, False, False, False, False, False] - - tcqc = [] - for p in ds.threadProfiles: - tcqc.append(qctests.EN_track_check.test(p)[0]) - - assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' - - def real_case_2_test(self): - ''' - A real instance of a series of a track with a failed track check reject. - ''' - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.350000, longitude=-13.520000, date=[1925, 6, 11, 15.170000], cruise=843883, uid=222, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.300000, longitude=-13.000000, date=[1925, 6, 12, 11.830000], cruise=843883, uid=252, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.500000, longitude=-12.420000, date=[1925, 6, 12, 17.830000], cruise=843883, uid=256, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.820000, longitude=-12.430000, date=[1925, 6, 12, 23.330000], cruise=843883, uid=260, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.820000, longitude=-12.430000, date=[1925, 6, 12, 12.000000], cruise=843883, uid=261, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.500000, longitude=-12.420000, date=[1925, 6, 12, 12.000000], cruise=843883, uid=262, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.750000, longitude=-14.170000, date=[1925, 6, 13, 14.500000], cruise=843883, uid=272, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.270000, longitude=-14.370000, date=[1925, 6, 14, 2.750000], cruise=843883, uid=277, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.570000, longitude=-15.420000, date=[1925, 6, 14, 14.670000], cruise=843883, uid=279, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.600000, longitude=-16.450000, date=[1925, 6, 14, 18.500000], cruise=843883, uid=280, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.320000, longitude=-16.670000, date=[1925, 6, 15, 11.500000], cruise=843883, uid=289, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.020000, longitude=-17.400000, date=[1925, 6, 15, 18.500000], cruise=843883, uid=297, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.220000, longitude=-18.080000, date=[1925, 6, 17, 8.830000], cruise=843883, uid=325, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.350000, longitude=-18.320000, date=[1925, 6, 17, 12.500000], cruise=843883, uid=327, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.280000, longitude=-19.220000, date=[1925, 6, 17, 20.000000], cruise=843883, uid=331, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.180000, longitude=-20.170000, date=[1925, 6, 18, 0.500000], cruise=843883, uid=350, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.720000, longitude=-20.370000, date=[1925, 6, 18, 7.500000], cruise=843883, uid=351, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.080000, longitude=-20.930000, date=[1925, 6, 18, 13.500000], cruise=843883, uid=356, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.350000, longitude=-21.370000, date=[1925, 6, 18, 17.500000], cruise=843883, uid=358, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.530000, longitude=-22.050000, date=[1925, 6, 18, 23.000000], cruise=843883, uid=359, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.630000, longitude=-23.130000, date=[1925, 6, 19, 21.000000], cruise=843883, uid=378, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.600000, longitude=-23.380000, date=[1925, 6, 20, 1.750000], cruise=843883, uid=389, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.380000, longitude=-23.770000, date=[1925, 6, 20, 6.250000], cruise=843883, uid=392, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.830000, longitude=-23.950000, date=[1925, 6, 20, 14.500000], cruise=843883, uid=394, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.770000, longitude=-25.500000, date=[1925, 6, 20, 22.000000], cruise=843883, uid=396, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.270000, longitude=-24.780000, date=[1925, 6, 21, 5.420000], cruise=843883, uid=414, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.880000, longitude=-24.220000, date=[1925, 6, 21, 10.500000], cruise=843883, uid=418, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.550000, longitude=-23.430000, date=[1925, 6, 21, 19.000000], cruise=843883, uid=429, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.180000, longitude=-23.280000, date=[1925, 6, 22, 0.000000], cruise=843883, uid=462, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 22, 6.000000], cruise=843883, uid=467, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 24, 5.670000], cruise=843883, uid=503, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.130000, longitude=-22.400000, date=[1925, 6, 24, 11.000000], cruise=843883, uid=510, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.100000, longitude=-22.570000, date=[1925, 6, 24, 15.000000], cruise=843883, uid=512, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.870000, longitude=-22.820000, date=[1925, 6, 26, 1.500000], cruise=843883, uid=526, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.800000, longitude=-23.080000, date=[1925, 6, 26, 7.000000], cruise=843883, uid=528, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.670000, longitude=-22.800000, date=[1925, 6, 26, 23.000000], cruise=843883, uid=535, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.730000, longitude=-21.580000, date=[1925, 6, 27, 8.170000], cruise=843883, uid=547, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.320000, longitude=-20.800000, date=[1925, 6, 27, 16.000000], cruise=843883, uid=549, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.570000, longitude=-20.430000, date=[1925, 6, 27, 22.000000], cruise=843883, uid=550, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.300000, longitude=-20.080000, date=[1925, 6, 30, 13.000000], cruise=843883, uid=598, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.420000, longitude=-19.420000, date=[1925, 6, 30, 21.000000], cruise=843883, uid=602, probe_type=7)) - qc= [False, True, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - - tcqc = [] - for p in ds.threadProfiles: - tcqc.append(qctests.EN_track_check.test(p)[0]) - - assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' - - def real_case_3_test(self): - ''' - A real instance of a series of a track with a failed track check reject. - ''' - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=46.230000, longitude=-7.430000, date=[1975, 6, 3, 17.000000], cruise=9710419, uid=841, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.820000, longitude=-17.330000, date=[1975, 6, 10, 16.250000], cruise=9710419, uid=1419, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.680000, longitude=-17.400000, date=[1975, 6, 10, 19.420000], cruise=9710419, uid=1433, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.220000, longitude=-17.430000, date=[1975, 6, 11, 9.250000], cruise=9710419, uid=1486, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.530000, longitude=-17.430000, date=[1975, 6, 12, 3.080000], cruise=9710419, uid=1543, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.330000, longitude=-17.450000, date=[1975, 6, 12, 4.420000], cruise=9710419, uid=1547, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.170000, longitude=-17.500000, date=[1975, 6, 12, 5.580000], cruise=9710419, uid=1548, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.000000, longitude=-17.580000, date=[1975, 6, 12, 7.080000], cruise=9710419, uid=1556, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.830000, longitude=-17.630000, date=[1975, 6, 12, 10.080000], cruise=9710419, uid=1566, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 12, 11.330000], cruise=9710419, uid=1569, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.670000, date=[1975, 6, 12, 14.920000], cruise=9710419, uid=1584, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.650000, date=[1975, 6, 12, 19.250000], cruise=9710419, uid=1607, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.650000, date=[1975, 6, 12, 21.000000], cruise=9710419, uid=1610, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.570000, date=[1975, 6, 12, 22.250000], cruise=9710419, uid=1614, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.580000, date=[1975, 6, 14, 8.670000], cruise=9710419, uid=1739, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.200000, longitude=-17.620000, date=[1975, 6, 14, 18.000000], cruise=9710419, uid=1779, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.350000, longitude=-17.620000, date=[1975, 6, 15, 2.500000], cruise=9710419, uid=1804, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.100000, longitude=-17.600000, date=[1975, 6, 15, 14.920000], cruise=9710419, uid=1841, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.630000, date=[1975, 6, 15, 18.580000], cruise=9710419, uid=1851, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.600000, date=[1975, 6, 16, 5.000000], cruise=9710419, uid=1880, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.130000, longitude=-17.570000, date=[1975, 6, 16, 9.000000], cruise=9710419, uid=1899, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.380000, longitude=-17.630000, date=[1975, 6, 16, 19.330000], cruise=9710419, uid=1943, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.630000, longitude=-17.650000, date=[1975, 6, 17, 0.000000], cruise=9710419, uid=1961, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.600000, date=[1975, 6, 17, 19.330000], cruise=9710419, uid=2041, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.120000, longitude=-17.620000, date=[1975, 6, 18, 0.500000], cruise=9710419, uid=2059, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.180000, longitude=-17.500000, date=[1975, 6, 18, 21.580000], cruise=9710419, uid=2137, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.670000, date=[1975, 6, 19, 0.500000], cruise=9710419, uid=2159, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.700000, date=[1975, 6, 19, 2.500000], cruise=9710419, uid=2162, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.350000, longitude=-17.700000, date=[1975, 6, 19, 4.830000], cruise=9710419, uid=2171, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.700000, date=[1975, 6, 19, 6.500000], cruise=9710419, uid=2179, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.600000, date=[1975, 6, 19, 20.670000], cruise=9710419, uid=2273, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.620000, longitude=-17.650000, date=[1975, 6, 19, 22.250000], cruise=9710419, uid=2282, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.920000, longitude=-17.500000, date=[1975, 6, 20, 21.580000], cruise=9710419, uid=2365, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.670000, date=[1975, 6, 21, 0.166944], cruise=9710419, uid=2376, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.700000, date=[1975, 6, 21, 2.420000], cruise=9710419, uid=2385, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.700000, date=[1975, 6, 21, 4.000000], cruise=9710419, uid=2392, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.700000, date=[1975, 6, 21, 6.170000], cruise=9710419, uid=2402, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.630000, longitude=-17.650000, date=[1975, 6, 21, 7.670000], cruise=9710419, uid=2409, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.580000, date=[1975, 6, 23, 9.330000], cruise=9710419, uid=2633, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 23, 18.170000], cruise=9710419, uid=2698, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.900000, longitude=-17.480000, date=[1975, 6, 23, 20.170000], cruise=9710419, uid=2709, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.970000, longitude=-17.430000, date=[1975, 6, 24, 20.420000], cruise=9710419, uid=2806, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.800000, longitude=-17.430000, date=[1975, 6, 25, 0.500000], cruise=9710419, uid=2824, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.830000, longitude=-17.500000, date=[1975, 6, 26, 6.170000], cruise=9710419, uid=2928, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.920000, longitude=-17.500000, date=[1975, 6, 26, 10.170000], cruise=9710419, uid=2940, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.950000, longitude=-17.480000, date=[1975, 6, 27, 6.920000], cruise=9710419, uid=3016, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 27, 14.670000], cruise=9710419, uid=3053, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.680000, date=[1975, 6, 27, 15.750000], cruise=9710419, uid=3061, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.650000, date=[1975, 6, 27, 16.920000], cruise=9710419, uid=3063, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 27, 18.170000], cruise=9710419, uid=3070, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.570000, date=[1975, 6, 27, 19.170000], cruise=9710419, uid=3077, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.830000, longitude=-17.500000, date=[1975, 6, 27, 20.170000], cruise=9710419, uid=3080, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.670000, longitude=-17.450000, date=[1975, 6, 27, 21.330000], cruise=9710419, uid=3085, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.500000, longitude=-17.400000, date=[1975, 6, 27, 22.420000], cruise=9710419, uid=3088, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.670000, date=[1975, 6, 28, 11.750000], cruise=9710419, uid=3112, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.580000, date=[1975, 6, 28, 13.330000], cruise=9710419, uid=3117, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.830000, longitude=-17.500000, date=[1975, 6, 28, 14.830000], cruise=9710419, uid=3121, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.670000, longitude=-17.450000, date=[1975, 6, 28, 15.920000], cruise=9710419, uid=3123, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.500000, longitude=-17.570000, date=[1975, 6, 28, 17.000000], cruise=9710419, uid=3128, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.330000, longitude=-17.330000, date=[1975, 6, 28, 18.000000], cruise=9710419, uid=3129, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.170000, longitude=-17.300000, date=[1975, 6, 28, 19.000000], cruise=9710419, uid=3133, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.000000, longitude=-17.180000, date=[1975, 6, 28, 20.170000], cruise=9710419, uid=3135, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.830000, longitude=-17.080000, date=[1975, 6, 28, 21.250000], cruise=9710419, uid=3140, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.600000, longitude=-17.630000, date=[1975, 6, 30, 6.330000], cruise=9710419, uid=3205, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.650000, longitude=-17.650000, date=[1975, 6, 30, 19.500000], cruise=9710419, uid=3244, probe_type=1)) - qc= [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - - tcqc = [] - for p in ds.threadProfiles: - tcqc.append(qctests.EN_track_check.test(p)[0]) - - assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' - - def real_case_4_test(self): - ''' - A real instance of a series of a track with a failed track check reject. - ''' - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.070000, longitude=-18.920000, date=[1975, 6, 1, 7.580000], cruise=5546547, uid=8104, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.270000, longitude=-18.730000, date=[1975, 6, 4, 18.430000], cruise=5546547, uid=8593, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.450000, longitude=-10.330000, date=[1975, 6, 7, 15.250000], cruise=5546547, uid=9026, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.280000, longitude=-13.120000, date=[1975, 6, 8, 2.830000], cruise=5546547, uid=9097, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.300000, longitude=-17.000000, date=[1975, 6, 8, 8.170000], cruise=5546547, uid=9137, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.750000, longitude=-14.770000, date=[1975, 6, 8, 10.050000], cruise=5546547, uid=9148, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.000000, longitude=-15.880000, date=[1975, 6, 8, 15.030000], cruise=5546547, uid=9182, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.580000, longitude=-14.670000, date=[1975, 6, 8, 21.080000], cruise=5546547, uid=9235, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.220000, longitude=-13.630000, date=[1975, 6, 9, 2.080000], cruise=5546547, uid=9278, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.450000, longitude=-10.780000, date=[1975, 6, 9, 15.020000], cruise=5546547, uid=9368, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.130000, longitude=-9.980000, date=[1975, 6, 9, 21.170000], cruise=5546547, uid=9410, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.020000, longitude=-19.200000, date=[1975, 6, 13, 9.580000], cruise=5546547, uid=9989, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.220000, longitude=-19.400000, date=[1975, 6, 16, 21.400000], cruise=5546547, uid=10516, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.770000, longitude=-19.420000, date=[1975, 6, 22, 8.150000], cruise=5546547, uid=11446, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.730000, longitude=-19.330000, date=[1975, 6, 23, 1.000000], cruise=5546547, uid=11580, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.850000, longitude=-19.400000, date=[1975, 6, 23, 10.250000], cruise=5546547, uid=11644, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.820000, longitude=-19.420000, date=[1975, 6, 24, 7.720000], cruise=5546547, uid=11821, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.820000, longitude=-19.380000, date=[1975, 6, 25, 9.670000], cruise=5546547, uid=12029, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.750000, longitude=-19.400000, date=[1975, 6, 26, 8.250000], cruise=5546547, uid=12208, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.830000, longitude=-19.620000, date=[1975, 6, 27, 9.000000], cruise=5546547, uid=12370, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.770000, longitude=-19.550000, date=[1975, 6, 28, 8.000000], cruise=5546547, uid=12515, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.750000, longitude=-19.580000, date=[1975, 6, 29, 7.920000], cruise=5546547, uid=12647, probe_type=2)) - qc= [False, False, False, False, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - - tcqc = [] - for p in ds.threadProfiles: - tcqc.append(qctests.EN_track_check.test(p)[0]) - - assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' - - def real_case_5_test(self): - ''' - A real instance of a series of a track with a failed track check reject. - ''' - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-20.920000, longitude=112.862000, date=[1975, 6, 7, 18.000000], cruise=5670710, uid=9040, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-19.350000, longitude=113.795000, date=[1975, 6, 8, 0.020000], cruise=5670710, uid=9077, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-17.380000, longitude=114.162000, date=[1975, 6, 8, 6.000000], cruise=5670710, uid=9116, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-15.500000, longitude=115.512000, date=[1975, 6, 8, 12.000000], cruise=5670710, uid=9164, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-12.470000, longitude=114.800000, date=[1975, 6, 8, 18.000000], cruise=5670710, uid=9212, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-10.980000, longitude=115.220000, date=[1975, 6, 9, 0.020000], cruise=5670710, uid=9257, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-9.370000, longitude=115.580000, date=[1975, 6, 9, 7.000000], cruise=5670710, uid=9323, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-7.750000, longitude=115.050000, date=[1975, 6, 9, 12.000000], cruise=5670710, uid=9360, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-6.630000, longitude=116.700000, date=[1975, 6, 9, 18.000000], cruise=5670710, uid=9384, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-3.700000, longitude=118.130000, date=[1975, 6, 10, 0.020000], cruise=5670710, uid=9451, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-1.770000, longitude=118.780000, date=[1975, 6, 10, 6.000000], cruise=5670710, uid=9481, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0.267000, longitude=119.220000, date=[1975, 6, 10, 12.000000], cruise=5670710, uid=9527, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=2.170000, longitude=119.480000, date=[1975, 6, 10, 18.000000], cruise=5670710, uid=9562, probe_type=2)) - qc= [False, False, False, True, True, False, False, False, True, False, False, False, False] - - tcqc = [] - for p in ds.threadProfiles: - tcqc.append(qctests.EN_track_check.test(p)[0]) - - assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' + # # pass in any arbitrary profiles should catch all of them + # qctests.EN_track_check.test(ds.threadProfiles[3]) + # truth = {} + + # for i in range(1,11): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'all profiles on a nominal profile should pass no matter which one is provided to EN_track' + + # def multi_track_test(self): + # ''' + # a wild outlier on a different track shouldn't hurt anything + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=10, date=[1999, 12, 31, 9.5], cruise=1001, uid=11)) + + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) + + # qctests.EN_track_check.test(ds.threadProfiles[3]) + # truth = {} + + # for i in range(1,11): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'profiles from a different track should not cause failures' + + # def wild_outlier_test(self): + # ''' + # flag an extreme outlier + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=10, date=[1999, 12, 31, 9.5], cruise=1000, uid=11)) + + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) + + # qctests.EN_track_check.test(ds.threadProfiles[3]) + + # assert numpy.array_equal(numpy.ones(1, dtype=bool), qctests.EN_track_check.EN_track_results[(1000,11)]), 'should reject wild outlier' + + # def condition_i_gap_test(self): + # ''' + # if removing a profile makes an excessive speed between m-1 and m+1, remove both m and m-1. + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 30, 7], cruise=1000, uid=3)) + + # #end of first pass: reject on (i) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + + # #first pass: reject on (b) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) + + # qctests.EN_track_check.test(ds.threadProfiles[7]) + + # truth = {} + # for i in range(1,11): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 4)] = numpy.ones(1, dtype=bool) + # truth[(1000, 5)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (b) & (i) reject' + + + # def condition_c_integration_test(self): + # ''' + # track passes until condition c + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) + # #first pass: reject profile[2] on (c) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) + # #inital speed check: flag profile[3] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + + # qctests.EN_track_check.test(ds.threadProfiles[3]) + + # truth = {} + # for i in range(1,7): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 3)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (c) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] + # assert flag == 'c', 'Correct profile flagged, but not by the expected step.' + + # def condition_d_integration_test(self): + # ''' + # track passes until condition d + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) + # #initial speed check: flag profile[3] + # #first pass: reject profile[3] on (d) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + + # qctests.EN_track_check.test(ds.threadProfiles[5]) + + # truth = {} + # for i in range(1,7): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 4)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (d) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] + # assert flag == 'd', 'Correct profile flagged, but not by the expected step.' + + # def condition_e_integration_test(self): + # ''' + # track passes until condition e + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 30, 7], cruise=1000, uid=3)) + # #first pass: reject profile[3] on (e) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # #initial speed check: flag profile[4] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=15.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=15, longitude=90, date=[2000, 01, 01, 10], cruise=1000, uid=6)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=14.5, longitude=90, date=[2000, 01, 01, 11], cruise=1000, uid=7)) + + # qctests.EN_track_check.test(ds.threadProfiles[5]) + + # truth = {} + # for i in range(1,8): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 4)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (e) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 4, 15)[1] + # assert flag == 'e', 'Correct profile flagged, but not by the expected step.' + + # def condition_f_integration_test(self): + # ''' + # track passes until condition f + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 3], cruise=1000, uid=2)) + # #first pass: reject profile[2] on (f) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=3)) + # #initial speed check: flag profile[3] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=5)) + + # qctests.EN_track_check.test(ds.threadProfiles[4]) + + # truth = {} + # for i in range(1,6): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 3)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (f) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] + # print flag + # assert flag == 'f', 'Correct profile flagged, but not by the expected step.' + + # def condition_g_integration_test(self): + # ''' + # track passes until condition g + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1998, 12, 31, 1], cruise=1000, uid=1)) + # #first pass: reject profile[1] on (g) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=89, date=[1999, 12, 31, 1], cruise=1000, uid=2)) + # #inital speed check: flag profile[2] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 2], cruise=1000, uid=3)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[2000, 12, 31, 3], cruise=1000, uid=4)) + + # qctests.EN_track_check.test(ds.threadProfiles[3]) + + # truth = {} + # for i in range(1,5): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 2)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (g) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 2, 15)[1] + # assert flag == 'g', 'Correct profile flagged, but not by the expected step.' + + # def condition_h_integration_test(self): + # ''' + # track passes until condition h + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 15], cruise=1000, uid=3)) + # #initial speed check: flag profile [3] + # #first pass: reject profile[3] on (h) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 16], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 20], cruise=1000, uid=5)) + # #PD1: 1/3 + # #PD2: 2/3 + # #PT1: 3/8 + # #PT2: 1/2 + + # qctests.EN_track_check.test(ds.threadProfiles[4]) + + # truth = {} + # for i in range(1,6): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 4)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (h) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] + # assert flag == 'h', 'Correct profile flagged, but not by the expected step.' + + # def unusual_case_one_prof_test(self): + # ''' + # spot check on handling of cruise with only one profile. + # ''' + + # # Some fake profiles + # ds.threadProfiles = [] + + # # Only one profile available. + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) + + # assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle single profile' + + # def unusual_case_no_time_test(self): + # ''' + # spot check on handling of profiles with incomplete data (missing time) + # ''' + + # # Some fake profiles + # ds.threadProfiles = [] + + # # Time is missing. + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=2)) + # ds.threadProfiles[0].primary_header['Time'] = None + + # assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle missing time' + + # def unusual_case_identical_positions_test(self): + # ''' + # spot check on handling of profiles with incomplete data (identical positions) + # ''' + + # # Some fake profiles + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=2)) + + # assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle identical positions' + + # def unusual_case_identical_times_test(self): + # ''' + # spot check on handling of profiles with incomplete data (identical times) + # ''' + + # # Some fake profiles + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=2)) + + # assert qctests.EN_track_check.test(ds.threadProfiles[0]) == True, 'Failed to handle identical times' + + # def real_case_1_test(self): + # ''' + # A real instance of a series of a track with a failed track check reject. + # ''' + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 3, 12.000000], cruise=45, uid=72, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.050000, longitude=12.000000, date=[1925, 6, 5, 12.000000], cruise=45, uid=112, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.470000, longitude=11.080000, date=[1925, 6, 6, 12.000000], cruise=45, uid=130, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.470000, longitude=12.000000, date=[1925, 6, 6, 12.000000], cruise=45, uid=134, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.130000, longitude=12.000000, date=[1925, 6, 6, 12.000000], cruise=45, uid=137, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.930000, longitude=-52.680000, date=[1925, 6, 9, 12.000000], cruise=45, uid=189, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.230000, date=[1925, 6, 15, 12.000000], cruise=45, uid=301, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.220000, date=[1925, 6, 15, 12.000000], cruise=45, uid=303, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.650000, date=[1925, 6, 16, 12.000000], cruise=45, uid=316, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=68.830000, longitude=-52.800000, date=[1925, 6, 22, 12.000000], cruise=45, uid=489, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.030000, longitude=-52.620000, date=[1925, 6, 28, 12.000000], cruise=45, uid=577, probe_type=7)) + # qc= [False, False, False, False, True, False, False, False, False, False, False] + + # tcqc = [] + # for p in ds.threadProfiles: + # tcqc.append(qctests.EN_track_check.test(p)[0]) + + # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' + + # def real_case_2_test(self): + # ''' + # A real instance of a series of a track with a failed track check reject. + # ''' + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.350000, longitude=-13.520000, date=[1925, 6, 11, 15.170000], cruise=843883, uid=222, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.300000, longitude=-13.000000, date=[1925, 6, 12, 11.830000], cruise=843883, uid=252, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.500000, longitude=-12.420000, date=[1925, 6, 12, 17.830000], cruise=843883, uid=256, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.820000, longitude=-12.430000, date=[1925, 6, 12, 23.330000], cruise=843883, uid=260, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.820000, longitude=-12.430000, date=[1925, 6, 12, 12.000000], cruise=843883, uid=261, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.500000, longitude=-12.420000, date=[1925, 6, 12, 12.000000], cruise=843883, uid=262, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.750000, longitude=-14.170000, date=[1925, 6, 13, 14.500000], cruise=843883, uid=272, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.270000, longitude=-14.370000, date=[1925, 6, 14, 2.750000], cruise=843883, uid=277, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.570000, longitude=-15.420000, date=[1925, 6, 14, 14.670000], cruise=843883, uid=279, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.600000, longitude=-16.450000, date=[1925, 6, 14, 18.500000], cruise=843883, uid=280, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.320000, longitude=-16.670000, date=[1925, 6, 15, 11.500000], cruise=843883, uid=289, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.020000, longitude=-17.400000, date=[1925, 6, 15, 18.500000], cruise=843883, uid=297, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.220000, longitude=-18.080000, date=[1925, 6, 17, 8.830000], cruise=843883, uid=325, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.350000, longitude=-18.320000, date=[1925, 6, 17, 12.500000], cruise=843883, uid=327, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.280000, longitude=-19.220000, date=[1925, 6, 17, 20.000000], cruise=843883, uid=331, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.180000, longitude=-20.170000, date=[1925, 6, 18, 0.500000], cruise=843883, uid=350, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.720000, longitude=-20.370000, date=[1925, 6, 18, 7.500000], cruise=843883, uid=351, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.080000, longitude=-20.930000, date=[1925, 6, 18, 13.500000], cruise=843883, uid=356, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.350000, longitude=-21.370000, date=[1925, 6, 18, 17.500000], cruise=843883, uid=358, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.530000, longitude=-22.050000, date=[1925, 6, 18, 23.000000], cruise=843883, uid=359, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.630000, longitude=-23.130000, date=[1925, 6, 19, 21.000000], cruise=843883, uid=378, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.600000, longitude=-23.380000, date=[1925, 6, 20, 1.750000], cruise=843883, uid=389, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.380000, longitude=-23.770000, date=[1925, 6, 20, 6.250000], cruise=843883, uid=392, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.830000, longitude=-23.950000, date=[1925, 6, 20, 14.500000], cruise=843883, uid=394, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.770000, longitude=-25.500000, date=[1925, 6, 20, 22.000000], cruise=843883, uid=396, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.270000, longitude=-24.780000, date=[1925, 6, 21, 5.420000], cruise=843883, uid=414, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.880000, longitude=-24.220000, date=[1925, 6, 21, 10.500000], cruise=843883, uid=418, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.550000, longitude=-23.430000, date=[1925, 6, 21, 19.000000], cruise=843883, uid=429, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.180000, longitude=-23.280000, date=[1925, 6, 22, 0.000000], cruise=843883, uid=462, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 22, 6.000000], cruise=843883, uid=467, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 24, 5.670000], cruise=843883, uid=503, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.130000, longitude=-22.400000, date=[1925, 6, 24, 11.000000], cruise=843883, uid=510, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.100000, longitude=-22.570000, date=[1925, 6, 24, 15.000000], cruise=843883, uid=512, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.870000, longitude=-22.820000, date=[1925, 6, 26, 1.500000], cruise=843883, uid=526, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.800000, longitude=-23.080000, date=[1925, 6, 26, 7.000000], cruise=843883, uid=528, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.670000, longitude=-22.800000, date=[1925, 6, 26, 23.000000], cruise=843883, uid=535, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.730000, longitude=-21.580000, date=[1925, 6, 27, 8.170000], cruise=843883, uid=547, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.320000, longitude=-20.800000, date=[1925, 6, 27, 16.000000], cruise=843883, uid=549, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.570000, longitude=-20.430000, date=[1925, 6, 27, 22.000000], cruise=843883, uid=550, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.300000, longitude=-20.080000, date=[1925, 6, 30, 13.000000], cruise=843883, uid=598, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.420000, longitude=-19.420000, date=[1925, 6, 30, 21.000000], cruise=843883, uid=602, probe_type=7)) + # qc= [False, True, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + + # tcqc = [] + # for p in ds.threadProfiles: + # tcqc.append(qctests.EN_track_check.test(p)[0]) + + # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' + + # def real_case_3_test(self): + # ''' + # A real instance of a series of a track with a failed track check reject. + # ''' + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=46.230000, longitude=-7.430000, date=[1975, 6, 3, 17.000000], cruise=9710419, uid=841, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.820000, longitude=-17.330000, date=[1975, 6, 10, 16.250000], cruise=9710419, uid=1419, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.680000, longitude=-17.400000, date=[1975, 6, 10, 19.420000], cruise=9710419, uid=1433, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.220000, longitude=-17.430000, date=[1975, 6, 11, 9.250000], cruise=9710419, uid=1486, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.530000, longitude=-17.430000, date=[1975, 6, 12, 3.080000], cruise=9710419, uid=1543, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.330000, longitude=-17.450000, date=[1975, 6, 12, 4.420000], cruise=9710419, uid=1547, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.170000, longitude=-17.500000, date=[1975, 6, 12, 5.580000], cruise=9710419, uid=1548, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.000000, longitude=-17.580000, date=[1975, 6, 12, 7.080000], cruise=9710419, uid=1556, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.830000, longitude=-17.630000, date=[1975, 6, 12, 10.080000], cruise=9710419, uid=1566, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 12, 11.330000], cruise=9710419, uid=1569, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.670000, date=[1975, 6, 12, 14.920000], cruise=9710419, uid=1584, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.650000, date=[1975, 6, 12, 19.250000], cruise=9710419, uid=1607, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.650000, date=[1975, 6, 12, 21.000000], cruise=9710419, uid=1610, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.570000, date=[1975, 6, 12, 22.250000], cruise=9710419, uid=1614, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.580000, date=[1975, 6, 14, 8.670000], cruise=9710419, uid=1739, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.200000, longitude=-17.620000, date=[1975, 6, 14, 18.000000], cruise=9710419, uid=1779, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.350000, longitude=-17.620000, date=[1975, 6, 15, 2.500000], cruise=9710419, uid=1804, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.100000, longitude=-17.600000, date=[1975, 6, 15, 14.920000], cruise=9710419, uid=1841, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.630000, date=[1975, 6, 15, 18.580000], cruise=9710419, uid=1851, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.600000, date=[1975, 6, 16, 5.000000], cruise=9710419, uid=1880, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.130000, longitude=-17.570000, date=[1975, 6, 16, 9.000000], cruise=9710419, uid=1899, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.380000, longitude=-17.630000, date=[1975, 6, 16, 19.330000], cruise=9710419, uid=1943, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.630000, longitude=-17.650000, date=[1975, 6, 17, 0.000000], cruise=9710419, uid=1961, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.600000, date=[1975, 6, 17, 19.330000], cruise=9710419, uid=2041, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.120000, longitude=-17.620000, date=[1975, 6, 18, 0.500000], cruise=9710419, uid=2059, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.180000, longitude=-17.500000, date=[1975, 6, 18, 21.580000], cruise=9710419, uid=2137, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.670000, date=[1975, 6, 19, 0.500000], cruise=9710419, uid=2159, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.700000, date=[1975, 6, 19, 2.500000], cruise=9710419, uid=2162, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.350000, longitude=-17.700000, date=[1975, 6, 19, 4.830000], cruise=9710419, uid=2171, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.700000, date=[1975, 6, 19, 6.500000], cruise=9710419, uid=2179, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.600000, date=[1975, 6, 19, 20.670000], cruise=9710419, uid=2273, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.620000, longitude=-17.650000, date=[1975, 6, 19, 22.250000], cruise=9710419, uid=2282, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.920000, longitude=-17.500000, date=[1975, 6, 20, 21.580000], cruise=9710419, uid=2365, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.670000, date=[1975, 6, 21, 0.166944], cruise=9710419, uid=2376, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.700000, date=[1975, 6, 21, 2.420000], cruise=9710419, uid=2385, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.700000, date=[1975, 6, 21, 4.000000], cruise=9710419, uid=2392, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.700000, date=[1975, 6, 21, 6.170000], cruise=9710419, uid=2402, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.630000, longitude=-17.650000, date=[1975, 6, 21, 7.670000], cruise=9710419, uid=2409, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.580000, date=[1975, 6, 23, 9.330000], cruise=9710419, uid=2633, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 23, 18.170000], cruise=9710419, uid=2698, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.900000, longitude=-17.480000, date=[1975, 6, 23, 20.170000], cruise=9710419, uid=2709, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.970000, longitude=-17.430000, date=[1975, 6, 24, 20.420000], cruise=9710419, uid=2806, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.800000, longitude=-17.430000, date=[1975, 6, 25, 0.500000], cruise=9710419, uid=2824, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.830000, longitude=-17.500000, date=[1975, 6, 26, 6.170000], cruise=9710419, uid=2928, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.920000, longitude=-17.500000, date=[1975, 6, 26, 10.170000], cruise=9710419, uid=2940, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.950000, longitude=-17.480000, date=[1975, 6, 27, 6.920000], cruise=9710419, uid=3016, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 27, 14.670000], cruise=9710419, uid=3053, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.680000, date=[1975, 6, 27, 15.750000], cruise=9710419, uid=3061, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.650000, date=[1975, 6, 27, 16.920000], cruise=9710419, uid=3063, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 27, 18.170000], cruise=9710419, uid=3070, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.570000, date=[1975, 6, 27, 19.170000], cruise=9710419, uid=3077, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.830000, longitude=-17.500000, date=[1975, 6, 27, 20.170000], cruise=9710419, uid=3080, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.670000, longitude=-17.450000, date=[1975, 6, 27, 21.330000], cruise=9710419, uid=3085, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.500000, longitude=-17.400000, date=[1975, 6, 27, 22.420000], cruise=9710419, uid=3088, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.670000, date=[1975, 6, 28, 11.750000], cruise=9710419, uid=3112, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.580000, date=[1975, 6, 28, 13.330000], cruise=9710419, uid=3117, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.830000, longitude=-17.500000, date=[1975, 6, 28, 14.830000], cruise=9710419, uid=3121, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.670000, longitude=-17.450000, date=[1975, 6, 28, 15.920000], cruise=9710419, uid=3123, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.500000, longitude=-17.570000, date=[1975, 6, 28, 17.000000], cruise=9710419, uid=3128, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.330000, longitude=-17.330000, date=[1975, 6, 28, 18.000000], cruise=9710419, uid=3129, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.170000, longitude=-17.300000, date=[1975, 6, 28, 19.000000], cruise=9710419, uid=3133, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.000000, longitude=-17.180000, date=[1975, 6, 28, 20.170000], cruise=9710419, uid=3135, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.830000, longitude=-17.080000, date=[1975, 6, 28, 21.250000], cruise=9710419, uid=3140, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.600000, longitude=-17.630000, date=[1975, 6, 30, 6.330000], cruise=9710419, uid=3205, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.650000, longitude=-17.650000, date=[1975, 6, 30, 19.500000], cruise=9710419, uid=3244, probe_type=1)) + # qc= [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + + # tcqc = [] + # for p in ds.threadProfiles: + # tcqc.append(qctests.EN_track_check.test(p)[0]) + + # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' + + # def real_case_4_test(self): + # ''' + # A real instance of a series of a track with a failed track check reject. + # ''' + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.070000, longitude=-18.920000, date=[1975, 6, 1, 7.580000], cruise=5546547, uid=8104, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.270000, longitude=-18.730000, date=[1975, 6, 4, 18.430000], cruise=5546547, uid=8593, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.450000, longitude=-10.330000, date=[1975, 6, 7, 15.250000], cruise=5546547, uid=9026, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.280000, longitude=-13.120000, date=[1975, 6, 8, 2.830000], cruise=5546547, uid=9097, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.300000, longitude=-17.000000, date=[1975, 6, 8, 8.170000], cruise=5546547, uid=9137, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.750000, longitude=-14.770000, date=[1975, 6, 8, 10.050000], cruise=5546547, uid=9148, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.000000, longitude=-15.880000, date=[1975, 6, 8, 15.030000], cruise=5546547, uid=9182, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.580000, longitude=-14.670000, date=[1975, 6, 8, 21.080000], cruise=5546547, uid=9235, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.220000, longitude=-13.630000, date=[1975, 6, 9, 2.080000], cruise=5546547, uid=9278, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.450000, longitude=-10.780000, date=[1975, 6, 9, 15.020000], cruise=5546547, uid=9368, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.130000, longitude=-9.980000, date=[1975, 6, 9, 21.170000], cruise=5546547, uid=9410, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.020000, longitude=-19.200000, date=[1975, 6, 13, 9.580000], cruise=5546547, uid=9989, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.220000, longitude=-19.400000, date=[1975, 6, 16, 21.400000], cruise=5546547, uid=10516, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.770000, longitude=-19.420000, date=[1975, 6, 22, 8.150000], cruise=5546547, uid=11446, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.730000, longitude=-19.330000, date=[1975, 6, 23, 1.000000], cruise=5546547, uid=11580, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.850000, longitude=-19.400000, date=[1975, 6, 23, 10.250000], cruise=5546547, uid=11644, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.820000, longitude=-19.420000, date=[1975, 6, 24, 7.720000], cruise=5546547, uid=11821, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.820000, longitude=-19.380000, date=[1975, 6, 25, 9.670000], cruise=5546547, uid=12029, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.750000, longitude=-19.400000, date=[1975, 6, 26, 8.250000], cruise=5546547, uid=12208, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.830000, longitude=-19.620000, date=[1975, 6, 27, 9.000000], cruise=5546547, uid=12370, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.770000, longitude=-19.550000, date=[1975, 6, 28, 8.000000], cruise=5546547, uid=12515, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.750000, longitude=-19.580000, date=[1975, 6, 29, 7.920000], cruise=5546547, uid=12647, probe_type=2)) + # qc= [False, False, False, False, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + + # tcqc = [] + # for p in ds.threadProfiles: + # tcqc.append(qctests.EN_track_check.test(p)[0]) + + # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' + + # def real_case_5_test(self): + # ''' + # A real instance of a series of a track with a failed track check reject. + # ''' + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-20.920000, longitude=112.862000, date=[1975, 6, 7, 18.000000], cruise=5670710, uid=9040, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-19.350000, longitude=113.795000, date=[1975, 6, 8, 0.020000], cruise=5670710, uid=9077, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-17.380000, longitude=114.162000, date=[1975, 6, 8, 6.000000], cruise=5670710, uid=9116, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-15.500000, longitude=115.512000, date=[1975, 6, 8, 12.000000], cruise=5670710, uid=9164, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-12.470000, longitude=114.800000, date=[1975, 6, 8, 18.000000], cruise=5670710, uid=9212, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-10.980000, longitude=115.220000, date=[1975, 6, 9, 0.020000], cruise=5670710, uid=9257, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-9.370000, longitude=115.580000, date=[1975, 6, 9, 7.000000], cruise=5670710, uid=9323, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-7.750000, longitude=115.050000, date=[1975, 6, 9, 12.000000], cruise=5670710, uid=9360, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-6.630000, longitude=116.700000, date=[1975, 6, 9, 18.000000], cruise=5670710, uid=9384, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-3.700000, longitude=118.130000, date=[1975, 6, 10, 0.020000], cruise=5670710, uid=9451, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-1.770000, longitude=118.780000, date=[1975, 6, 10, 6.000000], cruise=5670710, uid=9481, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0.267000, longitude=119.220000, date=[1975, 6, 10, 12.000000], cruise=5670710, uid=9527, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=2.170000, longitude=119.480000, date=[1975, 6, 10, 18.000000], cruise=5670710, uid=9562, probe_type=2)) + # qc= [False, False, False, True, True, False, False, False, True, False, False, False, False] + + # tcqc = [] + # for p in ds.threadProfiles: + # tcqc.append(qctests.EN_track_check.test(p)[0]) + + # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' From 5d6a9c4a4940834a53f49ffc535f2fe1fdc16162 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Fri, 5 Aug 2016 01:59:47 +0000 Subject: [PATCH 29/79] moved loose location test back to original location --- .../{Misc_loose_location_at_sea.py => loose_location_at_sea.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename qctests/{Misc_loose_location_at_sea.py => loose_location_at_sea.py} (100%) diff --git a/qctests/Misc_loose_location_at_sea.py b/qctests/loose_location_at_sea.py similarity index 100% rename from qctests/Misc_loose_location_at_sea.py rename to qctests/loose_location_at_sea.py From 75fc2eb9b534f922c6234c1e7916e21c391bda07 Mon Sep 17 00:00:00 2001 From: Simon Good Date: Fri, 5 Aug 2016 22:01:51 +0100 Subject: [PATCH 30/79] Update cotede_test.py to handle pre-1900 profiles woa_normbias can't handle pre-1900 profiles because it uses datetime.datetime.strftime which fails if given a date before 1900. Profiles from before 1900 are set to have year=1900. This should not have an impact on QC results but will prevent an error. --- cotede_qc/cotede_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cotede_qc/cotede_test.py b/cotede_qc/cotede_test.py index dfcb5c1..0015f5e 100644 --- a/cotede_qc/cotede_test.py +++ b/cotede_qc/cotede_test.py @@ -38,6 +38,9 @@ def get_qc(p, config, test): test not in cotede_results[2] or p.uid() is None): inputs = Wod4CoTeDe(p) + dt = inputs.attributes['datetime'] + if dt.year < 1900: + inputs.attributes['datetime'] = dt.replace(year=1900) # If config is a dictionary, use it. if type(config) is not dict: From 4b82f3ed20e83a098780b9aedf3bba2ccc62766a Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 3 Jul 2016 06:11:23 +0000 Subject: [PATCH 31/79] beginning to set up infrastructure for postgres --- postgres/build-db.py | 59 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 postgres/build-db.py diff --git a/postgres/build-db.py b/postgres/build-db.py new file mode 100644 index 0000000..e32a744 --- /dev/null +++ b/postgres/build-db.py @@ -0,0 +1,59 @@ +import psycopg2 +from wodpy import wod +import sys + +# connect to database and create a cursor by which to interact with it. +try: + conn = psycopg2.connect("dbname='root' user='root'") +except: + print "I am unable to connect to the database" + +cur = conn.cursor() + +# set up our table +query = """CREATE TABLE IF NOT EXISTS profiles( + lat real, + long real, + uid integer, + cruise integer, + year integer, + month integer, + day integer, + time real, + probetype integer, + depth real[], + temperature real[], + salinity real[] + );""" +cur.execute(query) + +# populate table from wod-ascii data +fid = open(sys.argv[1]) +while True: + profile = wod.WodProfile(fid) + wodDict = profile.npdict() + wodDict['z'] = "'{" + ",".join(map(str, wodDict['z'])) + "}'" + wodDict['t'] = "'{" + ",".join(map(str, wodDict['t'])) + "}'" + wodDict['s'] = "'{" + ",".join(map(str, wodDict['s'])) + "}'" + + query = """INSERT INTO profiles VALUES( + {p[latitude]}, + {p[longitude]}, + {p[uid]}, + {p[cruise]}, + {p[year]}, + {p[month]}, + {p[day]}, + {p[time]}, + {p[probe_type]}, + {p[z]}, + {p[t]}, + {p[s]} + )""".format(p=wodDict) + query = query.replace('--', 'NULL') + query = query.replace('None', 'NULL') + cur.execute(query) + if profile.is_last_profile_in_file(fid) == True: + break + +conn.commit() From 13d0ca19a638f65a0b01a66e87521b68d325e176 Mon Sep 17 00:00:00 2001 From: BillMills Date: Sat, 2 Jul 2016 23:17:41 -0700 Subject: [PATCH 32/79] dockerfile support for postgres infrastructure --- docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index d9c06c4..d2ed46c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,10 +6,10 @@ RUN conda update -q conda RUN apt-get update # dependencies! -RUN apt-get -y install libhdf5-serial-dev libnetcdf-dev unzip +RUN apt-get -y install libhdf5-serial-dev libnetcdf-dev unzip postgresql libpq-dev python-dev nano RUN conda install --yes python=2.7 pip nose Shapely netCDF4 matplotlib numpy scipy pyproj pandas -RUN pip install seabird>=0.6.3 gsw scikit-fuzzy +RUN pip install seabird>=0.6.3 gsw scikit-fuzzy psycopg2 # Pypi is not working well. Temporary solution RUN pip install git+https://github.com/castelao/oceansdb.git@master#egg=oceansdb RUN pip install git+https://github.com/castelao/CoTeDe.git@master#egg=CoTeDe From be9b27f3bc2173052188fa1dc458a2238ef000f4 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Mon, 4 Jul 2016 01:18:01 +0000 Subject: [PATCH 33/79] parallel experiments --- AutoQC.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 2d70a28..340fb73 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -4,6 +4,7 @@ import sys, os, json, data.ds import util.main as main import pandas +from multiprocessing import Pool def run(test, profiles): ''' @@ -39,6 +40,8 @@ def processFile(fName): data.ds.threadFile = fName for iprofile, pinfo in enumerate(data.ds.threadProfiles): + if iprofile >= 10: + continue # Load the profile data. p, currentFile, f = main.profileData(pinfo, currentFile, f) # Check that there are temperature data in the profile, otherwise skip. @@ -63,7 +66,7 @@ def processFile(fName): trueVerbose.append(truth[1][0]) profileIDs.append(p.uid()) # testResults[i][j] now contains a flag indicating the exception raised by test i on profile j - + return trueResults, testResults, profileIDs @@ -89,9 +92,19 @@ def processFile(fName): # Parallel processing. print('\nPlease wait while QC is performed\n') - processFile.parallel = main.parallel_function(processFile, sys.argv[2]) - parallel_result = processFile.parallel(filenames) + #processFile.parallel = main.parallel_function(processFile, sys.argv[2]) + #parallel_result = processFile.parallel(filenames) + + pool = Pool(processes=int(sys.argv[2])) + parallel_result = [] + def log_result(result): + parallel_result.append(result) + for i in range(len(filenames)): + pool.apply_async(processFile, (filenames[i],), callback = log_result) + pool.close() + pool.join() + # Recombine results truth, results, profileIDs = main.combineArrays(parallel_result) From 5a8ac19dd0ea03cd764459a60a0a6b35a037fb40 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Mon, 4 Jul 2016 01:18:29 +0000 Subject: [PATCH 34/79] tentative new parallelization scheme --- AutoQC.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 340fb73..b9f712f 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -92,9 +92,11 @@ def processFile(fName): # Parallel processing. print('\nPlease wait while QC is performed\n') + # old-style---------------------------------- #processFile.parallel = main.parallel_function(processFile, sys.argv[2]) #parallel_result = processFile.parallel(filenames) - + + # tentative new-style------------------------ pool = Pool(processes=int(sys.argv[2])) parallel_result = [] def log_result(result): @@ -104,7 +106,8 @@ def log_result(result): pool.apply_async(processFile, (filenames[i],), callback = log_result) pool.close() pool.join() - + #-------------------------------------------- + # Recombine results truth, results, profileIDs = main.combineArrays(parallel_result) From 0a1a4ee19c7804861f662910ad4a53c2280099b0 Mon Sep 17 00:00:00 2001 From: BillMills Date: Mon, 4 Jul 2016 20:39:37 -0700 Subject: [PATCH 35/79] added truth, variable table name to postgres db builder; start postgres automatically on container launch --- docker/Dockerfile | 5 ++++- postgres/build-db.py | 13 +++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index d2ed46c..4963220 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -5,7 +5,7 @@ RUN conda config --set always_yes yes --set changeps1 no RUN conda update -q conda RUN apt-get update -# dependencies! +# dependencies RUN apt-get -y install libhdf5-serial-dev libnetcdf-dev unzip postgresql libpq-dev python-dev nano RUN conda install --yes python=2.7 pip nose Shapely netCDF4 matplotlib numpy scipy pyproj pandas @@ -30,4 +30,7 @@ ADD woa13_decav_s16_5dv2.nc /AutoQC/data/. ADD etopo5.nc /AutoQC/data/. ADD climatological_t_median_and_amd_for_aqc.nc /AutoQC/data/. +# set up database; load quota_subset.dat into a table 'demo'. +RUN /etc/init.d/postgresql start && su postgres -c 'createuser -s root' && su postgres -c 'createdb root' + ADD bashrc /.bashrc diff --git a/postgres/build-db.py b/postgres/build-db.py index e32a744..3d7d7e6 100644 --- a/postgres/build-db.py +++ b/postgres/build-db.py @@ -1,3 +1,5 @@ +# usage: python build-db.py
+ import psycopg2 from wodpy import wod import sys @@ -11,7 +13,7 @@ cur = conn.cursor() # set up our table -query = """CREATE TABLE IF NOT EXISTS profiles( +query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( lat real, long real, uid integer, @@ -23,7 +25,8 @@ probetype integer, depth real[], temperature real[], - salinity real[] + salinity real[], + truth boolean );""" cur.execute(query) @@ -35,8 +38,9 @@ wodDict['z'] = "'{" + ",".join(map(str, wodDict['z'])) + "}'" wodDict['t'] = "'{" + ",".join(map(str, wodDict['t'])) + "}'" wodDict['s'] = "'{" + ",".join(map(str, wodDict['s'])) + "}'" + wodDict['truth'] = profile.t_level_qc(originator=True) >= 3 - query = """INSERT INTO profiles VALUES( + query = "INSERT INTO " + sys.argv[2] + """ VALUES( {p[latitude]}, {p[longitude]}, {p[uid]}, @@ -48,7 +52,8 @@ {p[probe_type]}, {p[z]}, {p[t]}, - {p[s]} + {p[s]}, + {p[truth]} )""".format(p=wodDict) query = query.replace('--', 'NULL') query = query.replace('None', 'NULL') From 1eb80778aadb24fb0a4859fc68d7f6ab2e93bc31 Mon Sep 17 00:00:00 2001 From: BillMills Date: Mon, 4 Jul 2016 20:45:10 -0700 Subject: [PATCH 36/79] corrections to previous --- docker/bashrc | 1 + postgres/build-db.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/bashrc b/docker/bashrc index c6b09e4..46dc9a1 100644 --- a/docker/bashrc +++ b/docker/bashrc @@ -1 +1,2 @@ export OCEANSDB_DIR=/AutoQC/data/ +/etc/init.d/postgresql start diff --git a/postgres/build-db.py b/postgres/build-db.py index 3d7d7e6..ce88b7d 100644 --- a/postgres/build-db.py +++ b/postgres/build-db.py @@ -38,7 +38,7 @@ wodDict['z'] = "'{" + ",".join(map(str, wodDict['z'])) + "}'" wodDict['t'] = "'{" + ",".join(map(str, wodDict['t'])) + "}'" wodDict['s'] = "'{" + ",".join(map(str, wodDict['s'])) + "}'" - wodDict['truth'] = profile.t_level_qc(originator=True) >= 3 + wodDict['truth'] = sum(profile.t_level_qc(originator=True) >= 3) >= 1 query = "INSERT INTO " + sys.argv[2] + """ VALUES( {p[latitude]}, From 5277e6f09a88b242e2202d2578466cc551d1e9ad Mon Sep 17 00:00:00 2001 From: BillMills Date: Mon, 4 Jul 2016 22:00:53 -0700 Subject: [PATCH 37/79] incremental process to async postgres row processing --- AutoQC.py | 53 +++++++++++++++++++++++++++++++++++++++++----------- util/main.py | 14 ++++++++++---- 2 files changed, 52 insertions(+), 15 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index b9f712f..34e8f9d 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -3,7 +3,7 @@ import numpy as np import sys, os, json, data.ds import util.main as main -import pandas +import pandas, psycopg2 from multiprocessing import Pool def run(test, profiles): @@ -96,24 +96,55 @@ def processFile(fName): #processFile.parallel = main.parallel_function(processFile, sys.argv[2]) #parallel_result = processFile.parallel(filenames) - # tentative new-style------------------------ - pool = Pool(processes=int(sys.argv[2])) + # new-style (per file)------------------------ + # pool = Pool(processes=int(sys.argv[2])) + # parallel_result = [] + # def log_result(result): + # '''helper to run as callback after a file is processed''' + # parallel_result.append(result) + + # for i in range(len(filenames)): + # pool.apply_async(processFile, (filenames[i],), callback = log_result) + # pool.close() + # pool.join() + # new-style (per db row)---------------------- parallel_result = [] def log_result(result): + '''helper to run as callback after a file is processed''' parallel_result.append(result) - for i in range(len(filenames)): - pool.apply_async(processFile, (filenames[i],), callback = log_result) + def process_row(i): + '''run all tests on the ith database row''' + + # extract profile + cur.execute('SELECT * FROM demo LIMIT 1 OFFSET ' + str(i)) + row = cur.fetchall() + profile = main.mock_wodpy(row[0]) + print profile.uid() + + conn = psycopg2.connect("dbname='root' user='root'") + cur = conn.cursor() + cur.execute('SELECT COUNT(*) FROM demo') + nRows = cur.fetchall()[0][0] + + # launch async processes + pool = Pool(processes=int(sys.argv[2])) + for i in range(10): + pool.apply_async(process_row, (i,), callback = log_result) pool.close() pool.join() - #-------------------------------------------- + + + + + # ------------------------------------------- - # Recombine results - truth, results, profileIDs = main.combineArrays(parallel_result) + # # Recombine results + # truth, results, profileIDs = main.combineArrays(parallel_result) - # Print summary statistics and write output file. - main.printSummary(truth, results, testNames) - main.generateCSV(truth, results, testNames, profileIDs, sys.argv[1]) + # # Print summary statistics and write output file. + # main.printSummary(truth, results, testNames) + # main.generateCSV(truth, results, testNames, profileIDs, sys.argv[1]) else: print 'Please add command line arguments to name your output file and set parallelization:' print 'python AutoQC myFile 4' diff --git a/util/main.py b/util/main.py index 16f678b..05040ed 100644 --- a/util/main.py +++ b/util/main.py @@ -73,7 +73,7 @@ def catchFlags(profile): def referenceResults(profiles): ''' - extract the summary reference result for each profile: + extract the summary reference result for each profile: DEPRECATED ''' refResult = [] verbose = [] @@ -108,7 +108,7 @@ def generateCSV(truth, results, tests, primaryKeys, name): def parallel_function(f, nfold=2): ''' - thanks http://scottsievert.github.io/blog/2014/07/30/simple-python-parallelism/ + thanks http://scottsievert.github.io/blog/2014/07/30/simple-python-parallelism/ DEPRECATED ''' def easy_parallize(f, sequence): """ assumes f takes sequence as input, easy w/ Python's scope """ @@ -251,9 +251,9 @@ def combineArrays(parallelResults): def sort_headers(headers): ''' - takes a list of headers, and sorts them into a dictionary keyed by cruise number + takes a list of headers, and sorts them into a dictionary keyed by cruise number containing a list of corresponding headers; - header lists are then time sorted. + header lists are then time sorted. DEPRECATED ''' sortedHeaders = {} @@ -269,7 +269,13 @@ def sort_headers(headers): return sortedHeaders +def mock_wodpy(row): + ''' + given a single row from a postgres cursor, return an object that mocks + a wodpy object with the same values + ''' + return testingProfile.fakeProfile(row[10], row[9], latitude=row[0], longitude=row[1], date=[row[4], row[5], row[6], row[7]], probe_type=row[8], salinities=row[11], pressures=None, uid=row[2], cruise=row[3]) From 2d150e4a9513ba7c4c0408b0f8d44a7bb5654f0b Mon Sep 17 00:00:00 2001 From: BillMills Date: Mon, 4 Jul 2016 22:03:26 -0700 Subject: [PATCH 38/79] remove a couple of hacks --- AutoQC.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 34e8f9d..d4e54b6 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -40,8 +40,6 @@ def processFile(fName): data.ds.threadFile = fName for iprofile, pinfo in enumerate(data.ds.threadProfiles): - if iprofile >= 10: - continue # Load the profile data. p, currentFile, f = main.profileData(pinfo, currentFile, f) # Check that there are temperature data in the profile, otherwise skip. @@ -129,7 +127,7 @@ def process_row(i): # launch async processes pool = Pool(processes=int(sys.argv[2])) - for i in range(10): + for i in range(nRows): pool.apply_async(process_row, (i,), callback = log_result) pool.close() pool.join() From a38e4dd4e35632fe3df90478799853346dbc3dc1 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Tue, 12 Jul 2016 03:34:52 +0000 Subject: [PATCH 39/79] moving towards full testing --- AutoQC.py | 46 +++++++++++------------------ postgres/build-db.py => build-db.py | 18 +++++++++-- util/main.py | 6 ++-- util/testingProfile.py | 10 +++++-- 4 files changed, 43 insertions(+), 37 deletions(-) rename postgres/build-db.py => build-db.py (79%) diff --git a/AutoQC.py b/AutoQC.py index d4e54b6..71b09c1 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -82,34 +82,8 @@ def processFile(fName): for testName in testNames: print(' {}'.format(testName)) - # Identify data files and create a profile list. - filenames = main.readInput('datafiles.json') - profiles = main.extractProfiles(filenames) - data.ds.profiles = profiles - print('\n{} file(s) will be read containing {} profiles'.format(len(filenames), len(profiles))) - # Parallel processing. print('\nPlease wait while QC is performed\n') - # old-style---------------------------------- - #processFile.parallel = main.parallel_function(processFile, sys.argv[2]) - #parallel_result = processFile.parallel(filenames) - - # new-style (per file)------------------------ - # pool = Pool(processes=int(sys.argv[2])) - # parallel_result = [] - # def log_result(result): - # '''helper to run as callback after a file is processed''' - # parallel_result.append(result) - - # for i in range(len(filenames)): - # pool.apply_async(processFile, (filenames[i],), callback = log_result) - # pool.close() - # pool.join() - # new-style (per db row)---------------------- - parallel_result = [] - def log_result(result): - '''helper to run as callback after a file is processed''' - parallel_result.append(result) def process_row(i): '''run all tests on the ith database row''' @@ -118,8 +92,22 @@ def process_row(i): cur.execute('SELECT * FROM demo LIMIT 1 OFFSET ' + str(i)) row = cur.fetchall() profile = main.mock_wodpy(row[0]) + + # data pre-validation + # ---tbd--- + + # run tests + results = [profile.qcflag()] + for itest, test in enumerate(testNames): + if test[0:5] != 'CSIRO': # testing on CSIRO suite for now + continue + result = run(test, [profile]) + query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" + cur.execute(query) + print profile.uid() + # connect to database & determine how many profiles are present conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() cur.execute('SELECT COUNT(*) FROM demo') @@ -127,14 +115,14 @@ def process_row(i): # launch async processes pool = Pool(processes=int(sys.argv[2])) - for i in range(nRows): - pool.apply_async(process_row, (i,), callback = log_result) + for i in range(nRows): # <-- this is not quite right; examine the list of uids printed in process_row, duplicates found. + pool.apply_async(process_row, (i,)) pool.close() pool.join() + conn.commit() - # ------------------------------------------- # # Recombine results diff --git a/postgres/build-db.py b/build-db.py similarity index 79% rename from postgres/build-db.py rename to build-db.py index ce88b7d..f5b49f7 100644 --- a/postgres/build-db.py +++ b/build-db.py @@ -3,6 +3,7 @@ import psycopg2 from wodpy import wod import sys +import util.main as main # connect to database and create a cursor by which to interact with it. try: @@ -12,6 +13,10 @@ cur = conn.cursor() +# Identify tests +testNames = main.importQC('qctests') +testNames.sort() + # set up our table query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( lat real, @@ -26,8 +31,15 @@ depth real[], temperature real[], salinity real[], - truth boolean - );""" + truth boolean, + """ +for i in range(len(testNames)): + query += testNames[i].lower() + ' boolean' + if i= 3) >= 1 - query = "INSERT INTO " + sys.argv[2] + """ VALUES( + query = "INSERT INTO " + sys.argv[2] + " (lat, long, uid, cruise, year, month, day, time, probetype, depth, temperature, salinity, truth) " + """ VALUES( {p[latitude]}, {p[longitude]}, {p[uid]}, diff --git a/util/main.py b/util/main.py index 05040ed..85eaec3 100644 --- a/util/main.py +++ b/util/main.py @@ -4,6 +4,7 @@ import numpy as np from wodpy import wod from netCDF4 import Dataset +import testingProfile def readInput(JSONlist): '''Create a list of data file names from a json array.''' @@ -274,9 +275,8 @@ def mock_wodpy(row): given a single row from a postgres cursor, return an object that mocks a wodpy object with the same values ''' - - return testingProfile.fakeProfile(row[10], row[9], latitude=row[0], longitude=row[1], date=[row[4], row[5], row[6], row[7]], probe_type=row[8], salinities=row[11], pressures=None, uid=row[2], cruise=row[3]) - + + return testingProfile.fakeProfile(row[10], row[9], latitude=row[0], longitude=row[1], date=[row[4], row[5], row[6], row[7]], probe_type=row[8], salinities=row[11], pressures=None, uid=row[2], cruise=row[3], qcflag=row[12]) diff --git a/util/testingProfile.py b/util/testingProfile.py index 904cbde..85f9289 100644 --- a/util/testingProfile.py +++ b/util/testingProfile.py @@ -7,7 +7,8 @@ class fakeProfile: implementations of qc-tests. ''' - def __init__(self, temperatures, depths, latitude=None, longitude=None, date=[1999, 12, 31, 0], probe_type=None, salinities=None, pressures=None, uid=None, cruise=None): + def __init__(self, temperatures, depths, latitude=None, longitude=None, date=[1999, 12, 31, 0], probe_type=None, salinities=None, pressures=None, uid=None, cruise=None, qcflag=False): + self.temperatures = temperatures if salinities is None: self.salinities = np.ma.array(temperatures, mask=True) @@ -29,6 +30,7 @@ def __init__(self, temperatures, depths, latitude=None, longitude=None, date=[19 self.primary_header['Time'] = date[3] self.primary_header['WOD unique cast number'] = uid self.primary_header['Cruise number'] = cruise + self.primary_header['QC summary flag'] = qcflag self.secondary_header = {'entries':[]} if probe_type is not None: @@ -117,4 +119,8 @@ def z_level_qc(self): return np.zeros(self.depths.shape).astype('bool') def t_qc_mask(self): - return np.zeros(self.temperatures.shape).astype('bool') \ No newline at end of file + return np.zeros(self.temperatures.shape).astype('bool') + + def qcflag(self): + """ Returns the time. """ + return self.primary_header['QC summary flag'] From 14cbbaef7fdf5dd82df06529c87a07c9bfc7e73c Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Wed, 13 Jul 2016 01:49:17 +0000 Subject: [PATCH 40/79] fixed loop over postgres rows --- AutoQC.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 71b09c1..fa7bbbe 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -85,11 +85,11 @@ def processFile(fName): # Parallel processing. print('\nPlease wait while QC is performed\n') - def process_row(i): + def process_row(uid): '''run all tests on the ith database row''' # extract profile - cur.execute('SELECT * FROM demo LIMIT 1 OFFSET ' + str(i)) + cur.execute('SELECT * FROM demo WHERE uid = ' + str(uid) ) row = cur.fetchall() profile = main.mock_wodpy(row[0]) @@ -107,16 +107,16 @@ def process_row(i): print profile.uid() - # connect to database & determine how many profiles are present + # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() - cur.execute('SELECT COUNT(*) FROM demo') - nRows = cur.fetchall()[0][0] + cur.execute('SELECT uid FROM demo') + uids = cur.fetchall() # launch async processes pool = Pool(processes=int(sys.argv[2])) - for i in range(nRows): # <-- this is not quite right; examine the list of uids printed in process_row, duplicates found. - pool.apply_async(process_row, (i,)) + for i in range(len(uids)): + pool.apply_async(process_row, (uids[i][0],)) pool.close() pool.join() From 3733375f27a0c214a9a43e1c9888c9d42f69c7bc Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 14 Jul 2016 23:15:23 +0000 Subject: [PATCH 41/79] began building summary from postgres table --- summarize-results.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 summarize-results.py diff --git a/summarize-results.py b/summarize-results.py new file mode 100644 index 0000000..c536010 --- /dev/null +++ b/summarize-results.py @@ -0,0 +1,30 @@ +import util.main as main +import psycopg2, pandas + +# what tests are available +testNames = main.importQC('qctests') +testNames.sort() + +testNames = [test for test in testNames if test[0:5] == 'CSIRO'] + +# connect to database +conn = psycopg2.connect("dbname='root' user='root'") +cur = conn.cursor() + +# extract matrix of test results and true flags into a dataframe +query = 'SELECT truth' +for test in testNames: + query += ', ' + test.lower() +query += ' FROM demo' + +cur.execute(query) +rawresults = cur.fetchall() + +df = pandas.DataFrame(rawresults) +df.columns = ['Truth'] + testNames + +# summarize results +print('%35s %7s %7s %7s %7s %7s' % ('NAME OF TEST', 'FAILS', 'TPR', 'FPR', 'TNR', 'FNR')) +for test in testNames: + tpr, fpr, fnr, tnr = main.calcRates(df[test].tolist(), df['Truth'].tolist()) + print('%35s %7i %6.1f%1s %6.1f%1s %6.1f%1s %6.1f%1s' % (test, sum(df[test].tolist()), tpr, '%', fpr, '%', tnr, '%', fnr, '%')) From e6f8c82ea5bb3534441af681d576566a9ebdc1d4 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 21 Jul 2016 06:55:26 +0000 Subject: [PATCH 42/79] rethinking on-the-fly data presence checking for new db backend --- AutoQC.py | 11 +++--- build-db.py | 6 ++- qctests/CSIRO_constant_bottom.py | 32 +++++++--------- qctests/CSIRO_depth.py | 18 ++++----- qctests/CSIRO_long_gradient.py | 32 +++++++--------- qctests/CSIRO_short_gradient.py | 24 +++++------- qctests/CSIRO_surface_spikes.py | 24 ++++++------ qctests/CSIRO_wire_break.py | 16 ++++---- util/main.py | 64 +++++++++++++++++++++++++++++--- 9 files changed, 132 insertions(+), 95 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index fa7bbbe..42a5259 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -91,21 +91,22 @@ def process_row(uid): # extract profile cur.execute('SELECT * FROM demo WHERE uid = ' + str(uid) ) row = cur.fetchall() - profile = main.mock_wodpy(row[0]) - + profile = main.row2dict(row[0]) + # data pre-validation # ---tbd--- # run tests - results = [profile.qcflag()] + results = [profile['qcflag']] for itest, test in enumerate(testNames): if test[0:5] != 'CSIRO': # testing on CSIRO suite for now continue + result = run(test, [profile]) - query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" + query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile['uid']) + ";" cur.execute(query) - print profile.uid() + print profile['uid'] # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") diff --git a/build-db.py b/build-db.py index f5b49f7..ae6632f 100644 --- a/build-db.py +++ b/build-db.py @@ -32,6 +32,7 @@ temperature real[], salinity real[], truth boolean, + n_levels integer, """ for i in range(len(testNames)): query += testNames[i].lower() + ' boolean' @@ -52,7 +53,7 @@ wodDict['s'] = "'{" + ",".join(map(str, wodDict['s'])) + "}'" wodDict['truth'] = sum(profile.t_level_qc(originator=True) >= 3) >= 1 - query = "INSERT INTO " + sys.argv[2] + " (lat, long, uid, cruise, year, month, day, time, probetype, depth, temperature, salinity, truth) " + """ VALUES( + query = "INSERT INTO " + sys.argv[2] + " (lat, long, uid, cruise, year, month, day, time, probetype, depth, temperature, salinity, truth, n_levels) " + """ VALUES( {p[latitude]}, {p[longitude]}, {p[uid]}, @@ -65,7 +66,8 @@ {p[z]}, {p[t]}, {p[s]}, - {p[truth]} + {p[truth]}, + {p[n_levels]} )""".format(p=wodDict) query = query.replace('--', 'NULL') query = query.replace('None', 'NULL') diff --git a/qctests/CSIRO_constant_bottom.py b/qctests/CSIRO_constant_bottom.py index 1a0efde..95fb50b 100644 --- a/qctests/CSIRO_constant_bottom.py +++ b/qctests/CSIRO_constant_bottom.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -11,30 +12,25 @@ def test(p): of quality control decisions with False where the data value has passed the check and True where it failed. """ - + # Get temperature values from the profile. - t = p.t() + t = p['t'] # depths - d = p.z() + d = p['z'] # is this an xbt? - isXBT = p.probe_type() == 2 - latitude = p.latitude() - + isXBT = p['probe_type'] == 2 + latitude = p['latitude'] + # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isDepth = (d.mask==False) - isData = isTemperature & isDepth + qc = numpy.zeros(len(t), dtype=bool) # need more than one level - if len(isData) < 2: + if len(d) < 2: return qc - + # constant temperature at bottom of profile, for latitude > -40 and bottom two depths at least 30m apart: - if isData[-1] and isData[-2] and isXBT: - if t.data[-1] == t.data[-2] and latitude > -40 and d.data[-1] - d.data[-2] > 30: + if main.dataPresent(('t', 'z'), -1, p) and main.dataPresent(('t', 'z'), -2, p) and isXBT: + if t[-1] == t[-2] and latitude > -40 and d[-1] - d[-2] > 30: qc[-1] = True - - return qc \ No newline at end of file + + return qc diff --git a/qctests/CSIRO_depth.py b/qctests/CSIRO_depth.py index d86d9d4..af91825 100644 --- a/qctests/CSIRO_depth.py +++ b/qctests/CSIRO_depth.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -13,21 +14,18 @@ def test(p): """ # Get depth values (m) from the profile. - d = p.z() + d = p['z'] # is this an xbt? - isXBT = p.probe_type() == 2 + isXBT = p['probe_type'] == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(p.n_levels(), dtype=bool) + qc = numpy.zeros(p['n_levels'], dtype=bool) - # check for gaps in data - isDepth = (d.mask==False) - - for i in range(p.n_levels()): - if isDepth[i]: + for i in range(p['n_levels']): + if main.dataPresent(('z'), i, p): # too-shallow temperatures on XBT probes # note we simply flag this profile for manual QC, in order to minimize false negatives. - if isXBT and d.data[i] < 3.6: + if isXBT and d[i] < 3.6: qc[i] = True - return qc \ No newline at end of file + return qc diff --git a/qctests/CSIRO_long_gradient.py b/qctests/CSIRO_long_gradient.py index ad3308d..881c174 100644 --- a/qctests/CSIRO_long_gradient.py +++ b/qctests/CSIRO_long_gradient.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -13,40 +14,35 @@ def test(p): """ # depths - d = p.z() + d = p['z'] # temperatures - t = p.t() + t = p['t'] # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isDepth = (d.mask==False) - isTemperature = (t.mask==False) - isData = isTemperature & isDepth + qc = numpy.zeros(len(t), dtype=bool) on_inv = False # are we currently in an inversion? - for i in range(0, p.n_levels()-1 ): - if isData[i] and isData[i+1]: + for i in range(0, p['n_levels']-1 ): + if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t', 'z'), i+1, p): # not interested below 5m: - if d.data[i] < 5: continue + if d[i] < 5: continue - if t.data[i+1] > t.data[i] and not on_inv: + if t[i+1] > t[i] and not on_inv: # entering an inversion - start_inv_temp = t.data[i] - start_inv_depth = d.data[i] + start_inv_temp = t[i] + start_inv_depth = d[i] potential_flag = i on_inv = True - if t.data[i+1] < t.data[i] and on_inv: + if t[i+1] < t[i] and on_inv: # exiting the inversion - end_inv_temp = t.data[i] - end_inv_depth = d.data[i] + end_inv_temp = t[i] + end_inv_depth = d[i] on_inv = False gradlong = (end_inv_depth - start_inv_depth) / (end_inv_temp - start_inv_depth) if abs(gradlong) < 4: qc[potential_flag] = True - return qc \ No newline at end of file + return qc diff --git a/qctests/CSIRO_short_gradient.py b/qctests/CSIRO_short_gradient.py index 959756a..9de632b 100644 --- a/qctests/CSIRO_short_gradient.py +++ b/qctests/CSIRO_short_gradient.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -13,25 +14,20 @@ def test(p): """ # depths - d = p.z() + d = p['z'] # temperatures - t = p.t() - + t = p['t'] + # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isDepth = (d.mask==False) - isTemperature = (t.mask==False) - isData = isTemperature & isDepth + qc = numpy.zeros(len(t), dtype=bool) - for i in range(0, p.n_levels()-1 ): - if isData[i] and isData[i+1]: - deltaD = (d.data[i+1] - d.data[i]) - deltaT = (t.data[i+1] - t.data[i]) + for i in range(0, p['n_levels']-1 ): + if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t', 'z'), i+1, p): + deltaD = (d[i+1] - d[i]) + deltaT = (t[i+1] - t[i]) gradshort = deltaD / deltaT if (deltaT > 0.5 and deltaD < 30) or abs(gradshort) < 0.4 or (gradshort > 0 and gradshort < 12.5): if abs(deltaT) > 0.4: qc[i] = True - return qc \ No newline at end of file + return qc diff --git a/qctests/CSIRO_surface_spikes.py b/qctests/CSIRO_surface_spikes.py index f88c601..ac2e3cc 100644 --- a/qctests/CSIRO_surface_spikes.py +++ b/qctests/CSIRO_surface_spikes.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -13,26 +14,23 @@ def test(p): """ # depths - d = p.z() + d = p['z'] # is this an xbt? - isXBT = p.probe_type() == 2 + isXBT = p['probe_type'] == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(len(d.data), dtype=bool) - - # check for gaps in data - isDepth = (d.mask==False) + qc = numpy.zeros(len(d), dtype=bool) if not isXBT: return qc - + # flag any level that is shallower than 4m and is followed by a level shallower than 8m. - for i in range(p.n_levels()): - if isDepth[i]: - if d.data[i] < 4 and i < p.n_levels()-1: #only interested in depths less than 4m and not at the bottom of the profile. - if d.data[i+1] < 8: + for i in range(p['n_levels']): + if main.dataPresent(('z'), i, p): + if d[i] < 4 and i < p['n_levels']-1: #only interested in depths less than 4m and not at the bottom of the profile. + if d[i+1] < 8: qc[i] = True else: break - - return qc \ No newline at end of file + + return qc diff --git a/qctests/CSIRO_wire_break.py b/qctests/CSIRO_wire_break.py index 68fc2e7..f8196b6 100644 --- a/qctests/CSIRO_wire_break.py +++ b/qctests/CSIRO_wire_break.py @@ -4,6 +4,7 @@ """ import numpy +import util.main as main def test(p): """ @@ -13,19 +14,16 @@ def test(p): """ # Get temperature values from the profile. - t = p.t() + t = p['t'] # is this an xbt? - isXBT = p.probe_type() == 2 + isXBT = p['probe_type'] == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) + qc = numpy.zeros(len(t), dtype=bool) # wire breaks at bottom of profile: - if isTemperature[-1] and isXBT: - if t.data[-1] < -2.8 or t.data[-1] > 36: + if main.dataPresent(('t'), -1, p) and isXBT: + if t[-1] < -2.8 or t[-1] > 36: qc[-1] = True - return qc \ No newline at end of file + return qc diff --git a/util/main.py b/util/main.py index 85eaec3..16c078d 100644 --- a/util/main.py +++ b/util/main.py @@ -5,6 +5,7 @@ from wodpy import wod from netCDF4 import Dataset import testingProfile +from numbers import Number def readInput(JSONlist): '''Create a list of data file names from a json array.''' @@ -278,10 +279,61 @@ def mock_wodpy(row): return testingProfile.fakeProfile(row[10], row[9], latitude=row[0], longitude=row[1], date=[row[4], row[5], row[6], row[7]], probe_type=row[8], salinities=row[11], pressures=None, uid=row[2], cruise=row[3], qcflag=row[12]) +def row2dict(row): + ''' + given a single row from a postgres cursor, return a dictionary containing the row's info, keyed as a wodpy object + ''' - - - - - - + profile = { + 'latitude': row[0], + 'longitude': row[1], + 'uid': row[2], + 'cruise': row[3], + 'year': row[4], + 'month': row[5], + 'day': row[6], + 'time': row[7], + 'probe_type': row[8], + 'z': row[9], + 't': row[10], + 's': row[11], + 'qcflag': row[12], + 'n_levels': row[13] + } + + return profile + +def dataPresent(keys, level, profile): + ''' + keys: tuple of key names found in the return object of row2dict + level: index number of level in question + profile: return object from row2dict + returns true if all the listed keys have a sensible value in the provided profile at the indicated level; + false otherwise. + ''' + + present = True + + for key in keys: + if key in ['latitude', 'longitude', 'time']: + # must be float + present = present and isinstance(profile[key], Number) + + elif key in ['uid', 'cruise', 'year', 'month', 'day', 'probe_type', 'n_levels']: + # muse be int + present = present and isinstance(profile[key], (int, long)) + + elif key in ['z', 't', 's']: + # must be float at given level + if level >= len(profile[key]): + return False + present = present and isinstance(profile[key][level], Number) + if key == 't': + # t = 99.9 indicates missing value + present = present and profile[key][level] != 99.9 + + elif key in ['qcflag']: + # must be bool + present = present and isinstance(profile[key], bool) + + return present From ebee3daddbc16f5d185d2d49ecc50e456fdc333a Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 21 Jul 2016 23:57:20 +0000 Subject: [PATCH 43/79] fix for csiro short gradient divide by 0 problems --- qctests/CSIRO_short_gradient.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qctests/CSIRO_short_gradient.py b/qctests/CSIRO_short_gradient.py index 9de632b..0a79b7f 100644 --- a/qctests/CSIRO_short_gradient.py +++ b/qctests/CSIRO_short_gradient.py @@ -20,11 +20,13 @@ def test(p): # initialize qc as a bunch of falses; qc = numpy.zeros(len(t), dtype=bool) - + for i in range(0, p['n_levels']-1 ): if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t', 'z'), i+1, p): deltaD = (d[i+1] - d[i]) deltaT = (t[i+1] - t[i]) + if deltaT == 0: + continue gradshort = deltaD / deltaT if (deltaT > 0.5 and deltaD < 30) or abs(gradshort) < 0.4 or (gradshort > 0 and gradshort < 12.5): if abs(deltaT) > 0.4: From ecef1324a394ccd10fcb4d367475a79fc585418a Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Fri, 22 Jul 2016 00:50:57 +0000 Subject: [PATCH 44/79] began translating argo tests --- AutoQC.py | 4 +-- qctests/Argo_global_range_check.py | 17 ++++++--- qctests/Argo_gradient_test.py | 22 +++++------- qctests/Argo_impossible_date_test.py | 8 ++--- qctests/Argo_impossible_location_test.py | 4 +-- qctests/Argo_pressure_increasing_test.py | 44 ++++++++++++------------ qctests/Argo_regional_range_test.py | 18 +++++----- qctests/Argo_spike_test.py | 22 +++++------- summarize-results.py | 2 +- util/obs_utils.py | 4 +-- 10 files changed, 69 insertions(+), 76 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 42a5259..508c137 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -99,9 +99,9 @@ def process_row(uid): # run tests results = [profile['qcflag']] for itest, test in enumerate(testNames): - if test[0:5] != 'CSIRO': # testing on CSIRO suite for now + if test[0:4] != 'Argo': # testing on Argo suite for now continue - + result = run(test, [profile]) query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile['uid']) + ";" cur.execute(query) diff --git a/qctests/Argo_global_range_check.py b/qctests/Argo_global_range_check.py index f20cc95..8d38363 100644 --- a/qctests/Argo_global_range_check.py +++ b/qctests/Argo_global_range_check.py @@ -6,6 +6,8 @@ """ from util import obs_utils +import util.main as main +import numpy def test(p): """ @@ -15,15 +17,20 @@ def test(p): """ # Get temperature and pressure values from the profile. - t = p.t() - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + t = p['t'] + z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) + # initialize qc as a bunch of falses; + qc = numpy.zeros(p['n_levels'], dtype=bool) + # Make the quality control decisions. This should # return true if the temperature is outside -2.5 deg C # and 40 deg C or pressure is less than -5. - qct = (t.mask == False) & ((t.data < -2.5) | (t.data > 40.0)) - qcp = (z.mask == False) & (z.data < -5) - qc = qct | qcp + for i in range(p['n_levels']): + if main.dataPresent(('t'), i, p): + qc[i] == t[i] > -2.5 and t[i] < 40.0 + if main.dataPresent(('z', 'latitude'), i, p): + qc[i] == qc[i] and z[i] > -5 return qc diff --git a/qctests/Argo_gradient_test.py b/qctests/Argo_gradient_test.py index 4daddf6..1f83f74 100644 --- a/qctests/Argo_gradient_test.py +++ b/qctests/Argo_gradient_test.py @@ -4,6 +4,7 @@ import numpy from util import obs_utils +import util.main as main def test(p): """ @@ -13,27 +14,20 @@ def test(p): """ # Get temperature values from the profile. - t = p.t() + t = p['t'] # Get depth values (m) from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' + z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) # initialize qc as a bunch of falses; # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isPressure = (z.mask==False) - isData = isTemperature & isPressure + qc = numpy.zeros(p['n_levels'], dtype=bool) - for i in range(1,len(t.data)-1): - if isData[i] & isTemperature[i-1] & isTemperature[i+1]: + for i in range(1,p['n_levels']-1): + if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t'), i-1, p) and main.dataPresent(('t'), i+1, p): - isSlope = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) + isSlope = numpy.abs(t[i] - (t[i-1] + t[i+1])/2) - if z.data[i] < 500: + if z[i] < 500: qc[i] = isSlope > 9.0 else: qc[i] = isSlope > 3.0 diff --git a/qctests/Argo_impossible_date_test.py b/qctests/Argo_impossible_date_test.py index 963736b..f641a19 100644 --- a/qctests/Argo_impossible_date_test.py +++ b/qctests/Argo_impossible_date_test.py @@ -15,10 +15,10 @@ def test(p): """ # Get the year, month, day and time: - year = p.year() - month = p.month() - day = p.day() - time = p.time() + year = p['year'] + month = p['month'] + day = p['day'] + time = p['time'] # initialize qc as false: qc = numpy.zeros(1, dtype=bool) diff --git a/qctests/Argo_impossible_location_test.py b/qctests/Argo_impossible_location_test.py index 8a2276f..bbd2321 100644 --- a/qctests/Argo_impossible_location_test.py +++ b/qctests/Argo_impossible_location_test.py @@ -13,8 +13,8 @@ def test(p): """ # Get the lat and long: - latitude = p.latitude() - longitude = p.longitude() + latitude = p['latitude'] + longitude = p['longitude'] # initialize qc as false: qc = numpy.zeros(1, dtype=bool) diff --git a/qctests/Argo_pressure_increasing_test.py b/qctests/Argo_pressure_increasing_test.py index 6f25b89..6a54d3c 100644 --- a/qctests/Argo_pressure_increasing_test.py +++ b/qctests/Argo_pressure_increasing_test.py @@ -8,6 +8,7 @@ import numpy as np from util import obs_utils +import util.main as main def test(p): """ @@ -15,36 +16,35 @@ def test(p): of quality control decisions with False where the data value has passed the check and True where it failed. """ - + # Get vertical coordinate values from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - + z = obs_utils.depth_to_pressure(np.asarray(p['z']), p['latitude']) + # Make the quality control decisions. This should # return true where z decreases or stays the same. - qc = np.ndarray(p.n_levels(), dtype=bool) + qc = np.ndarray(p['n_levels'], dtype=bool) qc[:] = False iRef = -1 - for i in range(0, p.n_levels()): + for i in range(0, p['n_levels']): # Check if the data value is missing. - if z.mask[i] == True: - continue + if main.dataPresent(('z'), i, p): - # The first level with a z value is saved to use as a reference - # to compare to the next level. - if iRef == -1: - iRef = i - zRef = z[iRef] - continue + # The first level with a z value is saved to use as a reference + # to compare to the next level. + if iRef == -1: + iRef = i + zRef = z[iRef] + continue - # Check for non-increasing z. If z increases, update the reference. - if z[i] == zRef: - qc[i] = True - elif z[i] < zRef: - qc[iRef] = True - qc[i] = True - else: - iRef = i - zRef = z[iRef] + # Check for non-increasing z. If z increases, update the reference. + if z[i] == zRef: + qc[i] = True + elif z[i] < zRef: + qc[iRef] = True + qc[i] = True + else: + iRef = i + zRef = z[iRef] return qc diff --git a/qctests/Argo_regional_range_test.py b/qctests/Argo_regional_range_test.py index 3e2d89e..ddab536 100644 --- a/qctests/Argo_regional_range_test.py +++ b/qctests/Argo_regional_range_test.py @@ -5,6 +5,7 @@ import numpy import pyproj from shapely.geometry import Polygon, Point +import util.main as main def test(p): """ @@ -20,21 +21,18 @@ def test(p): mediterraneanLong = [6., 40., 35., 20., 15., 5., 6.] # Get the lat and long and temp: - latitude = p.latitude() - longitude = p.longitude() - t = p.t() - - # check for gaps in data - isTemperature = (t.mask==False) - + latitude = p['latitude'] + longitude = p['longitude'] + t = p['t'] + # initialize qc as false (all pass) - qc = numpy.zeros(len(t), dtype=bool) + qc = numpy.zeros(p['n_levels'], dtype=bool) isInRedSea = isInRegion(latitude, longitude, redSeaLat, redSeaLong) isInMediterranean = isInRegion(latitude, longitude, mediterraneanLat, mediterraneanLong) - for i in range(p.n_levels()): - if isTemperature[i]: + for i in range(p['n_levels']): + if main.dataPresent(('t'), i, p): if isInRedSea: if t[i] < 21.7 or t[i] > 40.: qc[i] = True diff --git a/qctests/Argo_spike_test.py b/qctests/Argo_spike_test.py index a302571..f5881f5 100644 --- a/qctests/Argo_spike_test.py +++ b/qctests/Argo_spike_test.py @@ -4,6 +4,7 @@ import numpy from util import obs_utils +import util.main as main def test(p): """ @@ -13,25 +14,18 @@ def test(p): """ # Get temperature values from the profile. - t = p.t() + t = p['t'] # Get pressure values (db) from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' - + z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) + # initialize qc as a bunch of falses; # implies all measurements pass when a spike can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isPressure = (z.mask==False) - isData = isTemperature & isPressure + qc = numpy.zeros(p['n_levels'], dtype=bool) - for i in range(1,len(t.data)-1): - if isData[i] & isTemperature[i-1] & isTemperature[i+1]: + for i in range(1,p['n_levels']-1): + if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t'), i-1, p) and main.dataPresent(('t'), i+1, p): - isSpike = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - numpy.abs((t.data[i+1] - t.data[i-1])/2) + isSpike = numpy.abs(t[i] - (t[i-1] + t[i+1])/2) - numpy.abs((t[i+1] - t[i-1])/2) if z.data[i] < 500: qc[i] = isSpike > 6.0 else: diff --git a/summarize-results.py b/summarize-results.py index c536010..4d5348a 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -5,7 +5,7 @@ testNames = main.importQC('qctests') testNames.sort() -testNames = [test for test in testNames if test[0:5] == 'CSIRO'] +testNames = [test for test in testNames if test[0:4] == 'Argo'] # connect to database conn = psycopg2.connect("dbname='root' user='root'") diff --git a/util/obs_utils.py b/util/obs_utils.py index 0c4f83f..cc8c3e5 100644 --- a/util/obs_utils.py +++ b/util/obs_utils.py @@ -89,9 +89,9 @@ def depth_to_pressure(z, lat): lat: scalar or numpy array of latitude (deg).""" assert np.array(lat).size > 0 and np.array(z).size > 0, 'No value provided for z or lat' - + p = gsw.p_from_z(-z, lat) - + return p def pressure_to_depth(p, lat): From e68dfaae9c1caf2d193ff4f3fd6fdab0d556c1d8 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 30 Jul 2016 23:39:02 +0000 Subject: [PATCH 45/79] trying full profile in db --- AutoQC.py | 17 +++++---- build-db.py | 44 +++++++++--------------- qctests/Argo_global_range_check.py | 17 +++------ qctests/Argo_gradient_test.py | 22 +++++++----- qctests/Argo_impossible_date_test.py | 8 ++--- qctests/Argo_impossible_location_test.py | 4 +-- qctests/Argo_pressure_increasing_test.py | 44 ++++++++++++------------ qctests/Argo_regional_range_test.py | 18 +++++----- qctests/Argo_spike_test.py | 22 +++++++----- util/obs_utils.py | 4 +-- 10 files changed, 101 insertions(+), 99 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 508c137..a18afed 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -5,6 +5,7 @@ import util.main as main import pandas, psycopg2 from multiprocessing import Pool +import tempfile def run(test, profiles): ''' @@ -87,33 +88,37 @@ def processFile(fName): def process_row(uid): '''run all tests on the ith database row''' - + # extract profile cur.execute('SELECT * FROM demo WHERE uid = ' + str(uid) ) row = cur.fetchall() - profile = main.row2dict(row[0]) + fProfile = tempfile.TemporaryFile() + fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row + fProfile.seek(0) + profile = wod.WodProfile(fProfile) + fProfile.close() # data pre-validation # ---tbd--- # run tests - results = [profile['qcflag']] + results = [row[0][1]] for itest, test in enumerate(testNames): if test[0:4] != 'Argo': # testing on Argo suite for now continue result = run(test, [profile]) - query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile['uid']) + ";" + query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) - print profile['uid'] + print profile.uid() # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() cur.execute('SELECT uid FROM demo') uids = cur.fetchall() - + # launch async processes pool = Pool(processes=int(sys.argv[2])) for i in range(len(uids)): diff --git a/build-db.py b/build-db.py index ae6632f..94ccdc9 100644 --- a/build-db.py +++ b/build-db.py @@ -19,20 +19,12 @@ # set up our table query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( + raw text, + truth boolean, + uid integer, lat real, long real, - uid integer, cruise integer, - year integer, - month integer, - day integer, - time real, - probetype integer, - depth real[], - temperature real[], - salinity real[], - truth boolean, - n_levels integer, """ for i in range(len(testNames)): query += testNames[i].lower() + ' boolean' @@ -46,28 +38,26 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) while True: + # extract profile as wodpy object and raw text + start = fid.tell() profile = wod.WodProfile(fid) + end = fid.tell() + fid.seek(start) + raw = fid.read(end-start) + fid.seek(end) + + # set up dictionary for populating query string wodDict = profile.npdict() - wodDict['z'] = "'{" + ",".join(map(str, wodDict['z'])) + "}'" - wodDict['t'] = "'{" + ",".join(map(str, wodDict['t'])) + "}'" - wodDict['s'] = "'{" + ",".join(map(str, wodDict['s'])) + "}'" + wodDict['raw'] = "'" + raw + "'" wodDict['truth'] = sum(profile.t_level_qc(originator=True) >= 3) >= 1 - query = "INSERT INTO " + sys.argv[2] + " (lat, long, uid, cruise, year, month, day, time, probetype, depth, temperature, salinity, truth, n_levels) " + """ VALUES( + query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, lat, long, cruise) " + """ VALUES( + {p[raw]}, + {p[truth]}, + {p[uid]}, {p[latitude]}, {p[longitude]}, - {p[uid]}, - {p[cruise]}, - {p[year]}, - {p[month]}, - {p[day]}, - {p[time]}, - {p[probe_type]}, - {p[z]}, - {p[t]}, - {p[s]}, - {p[truth]}, - {p[n_levels]} + {p[cruise]} )""".format(p=wodDict) query = query.replace('--', 'NULL') query = query.replace('None', 'NULL') diff --git a/qctests/Argo_global_range_check.py b/qctests/Argo_global_range_check.py index 8d38363..f20cc95 100644 --- a/qctests/Argo_global_range_check.py +++ b/qctests/Argo_global_range_check.py @@ -6,8 +6,6 @@ """ from util import obs_utils -import util.main as main -import numpy def test(p): """ @@ -17,20 +15,15 @@ def test(p): """ # Get temperature and pressure values from the profile. - t = p['t'] - z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) + t = p.t() + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - # initialize qc as a bunch of falses; - qc = numpy.zeros(p['n_levels'], dtype=bool) - # Make the quality control decisions. This should # return true if the temperature is outside -2.5 deg C # and 40 deg C or pressure is less than -5. - for i in range(p['n_levels']): - if main.dataPresent(('t'), i, p): - qc[i] == t[i] > -2.5 and t[i] < 40.0 - if main.dataPresent(('z', 'latitude'), i, p): - qc[i] == qc[i] and z[i] > -5 + qct = (t.mask == False) & ((t.data < -2.5) | (t.data > 40.0)) + qcp = (z.mask == False) & (z.data < -5) + qc = qct | qcp return qc diff --git a/qctests/Argo_gradient_test.py b/qctests/Argo_gradient_test.py index 1f83f74..4daddf6 100644 --- a/qctests/Argo_gradient_test.py +++ b/qctests/Argo_gradient_test.py @@ -4,7 +4,6 @@ import numpy from util import obs_utils -import util.main as main def test(p): """ @@ -14,20 +13,27 @@ def test(p): """ # Get temperature values from the profile. - t = p['t'] + t = p.t() # Get depth values (m) from the profile. - z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' # initialize qc as a bunch of falses; # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(p['n_levels'], dtype=bool) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isPressure = (z.mask==False) + isData = isTemperature & isPressure - for i in range(1,p['n_levels']-1): - if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t'), i-1, p) and main.dataPresent(('t'), i+1, p): + for i in range(1,len(t.data)-1): + if isData[i] & isTemperature[i-1] & isTemperature[i+1]: - isSlope = numpy.abs(t[i] - (t[i-1] + t[i+1])/2) + isSlope = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - if z[i] < 500: + if z.data[i] < 500: qc[i] = isSlope > 9.0 else: qc[i] = isSlope > 3.0 diff --git a/qctests/Argo_impossible_date_test.py b/qctests/Argo_impossible_date_test.py index f641a19..963736b 100644 --- a/qctests/Argo_impossible_date_test.py +++ b/qctests/Argo_impossible_date_test.py @@ -15,10 +15,10 @@ def test(p): """ # Get the year, month, day and time: - year = p['year'] - month = p['month'] - day = p['day'] - time = p['time'] + year = p.year() + month = p.month() + day = p.day() + time = p.time() # initialize qc as false: qc = numpy.zeros(1, dtype=bool) diff --git a/qctests/Argo_impossible_location_test.py b/qctests/Argo_impossible_location_test.py index bbd2321..8a2276f 100644 --- a/qctests/Argo_impossible_location_test.py +++ b/qctests/Argo_impossible_location_test.py @@ -13,8 +13,8 @@ def test(p): """ # Get the lat and long: - latitude = p['latitude'] - longitude = p['longitude'] + latitude = p.latitude() + longitude = p.longitude() # initialize qc as false: qc = numpy.zeros(1, dtype=bool) diff --git a/qctests/Argo_pressure_increasing_test.py b/qctests/Argo_pressure_increasing_test.py index 6a54d3c..6f25b89 100644 --- a/qctests/Argo_pressure_increasing_test.py +++ b/qctests/Argo_pressure_increasing_test.py @@ -8,7 +8,6 @@ import numpy as np from util import obs_utils -import util.main as main def test(p): """ @@ -16,35 +15,36 @@ def test(p): of quality control decisions with False where the data value has passed the check and True where it failed. """ - + # Get vertical coordinate values from the profile. - z = obs_utils.depth_to_pressure(np.asarray(p['z']), p['latitude']) - + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + # Make the quality control decisions. This should # return true where z decreases or stays the same. - qc = np.ndarray(p['n_levels'], dtype=bool) + qc = np.ndarray(p.n_levels(), dtype=bool) qc[:] = False iRef = -1 - for i in range(0, p['n_levels']): + for i in range(0, p.n_levels()): # Check if the data value is missing. - if main.dataPresent(('z'), i, p): + if z.mask[i] == True: + continue - # The first level with a z value is saved to use as a reference - # to compare to the next level. - if iRef == -1: - iRef = i - zRef = z[iRef] - continue + # The first level with a z value is saved to use as a reference + # to compare to the next level. + if iRef == -1: + iRef = i + zRef = z[iRef] + continue - # Check for non-increasing z. If z increases, update the reference. - if z[i] == zRef: - qc[i] = True - elif z[i] < zRef: - qc[iRef] = True - qc[i] = True - else: - iRef = i - zRef = z[iRef] + # Check for non-increasing z. If z increases, update the reference. + if z[i] == zRef: + qc[i] = True + elif z[i] < zRef: + qc[iRef] = True + qc[i] = True + else: + iRef = i + zRef = z[iRef] return qc diff --git a/qctests/Argo_regional_range_test.py b/qctests/Argo_regional_range_test.py index ddab536..3e2d89e 100644 --- a/qctests/Argo_regional_range_test.py +++ b/qctests/Argo_regional_range_test.py @@ -5,7 +5,6 @@ import numpy import pyproj from shapely.geometry import Polygon, Point -import util.main as main def test(p): """ @@ -21,18 +20,21 @@ def test(p): mediterraneanLong = [6., 40., 35., 20., 15., 5., 6.] # Get the lat and long and temp: - latitude = p['latitude'] - longitude = p['longitude'] - t = p['t'] - + latitude = p.latitude() + longitude = p.longitude() + t = p.t() + + # check for gaps in data + isTemperature = (t.mask==False) + # initialize qc as false (all pass) - qc = numpy.zeros(p['n_levels'], dtype=bool) + qc = numpy.zeros(len(t), dtype=bool) isInRedSea = isInRegion(latitude, longitude, redSeaLat, redSeaLong) isInMediterranean = isInRegion(latitude, longitude, mediterraneanLat, mediterraneanLong) - for i in range(p['n_levels']): - if main.dataPresent(('t'), i, p): + for i in range(p.n_levels()): + if isTemperature[i]: if isInRedSea: if t[i] < 21.7 or t[i] > 40.: qc[i] = True diff --git a/qctests/Argo_spike_test.py b/qctests/Argo_spike_test.py index f5881f5..a302571 100644 --- a/qctests/Argo_spike_test.py +++ b/qctests/Argo_spike_test.py @@ -4,7 +4,6 @@ import numpy from util import obs_utils -import util.main as main def test(p): """ @@ -14,18 +13,25 @@ def test(p): """ # Get temperature values from the profile. - t = p['t'] + t = p.t() # Get pressure values (db) from the profile. - z = obs_utils.depth_to_pressure(numpy.asarray(p['z']), p['latitude']) - + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' + # initialize qc as a bunch of falses; # implies all measurements pass when a spike can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(p['n_levels'], dtype=bool) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isPressure = (z.mask==False) + isData = isTemperature & isPressure - for i in range(1,p['n_levels']-1): - if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t'), i-1, p) and main.dataPresent(('t'), i+1, p): + for i in range(1,len(t.data)-1): + if isData[i] & isTemperature[i-1] & isTemperature[i+1]: - isSpike = numpy.abs(t[i] - (t[i-1] + t[i+1])/2) - numpy.abs((t[i+1] - t[i-1])/2) + isSpike = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - numpy.abs((t.data[i+1] - t.data[i-1])/2) if z.data[i] < 500: qc[i] = isSpike > 6.0 else: diff --git a/util/obs_utils.py b/util/obs_utils.py index cc8c3e5..0c4f83f 100644 --- a/util/obs_utils.py +++ b/util/obs_utils.py @@ -89,9 +89,9 @@ def depth_to_pressure(z, lat): lat: scalar or numpy array of latitude (deg).""" assert np.array(lat).size > 0 and np.array(z).size > 0, 'No value provided for z or lat' - + p = gsw.p_from_z(-z, lat) - + return p def pressure_to_depth(p, lat): From 0766ea30de1ed34aaafd6dca1efa122c68544343 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 31 Jul 2016 00:00:16 +0000 Subject: [PATCH 46/79] continuing to implement and validate full-profile db --- AutoQC.py | 12 +- qctests/Argo_global_range_check.py | 30 -- qctests/Argo_gradient_test.py | 41 -- qctests/Argo_impossible_date_test.py | 35 -- qctests/Argo_impossible_location_test.py | 27 -- qctests/Argo_pressure_increasing_test.py | 51 --- qctests/Argo_regional_range_test.py | 68 --- qctests/Argo_spike_test.py | 40 -- qctests/CSIRO_constant_bottom.py | 32 +- qctests/CSIRO_depth.py | 18 +- qctests/CSIRO_long_gradient.py | 32 +- qctests/CSIRO_short_gradient.py | 28 +- qctests/CSIRO_surface_spikes.py | 24 +- qctests/CSIRO_wire_break.py | 16 +- qctests/CoTeDe_Argo_density_inversion.py | 11 - qctests/CoTeDe_GTSPP_WOA_normbias.py | 11 - qctests/CoTeDe_GTSPP_global_range.py | 11 - qctests/CoTeDe_GTSPP_gradient.py | 11 - qctests/CoTeDe_GTSPP_profile_envelop.py | 11 - qctests/CoTeDe_GTSPP_spike_check.py | 11 - qctests/CoTeDe_WOA_normbias.py | 11 - qctests/CoTeDe_anomaly_detection.py | 11 - qctests/CoTeDe_digit_roll_over.py | 11 - qctests/CoTeDe_gradient.py | 11 - qctests/CoTeDe_location_at_sea_test.py | 11 - qctests/CoTeDe_rate_of_change.py | 11 - qctests/CoTeDe_spike.py | 11 - qctests/CoTeDe_tukey53H_norm.py | 11 - qctests/EN_background_available_check.py | 58 --- qctests/EN_background_check.py | 193 --------- qctests/EN_constant_value_check.py | 70 ---- qctests/EN_increasing_depth_check.py | 94 ----- qctests/EN_range_check.py | 23 - qctests/EN_spike_and_step_check.py | 202 --------- qctests/EN_spike_and_step_suspect.py | 7 - qctests/EN_stability_check.py | 176 -------- qctests/EN_std_lev_bkg_and_buddy_check.py | 369 ----------------- qctests/EN_track_check.py | 392 ------------------ qctests/ICDC_aqc_01_level_order.py | 111 ----- qctests/ICDC_aqc_02_crude_range.py | 68 --- qctests/ICDC_aqc_04_max_obs_depth.py | 54 --- qctests/ICDC_aqc_05_stuck_value.py | 71 ---- qctests/ICDC_aqc_06_n_temperature_extrema.py | 62 --- qctests/ICDC_aqc_07_spike_check.py | 75 ---- qctests/ICDC_aqc_08_gradient_check.py | 63 --- .../ICDC_aqc_09_local_climatology_check.py | 220 ---------- qctests/WOD_gradient_check.py | 45 -- qctests/WOD_range_check.py | 71 ---- qctests/loose_location_at_sea.py | 55 --- summarize-results.py | 2 +- 50 files changed, 92 insertions(+), 2997 deletions(-) delete mode 100644 qctests/Argo_global_range_check.py delete mode 100644 qctests/Argo_gradient_test.py delete mode 100644 qctests/Argo_impossible_date_test.py delete mode 100644 qctests/Argo_impossible_location_test.py delete mode 100644 qctests/Argo_pressure_increasing_test.py delete mode 100644 qctests/Argo_regional_range_test.py delete mode 100644 qctests/Argo_spike_test.py delete mode 100644 qctests/CoTeDe_Argo_density_inversion.py delete mode 100644 qctests/CoTeDe_GTSPP_WOA_normbias.py delete mode 100644 qctests/CoTeDe_GTSPP_global_range.py delete mode 100644 qctests/CoTeDe_GTSPP_gradient.py delete mode 100644 qctests/CoTeDe_GTSPP_profile_envelop.py delete mode 100644 qctests/CoTeDe_GTSPP_spike_check.py delete mode 100644 qctests/CoTeDe_WOA_normbias.py delete mode 100644 qctests/CoTeDe_anomaly_detection.py delete mode 100644 qctests/CoTeDe_digit_roll_over.py delete mode 100644 qctests/CoTeDe_gradient.py delete mode 100644 qctests/CoTeDe_location_at_sea_test.py delete mode 100644 qctests/CoTeDe_rate_of_change.py delete mode 100644 qctests/CoTeDe_spike.py delete mode 100644 qctests/CoTeDe_tukey53H_norm.py delete mode 100644 qctests/EN_background_available_check.py delete mode 100644 qctests/EN_background_check.py delete mode 100644 qctests/EN_constant_value_check.py delete mode 100644 qctests/EN_increasing_depth_check.py delete mode 100644 qctests/EN_range_check.py delete mode 100644 qctests/EN_spike_and_step_check.py delete mode 100644 qctests/EN_spike_and_step_suspect.py delete mode 100644 qctests/EN_stability_check.py delete mode 100644 qctests/EN_std_lev_bkg_and_buddy_check.py delete mode 100644 qctests/EN_track_check.py delete mode 100644 qctests/ICDC_aqc_01_level_order.py delete mode 100644 qctests/ICDC_aqc_02_crude_range.py delete mode 100644 qctests/ICDC_aqc_04_max_obs_depth.py delete mode 100644 qctests/ICDC_aqc_05_stuck_value.py delete mode 100644 qctests/ICDC_aqc_06_n_temperature_extrema.py delete mode 100644 qctests/ICDC_aqc_07_spike_check.py delete mode 100644 qctests/ICDC_aqc_08_gradient_check.py delete mode 100644 qctests/ICDC_aqc_09_local_climatology_check.py delete mode 100644 qctests/WOD_gradient_check.py delete mode 100644 qctests/WOD_range_check.py delete mode 100644 qctests/loose_location_at_sea.py diff --git a/AutoQC.py b/AutoQC.py index a18afed..73a8017 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -98,13 +98,17 @@ def process_row(uid): profile = wod.WodProfile(fProfile) fProfile.close() - # data pre-validation - # ---tbd--- - + # Check that there are temperature data in the profile, otherwise skip. + if profile.var_index() is None: + return + main.catchFlags(profile) + if np.sum(profile.t().mask == False) == 0: + return + # run tests results = [row[0][1]] for itest, test in enumerate(testNames): - if test[0:4] != 'Argo': # testing on Argo suite for now + if test[0:5] != 'CSIRO': # testing on Argo suite for now continue result = run(test, [profile]) diff --git a/qctests/Argo_global_range_check.py b/qctests/Argo_global_range_check.py deleted file mode 100644 index f20cc95..0000000 --- a/qctests/Argo_global_range_check.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -Implements the global range check used in the Argo quality control -system. - -See Argo quality control manual (based on version 2.5). -""" - -from util import obs_utils - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get temperature and pressure values from the profile. - t = p.t() - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - # Make the quality control decisions. This should - # return true if the temperature is outside -2.5 deg C - # and 40 deg C or pressure is less than -5. - qct = (t.mask == False) & ((t.data < -2.5) | (t.data > 40.0)) - qcp = (z.mask == False) & (z.data < -5) - qc = qct | qcp - - return qc - - diff --git a/qctests/Argo_gradient_test.py b/qctests/Argo_gradient_test.py deleted file mode 100644 index 4daddf6..0000000 --- a/qctests/Argo_gradient_test.py +++ /dev/null @@ -1,41 +0,0 @@ -""" -Implements the gradient test on page 8 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf -""" - -import numpy -from util import obs_utils - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get temperature values from the profile. - t = p.t() - # Get depth values (m) from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' - - # initialize qc as a bunch of falses; - # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isPressure = (z.mask==False) - isData = isTemperature & isPressure - - for i in range(1,len(t.data)-1): - if isData[i] & isTemperature[i-1] & isTemperature[i+1]: - - isSlope = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - - if z.data[i] < 500: - qc[i] = isSlope > 9.0 - else: - qc[i] = isSlope > 3.0 - - return qc diff --git a/qctests/Argo_impossible_date_test.py b/qctests/Argo_impossible_date_test.py deleted file mode 100644 index 963736b..0000000 --- a/qctests/Argo_impossible_date_test.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -Implements the impossible date test on page 6 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf - -The date criterion has been altered so that the test can be applied to all data types. -""" - -import numpy -import calendar - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get the year, month, day and time: - year = p.year() - month = p.month() - day = p.day() - time = p.time() - - # initialize qc as false: - qc = numpy.zeros(1, dtype=bool) - - if year < 1700: - qc[0] = True - elif month not in range(1,13): - qc[0] = True - elif day not in range(1, calendar.monthrange(year, month)[1] + 1): - qc[0] = True - elif time is not None and (time < 0 or time >= 24): - qc[0] = True - - return qc diff --git a/qctests/Argo_impossible_location_test.py b/qctests/Argo_impossible_location_test.py deleted file mode 100644 index 8a2276f..0000000 --- a/qctests/Argo_impossible_location_test.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -Implements the impossible location test on page 6 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf -""" - -import numpy -import calendar - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get the lat and long: - latitude = p.latitude() - longitude = p.longitude() - - # initialize qc as false: - qc = numpy.zeros(1, dtype=bool) - - if isinstance(latitude, float) and latitude < -90 or latitude > 90: - qc[0] = True - elif isinstance(longitude, float) and longitude < -180 or longitude > 180: - qc[0] = True - - return qc diff --git a/qctests/Argo_pressure_increasing_test.py b/qctests/Argo_pressure_increasing_test.py deleted file mode 100644 index 6f25b89..0000000 --- a/qctests/Argo_pressure_increasing_test.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -Implements the pressure increasing check used in the Argo quality control -system. - -See Argo quality control manual (based on version 2.5), -http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf page 8. -""" - -import numpy as np -from util import obs_utils - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get vertical coordinate values from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - # Make the quality control decisions. This should - # return true where z decreases or stays the same. - qc = np.ndarray(p.n_levels(), dtype=bool) - qc[:] = False - iRef = -1 - for i in range(0, p.n_levels()): - # Check if the data value is missing. - if z.mask[i] == True: - continue - - # The first level with a z value is saved to use as a reference - # to compare to the next level. - if iRef == -1: - iRef = i - zRef = z[iRef] - continue - - # Check for non-increasing z. If z increases, update the reference. - if z[i] == zRef: - qc[i] = True - elif z[i] < zRef: - qc[iRef] = True - qc[i] = True - else: - iRef = i - zRef = z[iRef] - - return qc - - diff --git a/qctests/Argo_regional_range_test.py b/qctests/Argo_regional_range_test.py deleted file mode 100644 index 3e2d89e..0000000 --- a/qctests/Argo_regional_range_test.py +++ /dev/null @@ -1,68 +0,0 @@ -""" -Implements the regional range test on page 7 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf -""" - -import numpy -import pyproj -from shapely.geometry import Polygon, Point - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - redSeaLat = [10., 20., 30., 10.] - redSeaLong = [40., 50., 30., 40.] - - mediterraneanLat = [30., 30., 40., 42., 50., 40., 30] - mediterraneanLong = [6., 40., 35., 20., 15., 5., 6.] - - # Get the lat and long and temp: - latitude = p.latitude() - longitude = p.longitude() - t = p.t() - - # check for gaps in data - isTemperature = (t.mask==False) - - # initialize qc as false (all pass) - qc = numpy.zeros(len(t), dtype=bool) - - isInRedSea = isInRegion(latitude, longitude, redSeaLat, redSeaLong) - isInMediterranean = isInRegion(latitude, longitude, mediterraneanLat, mediterraneanLong) - - for i in range(p.n_levels()): - if isTemperature[i]: - if isInRedSea: - if t[i] < 21.7 or t[i] > 40.: - qc[i] = True - if isInMediterranean: - if t[i] < 10. or t[i] > 40.: - qc[i] = True - - return qc - -def isInRegion(lat, longitude, regionLat, regionLong): - ''' - determine if the point lat, longitude is in the region bounded by a polygon with vertices regionLat, regionLong - adapted from solution at http://gis.stackexchange.com/questions/79215/determine-if-point-is-within-an-irregular-polygon-using-python - ''' - - # WGS84 datum - wgs84 = pyproj.Proj(init='EPSG:4326') - - # Albers Equal Area Conic (aea) - nplaea = pyproj.Proj("+proj=laea +lat_0=90 +lon_0=-40 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs") - - # Transform polygon and test point coordinates to northern lat AEAC projection - poly_x, poly_y = pyproj.transform(wgs84, nplaea, regionLong, regionLat) - point_x, point_y = pyproj.transform(wgs84, nplaea, [longitude], [lat]) - - poly_proj = Polygon(zip(poly_x,poly_y)) - - testPoint = Point(point_x[0], point_y[0]) - return testPoint.within(poly_proj) - - diff --git a/qctests/Argo_spike_test.py b/qctests/Argo_spike_test.py deleted file mode 100644 index a302571..0000000 --- a/qctests/Argo_spike_test.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Implements the spike test on page 8 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf -""" - -import numpy -from util import obs_utils - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get temperature values from the profile. - t = p.t() - # Get pressure values (db) from the profile. - z = obs_utils.depth_to_pressure(p.z(), p.latitude()) - - assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' - - # initialize qc as a bunch of falses; - # implies all measurements pass when a spike can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isPressure = (z.mask==False) - isData = isTemperature & isPressure - - for i in range(1,len(t.data)-1): - if isData[i] & isTemperature[i-1] & isTemperature[i+1]: - - isSpike = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - numpy.abs((t.data[i+1] - t.data[i-1])/2) - if z.data[i] < 500: - qc[i] = isSpike > 6.0 - else: - qc[i] = isSpike > 2.0 - - return qc diff --git a/qctests/CSIRO_constant_bottom.py b/qctests/CSIRO_constant_bottom.py index 95fb50b..1a0efde 100644 --- a/qctests/CSIRO_constant_bottom.py +++ b/qctests/CSIRO_constant_bottom.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -12,25 +11,30 @@ def test(p): of quality control decisions with False where the data value has passed the check and True where it failed. """ - + # Get temperature values from the profile. - t = p['t'] + t = p.t() # depths - d = p['z'] + d = p.z() # is this an xbt? - isXBT = p['probe_type'] == 2 - latitude = p['latitude'] - + isXBT = p.probe_type() == 2 + latitude = p.latitude() + # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t), dtype=bool) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isDepth = (d.mask==False) + isData = isTemperature & isDepth # need more than one level - if len(d) < 2: + if len(isData) < 2: return qc - + # constant temperature at bottom of profile, for latitude > -40 and bottom two depths at least 30m apart: - if main.dataPresent(('t', 'z'), -1, p) and main.dataPresent(('t', 'z'), -2, p) and isXBT: - if t[-1] == t[-2] and latitude > -40 and d[-1] - d[-2] > 30: + if isData[-1] and isData[-2] and isXBT: + if t.data[-1] == t.data[-2] and latitude > -40 and d.data[-1] - d.data[-2] > 30: qc[-1] = True - - return qc + + return qc \ No newline at end of file diff --git a/qctests/CSIRO_depth.py b/qctests/CSIRO_depth.py index af91825..d86d9d4 100644 --- a/qctests/CSIRO_depth.py +++ b/qctests/CSIRO_depth.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -14,18 +13,21 @@ def test(p): """ # Get depth values (m) from the profile. - d = p['z'] + d = p.z() # is this an xbt? - isXBT = p['probe_type'] == 2 + isXBT = p.probe_type() == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(p['n_levels'], dtype=bool) + qc = numpy.zeros(p.n_levels(), dtype=bool) - for i in range(p['n_levels']): - if main.dataPresent(('z'), i, p): + # check for gaps in data + isDepth = (d.mask==False) + + for i in range(p.n_levels()): + if isDepth[i]: # too-shallow temperatures on XBT probes # note we simply flag this profile for manual QC, in order to minimize false negatives. - if isXBT and d[i] < 3.6: + if isXBT and d.data[i] < 3.6: qc[i] = True - return qc + return qc \ No newline at end of file diff --git a/qctests/CSIRO_long_gradient.py b/qctests/CSIRO_long_gradient.py index 881c174..ad3308d 100644 --- a/qctests/CSIRO_long_gradient.py +++ b/qctests/CSIRO_long_gradient.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -14,35 +13,40 @@ def test(p): """ # depths - d = p['z'] + d = p.z() # temperatures - t = p['t'] + t = p.t() # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t), dtype=bool) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isDepth = (d.mask==False) + isTemperature = (t.mask==False) + isData = isTemperature & isDepth on_inv = False # are we currently in an inversion? - for i in range(0, p['n_levels']-1 ): - if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t', 'z'), i+1, p): + for i in range(0, p.n_levels()-1 ): + if isData[i] and isData[i+1]: # not interested below 5m: - if d[i] < 5: continue + if d.data[i] < 5: continue - if t[i+1] > t[i] and not on_inv: + if t.data[i+1] > t.data[i] and not on_inv: # entering an inversion - start_inv_temp = t[i] - start_inv_depth = d[i] + start_inv_temp = t.data[i] + start_inv_depth = d.data[i] potential_flag = i on_inv = True - if t[i+1] < t[i] and on_inv: + if t.data[i+1] < t.data[i] and on_inv: # exiting the inversion - end_inv_temp = t[i] - end_inv_depth = d[i] + end_inv_temp = t.data[i] + end_inv_depth = d.data[i] on_inv = False gradlong = (end_inv_depth - start_inv_depth) / (end_inv_temp - start_inv_depth) if abs(gradlong) < 4: qc[potential_flag] = True - return qc + return qc \ No newline at end of file diff --git a/qctests/CSIRO_short_gradient.py b/qctests/CSIRO_short_gradient.py index 0a79b7f..959756a 100644 --- a/qctests/CSIRO_short_gradient.py +++ b/qctests/CSIRO_short_gradient.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -14,22 +13,25 @@ def test(p): """ # depths - d = p['z'] + d = p.z() # temperatures - t = p['t'] - + t = p.t() + # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t), dtype=bool) - - for i in range(0, p['n_levels']-1 ): - if main.dataPresent(('t', 'z'), i, p) and main.dataPresent(('t', 'z'), i+1, p): - deltaD = (d[i+1] - d[i]) - deltaT = (t[i+1] - t[i]) - if deltaT == 0: - continue + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isDepth = (d.mask==False) + isTemperature = (t.mask==False) + isData = isTemperature & isDepth + + for i in range(0, p.n_levels()-1 ): + if isData[i] and isData[i+1]: + deltaD = (d.data[i+1] - d.data[i]) + deltaT = (t.data[i+1] - t.data[i]) gradshort = deltaD / deltaT if (deltaT > 0.5 and deltaD < 30) or abs(gradshort) < 0.4 or (gradshort > 0 and gradshort < 12.5): if abs(deltaT) > 0.4: qc[i] = True - return qc + return qc \ No newline at end of file diff --git a/qctests/CSIRO_surface_spikes.py b/qctests/CSIRO_surface_spikes.py index ac2e3cc..f88c601 100644 --- a/qctests/CSIRO_surface_spikes.py +++ b/qctests/CSIRO_surface_spikes.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -14,23 +13,26 @@ def test(p): """ # depths - d = p['z'] + d = p.z() # is this an xbt? - isXBT = p['probe_type'] == 2 + isXBT = p.probe_type() == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(len(d), dtype=bool) + qc = numpy.zeros(len(d.data), dtype=bool) + + # check for gaps in data + isDepth = (d.mask==False) if not isXBT: return qc - + # flag any level that is shallower than 4m and is followed by a level shallower than 8m. - for i in range(p['n_levels']): - if main.dataPresent(('z'), i, p): - if d[i] < 4 and i < p['n_levels']-1: #only interested in depths less than 4m and not at the bottom of the profile. - if d[i+1] < 8: + for i in range(p.n_levels()): + if isDepth[i]: + if d.data[i] < 4 and i < p.n_levels()-1: #only interested in depths less than 4m and not at the bottom of the profile. + if d.data[i+1] < 8: qc[i] = True else: break - - return qc + + return qc \ No newline at end of file diff --git a/qctests/CSIRO_wire_break.py b/qctests/CSIRO_wire_break.py index f8196b6..68fc2e7 100644 --- a/qctests/CSIRO_wire_break.py +++ b/qctests/CSIRO_wire_break.py @@ -4,7 +4,6 @@ """ import numpy -import util.main as main def test(p): """ @@ -14,16 +13,19 @@ def test(p): """ # Get temperature values from the profile. - t = p['t'] + t = p.t() # is this an xbt? - isXBT = p['probe_type'] == 2 + isXBT = p.probe_type() == 2 # initialize qc as a bunch of falses; - qc = numpy.zeros(len(t), dtype=bool) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) # wire breaks at bottom of profile: - if main.dataPresent(('t'), -1, p) and isXBT: - if t[-1] < -2.8 or t[-1] > 36: + if isTemperature[-1] and isXBT: + if t.data[-1] < -2.8 or t.data[-1] > 36: qc[-1] = True - return qc + return qc \ No newline at end of file diff --git a/qctests/CoTeDe_Argo_density_inversion.py b/qctests/CoTeDe_Argo_density_inversion.py deleted file mode 100644 index 26b9493..0000000 --- a/qctests/CoTeDe_Argo_density_inversion.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the density inversion QC from the CoTeDe Argo config.''' - - config = 'argo' - testname = 'density_inversion' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_GTSPP_WOA_normbias.py b/qctests/CoTeDe_GTSPP_WOA_normbias.py deleted file mode 100644 index e040cd2..0000000 --- a/qctests/CoTeDe_GTSPP_WOA_normbias.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the WOA normbias QC from the CoTeDe GTSPP config.''' - - config = 'gtspp' - testname = 'woa_normbias' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_GTSPP_global_range.py b/qctests/CoTeDe_GTSPP_global_range.py deleted file mode 100644 index 4d4896d..0000000 --- a/qctests/CoTeDe_GTSPP_global_range.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the global range QC from the CoTeDe GTSPP config.''' - - config = 'gtspp' - testname = 'global_range' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_GTSPP_gradient.py b/qctests/CoTeDe_GTSPP_gradient.py deleted file mode 100644 index da97a9d..0000000 --- a/qctests/CoTeDe_GTSPP_gradient.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the gradient QC from the CoTeDe GTSPP config.''' - - config = 'gtspp' - testname = 'gradient' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_GTSPP_profile_envelop.py b/qctests/CoTeDe_GTSPP_profile_envelop.py deleted file mode 100644 index 1645451..0000000 --- a/qctests/CoTeDe_GTSPP_profile_envelop.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the profile_envelop QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'profile_envelop' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_GTSPP_spike_check.py b/qctests/CoTeDe_GTSPP_spike_check.py deleted file mode 100644 index eaa68fe..0000000 --- a/qctests/CoTeDe_GTSPP_spike_check.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the spike QC from the CoTeDe GTSPP config.''' - - config = 'gtspp' - testname = 'spike' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_WOA_normbias.py b/qctests/CoTeDe_WOA_normbias.py deleted file mode 100644 index 2b9bc1c..0000000 --- a/qctests/CoTeDe_WOA_normbias.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the WOA normbias QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'woa_normbias' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_anomaly_detection.py b/qctests/CoTeDe_anomaly_detection.py deleted file mode 100644 index d1c4f05..0000000 --- a/qctests/CoTeDe_anomaly_detection.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the CoTeDe Anomaly Detection QC.''' - - config = 'anomaly_detection' - testname = 'anomaly_detection' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_digit_roll_over.py b/qctests/CoTeDe_digit_roll_over.py deleted file mode 100644 index f1d0c0a..0000000 --- a/qctests/CoTeDe_digit_roll_over.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the digit roll over QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'digit_roll_over' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_gradient.py b/qctests/CoTeDe_gradient.py deleted file mode 100644 index 820bf6c..0000000 --- a/qctests/CoTeDe_gradient.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the gradient QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'gradient' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_location_at_sea_test.py b/qctests/CoTeDe_location_at_sea_test.py deleted file mode 100644 index 48cb346..0000000 --- a/qctests/CoTeDe_location_at_sea_test.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the CoTeDe location at sea QC.''' - - config = 'cotede' - testname = 'location_at_sea' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_rate_of_change.py b/qctests/CoTeDe_rate_of_change.py deleted file mode 100644 index f852aa0..0000000 --- a/qctests/CoTeDe_rate_of_change.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the rate_of_change QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'rate_of_change' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_spike.py b/qctests/CoTeDe_spike.py deleted file mode 100644 index 004ebd2..0000000 --- a/qctests/CoTeDe_spike.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the spike QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'spike' - - return get_qc(p, config, testname) - - diff --git a/qctests/CoTeDe_tukey53H_norm.py b/qctests/CoTeDe_tukey53H_norm.py deleted file mode 100644 index a444708..0000000 --- a/qctests/CoTeDe_tukey53H_norm.py +++ /dev/null @@ -1,11 +0,0 @@ -from cotede_qc.cotede_test import get_qc - -def test(p): - '''Run the tukey53H norm QC from the CoTeDe config.''' - - config = 'cotede' - testname = 'tukey53H_norm' - - return get_qc(p, config, testname) - - diff --git a/qctests/EN_background_available_check.py b/qctests/EN_background_available_check.py deleted file mode 100644 index ca9f93e..0000000 --- a/qctests/EN_background_available_check.py +++ /dev/null @@ -1,58 +0,0 @@ -""" -The background check on reported levels from the EN quality control -system, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf, includes -setting the QC flags if the background is not available at a profile level. -This aspect is separated out in this check. -""" - -import numpy as np -from qctests.EN_background_check import auxParam -from qctests.EN_background_check import findGridCell - -def test(p, *args): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Define an array to hold results. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Find grid cell nearest to the observation. - ilon, ilat = findGridCell(p, auxParam['lon'], auxParam['lat']) - - # Extract the relevant auxiliary data. - imonth = p.month() - 1 - clim = auxParam['clim'][:, ilat, ilon, imonth] - depths = auxParam['depth'] - - # Remove missing data points. - iOK = (clim.mask == False) - if np.count_nonzero(iOK) == 0: - qc[:] = True - return qc - clim = clim[iOK] - depths = depths[iOK] - - # Find which levels have data. - t = p.t() - z = p.z() - isTemperature = (t.mask==False) - isDepth = (z.mask==False) - isData = isTemperature & isDepth - - # Loop over levels. - for iLevel in range(p.n_levels()): - if isData[iLevel] == False: continue - - # Get the climatology and error variance values at this level. - climLevel = np.interp(z[iLevel], depths, clim, right=99999) - if climLevel == 99999: - qc[iLevel] = True # This could reject some good data if the - # climatology is incomplete, but also can act as - # a check that the depth of the profile is - # consistent with the depth of the ocean. - - return qc - diff --git a/qctests/EN_background_check.py b/qctests/EN_background_check.py deleted file mode 100644 index af3f455..0000000 --- a/qctests/EN_background_check.py +++ /dev/null @@ -1,193 +0,0 @@ -""" -Implements the background check on reported levels from the EN quality control -system, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -import EN_spike_and_step_check -import numpy as np -import util.obs_utils as outils -from netCDF4 import Dataset - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Check if the QC of this profile was already done and if not - # run the QC. - if p.uid() != uid or p.uid() is None: - run_qc(p) - - # QC results are in the module variable. - return qc - -def run_qc(p): - """ - Performs the QC check. - """ - - global qc, uid, origLevels, ptLevels, bgLevels, bgStdLevels, bgevStdLevels - - # Define an array to hold results. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Create a record of the processing for use by the background - # and buddy checks on standard levels. - uid = p.uid() - origLevels = [] - ptLevels = [] - bgLevels = [] - - # Find grid cell nearest to the observation. - ilon, ilat = findGridCell(p, auxParam['lon'], auxParam['lat']) - - # Extract the relevant auxiliary data. - imonth = p.month() - 1 - clim = auxParam['clim'][:, ilat, ilon, imonth] - bgev = auxParam['bgev'][:, ilat, ilon] - bgStdLevels = clim # Save for use in another check. - bgevStdLevels = bgev # Save the full column for use by another check. - obev = auxParam['obev'] - depths = auxParam['depth'] - - # Remove missing data points. - iOK = (clim.mask == False) & (bgev.mask == False) - if np.count_nonzero(iOK) == 0: return qc - clim = clim[iOK] - bgev = bgev[iOK] - obev = obev[iOK] - depths = depths[iOK] - - # Find which levels have data. - t = p.t() - s = p.s() - z = p.z() - isTemperature = (t.mask==False) - isSalinity = (s.mask==False) - isDepth = (z.mask==False) - isData = isTemperature & isDepth - - # Use the EN_spike_and_step_check to find suspect values. - suspect = EN_spike_and_step_check.test(p, suspect=True) - - # Loop over levels. - for iLevel in range(p.n_levels()): - if isData[iLevel] == False: continue - - # Get the climatology and error variance values at this level. - climLevel = np.interp(z[iLevel], depths, clim, right=99999) - bgevLevel = np.interp(z[iLevel], depths, bgev, right=99999) - obevLevel = np.interp(z[iLevel], depths, obev, right=99999) - if climLevel == 99999: - continue - assert bgevLevel > 0, 'Background error variance <= 0' - assert obevLevel > 0, 'Observation error variance <= 0' - - # If at low latitudes the background error variance is increased. - # Also, because we are on reported levels instead of standard levels - # the variances are increased. NB multiplication factors are squared - # because we are working with error variances instead of standard - # deviations. - if np.abs(p.latitude()) < 10.0: bgevLevel *= 1.5**2 - bgevLevel *= 2.0**2 - - # Set up an initial estimate of probability of gross error. - pge = estimatePGE(p.probe_type(), suspect[iLevel]) - - # Calculate potential temperature. - if isSalinity[iLevel]: - sLevel = s[iLevel] - else: - sLevel = 35.0 - potm = outils.pottem(t[iLevel], sLevel, z[iLevel], lat=p.latitude()) - - # Do Bayesian calculation. - evLevel = obevLevel + bgevLevel - sdiff = (potm - climLevel)**2 / evLevel - pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) - pdTotal = 0.1 * pge + pdGood * (1.0 - pge) - pgebk = 0.1 * pge / pdTotal - - if pgebk >= 0.5: - qc[iLevel] = True - else: - # Store the results. - origLevels.append(iLevel) - ptLevels.append(potm) - bgLevels.append(climLevel) - - return None - -def findGridCell(p, gridLong, gridLat): - ''' - Find grid cell nearest to the observation p, - where gridLong and gridLat are lists of grid coordinates. - ''' - for i in range(1, len(gridLong)): - assert gridLong[i] - gridLong[i-1] == gridLong[1] - gridLong[0], 'longitude grid points must be evenly spaced' - lon = p.longitude() - grid = gridLong - nlon = len(grid) - ilon = int(np.mod(np.round((lon - grid[0]) / (grid[1] - grid[0])), nlon)) - for i in range(1, len(gridLat)): - assert gridLat[i] - gridLat[i-1] == gridLat[1] - gridLat[0], 'latitude grid points must be evenly spaced' - lat = p.latitude() - grid = gridLat - nlat = len(grid) - ilat = int(np.mod(np.round((lat - grid[0]) / (grid[1] - grid[0])), nlat)) - if ilat == nlat: ilat -= 1 # Checks for edge case where lat is ~90. - - assert ilon >=0 and ilon < nlon, 'Longitude is out of range: %f %i' % (lon, ilon) - assert ilat >=0 and ilat < nlat, 'Latitude is out of range: %f %i' % (lat, ilat) - - return ilon, ilat - - -def estimatePGE(probe_type, isSuspect): - ''' - Estimates the probability of gross error for a measurement taken by - the given probe_type. Information from the EN_spike_and_step_check - is used here to increase the initial estimate if the observation is suspect. - ''' - if probe_type in [1,2,3,13,16]: - pge = 0.05 - else: - pge = 0.01 - if isSuspect: - pge = 0.5 + 0.5 * pge - - return pge - -def readENBackgroundCheckAux(): - ''' - Reads auxiliary information needed by the EN background check. - ''' - - filename = 'data/EN_bgcheck_info.nc' - nc = Dataset(filename) - data = {} - data['lon'] = nc.variables['longitude'][:] - data['lat'] = nc.variables['latitude'][:] - data['depth'] = nc.variables['depth'][:] - data['month'] = nc.variables['month'][:] - data['clim'] = nc.variables['potm_climatology'][:] - data['bgev'] = nc.variables['bg_err_var'][:] - data['obev'] = nc.variables['ob_err_var'][:] - - return data - -#import parameters on load -auxParam = readENBackgroundCheckAux() - -# Initialise global variables to hold data needed for the -# EN background and buddy check on standard levels. -uid = None -qc = None -origLevels = [] -ptLevels = [] -bgLevels = [] -bgevStdLevels = [] -bgStdLevels = [] - diff --git a/qctests/EN_constant_value_check.py b/qctests/EN_constant_value_check.py deleted file mode 100644 index 82df764..0000000 --- a/qctests/EN_constant_value_check.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -Implements the constant value check used in the EN quality control -system, described on page 7 of http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -import numpy - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - if p.uid() != uid or p.uid() is None: - run_qc(p) - - # QC results are stored in the module variable. - return qc - -def run_qc(p): - - global qc, uid - - # Get temperature values from the profile. - t = p.t() - d = p.z() - - temperatures = {} - # initialize qc as a bunch of falses (pass by default) - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isDepth = (d.mask==False) - - #dictionary counts instances of each temperature value - for i in range(len(t.data)): - if isTemperature[i]: - if t.data[i] in temperatures: - temperatures[t.data[i]] += 1 - else: - temperatures[t.data[i]] = 1 - - for key in temperatures: - - if float(temperatures[key]) / float(len(t.data)) >= 0.9: - repeats = numpy.where(t.data == key)[0] - #drop the entries that don't have a depth associated with them; - #this triggers the 90% rule regardless of the presence of depth data, but - #ensures that depths are available to assess the range over which constant temps were observed. - repeatsWithDepth = [] - for j in range(len(repeats)): - if isDepth[repeats[j]]: - repeatsWithDepth.append(repeats[j]) - first = repeatsWithDepth[0] - last = repeatsWithDepth[-1] - - if d.data[last] - d.data[first] >= 100: - qc = numpy.ones(len(t.data), dtype=bool) #note everyhing is flagged by this test. - - uid = p.uid() - - return None - -uid = None -qc = None - - - diff --git a/qctests/EN_increasing_depth_check.py b/qctests/EN_increasing_depth_check.py deleted file mode 100644 index 68cf77d..0000000 --- a/qctests/EN_increasing_depth_check.py +++ /dev/null @@ -1,94 +0,0 @@ -""" -Implements the EN increasing depth check. -""" - -import EN_spike_and_step_check -import numpy as np -from collections import Counter - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - if p.uid() != uid or p.uid() is None: - run_qc(p) - - # QC results are in the module variable. - return qc - -def run_qc(p): - - global qc, uid - - # Get z values from the profile. - d = p.z() - mask = d.mask - n = p.n_levels() - - # Initialize qc array. - qc = np.zeros(n, dtype=bool) - - # if all the depths are the same, flag all levels and finish immediately - most_common_depth = Counter(d.data).most_common(1) - if most_common_depth[0][1] == len(d.data): - qc = np.ones(n, dtype=bool) - return None - - # Basic check on each level. - qc[d < 0] = True - qc[d > 11000] = True - - # Now check for inconsistencies in the depth levels. - comp = np.ndarray((n, n), dtype=int) - currentMax = 1 - while currentMax > 0: - # Comp gets set to 1 if there is not an increase in depth. - comp[:, :] = 0 - for i in range(n): - if qc[i] or mask[i]: continue - for j in range(n): - if qc[j] or mask[j] or (i == j): continue - if i < j: - if d[i] >= d[j]: comp[i, j] = 1 - else: - if d[i] <= d[j]: comp[i, j] = 1 - - # Check if comp was set to 1 anywhere and which level was - # most inconsistent with the others. - currentMax = 0 - currentLev = -1 - for i in range(n): - lineSum = np.sum(comp[:, i]) - if lineSum >= currentMax: - currentMax = lineSum - currentLev = i - - # Reject immediately if more than one inconsistency or - # investigate further if one inconsistency. - if currentMax > 1: - qc[currentLev] = True - elif currentMax == 1: - # Find out which level it is inconsistent with. - for i in range(n): - if comp[i, currentLev] == 1: otherLev = i - # Check if one was rejected by the spike and step - # check, otherwise reject both. - try: - spikeqc - except: - spikeqc = EN_spike_and_step_check.test(p) - if spikeqc[currentLev]: qc[currentLev] = True - if spikeqc[otherLev]: qc[otherLev] = True - if spikeqc[currentLev] == False and spikeqc[otherLev] == False: - qc[currentLev] = True - qc[otherLev] = True - - uid = p.uid() - - return None - -uid = None -qc = None diff --git a/qctests/EN_range_check.py b/qctests/EN_range_check.py deleted file mode 100644 index 95205be..0000000 --- a/qctests/EN_range_check.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -Implements the global range check used in the EN quality control -system. -""" - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get temperature values from the profile. - t = p.t() - - # Make the quality control decisions. This should - # return true if the temperature is outside -4 deg C - # and 40 deg C. - qc = (t.mask == False) & ((t.data < -4.0) | (t.data > 40.0)) - - return qc - - diff --git a/qctests/EN_spike_and_step_check.py b/qctests/EN_spike_and_step_check.py deleted file mode 100644 index b35ab7a..0000000 --- a/qctests/EN_spike_and_step_check.py +++ /dev/null @@ -1,202 +0,0 @@ -""" -Implements the spike and step check used in the EN quality control -system, pages 20-21 of http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf - -The EN quality control system does not directly reject levels that are marked as -steps, it marks them as suspect and then they are subjected to an extra test (a -background check) that can reprieve them. In the future it will be best to -remove these elements and include them within the background check code. -""" - -import numpy as np - -def test(p, suspect=False): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - - By default the test returns definite rejections. If the suspect keyword is - set to True the test instead returns suspect levels. - """ - - if p.uid() != uid or suspect != suspectSetting or p.uid() is None: - run_qc(p, suspect) - - # QC results are in the global variable. - return qc - -def run_qc(p, suspect): - - global uid, qc, suspectSetting - - # Define tolerances used. - tolD = np.array([0, 200, 300, 500, 600]) - tolDTrop = np.array([0, 300, 400, 500, 600]) - tolT = np.array([5.0, 5.0, 2.5, 2.0, 1.5]) - - # Define an array to hold results. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Get depth and temperature values from the profile. - z = p.z() - t = p.t() - - # Find which levels have data. - isTemperature = (t.mask==False) - isDepth = (z.mask==False) - isData = isTemperature & isDepth - - # Array to hold temperature differences between levels and gradients. - dt, gt = composeDT(t, z, p.n_levels()) - - # Spikes and steps detection. - for i in range(1, p.n_levels()): - if i >= 2: - if (isData[i-2] and isData[i-1] and isData[i]) == False: - continue - if z[i] - z[i-2] >= 5.0: - wt1 = (z[i-1] - z[i-2]) / (z[i] - z[i-2]) - else: - wt1 = 0.5 - else: - if (isData[i-1] and isData[i]) == False: - continue - wt1 = 0.5 - - dTTol = determineDepthTolerance(z[i-1], np.abs(p.latitude())) - gTTol = 0.05 - - # Check for low temperatures in the Tropics. - # This might be more appropriate to appear in a separate EN regional - # range check but is included here for now for consistency with the - # original code. - if (np.abs(p.latitude()) < 20.0 and z[i-1] < 1000.0 and - t[i-1] < 1.0): - dt[i] = np.ma.masked - if suspect == True: qc[i-1] = True - continue - - qc, dt = conditionA(dt, dTTol, qc, wt1, i, suspect) - qc, dt = conditionB(dt, dTTol, gTTol, qc, gt, i, suspect) - qc = conditionC(dt, dTTol, z, qc, t, i, suspect) - - # End of loop over levels. - - # Step or 0.0 at the bottom of a profile. - if isData[-1] and dt.mask[-1] == False: - dTTol = determineDepthTolerance(z[-1], np.abs(p.latitude())) - if np.abs(dt[-1]) > dTTol: - if suspect == True: qc[-1] = True - if isTemperature[-1]: - if t[-1] == 0.0: - if suspect == True: qc[-1] = True - - # If 4 levels or more than half the profile is rejected then reject all. - if suspect == False: - nRejects = np.count_nonzero(qc) - if nRejects >= 4 or nRejects > p.n_levels()/2: - qc[:] = True - - # Save details of the QC performed in module variables. - uid = p.uid() - suspectSetting = suspect - - return None - - -def composeDT(var, z, nLevels): - ''' - build the array of deltas for the variable provided - ''' - dt = np.ma.zeros(nLevels) - dt.mask = True - gt = dt.copy() - - for i in range(1, nLevels): - if ((z[i] - z[i-1]) <= 50.0 or (z[i] >= 350.0 and (z[i] - z[i-1]) <= 100.0)): - dt[i] = var[i] - var[i-1] - gt[i] = dt[i] / np.max([10.0, z[i] - z[i-1]]) - - - return dt, gt - - -def determineDepthTolerance(z, lattitude): - ''' - determine depth tolerance - ''' - - if (lattitude < 20.0): - depthTol = 300.0 - else: - depthTol = 200.0 - - if z > 600.0: - tTolFactor = 0.3 - elif z > 500.0: - tTolFactor = 0.4 - elif z > depthTol + 100.0: - tTolFactor = 0.5 - elif z > depthTol: - tTolFactor = 1.0 - 0.005 * (z - depthTol) - else: - tTolFactor = 1.0 - - return tTolFactor * 5.0 - -def conditionA(dt, dTTol, qc, wt1, i, suspect): - ''' - condition A (large spike check) - ''' - if (dt.mask[i-1] == False and dt.mask[i] == False and np.max(np.abs(dt[i-1:i+1])) > dTTol): - if np.abs(dt[i] + dt[i-1]) < 0.5*dTTol: - dt[i-1:i+1] = np.ma.masked - if suspect == False: qc[i-1] = True - elif np.abs((1.0-wt1) * dt[i-1] - wt1*dt[i]) < 0.5*dTTol: - # Likely to be a valid large temperature gradient. - dt[i-1:i+1] = np.ma.masked # Stops the levels being rechecked. - - return qc, dt - -def conditionB(dt, dTTol, gTTol, qc, gt, i, suspect): - ''' - condition B (small spike check) - ''' - if (dt.mask[i-1] == False and dt.mask[i] == False and - np.max(np.abs(dt[i-1:i+1])) > 0.5*dTTol and - np.max(np.abs(gt[i-1:i+1])) > gTTol and - np.abs(dt[i] + dt[i-1]) < 0.25*np.abs(dt[i] - dt[i-1])): - dt[i-1:i+1] = np.ma.masked - if suspect == False: qc[i-1] = True - - return qc, dt - -def conditionC(dt, dTTol, z, qc, t, i, suspect): - ''' - condition C (steps) - ''' - - if dt.mask[i-1] == False and np.abs(dt[i-1]) > dTTol: - if z[i-1] <= 250.0 and dt[i-1] < -dTTol and dt[i-1] > -3.0*dTTol: - # May be sharp thermocline, do not reject. - pass - elif i>1 and z[i] - z[i-2] > 0 and np.abs(t[i-1] - interpolate(z[i-1], z[i-2], z[i], t[i-2], t[i])) < 0.5*dTTol: - # consistent interpolation, do not reject - pass - else: - # mark both sides of the step - if suspect == True: qc[i-2:i] = True - - return qc - -def interpolate(depth, shallow, deep, shallowVal, deepVal): - ''' - interpolate values at - ''' - - return (depth - shallow) / (deep - shallow) * (deepVal - shallowVal) + shallowVal - -uid = None -qc = None -suspectSetting = None diff --git a/qctests/EN_spike_and_step_suspect.py b/qctests/EN_spike_and_step_suspect.py deleted file mode 100644 index e90dda4..0000000 --- a/qctests/EN_spike_and_step_suspect.py +++ /dev/null @@ -1,7 +0,0 @@ -'''Returns the suspect levels found by the EN spike and step check.''' - -import EN_spike_and_step_check - -def test(p): - - return EN_spike_and_step_check.test(p, suspect=True) diff --git a/qctests/EN_stability_check.py b/qctests/EN_stability_check.py deleted file mode 100644 index 2c8ee51..0000000 --- a/qctests/EN_stability_check.py +++ /dev/null @@ -1,176 +0,0 @@ -""" -Implements the stability check described on pages 8-9 of -http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -import math, numpy - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - if p.uid() != uid or p.uid() is None: - run_qc(p) - - # QC results are in the module variable. - return qc - -def run_qc(p): - - global uid, qc - - # Get temperature, salinity, pressure values from the profile. - t = p.t() - s = p.s() - P = p.p() - - # initialize qc as a bunch of falses; - qc = numpy.zeros(p.n_levels(), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isSalinity = (s.mask==False) - isPressure = (P.mask==False) - isData = isTemperature & isSalinity & isPressure - - # calculate potential temperatures - T = [] - for i in range(0, p.n_levels()): - T.append(potentialTemperature(s[i], t[i], P[i])) - - for i in range(2,len(t.data)-1): - if (isData[i] and isData[i-1] and isData[i-2]) == False: - continue - - delta_rho_k = mcdougallEOS(s[i], T[i], P[i]) - mcdougallEOS(s[i-1], T[i-1], P[i-1]) - if delta_rho_k >= -0.03: - continue; - - delta_rho_k_prev = mcdougallEOS(s[i-1], T[i-1], P[i-1]) - mcdougallEOS(s[i-2], T[i-2], P[i-2]) - - if abs(delta_rho_k_prev + delta_rho_k) < 0.25*abs(delta_rho_k_prev - delta_rho_k): - qc[i-1] = True - else: - if isData[i+1] == False: - continue - - delta_rho_k_next = mcdougallEOS(s[i+1], T[i+1], P[i+1]) - mcdougallEOS(s[i], T[i], P[i]) - if abs(delta_rho_k + delta_rho_k_next) < 0.25*abs(delta_rho_k - delta_rho_k_next): - qc[i] = True - else: - qc[i-1] = True - qc[i] = True - - #check bottom of profile - i = p.n_levels()-1 - if isData[i] and isData[i-1]: - delta_rho_k = mcdougallEOS(s[i], T[i], P[i]) - mcdougallEOS(s[i-1], T[i-1], P[i-1]) - if delta_rho_k < -0.03: - qc[i] = True - - #check for critical number of flags, flag all if so: - if sum(qc) >= max(2, len(t.data)/4.): - qc = numpy.ones(len(t.data), dtype=bool) - - uid = p.uid() - - return None - - -def mcdougallEOS(salinity, temperature, pressure): - ''' - equation of state defined in McDougall et al 2003 (http://journals.ametsoc.org/doi/pdf/10.1175/1520-0426%282003%2920%3C730%3AAACEAF%3E2.0.CO%3B2) - returns density in kg/m^3 - ''' - - p1CF = [ - 9.99843699e2, - 7.35212840e0, - -5.45928211e-2, - 3.98476704e-4, - 2.96938239e0, - -7.23268813e-3, - 2.12382341e-3, - 1.04004591e-2, - 1.03970529e-7, - 5.18761880e-6, - -3.24041825e-8, - -1.23869360e-11 - ] - - p2CF = [ - 1.0, - 7.28606739e-3, - -4.60835542e-5, - 3.68390573e-7, - 1.80809186e-10, - 2.14691708e-3, - -9.27062484e-6, - -1.78343643e-10, - 4.76534122e-6, - 1.63410736e-9, - 5.30848875e-6, - -3.03175128e-16, - -1.27934137e-17 - ] - - p1 = p1CF[0] - p1 += p1CF[1]*temperature - p1 += p1CF[2]*temperature*temperature - p1 += p1CF[3]*temperature*temperature*temperature - p1 += p1CF[4]*salinity - p1 += p1CF[5]*salinity*temperature - p1 += p1CF[6]*salinity*salinity - p1 += p1CF[7]*pressure - p1 += p1CF[8]*pressure*temperature*temperature - p1 += p1CF[9]*pressure*salinity - p1 += p1CF[10]*pressure*pressure - p1 += p1CF[11]*pressure*pressure*temperature*temperature - - p2 = p2CF[0] - p2 += p2CF[1]*temperature - p2 += p2CF[2]*temperature*temperature - p2 += p2CF[3]*temperature*temperature*temperature - p2 += p2CF[4]*temperature*temperature*temperature*temperature - p2 += p2CF[5]*salinity - p2 += p2CF[6]*salinity*temperature - p2 += p2CF[7]*salinity*temperature*temperature*temperature - p2 += p2CF[8]*math.pow(salinity, 1.5) - p2 += p2CF[9]*math.pow(salinity, 1.5)*temperature*temperature - p2 += p2CF[10]*pressure - p2 += p2CF[11]*pressure*pressure*temperature*temperature*temperature - p2 += p2CF[12]*pressure*pressure*pressure*temperature - - return p1/p2 - -def potentialTemperature(S, T, p): - # approximation for potential temperature given in McDougall et al 2003 (http://journals.ametsoc.org/doi/pdf/10.1175/1520-0426%282003%2920%3C730%3AAACEAF%3E2.0.CO%3B2) - # S in psu, T in degrees C, p in db - # note p_r = 0 for these fit values - - coef = [ - 0, - 1.067610e-5, - -1.434297e-6, - -7.566349e-9, - -8.535585e-6, - 3.074672e-8, - 1.918639e-8, - 1.788718e-10 - ] - - poly = coef[1] - poly += coef[2]*S - poly += coef[3]*p - poly += coef[4]*T - poly += coef[5]*S*T - poly += coef[6]*T*T - poly += coef[7]*T*p - - return T + p*poly - -uid = None -qc = None diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py deleted file mode 100644 index 44bdff2..0000000 --- a/qctests/EN_std_lev_bkg_and_buddy_check.py +++ /dev/null @@ -1,369 +0,0 @@ -""" -Implements the background check on standard levels and the buddy check -from the EN quality control system, -http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -from cotede.qctests.possible_speed import haversine -import datetime -import EN_background_check -import EN_constant_value_check -import EN_increasing_depth_check -import EN_range_check -import EN_spike_and_step_check -import EN_stability_check -import util.main as main -import data.ds -import numpy as np - -def test(p, allow_level_reinstating=True): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - - If allow_level_reinstating is set to True then rejected levels can be - reprieved by comparing with levels above and below. NB this is done by - default in EN processing. - """ - - # Define an array to hold results. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Obtain the obs minus background differences on standard levels. - result = stdLevelData(p) - if result is None: return qc - - # Unpack the results. - levels, origLevels, assocLevels = result - # Retrieve the background and observation error variances and - # the background values. - bgsl = EN_background_check.bgStdLevels - slev = EN_background_check.auxParam['depth'] - bgev = EN_background_check.bgevStdLevels - obev = EN_background_check.auxParam['obev'] - - #find initial pge - pgeData = determine_pge(levels, bgev, obev, p) - - # Find buddy. - profiles = data.ds.profiles - minDist = 1000000000.0 - iMinDist = None - for iProfile, profile in enumerate(profiles): - pDist = assessBuddyDistance(p, profile) - if pDist is not None and pDist < minDist: - minDist = pDist - iMinDist = iProfile - - # Check if we have found a buddy and process if so. - if minDist <= 400000: - fid = None - pBuddy, currentFile, fid = main.profileData(profiles[iMinDist], '', fid) - fid.close() - - # buddy vetos - Fail = False - if pBuddy.var_index() is None: - Fail = True - if Fail == False: - main.catchFlags(pBuddy) - if np.sum(pBuddy.t().mask == False) == 0: - Fail = True - - if Fail == False: - result = stdLevelData(pBuddy) - if result is not None: - levelsBuddy, origLevelsBuddy, assocLevelsBuddy = result - bgevBuddy = EN_background_check.bgevStdLevels - pgeBuddy = determine_pge(levels, bgevBuddy, obev, pBuddy) - pgeData = update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, p, pBuddy, obev, bgev, bgevBuddy) - - # Check if levels should be reinstated. - if allow_level_reinstating: - if np.abs(p.latitude()) < 20.0: - depthTol = 300.0 - else: - depthTol = 200.0 - stdLevelFlags = pgeData >= 0.5 - for i, slflag in enumerate(stdLevelFlags): - if slflag: - # Check for non rejected surrounding levels. - okbelow = False - if i > 0: - if stdLevelFlags[i - 1] == False and levels.mask[i - 1] == False and bgsl.mask[i - 1] == False: - okbelow = True - okabove = False - nsl = len(stdLevelFlags) - if i < nsl - 1: - if stdLevelFlags[i + 1] == False and levels.mask[i + 1] == False and bgsl.mask[i + 1] == False: - okabove = True - # Work out tolerances. - if slev[i] > depthTol + 100: - tolFactor = 0.5 - elif slev[i] > depthTol: - tolFactor = 1.0 - 0.005 * (slev[i] - depthTol) - else: - tolFactor = 1.0 - ttol = 0.5 * tolFactor - if okbelow == True and okabove == True: - xmax = levels[i - 1] + bgsl[i - 1] + ttol - xmin = levels[i + 1] + bgsl[i + 1] - ttol - elif okbelow == True: - xmax = levels[i - 1] + bgsl[i - 1] + ttol - xmin = levels[i - 1] + bgsl[i - 1] - ttol - elif okabove == True: - xmax = levels[i + 1] + bgsl[i + 1] + ttol - xmin = levels[i + 1] + bgsl[i + 1] - ttol - else: - continue - # Reassign PGE if level is within the tolerances. - if levels[i] + bgsl[i] >= xmin and levels[i] + bgsl[i] <= xmax: - pgeData[i] = 0.49 - - # Assign the QC flags to original levels. - for i, pge in enumerate(pgeData): - if pgeData.mask[i]: continue - if pge < 0.5: continue - for j, assocLevel in enumerate(assocLevels): - if assocLevel == i: - origLevel = origLevels[j] - qc[origLevel] = True - - return qc - -def determine_pge(levels, bgev, obev, profile): - ''' - determine the probability of gross error per level given: - levels: a list of observed - background temperatures per level (ie the first return of stdLevelData) - bgev: list of background error variance per level - obev: list of observational error variances per level - profile: the wodpy profile object in question - ''' - pge = np.ma.array(np.ndarray(len(levels))) - pge.mask = True - - for iLevel, level in enumerate(levels): - if levels.mask[iLevel] or bgev.mask[iLevel]: continue - bgevLevel = bgev[iLevel] - if np.abs(profile.latitude()) < 10.0: bgevLevel *= 1.5**2 - obevLevel = obev[iLevel] - pge_est = EN_background_check.estimatePGE(profile.probe_type(), False) - - kappa = 0.1 - evLevel = obevLevel + bgevLevel #V from the text - sdiff = level**2 / evLevel - pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) - pdTotal = kappa * pge_est + pdGood * (1.0 - pge_est) - pge[iLevel] = kappa * pge_est / pdTotal - - return pge - -def buddyCovariance(minDist, profile, buddyProfile, meso_ev_a, meso_ev_b, syn_ev_a, syn_ev_b): - ''' - coavariance formula for buddy profiles, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf pp.11 - meso_ev_a == mesoscale error variance for profile a, etc. - ''' - - corScaleA = 100.0 # In km. - corScaleB = 400.0 # In km. - corScaleT = 432000.0 # 5 days in secs. - mesSDist = minDist / (1000.0 * corScaleA) - synSDist = minDist / (1000.0 * corScaleB) - - timeDiff2 = timeDiff(profile, buddyProfile) - if timeDiff2 is None: - return None - timeDiff2 = (timeDiff2 / corScaleT)**2 - - covar = (np.sqrt(meso_ev_a * meso_ev_b) * - (1.0 + mesSDist) * np.exp(-mesSDist - timeDiff2) + - np.sqrt(syn_ev_a * syn_ev_b) * - (1.0 + synSDist) * np.exp(-synSDist - timeDiff2)) - - return covar - -def update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, profile, buddyProfile, obev, bgev, bgevBuddy): - ''' - update the PGE for the profile in question using the buddy pge. - ''' - - for iLevel in range(len(levelsBuddy)): - if levels.mask[iLevel] or levelsBuddy.mask[iLevel]: continue - - # For simplicity, going to assume that length scales - # are isotropic and the same everywhere; in the EN - # processing length scales are stretched in E/W direction - # near the equator and this functionality could be added - # later. - - covar = buddyCovariance(minDist, profile, buddyProfile, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0) - if covar is None: - continue; - - errVarA = obev[iLevel] + bgev[iLevel] - errVarB = obev[iLevel] + bgevBuddy[iLevel] - rho2 = covar**2 / (errVarA + errVarB) - expArg = (-(0.5 * rho2 / (1.0 - rho2)) * - (levels[iLevel]**2 / errVarA + - levelsBuddy[iLevel]**2 / errVarB - - 2.0 * levels[iLevel] * levelsBuddy[iLevel] / covar)) - expArg = -0.5 * np.log(1.0 - rho2) + expArg - expArg = min(80.0, max(-80.0, expArg)) - Z = 1.0 / (1.0 - (1.0 - pgeData[iLevel]) * - (1.0 - pgeBuddy[iLevel]) * (1.0 - expArg)) - if Z < 0.0: Z = 1.0 # In case of rounding errors. - Z = Z**0.5 - pgeData[iLevel] = pgeData[iLevel] * Z - - return pgeData - -def stdLevelData(p): - """ - Combines data that have passed other QC checks to create a - set of observation minus background data on standard levels. - """ - - # Combine other QC results. - preQC = (EN_background_check.test(p) | - EN_constant_value_check.test(p) | - EN_increasing_depth_check.test(p) | - EN_range_check.test(p) | - EN_spike_and_step_check.test(p) | - EN_stability_check.test(p)) - - # Get the data stored by the EN background check. - # As it was run above we know that the data held by the - # module corresponds to the correct profile. - origLevels = np.array(EN_background_check.origLevels) - diffLevels = (np.array(EN_background_check.ptLevels) - - np.array(EN_background_check.bgLevels)) - nLevels = len(origLevels) - if nLevels == 0: return None # Nothing more to do. - - # Remove any levels that failed previous QC. - nLevels, origLevels, diffLevels = filterLevels(preQC, origLevels, diffLevels) - if nLevels == 0: return None - - levels, assocLevs = meanDifferencesAtStandardLevels(origLevels, diffLevels, p.z()) - - return levels, origLevels, assocLevs - -def filterLevels(preQC, origLevels, diffLevels): - ''' - preQC: list or array of bools indicating a QC state for each level, determined from other tests - origLevels: list of level indices that passed EN_background - diffLevels: correpsonding to origLevels. - return (nLevels, origLevels, diffLevels) with all elements corresponding to a True entry in preQC removed. - ''' - - nLevels = len(origLevels) - use = np.ones(nLevels, dtype=bool) - for i, origLevel in enumerate(origLevels): - if preQC[origLevel]: use[i] = False - nLevels = np.count_nonzero(use) - origLevels = origLevels[use] - diffLevels = diffLevels[use] - - return nLevels, origLevels, diffLevels - -def meanDifferencesAtStandardLevels(origLevels, diffLevels, depths): - ''' - origLevels: list of level indices under consideration - diffLevels: list of differences corresponding to origLevels - depths: list of depths of all levels in profile. - returns (levels, assocLevs), where - levels == a masked array of mean differences at each standard level - assocLevs == a list of the indices of the closest standard levels to the levels indicated in origLevels - ''' - - # Get the set of standard levels. - stdLevels = EN_background_check.auxParam['depth'] - - # Create arrays to hold the standard level data and aggregate. - nStdLevels = len(stdLevels) - levels = np.zeros(nStdLevels) - nPerLev = np.zeros(nStdLevels) - assocLevs = [] - for i, origLevel in enumerate(origLevels): - # Find the closest standard level. - j = np.argmin(np.abs(depths[origLevel] - stdLevels)) - assocLevs.append(j) - levels[j] += diffLevels[i] - nPerLev[j] += 1 - - # Average the standard levels where there are data. - iGT1 = nPerLev > 1 - levels[iGT1] /= nPerLev[iGT1] - levels = np.ma.array(levels) - levels.mask = False - levels.mask[nPerLev == 0] = True - - return levels, assocLevs - - -def assessBuddyDistance(p, buddy): - """ - given a profile

and a possible buddy profile , - return None if is not a valid buddy, or the distance - to

if it is. - """ - - # Check that it is not the same profile and that they - # are near in time. The time criteria matches the EN - # processing but would probably be better if it checked - # that the profiles were within a time threshold. The - # cruise is compared as two profiles from the same instrument - # should not be compared. - if (buddy.uid() == p.uid() or - buddy.year() != p.year() or - buddy.month() != p.month() or - buddy.cruise() == p.cruise()): return None - lat = p.latitude() - lon = p.longitude() - latComp = buddy.latitude() - lonComp = buddy.longitude() - # Do a rough check of distance. - latDiff = np.abs(latComp - lat) - if latDiff > 5: return None - # Do a more detailed check of distance. - # Check in case they are either side of the edge of the map. - if np.abs(lonComp - lon) > 180: - if lonComp < lon: - lonComp += 360.0 - else: - lonComp -= 360.0 - # Calculate distance and return. - return haversine(lat, lon, latComp, lonComp) - -def timeDiff(p1, p2): - ''' - returns the time difference, in seconds, between two profiles - returns None if the year, month or day in either profile is invalid - ''' - - dts = [] - for prof in [p1, p2]: - year = prof.year() - month = prof.month() - day = prof.day() - if not (year > 0) or not (1 <= month <= 12) or not (1 <= day <= 31): - return None - time = prof.time() - if time is None or time < 0 or time >= 24: - hours = 0 - minutes = 0 - seconds = 0 - else: - hours = int(time) - minutesf = (time - hours) * 60 - minutes = int(minutesf) - seconds = int((minutesf - minutes) * 60) - - dts.append(datetime.datetime(year, month, day, hours, minutes, seconds)) - - diff = dts[0] - dts[1] - - return np.abs(diff.total_seconds()) - - diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py deleted file mode 100644 index 52342ee..0000000 --- a/qctests/EN_track_check.py +++ /dev/null @@ -1,392 +0,0 @@ -""" -Implements the EN track check, described on pp 7 and 21 of -http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -import numpy as np -import data.ds as ds -import util.main as main -import util.geo as geo -import copy -import datetime -import math - -# module constants -DistRes = 20000. # meters -TimeRes = 600. # seconds - -EN_track_headers = {} -EN_track_results = {} -threadFile = {} - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - global EN_track_headers - global EN_track_results - global threadFile - - cruise = p.cruise() - uid = p.uid() - - # don't bother if cruise == 0 or None - if cruise in [0, None]: - return np.zeros(1, dtype=bool); - - # The headers from an entire cruise must be analyzed all at once; - # we'll write the results to the global data store, in a dictionary - # with ntuple keys (cruise, uid), and values as single element - # numpy arrays, containing either a true or a false (per all the other - # qc return objects) - - # check if this profile has been examined already - if (cruise, uid) in EN_track_results.keys(): - return EN_track_results[(cruise, uid)] - - # some detector types cannot be assessed by this test; do not raise flag. - if p.probe_type in [None]: - return np.zeros(1, dtype=bool) - - # the first time this test is run, sort ds.threadProfiles into a cruise-keyed dictionary: - if ds.threadFile != threadFile: - EN_track_headers = main.sort_headers(ds.threadProfiles) - threadFile = ds.threadFile - - # since we didn't find an answer already calculated, - # we still need to do the calculation for this cruise; - # all the relevant headers are sitting in the EN_track_headers list. - headers = EN_track_headers[cruise] - - # start all as passing by default: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())] = np.zeros(1, dtype=bool) - - # copy the list of headers; - # remove entries as they are flagged. - passedHeaders = copy.deepcopy(headers) - rejects = findOutlier(passedHeaders) - while rejects != []: - passedIndex = [x for x in range(len(passedHeaders)) if x not in rejects ] - passedHeaders = [passedHeaders[index] for index in passedIndex ] - rejects = findOutlier(passedHeaders) - - # if more than half got rejected, reject everyone - if len(passedHeaders) < len(headers) / 2: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())][0] = True - - return EN_track_results[(cruise, uid)] - -def findOutlier(headers): - ''' - given a list of , find the fastest one; - if it's too fast, reject it or the one before it, return a list of rejected indices; - once the fastest is within limits, return []. - ''' - - maxShipSpeed = 15. # m/s - maxBuoySpeed = 2. # m/s - - if headers == []: - return [] - - # determine speeds and angles for list of headers - speeds, angles = calculateTraj(headers) - - # decide if something needs to be flagged - maxSpeed = maxShipSpeed - if isBuoy(headers[0]): - maxSpeed = maxBuoySpeed - iMax = speeds.index(max(speeds)) - flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) - - # decide which profile to reject, flag it, and return a list of indices rejected at this step. - if flag: - rejects = chooseReject(headers, speeds, angles, iMax, maxSpeed) - - for reject in rejects: - EN_track_results[(headers[reject].cruise(), headers[reject].uid())][0] = True - return rejects - else: - return [] - -def chooseReject(headers, speeds, angles, index, maxSpeed): - ''' - decide which profile to reject, headers[index] or headers[index-1], or both, - and return a list of indices to reject. - ''' - - # chain of tests breaks when a reject is found: - reject = condition_a(headers, speeds, angles, index, maxSpeed)[0] - - # condition i needs to run at the end of the chain in all cases: - # if no decision, reject both: - if reject == -1: - reject = [index-1, index] - # if excessive speed is created by removing the flag, reject both instead - # can't create new excessive speed by removing last profile. - elif reject < len(headers)-1: - newHeaders = copy.deepcopy(headers) - del newHeaders[reject] - newSpeeds, newAngles = calculateTraj(newHeaders) - flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) - if flag: - reject = [index-1, index] - else: - reject = [reject] - else: - reject = [reject] - - return reject - -def calculateTraj(headers): - ''' - return a list of speeds and a list of angles describing the trajectory of the track described - by the time-ordered list of . - ''' - - speeds = [None] - angles = [None] - - # Find speed and angle for all profiles remaining in the list - for i in range(1, len(headers)): - - speeds.append(None) - angles.append(None) - - speeds[i] = trackSpeed(headers[i-1], headers[i]) - if i < len(headers)-1: # can't do angle on last point - angles[i] = abs(math.pi - geo.haversineAngle(headers[i-1], headers[i], headers[i+1])) - - return speeds, angles - -def isBuoy(header): - ''' - decide if header belongs to a buoy-based measurement - ''' - - return header.probe_type in [4,7,9,10,11,12,13,15] - -def detectExcessiveSpeed(speeds, angles, index, maxSpeed): - ''' - decide if there was an excessive speed at in the lists and - ''' - - flag = speeds[index] > maxSpeed - - if index > 0: - flag = flag or ( (speeds[index] > 0.8*maxSpeed) and (angles[index]>math.pi/2 or angles[index-1]>math.pi/2) ) - - return flag - -def meanSpeed(speeds, headers, maxSpeed): - ''' - determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) - ''' - - meanSpeed = 0 - speedCount = 0 - for iSpeed, speed in enumerate(speeds): - if speed == None or iSpeed == 0: - #missing values - continue - elif iSpeed > 0 and geo.deltaTime(headers[iSpeed-1], headers[iSpeed]) < 3600.: - #too close together in time - continue - elif speed > maxSpeed: - #too fast - continue - else: - meanSpeed += speed - speedCount += 1 - - if speedCount > 0: - meanSpeed = meanSpeed / speedCount - - return meanSpeed - - -def trackSpeed(prevHeader, header): - ''' - computes the speed, including rounding tolerance from the reference, - for the track at

. - return None if some necessary data is missing - ''' - - # check that all required data is present: - if None in [header.latitude(), header.longitude(), prevHeader.latitude(), prevHeader.longitude()]: - return None - if None in [header.year(), header.month(), header.day(), header.time(), prevHeader.year(), prevHeader.month(), prevHeader.day(), prevHeader.time()]: - return None - - dist = geo.haversineDistance(prevHeader, header) - DTime = geo.deltaTime(prevHeader, header) - speed = (dist - DistRes) / max(DTime, TimeRes) - - return speed - -def condition_a(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (a) from the text - ''' - - if index == 1 and len(headers) == 2: - return 0, 'a' - elif index == 1 and len(headers) > 2: # note 'M' in the text seems to count from 1, not 0. - impliedSpeed = trackSpeed(headers[0], headers[2]) - if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): - return 1, 'a' - else: - return 0, 'a' - elif index == len(headers)-1 and len(headers)>3: # why not >=? seems to cause problems, investigate. - impliedSpeed = trackSpeed(headers[-3], headers[-1]) - if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): - return index-1, 'a' - else: - return index, 'a' - else: - return condition_b(headers, speeds, angles, index, maxSpeed) - -def condition_b(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (b) from the text - ''' - if speeds[index-1] > maxSpeed: - return index-1, 'b' - elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: - return index, 'b' - - return condition_c(headers, speeds, angles, index, maxSpeed) - -def condition_c(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (c) from the text - ''' - - if index < len(headers)-1 and index > 0: - impliedSpeed = trackSpeed(headers[index-1], headers[index+1]) - if impliedSpeed > maxSpeed: - return index-1, 'c' - - if index > 1: - impliedSpeed = trackSpeed(headers[index-2], headers[index]) - if impliedSpeed > maxSpeed: - return index, 'c' - - return condition_d(headers, speeds, angles, index, maxSpeed) - - -def condition_d(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (d) from the text - ''' - - if None not in [angles[index-1], angles[index]] and angles[index-1] > 45./180.*math.pi + angles[index]: - return index-1, 'd' - - if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: - return index, 'd' - - return condition_e(headers, speeds, angles, index, maxSpeed) - -def condition_e(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (e) from the text - ''' - - if len(headers) > max(2, index+1): - - if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: - return index-1, 'e' - - if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: - return index, 'e' - - return condition_f(headers, speeds, angles, index, maxSpeed) - -def condition_f(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (f) from the text - ''' - - if index>0 and index < len(speeds)-1: - - ms = meanSpeed(speeds, headers, maxSpeed) - - if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): - return index-1, 'f' - - if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): - return index, 'f' - - return condition_g(headers, speeds, angles, index, maxSpeed) - -def condition_g(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (g) from the text - ''' - - if index > 1 and index < len(headers) - 1: - - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) - - distTol = geo.haversineDistance(headers[index-1], headers[index-2]) - distTol += geo.haversineDistance(headers[index], headers[index-1]) - distTol += geo.haversineDistance(headers[index+1], headers[index]) - distTol = max(DistRes, 0.1*distTol) - - if dist1 < dist2 - distTol: - return index-1, 'g' - - if dist2 < dist1 - distTol: - return index, 'g' - - return condition_h(headers, speeds, angles, index, maxSpeed) - -def condition_h(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (h) from the text - typeo in text, implementation incomplete - ''' - - if index > 1 and index < len(headers) - 1: - - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) - - PD1 = geo.haversineDistance(headers[index-1], headers[index-2]) / dist2 - PD2 = geo.haversineDistance(headers[index], headers[index-2]) / dist1 - - PT1 = geo.deltaTime(headers[index-2], headers[index-1]) / geo.deltaTime(headers[index-2], headers[index+1]) - PT2 = geo.deltaTime(headers[index-2], headers[index]) / geo.deltaTime(headers[index-2], headers[index+1]) - - if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): - return index-1, 'h' - if abs(PD2 - PT2) > 0.1 + abs(PD1 - PT1): - return index, 'h' - - return -1, 'i' - -def checkOrder(profiles): - ''' - check that a list of profiles is properly time ordered - ''' - - dates = [] - for pro in profiles: - if pro.time() is not None: - hour, minute, second = geo.parseTime(pro.time()) - else: - hour = 0 - minute = 0 - second = 0 - date = datetime.datetime(year=pro.year(), month=pro.month(), day=pro.day(), hour=hour, minute=minute, second=second ) - dates.append(date) - - for i in range(len(dates)-1): - assert dates[i] <= dates [i+1], 'dates out of order %s %s' % (dates[i], dates[i+1]) diff --git a/qctests/ICDC_aqc_01_level_order.py b/qctests/ICDC_aqc_01_level_order.py deleted file mode 100644 index b64688c..0000000 --- a/qctests/ICDC_aqc_01_level_order.py +++ /dev/null @@ -1,111 +0,0 @@ -''' -Python version of check_aqc_01_level_order.f with input/output -adjusted to work with the AutoQC testing suite. Details of the -original code are: - -c/ DATE: JANUARY 14 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: check_aqc_01_levels_order - -c/ PURPOSE: -c to check the original level order; -c if necessary to bring the original levels to increasing order -''' - -import numpy as np - -# Global variables to hold data to avoid having to recalculate order -# repeatedly for the same profile. -uid = None -nlevels = 0 -origlevels = None -zr = None -tr = None -qc = None - -def test(p): - '''Return a set of QC decisions. This corresponds to levels with - negative depths. - ''' - - level_order(p) - - return qc - -def reordered_data(p): - '''Return number levels and depth, temperature in depth order. - Only non-rejected levels are returned. - ''' - - level_order(p) - - return nlevels, zr, tr - -def revert_order(p, data): - '''Return data in the original profile order. Data rejected in - the level_order function are returned as missing data. - ''' - - level_order(p) - - datar = np.ma.array(np.ndarray(p.n_levels()), - dtype = data.dtype) - datar.mask = True - - for i, datum in enumerate(data): - datar[origlevels[i]] = datum - - return datar - -def revert_qc_order(p, qc): - '''Return QC array. Missing data values are set to False.''' - - qcr = revert_order(p, qc) - qcr[qcr.mask] = False - return qcr - -def level_order(p): - '''Reorders data into depth order and rejects levels with - negative depth. - ''' - global uid, nlevels, origlevels, zr, tr, qc - - # Check if the module already holds the results for this profile. - if uid == p.uid() and uid is not None: - return None - - # Extract data and define the index for each level. - z = p.z() - t = p.t() - origlevels = np.arange(p.n_levels()) - - # Implement the QC. For this test we only reject negative depths. - qc = z < 0 - - # Remove occurrences of no data at a level and rejected obs. - use = (z.mask == False) & (t.mask == False) & (qc == False) - z = z[use] - t = t[use] - origlevels = origlevels[use] - nlevels = np.count_nonzero(use) - - if nlevels > 1: - # Sort the data. Using mergesort keeps levels with the same depth - # in the same order. - isort = np.argsort(z, kind='mergesort') - zr = z[isort] - tr = t[isort] - origlevels = origlevels[isort] - else: - zr = z - tr = t - - return None - - diff --git a/qctests/ICDC_aqc_02_crude_range.py b/qctests/ICDC_aqc_02_crude_range.py deleted file mode 100644 index 18e560f..0000000 --- a/qctests/ICDC_aqc_02_crude_range.py +++ /dev/null @@ -1,68 +0,0 @@ -''' -Python version of check_aqc_02_crude_range.f. Details of the -original code are: - -c/ DATE: JANUARY 19 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: check_aqc_02_crude_range - -c/ PURPOSE: -c to check weather the temperature value is within the crude range -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np - -def test(p): - '''Return a set of QC decisions. - ''' - - nlevels, z, t = ICDC.reordered_data(p) - - qc = (t < parminover) | (t > parmaxover) - - for i, tval in enumerate(t): - if qc[i]: continue # Already rejected. - - zval = z[i] - - if np.any((tval >= tcrude1) & (tval <= tcrude2) & - (zval <= zcrude1) & (zval >= zcrude2)): - qc[i] = True - - return ICDC.revert_qc_order(p, qc) - -# Ranges: -tcrude1 = np.array( - [-3.5,-2.5,-2.3,-2.0,-1.4,-1.0,-0.8,-0.5,-0.4,3.0, - 5.0,5.5,6.0,7.0,7.5,8.8,9.5,10.0,11.0,12.0,12.8,13.5, - 14.75,15.0,16.0,17.5,18.5,19.0,20.0,21.4,22.4,23.0,24.0, - 26.0,28.0,31.0,32.0]) - -tcrude2 = np.array( - [-2.5,-2.3,-2.0,-1.4,-1.0,-0.8,-0.5,-0.4,3.0, - 5.0,5.5,6.0,7.0,7.5,8.8,9.5,10.0,11.0,12.0,12.8,13.5, - 14.75,15.0,16.0,17.5,18.5,19.0,20.0,21.4,22.4,23.0,24.0, - 26.0,28.0,31.0,32.0,35.0]) - -zcrude1 = np.ndarray(37) -zcrude1[:] = 9000.0 - -zcrude2 = np.array( - [ 0., 500.,1200.,2000.,3800.,4200., - 5000.,6000.,9000.,7500.,4400.,1950., - 1900.,1800.,1700.,2200.,1700.,5200., - 1600.,1400.,3600.,5200.,1000., 800., - 1800., 800., 600., 400., 350.,2400., - 400., 350., 300., 250., 200., 100., 50.]) - -parminover = -2.3 -parmaxover = 33.0 - - diff --git a/qctests/ICDC_aqc_04_max_obs_depth.py b/qctests/ICDC_aqc_04_max_obs_depth.py deleted file mode 100644 index 878ce31..0000000 --- a/qctests/ICDC_aqc_04_max_obs_depth.py +++ /dev/null @@ -1,54 +0,0 @@ -''' -Python version of check_aqc_04_instrument_type_max_obs_depth.f. Details of the -original code are: - -c/ DATE: JANUARY 20 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - - -c/ TITLE: check_aqc_04_instrument_type_max_obs_depth - -c/ PURPOSE: -c compare observed depths with unstrument type maximum observed depth -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np -from util.wod import wod_database - -def test(p): - '''Return quality control decisions. - ''' - - # Get WOD database. - db = wod_database(p) - - # Set maximum allowed depth. If not defined, it is set to the highest - # possible float. - if db == 'OSD': - zlast = 9000.0 - elif db == 'CTD': - zlast = 9000.0 - elif db == 'PFL': - zlast = 2020.0 - elif db == 'APB': - zlast = 1200.0 - elif db == 'MBT' and p.primary_header['Country code'] == 'JP': - zlast = 295.00001 - elif db == 'XBT': - zlast = 1900.0 - else: - zlast = np.finfo(dtype=float).max - - # Set QC flags. - qc = p.z() >= zlast - - return qc - - - diff --git a/qctests/ICDC_aqc_05_stuck_value.py b/qctests/ICDC_aqc_05_stuck_value.py deleted file mode 100644 index 4c70829..0000000 --- a/qctests/ICDC_aqc_05_stuck_value.py +++ /dev/null @@ -1,71 +0,0 @@ -''' -Python version of check_aqc_05_stuck_value.f. Details of the original code are: - -c/ DATE: JANUARY 20 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: check_aqc_05_stuck_value - -c/ PURPOSE: -c to check temperature profile for stuck value/unrealistically thick thermostad -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np -from util.wod import wod_database - -def test(p): - '''Return quality control decisions. - ''' - - # Default set of QC flags to return. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Set minimum allowed levels. - db = wod_database(p) - if db == 'OSD': - minlevs = 7 - elif db == 'CTD': - minlevs = 50 - elif db == 'PFL': - minlevs = 20 - elif db == 'APB': - minlevs = 20 - elif db == 'MBT': - minlevs = 7 - elif db == 'XBT': - minlevs = 20 - else: - return qc # Do not have the information to QC other types. - - # Check that we have the levels we need. - nlevels, z, t = ICDC.reordered_data(p) - if nlevels <= minlevs: return qc - - # Count stuck values. - n = np.ones(nlevels, dtype=int) - for i in range(nlevels - minlevs): - for j in range(i + 1, nlevels): - diff = np.abs(t[i] - t[j]) - if diff > 0.0001: break - n[i] += 1 - - # Find the largest stuck value range. - i = np.argmax(n) - if n[i] < minlevs: return qc - thick = z[i + n[i] - 1] - z[i] - if thick >= 200.0: - # If setting the QC flags we need to be careful about level order. - qclo = qc[0:nlevels] - qclo[i:i+n[i]] = True - qc = ICDC.revert_qc_order(p, qclo) - - return qc - - - diff --git a/qctests/ICDC_aqc_06_n_temperature_extrema.py b/qctests/ICDC_aqc_06_n_temperature_extrema.py deleted file mode 100644 index 8e4bbee..0000000 --- a/qctests/ICDC_aqc_06_n_temperature_extrema.py +++ /dev/null @@ -1,62 +0,0 @@ -''' -Python version of check_aqc_06_number_of_temperature_extrema.f. -Details of the original code are: - -c/ DATE: JANUARY 20 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: check_aqc_06_number_of_temperature_extrema - -c/ PURPOSE: -c find profiles with unrealistically large number of temperature extrema -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np - -def test(p): - '''Return quality control decisions. - ''' - - # Initialise data. - qc = np.zeros(p.n_levels(), dtype=bool) - parminover = -2.3 - parmaxover = 33.0 - levminext = 6 - deltaext = 0.5 - maxextre = 4 - - # Check that we have the levels we need. - nlevels, z, t = ICDC.reordered_data(p) - if nlevels <= levminext: return qc - - # Exclude data outside allowed range. - use = (t > parminover) & (t <= parmaxover) - nuse = np.count_nonzero(use) - if nuse < levminext: return qc - z = z[use] - t = t[use] - - # Find and count the extrema. - ima = 0 - for i in range(1, nuse - 1): - pcent = t[i] - pa = np.abs(pcent - t[i - 1]) - pb = np.abs(pcent - t[i + 1]) - pmin = min(pa, pb) - if pcent > t[i - 1] and pcent > t[i + 1] and pmin > deltaext: - ima += 1 - if pcent < t[i - 1] and pcent < t[i + 1] and pmin > deltaext: - ima += 1 - if ima > maxextre: - qc[:] = True - - return qc - - - diff --git a/qctests/ICDC_aqc_07_spike_check.py b/qctests/ICDC_aqc_07_spike_check.py deleted file mode 100644 index 5be4abc..0000000 --- a/qctests/ICDC_aqc_07_spike_check.py +++ /dev/null @@ -1,75 +0,0 @@ -''' -Python version of check_aqc_07_spike_check.f. -Details of the original code are: - -c/ DATE: JANUARY 25 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - - -c/ TITLE: check_aqc_07_spike_check - -c/ PURPOSE: -c to check temperature profile for spikes -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np - -def test(p): - '''Return quality control decisions. - ''' - - # The test is run on re-ordered data. - nlevels, z, t = ICDC.reordered_data(p) - qc = np.zeros(nlevels, dtype=bool) - if nlevels < 3: return qc # Not enough levels to check. - - # Ignore any levels outside of limits. - parminover = -2.3 - parmaxover = 33.0 - use = (t > parminover) & (t < parmaxover) - nuse = np.count_nonzero(use) - if nuse < 3: return qc - zuse = z[use] - tuse = t[use] - origlevels = (np.arange(nlevels))[use] - - # Extract sections of the arrays. We are QCing the values - # in the z2 and v3 arrays. - z1 = zuse[0:-2] - z2 = zuse[1:-1] - z3 = zuse[2:] - v1 = tuse[0:-2] - v2 = tuse[1:-1] - v3 = tuse[2:] - ol = origlevels[1:-1] - - # Calculate the level of 'spike'. - z13 = z3 - z1 - z12 = z2 - z1 - z23 = z3 - z2 - - a = 0.5 * (v1 + v3) - q1 = np.abs(v2 - a) - q2 = np.abs(0.5 * (v3 - v1)) - - spike = q1 - q2 - - # Define the threshold at each level. - spikemax = np.ndarray(nuse - 2) - spikemax[:] = 4.0 - spikemax[z2 > 1000.0] = 3.0 - spikemax[z2 > 2000.0] = 2.0 - - # Set QC flags. - qc[ol[spike > spikemax]] = True - - return ICDC.revert_qc_order(p, qc) - - - diff --git a/qctests/ICDC_aqc_08_gradient_check.py b/qctests/ICDC_aqc_08_gradient_check.py deleted file mode 100644 index 4f463bc..0000000 --- a/qctests/ICDC_aqc_08_gradient_check.py +++ /dev/null @@ -1,63 +0,0 @@ -''' -Python version of check_aqc_08_gradient_check.f. -Details of the original code are: - -c/ DATE: JANUARY 28 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: check_aqc_08_gradient_check - -c/ PURPOSE: -c to check temperature profile for unrealistic vertical gradients -''' - -import ICDC_aqc_01_level_order as ICDC -import numpy as np - -def test(p): - '''Return quality control decisions. - ''' - - # Global ranges - data outside these bounds are ignored. - parminover = -2.3 - parmaxover = 33.0 - - # The test is run on re-ordered data. - nlevels, z, t = ICDC.reordered_data(p) - qc = np.zeros(nlevels, dtype=bool) - - # Calculate gradients and thresholds. - z0 = z[0:-1] - z1 = z[1:] - t0 = t[0:-1] - t1 = t[1:] - - gradients = (t1 - t0) / (z1 - z0) - zmean = 0.5 * (z0 + z1) - zmean[zmean < 1.0] = 1.0 - - gradmin = -150.0 / zmean - 0.010 - gradmin[gradmin < -4.0] = -4.0 - - gradmax = 100.0 / zmean + 0.015 - gradmax[gradmax > 1.5] = 1.5 - - # Find where the gradients and outside the thresholds. - result = np.where(((gradients < gradmin) | (gradients > gradmax)) & - (t0 > parminover) & (t1 > parminover) & - (t0 < parmaxover) & (t1 < parmaxover))[0] - - # Both levels that form the gradient have to be rejected. - if len(result) > 0: - qc[result] = True - qc[result + 1] = True - - return ICDC.revert_qc_order(p, qc) - - - diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py deleted file mode 100644 index b53224c..0000000 --- a/qctests/ICDC_aqc_09_local_climatology_check.py +++ /dev/null @@ -1,220 +0,0 @@ -''' -Python version of check_aqc_09_gradient_check.f. -Details of the original code are: - -c/ DATE: FEBRUARY 4 2016 - -c/ AUTHOR: Viktor Gouretski - -c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany - -c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) - -c/ TITLE: local_climatological_range_check - check_aqc_09_climatological_range - -c/ PURPOSE: -c to check wheather temperature value is within the local climatological range - -c/ Local temperature median and absolute median deviation are calculated on the basis -c/ of the OSD, CTD, and PFL temperature profiles from the WOD13 (updates as of December 2015) -c/ The median and the amd are calculated on a regular 0.5x0.5 lat/lon grid at 60 depth levels -c/ with level spacing increasing with depth. -c/ Variable influence area size is used with the target number of 500 profiles within the influence -c/ area. This number is not achieved in the data sparse regions or nn the deep levels. - -c local climatological ranges for the level k are defined as: -c tminlocal(k)=tmedian(k) - rnumamd*tamd(k) -c tmaxlocal(k)=tmedian(k) + rnumamd*tamd(k) -''' - -import ICDC_aqc_01_level_order as ICDC -from netCDF4 import Dataset -import numpy as np -import os -import time - -def test(p): - '''Return quality control decisions. - ''' - - # The test is run on re-ordered data. - nlevels, z, t = ICDC.reordered_data(p) - - # Define default QC. - defaultqc = np.zeros(p.n_levels(), dtype=bool) - - # No check for the Caspian Sea or Great Lakes. - lat = p.latitude() - lon = p.longitude() - if ((lat >= 35.0 and lat <= 45.0 and lon >= 45.0 and lon <= 60.0) or - (lat >= 40.0 and lat <= 50.0 and lon >= -95.0 and lon <= -75.0)): - return defaultqc - - # Get range. - ranges = get_climatology_range(nlevels, z, lat, lon, p.month()) - if ranges is None: - return defaultqc - - # Perform the QC. - tmin, tmax = ranges - qc = ((t < tmin) | (t > tmax)) & (tmin != fillValue) & (tmax != fillValue) - - return ICDC.revert_qc_order(p, qc) - -def get_climatology_range(nlevels, z, lat, lon, month): - - # Define arrays for the results. - tmin = np.ndarray(nlevels) - tmax = np.ndarray(nlevels) - tmin[:] = fillValue - tmax[:] = fillValue - - # Calculate grid indices. - iy = int(np.floor((90.0 - lat) / 0.5)) - ix = int(np.floor((lon + 180.0) / 0.5)) - if (iy < 0 or iy > 360 or ix < 0 or ix > 720): - return None - - # Find the climatology range. - for k in range(nlevels): - # Find the corresponding climatology level. - arg = np.argwhere((z[k] >= zedqc[:-1]) & (z[k] < zedqc[1:])) - if len(arg) > 0: - kisel = arg[0] - else: - continue # No level found. - # Check if using monthly or annual fields. - if kisel <= 15: - useAnnual = False - else: - useAnnual = True - if month is None: useAnnual = True - # Extract the temperature. - if useAnnual == False: - amd = tamdM[ix, iy, kisel, month - 1] - if amd < 0.0: - useAnnual = True - else: - tmedian = tmedM[ix, iy, kisel, month - 1] - if tmedian < parminover: - useAnnual = True - if useAnnual: - amd = tamdA[ix, iy, kisel] - if amd < 0.0: - continue - else: - tmedian = tmedA[ix, iy, kisel] - if tmedian < parminover: - continue - if amd > 0.0 and amd < 0.05: amd = 0.05 - - rnumamd = 3.0 - tmaxa = tmedian + rnumamd * amd - tmina = tmedian - rnumamd * amd - if tmina < parminover: tmina = parminover - if tmaxa > parmaxover: tmaxa = parmaxover - - tmin[k] = tmina - tmax[k] = tmaxa - - return tmin, tmax - -def read_ascii_and_convert_to_netcdf(): - '''Coverts the ASCII data file to netCDF on first read. - This is much faster to access. - ''' - global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue - - # Load the data. - tmedM = np.ndarray([721, 361, 16, 12]) - tamdM = np.ndarray([721, 361, 16, 12]) - tmedA = np.ndarray([721, 361, 60]) - tamdA = np.ndarray([721, 361, 60]) - zedqc = np.ndarray(60) - # Do not use masked arrays to save on memory use. - fillValue = -9.0 # Has to be a negative number. - tmedM[:, :, :, :] = fillValue - tamdM[:, :, :, :] = fillValue - tmedA[:, :, :] = fillValue - tamdA[:, :, :] = fillValue - with open('data/climatological_t_median_and_amd_for_aqc.dat') as f: - for line in f: - vals = line.split() - m = int(vals[0]) - 1 - j = int(vals[1]) - 1 - i = int(vals[3]) - 1 - k = int(vals[5]) - 1 - z = float(vals[6]) - tmedian = float(vals[7]) - absmeddev = float(vals[8]) - - if m < 12 and k < 16: - tmedM[i, j, k, m] = tmedian - tamdM[i, j, k, m] = absmeddev - elif m == 12: - tmedA[i, j, k] = tmedian - tamdA[i, j, k] = absmeddev - zedqc[k] = z - - # Create the netCDF version. - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'w') - idim = nc.createDimension('i', 721) - jdim = nc.createDimension('j', 361) - kmdim = nc.createDimension('km', 16) - kadim = nc.createDimension('ka', 60) - mdim = nc.createDimension('m', 12) - - sf = 0.0001 - tmedav = nc.createVariable('tmedA', 'i4', ('i', 'j', 'ka'), zlib=True) - tmedav.add_offset = 0.0 - tmedav.scale_factor = sf - tmedav[:, :, :] = tmedA - - tamdav = nc.createVariable('tamdA', 'i4', ('i', 'j', 'ka'), zlib=True) - tamdav.add_offset = 0.0 - tamdav.scale_factor = sf - tamdav[:, :, :] = tamdA - - tmedmv = nc.createVariable('tmedM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) - tmedmv.add_offset = 0.0 - tmedmv.scale_factor = sf - tmedmv[:, :, :, :] = tmedM - - tamdmv = nc.createVariable('tamdM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) - tamdmv.add_offset = 0.0 - tamdmv.scale_factor = sf - tamdmv[:, :, :, :] = tamdM - - zedqcv = nc.createVariable('zedqc', 'f4', ('ka',)) - zedqcv[:] = zedqc - - nc.fillValue = fillValue - nc.history = 'Created ' + time.ctime(time.time()) + ' from climatological_t_median_and_amd_for_aqc.dat provided by Viktor Gouretski, Integrated Climate Data Center, University of Hamburg, Hamburg, Germany, February 2016' - nc.close() - -def read_netcdf(): - '''Read climatological data from netCDF. - ''' - global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue - - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') - tmedA = nc.variables['tmedA'][:, :, :] - tamdA = nc.variables['tamdA'][:, :, :] - tmedM = nc.variables['tmedM'][:, :, :, :] - tamdM = nc.variables['tamdM'][:, :, :, :] - zedqc = nc.variables['zedqc'][:] - fillValue = nc.fillValue - nc.close() - -# Global ranges - data outside these bounds are assumed not valid. -parminover = -2.3 -parmaxover = 33.0 - -# Read data. -if os.path.isfile('data/climatological_t_median_and_amd_for_aqc.nc'): - read_netcdf() -else: - read_ascii_and_convert_to_netcdf() - - - diff --git a/qctests/WOD_gradient_check.py b/qctests/WOD_gradient_check.py deleted file mode 100644 index a982c61..0000000 --- a/qctests/WOD_gradient_check.py +++ /dev/null @@ -1,45 +0,0 @@ -""" -Implements the excessive gradient test on page 47 of http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf -""" - -import numpy - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - # Get temperature values from the profile. - t = p.t() - # Get depth values (m) from the profile. - d = p.z() - - assert len(t.data) == len(d.data), 'Number of temperature measurements does not equal number of depth measurements.' - - # initialize qc as a bunch of falses; - # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isDepth = (d.mask==False) - isData = isTemperature & isDepth - - for i in range(0,len(t.data)-1): - if isData[i] & isData[i+1] & (d.data[i+1] - d.data[i] > 0): - - gradient = (t.data[i+1] - t.data[i]) / max([ (d.data[i+1] - d.data[i]) , 3.0]) - - # gradient & inversion check - qc[i] = (gradient > 0.3) or (gradient < -0.7) or qc[i] # in case qc[i] was set true by the zero sensitivity indicator in the previous step - qc[i+1] = (gradient > 0.3) or (gradient < -0.7) - - # zero sensitivity indicator - # flags data if temperature drops to 0 too abruptly, indicating a missing value. - if t.data[i+1] == 0: - if -1.0 * gradient > 5.0 * 0.7: - qc[i+1] = True - - return qc diff --git a/qctests/WOD_range_check.py b/qctests/WOD_range_check.py deleted file mode 100644 index 86a8941..0000000 --- a/qctests/WOD_range_check.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -Implements the WOD range check, -pp 46 http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf -""" -import numpy -import data.ds as ds - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - - - # Get data from the profile. - t = p.t() - d = p.z() - latitude = p.latitude() - longitude = p.longitude() - - temperatures = {} - # initialize qc as a bunch of falses (pass by default) - qc = numpy.zeros(len(t.data), dtype=bool) - - # check for gaps in data - isTemperature = (t.mask==False) - isDepth = (d.mask==False) - isData = isTemperature & isDepth - isLat = isinstance(latitude, float) - isLong = isinstance(longitude, float) - - if not isLat or not isLong: - return qc - - depths = ds.WODtempRanges['depths'] - gLat, gLong = nearestGrid(latitude, longitude) - cellCode = ds.cellCodes[(gLat, gLong)] - region = ds.regionCodes[cellCode] - minima = ds.WODtempRanges[region]['min'] - maxima = ds.WODtempRanges[region]['max'] - - for i in range(1, p.n_levels()): - if isData[i] == False: continue - - # find depth bin - iDepth = 0 - while d[i] > depths[iDepth] and iDepth <= len(depths): - iDepth += 1 - - minTemp = minima[iDepth] - maxTemp = maxima[iDepth] - - if t[i] < minTemp or t[i] > maxTemp: - qc[i] = True - - return qc - - -def nearestGrid(lat, lng): - ''' - find the nearest grid point to lat, lng. - grid st. lat is on [-89.5, 89.5] in steps of 1 - and long is on [-179.5, 179.5] in steps of 1 - ''' - - gLat = (numpy.round(lat - 0.5) + 0.5 + 90) % 180 - 90 - gLong = (numpy.round(lng - 0.5) + 0.5 + 180) % 360 - 180 - - return gLat, gLong diff --git a/qctests/loose_location_at_sea.py b/qctests/loose_location_at_sea.py deleted file mode 100644 index 0aa8357..0000000 --- a/qctests/loose_location_at_sea.py +++ /dev/null @@ -1,55 +0,0 @@ -'''Checks the profile location against a global relief dataset to check it is in the ocean. - It is similar CoTeDe's location at sea test but instead of interpolating to the position - the surrounding points are checked to see if any are ocean points. This allows for - errors in the global relief data or imprecise locations close to the coast. This makes it - similar to the way the ICDC and EN tests work. -''' - -from netCDF4 import Dataset -import numpy as np - -# Define the area either side of the closest global relief point that is -# checked for ocean points. -width = 2 - -# Load data into memory. Include a halo so that we can handle points next the data line. -nc = Dataset('data/etopo5.nc') -etopx = nc.variables['ETOPO05_X'][:] -etopy = nc.variables['ETOPO05_Y'][:] -etoph = np.ndarray([len(etopy) + width * 2, len(etopx) + width * 2]) -etoph[:, :] = -1 # Default is ocean points. -etoph[width:-width, width:-width] = nc.variables['ROSE'][:, :] -etoph[width:-width, 0:width] = etoph[width:-width, -2*width:-width] -etoph[width:-width, -width:] = etoph[width:-width, width:2*width] -nc.close() - -def test(p): - '''Return an array of QC decisions. There is a QC result per level but these - are all set to the same value, determined by the location. - ''' - - qc = np.zeros(p.n_levels(), dtype=bool) - - # Ensure that lon is in the range -180 to 180 or 0 to 360 and lat is from -90 to 90. - lat = p.latitude() - lon = p.longitude() - if lat is None or lon is None: - return qc - if lon < -180 or lon >=360 or lat < -90 or lat > 90: - qc[:] = True - return qc - if lon < 0: lon += 360 # Needs to be in range 0 to 360. - - # Find closest global relief point and extract section of the array. - ilat = np.argmin(np.abs(etopy - lat)) + width # Add on the halo width. - ilon = np.argmin(np.abs(etopx - lon)) + width - data = etoph[ilat - width:ilat + width + 1, ilon - width:ilon + width + 1] - - # If any point is an ocean point then do not reject. - if np.all(data >= 0): - qc[:] = True - - return qc - - - diff --git a/summarize-results.py b/summarize-results.py index 4d5348a..c536010 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -5,7 +5,7 @@ testNames = main.importQC('qctests') testNames.sort() -testNames = [test for test in testNames if test[0:4] == 'Argo'] +testNames = [test for test in testNames if test[0:5] == 'CSIRO'] # connect to database conn = psycopg2.connect("dbname='root' user='root'") From 7f02a9f7885039303469c39b2e839b5b317950f8 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 31 Jul 2016 00:00:41 +0000 Subject: [PATCH 47/79] continuing to implement and validate full-profile db --- qctests/Argo_global_range_check.py | 30 ++ qctests/Argo_gradient_test.py | 41 ++ qctests/Argo_impossible_date_test.py | 35 ++ qctests/Argo_impossible_location_test.py | 27 ++ qctests/Argo_pressure_increasing_test.py | 51 +++ qctests/Argo_regional_range_test.py | 68 +++ qctests/Argo_spike_test.py | 40 ++ qctests/CoTeDe_Argo_density_inversion.py | 11 + qctests/CoTeDe_GTSPP_WOA_normbias.py | 11 + qctests/CoTeDe_GTSPP_global_range.py | 11 + qctests/CoTeDe_GTSPP_gradient.py | 11 + qctests/CoTeDe_GTSPP_profile_envelop.py | 11 + qctests/CoTeDe_GTSPP_spike_check.py | 11 + qctests/CoTeDe_WOA_normbias.py | 11 + qctests/CoTeDe_anomaly_detection.py | 11 + qctests/CoTeDe_digit_roll_over.py | 11 + qctests/CoTeDe_gradient.py | 11 + qctests/CoTeDe_location_at_sea_test.py | 11 + qctests/CoTeDe_rate_of_change.py | 11 + qctests/CoTeDe_spike.py | 11 + qctests/CoTeDe_tukey53H_norm.py | 11 + qctests/EN_background_available_check.py | 58 +++ qctests/EN_background_check.py | 193 +++++++++ qctests/EN_constant_value_check.py | 70 ++++ qctests/EN_increasing_depth_check.py | 94 +++++ qctests/EN_range_check.py | 23 + qctests/EN_spike_and_step_check.py | 202 +++++++++ qctests/EN_spike_and_step_suspect.py | 7 + qctests/EN_stability_check.py | 176 ++++++++ qctests/EN_std_lev_bkg_and_buddy_check.py | 369 +++++++++++++++++ qctests/EN_track_check.py | 392 ++++++++++++++++++ qctests/ICDC_aqc_01_level_order.py | 111 +++++ qctests/ICDC_aqc_02_crude_range.py | 68 +++ qctests/ICDC_aqc_04_max_obs_depth.py | 54 +++ qctests/ICDC_aqc_05_stuck_value.py | 71 ++++ qctests/ICDC_aqc_06_n_temperature_extrema.py | 62 +++ qctests/ICDC_aqc_07_spike_check.py | 75 ++++ qctests/ICDC_aqc_08_gradient_check.py | 63 +++ .../ICDC_aqc_09_local_climatology_check.py | 220 ++++++++++ qctests/WOD_gradient_check.py | 45 ++ qctests/WOD_range_check.py | 71 ++++ qctests/loose_location_at_sea.py | 55 +++ 42 files changed, 2925 insertions(+) create mode 100644 qctests/Argo_global_range_check.py create mode 100644 qctests/Argo_gradient_test.py create mode 100644 qctests/Argo_impossible_date_test.py create mode 100644 qctests/Argo_impossible_location_test.py create mode 100644 qctests/Argo_pressure_increasing_test.py create mode 100644 qctests/Argo_regional_range_test.py create mode 100644 qctests/Argo_spike_test.py create mode 100644 qctests/CoTeDe_Argo_density_inversion.py create mode 100644 qctests/CoTeDe_GTSPP_WOA_normbias.py create mode 100644 qctests/CoTeDe_GTSPP_global_range.py create mode 100644 qctests/CoTeDe_GTSPP_gradient.py create mode 100644 qctests/CoTeDe_GTSPP_profile_envelop.py create mode 100644 qctests/CoTeDe_GTSPP_spike_check.py create mode 100644 qctests/CoTeDe_WOA_normbias.py create mode 100644 qctests/CoTeDe_anomaly_detection.py create mode 100644 qctests/CoTeDe_digit_roll_over.py create mode 100644 qctests/CoTeDe_gradient.py create mode 100644 qctests/CoTeDe_location_at_sea_test.py create mode 100644 qctests/CoTeDe_rate_of_change.py create mode 100644 qctests/CoTeDe_spike.py create mode 100644 qctests/CoTeDe_tukey53H_norm.py create mode 100644 qctests/EN_background_available_check.py create mode 100644 qctests/EN_background_check.py create mode 100644 qctests/EN_constant_value_check.py create mode 100644 qctests/EN_increasing_depth_check.py create mode 100644 qctests/EN_range_check.py create mode 100644 qctests/EN_spike_and_step_check.py create mode 100644 qctests/EN_spike_and_step_suspect.py create mode 100644 qctests/EN_stability_check.py create mode 100644 qctests/EN_std_lev_bkg_and_buddy_check.py create mode 100644 qctests/EN_track_check.py create mode 100644 qctests/ICDC_aqc_01_level_order.py create mode 100644 qctests/ICDC_aqc_02_crude_range.py create mode 100644 qctests/ICDC_aqc_04_max_obs_depth.py create mode 100644 qctests/ICDC_aqc_05_stuck_value.py create mode 100644 qctests/ICDC_aqc_06_n_temperature_extrema.py create mode 100644 qctests/ICDC_aqc_07_spike_check.py create mode 100644 qctests/ICDC_aqc_08_gradient_check.py create mode 100644 qctests/ICDC_aqc_09_local_climatology_check.py create mode 100644 qctests/WOD_gradient_check.py create mode 100644 qctests/WOD_range_check.py create mode 100644 qctests/loose_location_at_sea.py diff --git a/qctests/Argo_global_range_check.py b/qctests/Argo_global_range_check.py new file mode 100644 index 0000000..f20cc95 --- /dev/null +++ b/qctests/Argo_global_range_check.py @@ -0,0 +1,30 @@ +""" +Implements the global range check used in the Argo quality control +system. + +See Argo quality control manual (based on version 2.5). +""" + +from util import obs_utils + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get temperature and pressure values from the profile. + t = p.t() + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + # Make the quality control decisions. This should + # return true if the temperature is outside -2.5 deg C + # and 40 deg C or pressure is less than -5. + qct = (t.mask == False) & ((t.data < -2.5) | (t.data > 40.0)) + qcp = (z.mask == False) & (z.data < -5) + qc = qct | qcp + + return qc + + diff --git a/qctests/Argo_gradient_test.py b/qctests/Argo_gradient_test.py new file mode 100644 index 0000000..4daddf6 --- /dev/null +++ b/qctests/Argo_gradient_test.py @@ -0,0 +1,41 @@ +""" +Implements the gradient test on page 8 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf +""" + +import numpy +from util import obs_utils + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get temperature values from the profile. + t = p.t() + # Get depth values (m) from the profile. + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' + + # initialize qc as a bunch of falses; + # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isPressure = (z.mask==False) + isData = isTemperature & isPressure + + for i in range(1,len(t.data)-1): + if isData[i] & isTemperature[i-1] & isTemperature[i+1]: + + isSlope = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) + + if z.data[i] < 500: + qc[i] = isSlope > 9.0 + else: + qc[i] = isSlope > 3.0 + + return qc diff --git a/qctests/Argo_impossible_date_test.py b/qctests/Argo_impossible_date_test.py new file mode 100644 index 0000000..963736b --- /dev/null +++ b/qctests/Argo_impossible_date_test.py @@ -0,0 +1,35 @@ +""" +Implements the impossible date test on page 6 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf + +The date criterion has been altered so that the test can be applied to all data types. +""" + +import numpy +import calendar + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get the year, month, day and time: + year = p.year() + month = p.month() + day = p.day() + time = p.time() + + # initialize qc as false: + qc = numpy.zeros(1, dtype=bool) + + if year < 1700: + qc[0] = True + elif month not in range(1,13): + qc[0] = True + elif day not in range(1, calendar.monthrange(year, month)[1] + 1): + qc[0] = True + elif time is not None and (time < 0 or time >= 24): + qc[0] = True + + return qc diff --git a/qctests/Argo_impossible_location_test.py b/qctests/Argo_impossible_location_test.py new file mode 100644 index 0000000..8a2276f --- /dev/null +++ b/qctests/Argo_impossible_location_test.py @@ -0,0 +1,27 @@ +""" +Implements the impossible location test on page 6 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf +""" + +import numpy +import calendar + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get the lat and long: + latitude = p.latitude() + longitude = p.longitude() + + # initialize qc as false: + qc = numpy.zeros(1, dtype=bool) + + if isinstance(latitude, float) and latitude < -90 or latitude > 90: + qc[0] = True + elif isinstance(longitude, float) and longitude < -180 or longitude > 180: + qc[0] = True + + return qc diff --git a/qctests/Argo_pressure_increasing_test.py b/qctests/Argo_pressure_increasing_test.py new file mode 100644 index 0000000..6f25b89 --- /dev/null +++ b/qctests/Argo_pressure_increasing_test.py @@ -0,0 +1,51 @@ +""" +Implements the pressure increasing check used in the Argo quality control +system. + +See Argo quality control manual (based on version 2.5), +http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf page 8. +""" + +import numpy as np +from util import obs_utils + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get vertical coordinate values from the profile. + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + # Make the quality control decisions. This should + # return true where z decreases or stays the same. + qc = np.ndarray(p.n_levels(), dtype=bool) + qc[:] = False + iRef = -1 + for i in range(0, p.n_levels()): + # Check if the data value is missing. + if z.mask[i] == True: + continue + + # The first level with a z value is saved to use as a reference + # to compare to the next level. + if iRef == -1: + iRef = i + zRef = z[iRef] + continue + + # Check for non-increasing z. If z increases, update the reference. + if z[i] == zRef: + qc[i] = True + elif z[i] < zRef: + qc[iRef] = True + qc[i] = True + else: + iRef = i + zRef = z[iRef] + + return qc + + diff --git a/qctests/Argo_regional_range_test.py b/qctests/Argo_regional_range_test.py new file mode 100644 index 0000000..3e2d89e --- /dev/null +++ b/qctests/Argo_regional_range_test.py @@ -0,0 +1,68 @@ +""" +Implements the regional range test on page 7 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf +""" + +import numpy +import pyproj +from shapely.geometry import Polygon, Point + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + redSeaLat = [10., 20., 30., 10.] + redSeaLong = [40., 50., 30., 40.] + + mediterraneanLat = [30., 30., 40., 42., 50., 40., 30] + mediterraneanLong = [6., 40., 35., 20., 15., 5., 6.] + + # Get the lat and long and temp: + latitude = p.latitude() + longitude = p.longitude() + t = p.t() + + # check for gaps in data + isTemperature = (t.mask==False) + + # initialize qc as false (all pass) + qc = numpy.zeros(len(t), dtype=bool) + + isInRedSea = isInRegion(latitude, longitude, redSeaLat, redSeaLong) + isInMediterranean = isInRegion(latitude, longitude, mediterraneanLat, mediterraneanLong) + + for i in range(p.n_levels()): + if isTemperature[i]: + if isInRedSea: + if t[i] < 21.7 or t[i] > 40.: + qc[i] = True + if isInMediterranean: + if t[i] < 10. or t[i] > 40.: + qc[i] = True + + return qc + +def isInRegion(lat, longitude, regionLat, regionLong): + ''' + determine if the point lat, longitude is in the region bounded by a polygon with vertices regionLat, regionLong + adapted from solution at http://gis.stackexchange.com/questions/79215/determine-if-point-is-within-an-irregular-polygon-using-python + ''' + + # WGS84 datum + wgs84 = pyproj.Proj(init='EPSG:4326') + + # Albers Equal Area Conic (aea) + nplaea = pyproj.Proj("+proj=laea +lat_0=90 +lon_0=-40 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs") + + # Transform polygon and test point coordinates to northern lat AEAC projection + poly_x, poly_y = pyproj.transform(wgs84, nplaea, regionLong, regionLat) + point_x, point_y = pyproj.transform(wgs84, nplaea, [longitude], [lat]) + + poly_proj = Polygon(zip(poly_x,poly_y)) + + testPoint = Point(point_x[0], point_y[0]) + return testPoint.within(poly_proj) + + diff --git a/qctests/Argo_spike_test.py b/qctests/Argo_spike_test.py new file mode 100644 index 0000000..a302571 --- /dev/null +++ b/qctests/Argo_spike_test.py @@ -0,0 +1,40 @@ +""" +Implements the spike test on page 8 of http://w3.jcommops.org/FTPRoot/Argo/Doc/argo-quality-control-manual.pdf +""" + +import numpy +from util import obs_utils + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get temperature values from the profile. + t = p.t() + # Get pressure values (db) from the profile. + z = obs_utils.depth_to_pressure(p.z(), p.latitude()) + + assert len(t.data) == len(z.data), 'Number of temperature measurements does not equal number of depth measurements.' + + # initialize qc as a bunch of falses; + # implies all measurements pass when a spike can't be calculated, such as at edges & gaps in data: + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isPressure = (z.mask==False) + isData = isTemperature & isPressure + + for i in range(1,len(t.data)-1): + if isData[i] & isTemperature[i-1] & isTemperature[i+1]: + + isSpike = numpy.abs(t.data[i] - (t.data[i-1] + t.data[i+1])/2) - numpy.abs((t.data[i+1] - t.data[i-1])/2) + if z.data[i] < 500: + qc[i] = isSpike > 6.0 + else: + qc[i] = isSpike > 2.0 + + return qc diff --git a/qctests/CoTeDe_Argo_density_inversion.py b/qctests/CoTeDe_Argo_density_inversion.py new file mode 100644 index 0000000..26b9493 --- /dev/null +++ b/qctests/CoTeDe_Argo_density_inversion.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the density inversion QC from the CoTeDe Argo config.''' + + config = 'argo' + testname = 'density_inversion' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_GTSPP_WOA_normbias.py b/qctests/CoTeDe_GTSPP_WOA_normbias.py new file mode 100644 index 0000000..e040cd2 --- /dev/null +++ b/qctests/CoTeDe_GTSPP_WOA_normbias.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the WOA normbias QC from the CoTeDe GTSPP config.''' + + config = 'gtspp' + testname = 'woa_normbias' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_GTSPP_global_range.py b/qctests/CoTeDe_GTSPP_global_range.py new file mode 100644 index 0000000..4d4896d --- /dev/null +++ b/qctests/CoTeDe_GTSPP_global_range.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the global range QC from the CoTeDe GTSPP config.''' + + config = 'gtspp' + testname = 'global_range' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_GTSPP_gradient.py b/qctests/CoTeDe_GTSPP_gradient.py new file mode 100644 index 0000000..da97a9d --- /dev/null +++ b/qctests/CoTeDe_GTSPP_gradient.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the gradient QC from the CoTeDe GTSPP config.''' + + config = 'gtspp' + testname = 'gradient' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_GTSPP_profile_envelop.py b/qctests/CoTeDe_GTSPP_profile_envelop.py new file mode 100644 index 0000000..1645451 --- /dev/null +++ b/qctests/CoTeDe_GTSPP_profile_envelop.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the profile_envelop QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'profile_envelop' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_GTSPP_spike_check.py b/qctests/CoTeDe_GTSPP_spike_check.py new file mode 100644 index 0000000..eaa68fe --- /dev/null +++ b/qctests/CoTeDe_GTSPP_spike_check.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the spike QC from the CoTeDe GTSPP config.''' + + config = 'gtspp' + testname = 'spike' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_WOA_normbias.py b/qctests/CoTeDe_WOA_normbias.py new file mode 100644 index 0000000..2b9bc1c --- /dev/null +++ b/qctests/CoTeDe_WOA_normbias.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the WOA normbias QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'woa_normbias' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_anomaly_detection.py b/qctests/CoTeDe_anomaly_detection.py new file mode 100644 index 0000000..d1c4f05 --- /dev/null +++ b/qctests/CoTeDe_anomaly_detection.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the CoTeDe Anomaly Detection QC.''' + + config = 'anomaly_detection' + testname = 'anomaly_detection' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_digit_roll_over.py b/qctests/CoTeDe_digit_roll_over.py new file mode 100644 index 0000000..f1d0c0a --- /dev/null +++ b/qctests/CoTeDe_digit_roll_over.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the digit roll over QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'digit_roll_over' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_gradient.py b/qctests/CoTeDe_gradient.py new file mode 100644 index 0000000..820bf6c --- /dev/null +++ b/qctests/CoTeDe_gradient.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the gradient QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'gradient' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_location_at_sea_test.py b/qctests/CoTeDe_location_at_sea_test.py new file mode 100644 index 0000000..48cb346 --- /dev/null +++ b/qctests/CoTeDe_location_at_sea_test.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the CoTeDe location at sea QC.''' + + config = 'cotede' + testname = 'location_at_sea' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_rate_of_change.py b/qctests/CoTeDe_rate_of_change.py new file mode 100644 index 0000000..f852aa0 --- /dev/null +++ b/qctests/CoTeDe_rate_of_change.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the rate_of_change QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'rate_of_change' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_spike.py b/qctests/CoTeDe_spike.py new file mode 100644 index 0000000..004ebd2 --- /dev/null +++ b/qctests/CoTeDe_spike.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the spike QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'spike' + + return get_qc(p, config, testname) + + diff --git a/qctests/CoTeDe_tukey53H_norm.py b/qctests/CoTeDe_tukey53H_norm.py new file mode 100644 index 0000000..a444708 --- /dev/null +++ b/qctests/CoTeDe_tukey53H_norm.py @@ -0,0 +1,11 @@ +from cotede_qc.cotede_test import get_qc + +def test(p): + '''Run the tukey53H norm QC from the CoTeDe config.''' + + config = 'cotede' + testname = 'tukey53H_norm' + + return get_qc(p, config, testname) + + diff --git a/qctests/EN_background_available_check.py b/qctests/EN_background_available_check.py new file mode 100644 index 0000000..ca9f93e --- /dev/null +++ b/qctests/EN_background_available_check.py @@ -0,0 +1,58 @@ +""" +The background check on reported levels from the EN quality control +system, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf, includes +setting the QC flags if the background is not available at a profile level. +This aspect is separated out in this check. +""" + +import numpy as np +from qctests.EN_background_check import auxParam +from qctests.EN_background_check import findGridCell + +def test(p, *args): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Define an array to hold results. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Find grid cell nearest to the observation. + ilon, ilat = findGridCell(p, auxParam['lon'], auxParam['lat']) + + # Extract the relevant auxiliary data. + imonth = p.month() - 1 + clim = auxParam['clim'][:, ilat, ilon, imonth] + depths = auxParam['depth'] + + # Remove missing data points. + iOK = (clim.mask == False) + if np.count_nonzero(iOK) == 0: + qc[:] = True + return qc + clim = clim[iOK] + depths = depths[iOK] + + # Find which levels have data. + t = p.t() + z = p.z() + isTemperature = (t.mask==False) + isDepth = (z.mask==False) + isData = isTemperature & isDepth + + # Loop over levels. + for iLevel in range(p.n_levels()): + if isData[iLevel] == False: continue + + # Get the climatology and error variance values at this level. + climLevel = np.interp(z[iLevel], depths, clim, right=99999) + if climLevel == 99999: + qc[iLevel] = True # This could reject some good data if the + # climatology is incomplete, but also can act as + # a check that the depth of the profile is + # consistent with the depth of the ocean. + + return qc + diff --git a/qctests/EN_background_check.py b/qctests/EN_background_check.py new file mode 100644 index 0000000..af3f455 --- /dev/null +++ b/qctests/EN_background_check.py @@ -0,0 +1,193 @@ +""" +Implements the background check on reported levels from the EN quality control +system, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +import EN_spike_and_step_check +import numpy as np +import util.obs_utils as outils +from netCDF4 import Dataset + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Check if the QC of this profile was already done and if not + # run the QC. + if p.uid() != uid or p.uid() is None: + run_qc(p) + + # QC results are in the module variable. + return qc + +def run_qc(p): + """ + Performs the QC check. + """ + + global qc, uid, origLevels, ptLevels, bgLevels, bgStdLevels, bgevStdLevels + + # Define an array to hold results. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Create a record of the processing for use by the background + # and buddy checks on standard levels. + uid = p.uid() + origLevels = [] + ptLevels = [] + bgLevels = [] + + # Find grid cell nearest to the observation. + ilon, ilat = findGridCell(p, auxParam['lon'], auxParam['lat']) + + # Extract the relevant auxiliary data. + imonth = p.month() - 1 + clim = auxParam['clim'][:, ilat, ilon, imonth] + bgev = auxParam['bgev'][:, ilat, ilon] + bgStdLevels = clim # Save for use in another check. + bgevStdLevels = bgev # Save the full column for use by another check. + obev = auxParam['obev'] + depths = auxParam['depth'] + + # Remove missing data points. + iOK = (clim.mask == False) & (bgev.mask == False) + if np.count_nonzero(iOK) == 0: return qc + clim = clim[iOK] + bgev = bgev[iOK] + obev = obev[iOK] + depths = depths[iOK] + + # Find which levels have data. + t = p.t() + s = p.s() + z = p.z() + isTemperature = (t.mask==False) + isSalinity = (s.mask==False) + isDepth = (z.mask==False) + isData = isTemperature & isDepth + + # Use the EN_spike_and_step_check to find suspect values. + suspect = EN_spike_and_step_check.test(p, suspect=True) + + # Loop over levels. + for iLevel in range(p.n_levels()): + if isData[iLevel] == False: continue + + # Get the climatology and error variance values at this level. + climLevel = np.interp(z[iLevel], depths, clim, right=99999) + bgevLevel = np.interp(z[iLevel], depths, bgev, right=99999) + obevLevel = np.interp(z[iLevel], depths, obev, right=99999) + if climLevel == 99999: + continue + assert bgevLevel > 0, 'Background error variance <= 0' + assert obevLevel > 0, 'Observation error variance <= 0' + + # If at low latitudes the background error variance is increased. + # Also, because we are on reported levels instead of standard levels + # the variances are increased. NB multiplication factors are squared + # because we are working with error variances instead of standard + # deviations. + if np.abs(p.latitude()) < 10.0: bgevLevel *= 1.5**2 + bgevLevel *= 2.0**2 + + # Set up an initial estimate of probability of gross error. + pge = estimatePGE(p.probe_type(), suspect[iLevel]) + + # Calculate potential temperature. + if isSalinity[iLevel]: + sLevel = s[iLevel] + else: + sLevel = 35.0 + potm = outils.pottem(t[iLevel], sLevel, z[iLevel], lat=p.latitude()) + + # Do Bayesian calculation. + evLevel = obevLevel + bgevLevel + sdiff = (potm - climLevel)**2 / evLevel + pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) + pdTotal = 0.1 * pge + pdGood * (1.0 - pge) + pgebk = 0.1 * pge / pdTotal + + if pgebk >= 0.5: + qc[iLevel] = True + else: + # Store the results. + origLevels.append(iLevel) + ptLevels.append(potm) + bgLevels.append(climLevel) + + return None + +def findGridCell(p, gridLong, gridLat): + ''' + Find grid cell nearest to the observation p, + where gridLong and gridLat are lists of grid coordinates. + ''' + for i in range(1, len(gridLong)): + assert gridLong[i] - gridLong[i-1] == gridLong[1] - gridLong[0], 'longitude grid points must be evenly spaced' + lon = p.longitude() + grid = gridLong + nlon = len(grid) + ilon = int(np.mod(np.round((lon - grid[0]) / (grid[1] - grid[0])), nlon)) + for i in range(1, len(gridLat)): + assert gridLat[i] - gridLat[i-1] == gridLat[1] - gridLat[0], 'latitude grid points must be evenly spaced' + lat = p.latitude() + grid = gridLat + nlat = len(grid) + ilat = int(np.mod(np.round((lat - grid[0]) / (grid[1] - grid[0])), nlat)) + if ilat == nlat: ilat -= 1 # Checks for edge case where lat is ~90. + + assert ilon >=0 and ilon < nlon, 'Longitude is out of range: %f %i' % (lon, ilon) + assert ilat >=0 and ilat < nlat, 'Latitude is out of range: %f %i' % (lat, ilat) + + return ilon, ilat + + +def estimatePGE(probe_type, isSuspect): + ''' + Estimates the probability of gross error for a measurement taken by + the given probe_type. Information from the EN_spike_and_step_check + is used here to increase the initial estimate if the observation is suspect. + ''' + if probe_type in [1,2,3,13,16]: + pge = 0.05 + else: + pge = 0.01 + if isSuspect: + pge = 0.5 + 0.5 * pge + + return pge + +def readENBackgroundCheckAux(): + ''' + Reads auxiliary information needed by the EN background check. + ''' + + filename = 'data/EN_bgcheck_info.nc' + nc = Dataset(filename) + data = {} + data['lon'] = nc.variables['longitude'][:] + data['lat'] = nc.variables['latitude'][:] + data['depth'] = nc.variables['depth'][:] + data['month'] = nc.variables['month'][:] + data['clim'] = nc.variables['potm_climatology'][:] + data['bgev'] = nc.variables['bg_err_var'][:] + data['obev'] = nc.variables['ob_err_var'][:] + + return data + +#import parameters on load +auxParam = readENBackgroundCheckAux() + +# Initialise global variables to hold data needed for the +# EN background and buddy check on standard levels. +uid = None +qc = None +origLevels = [] +ptLevels = [] +bgLevels = [] +bgevStdLevels = [] +bgStdLevels = [] + diff --git a/qctests/EN_constant_value_check.py b/qctests/EN_constant_value_check.py new file mode 100644 index 0000000..82df764 --- /dev/null +++ b/qctests/EN_constant_value_check.py @@ -0,0 +1,70 @@ +""" +Implements the constant value check used in the EN quality control +system, described on page 7 of http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +import numpy + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + if p.uid() != uid or p.uid() is None: + run_qc(p) + + # QC results are stored in the module variable. + return qc + +def run_qc(p): + + global qc, uid + + # Get temperature values from the profile. + t = p.t() + d = p.z() + + temperatures = {} + # initialize qc as a bunch of falses (pass by default) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isDepth = (d.mask==False) + + #dictionary counts instances of each temperature value + for i in range(len(t.data)): + if isTemperature[i]: + if t.data[i] in temperatures: + temperatures[t.data[i]] += 1 + else: + temperatures[t.data[i]] = 1 + + for key in temperatures: + + if float(temperatures[key]) / float(len(t.data)) >= 0.9: + repeats = numpy.where(t.data == key)[0] + #drop the entries that don't have a depth associated with them; + #this triggers the 90% rule regardless of the presence of depth data, but + #ensures that depths are available to assess the range over which constant temps were observed. + repeatsWithDepth = [] + for j in range(len(repeats)): + if isDepth[repeats[j]]: + repeatsWithDepth.append(repeats[j]) + first = repeatsWithDepth[0] + last = repeatsWithDepth[-1] + + if d.data[last] - d.data[first] >= 100: + qc = numpy.ones(len(t.data), dtype=bool) #note everyhing is flagged by this test. + + uid = p.uid() + + return None + +uid = None +qc = None + + + diff --git a/qctests/EN_increasing_depth_check.py b/qctests/EN_increasing_depth_check.py new file mode 100644 index 0000000..68cf77d --- /dev/null +++ b/qctests/EN_increasing_depth_check.py @@ -0,0 +1,94 @@ +""" +Implements the EN increasing depth check. +""" + +import EN_spike_and_step_check +import numpy as np +from collections import Counter + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + if p.uid() != uid or p.uid() is None: + run_qc(p) + + # QC results are in the module variable. + return qc + +def run_qc(p): + + global qc, uid + + # Get z values from the profile. + d = p.z() + mask = d.mask + n = p.n_levels() + + # Initialize qc array. + qc = np.zeros(n, dtype=bool) + + # if all the depths are the same, flag all levels and finish immediately + most_common_depth = Counter(d.data).most_common(1) + if most_common_depth[0][1] == len(d.data): + qc = np.ones(n, dtype=bool) + return None + + # Basic check on each level. + qc[d < 0] = True + qc[d > 11000] = True + + # Now check for inconsistencies in the depth levels. + comp = np.ndarray((n, n), dtype=int) + currentMax = 1 + while currentMax > 0: + # Comp gets set to 1 if there is not an increase in depth. + comp[:, :] = 0 + for i in range(n): + if qc[i] or mask[i]: continue + for j in range(n): + if qc[j] or mask[j] or (i == j): continue + if i < j: + if d[i] >= d[j]: comp[i, j] = 1 + else: + if d[i] <= d[j]: comp[i, j] = 1 + + # Check if comp was set to 1 anywhere and which level was + # most inconsistent with the others. + currentMax = 0 + currentLev = -1 + for i in range(n): + lineSum = np.sum(comp[:, i]) + if lineSum >= currentMax: + currentMax = lineSum + currentLev = i + + # Reject immediately if more than one inconsistency or + # investigate further if one inconsistency. + if currentMax > 1: + qc[currentLev] = True + elif currentMax == 1: + # Find out which level it is inconsistent with. + for i in range(n): + if comp[i, currentLev] == 1: otherLev = i + # Check if one was rejected by the spike and step + # check, otherwise reject both. + try: + spikeqc + except: + spikeqc = EN_spike_and_step_check.test(p) + if spikeqc[currentLev]: qc[currentLev] = True + if spikeqc[otherLev]: qc[otherLev] = True + if spikeqc[currentLev] == False and spikeqc[otherLev] == False: + qc[currentLev] = True + qc[otherLev] = True + + uid = p.uid() + + return None + +uid = None +qc = None diff --git a/qctests/EN_range_check.py b/qctests/EN_range_check.py new file mode 100644 index 0000000..95205be --- /dev/null +++ b/qctests/EN_range_check.py @@ -0,0 +1,23 @@ +""" +Implements the global range check used in the EN quality control +system. +""" + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get temperature values from the profile. + t = p.t() + + # Make the quality control decisions. This should + # return true if the temperature is outside -4 deg C + # and 40 deg C. + qc = (t.mask == False) & ((t.data < -4.0) | (t.data > 40.0)) + + return qc + + diff --git a/qctests/EN_spike_and_step_check.py b/qctests/EN_spike_and_step_check.py new file mode 100644 index 0000000..b35ab7a --- /dev/null +++ b/qctests/EN_spike_and_step_check.py @@ -0,0 +1,202 @@ +""" +Implements the spike and step check used in the EN quality control +system, pages 20-21 of http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf + +The EN quality control system does not directly reject levels that are marked as +steps, it marks them as suspect and then they are subjected to an extra test (a +background check) that can reprieve them. In the future it will be best to +remove these elements and include them within the background check code. +""" + +import numpy as np + +def test(p, suspect=False): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + + By default the test returns definite rejections. If the suspect keyword is + set to True the test instead returns suspect levels. + """ + + if p.uid() != uid or suspect != suspectSetting or p.uid() is None: + run_qc(p, suspect) + + # QC results are in the global variable. + return qc + +def run_qc(p, suspect): + + global uid, qc, suspectSetting + + # Define tolerances used. + tolD = np.array([0, 200, 300, 500, 600]) + tolDTrop = np.array([0, 300, 400, 500, 600]) + tolT = np.array([5.0, 5.0, 2.5, 2.0, 1.5]) + + # Define an array to hold results. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Get depth and temperature values from the profile. + z = p.z() + t = p.t() + + # Find which levels have data. + isTemperature = (t.mask==False) + isDepth = (z.mask==False) + isData = isTemperature & isDepth + + # Array to hold temperature differences between levels and gradients. + dt, gt = composeDT(t, z, p.n_levels()) + + # Spikes and steps detection. + for i in range(1, p.n_levels()): + if i >= 2: + if (isData[i-2] and isData[i-1] and isData[i]) == False: + continue + if z[i] - z[i-2] >= 5.0: + wt1 = (z[i-1] - z[i-2]) / (z[i] - z[i-2]) + else: + wt1 = 0.5 + else: + if (isData[i-1] and isData[i]) == False: + continue + wt1 = 0.5 + + dTTol = determineDepthTolerance(z[i-1], np.abs(p.latitude())) + gTTol = 0.05 + + # Check for low temperatures in the Tropics. + # This might be more appropriate to appear in a separate EN regional + # range check but is included here for now for consistency with the + # original code. + if (np.abs(p.latitude()) < 20.0 and z[i-1] < 1000.0 and + t[i-1] < 1.0): + dt[i] = np.ma.masked + if suspect == True: qc[i-1] = True + continue + + qc, dt = conditionA(dt, dTTol, qc, wt1, i, suspect) + qc, dt = conditionB(dt, dTTol, gTTol, qc, gt, i, suspect) + qc = conditionC(dt, dTTol, z, qc, t, i, suspect) + + # End of loop over levels. + + # Step or 0.0 at the bottom of a profile. + if isData[-1] and dt.mask[-1] == False: + dTTol = determineDepthTolerance(z[-1], np.abs(p.latitude())) + if np.abs(dt[-1]) > dTTol: + if suspect == True: qc[-1] = True + if isTemperature[-1]: + if t[-1] == 0.0: + if suspect == True: qc[-1] = True + + # If 4 levels or more than half the profile is rejected then reject all. + if suspect == False: + nRejects = np.count_nonzero(qc) + if nRejects >= 4 or nRejects > p.n_levels()/2: + qc[:] = True + + # Save details of the QC performed in module variables. + uid = p.uid() + suspectSetting = suspect + + return None + + +def composeDT(var, z, nLevels): + ''' + build the array of deltas for the variable provided + ''' + dt = np.ma.zeros(nLevels) + dt.mask = True + gt = dt.copy() + + for i in range(1, nLevels): + if ((z[i] - z[i-1]) <= 50.0 or (z[i] >= 350.0 and (z[i] - z[i-1]) <= 100.0)): + dt[i] = var[i] - var[i-1] + gt[i] = dt[i] / np.max([10.0, z[i] - z[i-1]]) + + + return dt, gt + + +def determineDepthTolerance(z, lattitude): + ''' + determine depth tolerance + ''' + + if (lattitude < 20.0): + depthTol = 300.0 + else: + depthTol = 200.0 + + if z > 600.0: + tTolFactor = 0.3 + elif z > 500.0: + tTolFactor = 0.4 + elif z > depthTol + 100.0: + tTolFactor = 0.5 + elif z > depthTol: + tTolFactor = 1.0 - 0.005 * (z - depthTol) + else: + tTolFactor = 1.0 + + return tTolFactor * 5.0 + +def conditionA(dt, dTTol, qc, wt1, i, suspect): + ''' + condition A (large spike check) + ''' + if (dt.mask[i-1] == False and dt.mask[i] == False and np.max(np.abs(dt[i-1:i+1])) > dTTol): + if np.abs(dt[i] + dt[i-1]) < 0.5*dTTol: + dt[i-1:i+1] = np.ma.masked + if suspect == False: qc[i-1] = True + elif np.abs((1.0-wt1) * dt[i-1] - wt1*dt[i]) < 0.5*dTTol: + # Likely to be a valid large temperature gradient. + dt[i-1:i+1] = np.ma.masked # Stops the levels being rechecked. + + return qc, dt + +def conditionB(dt, dTTol, gTTol, qc, gt, i, suspect): + ''' + condition B (small spike check) + ''' + if (dt.mask[i-1] == False and dt.mask[i] == False and + np.max(np.abs(dt[i-1:i+1])) > 0.5*dTTol and + np.max(np.abs(gt[i-1:i+1])) > gTTol and + np.abs(dt[i] + dt[i-1]) < 0.25*np.abs(dt[i] - dt[i-1])): + dt[i-1:i+1] = np.ma.masked + if suspect == False: qc[i-1] = True + + return qc, dt + +def conditionC(dt, dTTol, z, qc, t, i, suspect): + ''' + condition C (steps) + ''' + + if dt.mask[i-1] == False and np.abs(dt[i-1]) > dTTol: + if z[i-1] <= 250.0 and dt[i-1] < -dTTol and dt[i-1] > -3.0*dTTol: + # May be sharp thermocline, do not reject. + pass + elif i>1 and z[i] - z[i-2] > 0 and np.abs(t[i-1] - interpolate(z[i-1], z[i-2], z[i], t[i-2], t[i])) < 0.5*dTTol: + # consistent interpolation, do not reject + pass + else: + # mark both sides of the step + if suspect == True: qc[i-2:i] = True + + return qc + +def interpolate(depth, shallow, deep, shallowVal, deepVal): + ''' + interpolate values at + ''' + + return (depth - shallow) / (deep - shallow) * (deepVal - shallowVal) + shallowVal + +uid = None +qc = None +suspectSetting = None diff --git a/qctests/EN_spike_and_step_suspect.py b/qctests/EN_spike_and_step_suspect.py new file mode 100644 index 0000000..e90dda4 --- /dev/null +++ b/qctests/EN_spike_and_step_suspect.py @@ -0,0 +1,7 @@ +'''Returns the suspect levels found by the EN spike and step check.''' + +import EN_spike_and_step_check + +def test(p): + + return EN_spike_and_step_check.test(p, suspect=True) diff --git a/qctests/EN_stability_check.py b/qctests/EN_stability_check.py new file mode 100644 index 0000000..2c8ee51 --- /dev/null +++ b/qctests/EN_stability_check.py @@ -0,0 +1,176 @@ +""" +Implements the stability check described on pages 8-9 of +http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +import math, numpy + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + if p.uid() != uid or p.uid() is None: + run_qc(p) + + # QC results are in the module variable. + return qc + +def run_qc(p): + + global uid, qc + + # Get temperature, salinity, pressure values from the profile. + t = p.t() + s = p.s() + P = p.p() + + # initialize qc as a bunch of falses; + qc = numpy.zeros(p.n_levels(), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isSalinity = (s.mask==False) + isPressure = (P.mask==False) + isData = isTemperature & isSalinity & isPressure + + # calculate potential temperatures + T = [] + for i in range(0, p.n_levels()): + T.append(potentialTemperature(s[i], t[i], P[i])) + + for i in range(2,len(t.data)-1): + if (isData[i] and isData[i-1] and isData[i-2]) == False: + continue + + delta_rho_k = mcdougallEOS(s[i], T[i], P[i]) - mcdougallEOS(s[i-1], T[i-1], P[i-1]) + if delta_rho_k >= -0.03: + continue; + + delta_rho_k_prev = mcdougallEOS(s[i-1], T[i-1], P[i-1]) - mcdougallEOS(s[i-2], T[i-2], P[i-2]) + + if abs(delta_rho_k_prev + delta_rho_k) < 0.25*abs(delta_rho_k_prev - delta_rho_k): + qc[i-1] = True + else: + if isData[i+1] == False: + continue + + delta_rho_k_next = mcdougallEOS(s[i+1], T[i+1], P[i+1]) - mcdougallEOS(s[i], T[i], P[i]) + if abs(delta_rho_k + delta_rho_k_next) < 0.25*abs(delta_rho_k - delta_rho_k_next): + qc[i] = True + else: + qc[i-1] = True + qc[i] = True + + #check bottom of profile + i = p.n_levels()-1 + if isData[i] and isData[i-1]: + delta_rho_k = mcdougallEOS(s[i], T[i], P[i]) - mcdougallEOS(s[i-1], T[i-1], P[i-1]) + if delta_rho_k < -0.03: + qc[i] = True + + #check for critical number of flags, flag all if so: + if sum(qc) >= max(2, len(t.data)/4.): + qc = numpy.ones(len(t.data), dtype=bool) + + uid = p.uid() + + return None + + +def mcdougallEOS(salinity, temperature, pressure): + ''' + equation of state defined in McDougall et al 2003 (http://journals.ametsoc.org/doi/pdf/10.1175/1520-0426%282003%2920%3C730%3AAACEAF%3E2.0.CO%3B2) + returns density in kg/m^3 + ''' + + p1CF = [ + 9.99843699e2, + 7.35212840e0, + -5.45928211e-2, + 3.98476704e-4, + 2.96938239e0, + -7.23268813e-3, + 2.12382341e-3, + 1.04004591e-2, + 1.03970529e-7, + 5.18761880e-6, + -3.24041825e-8, + -1.23869360e-11 + ] + + p2CF = [ + 1.0, + 7.28606739e-3, + -4.60835542e-5, + 3.68390573e-7, + 1.80809186e-10, + 2.14691708e-3, + -9.27062484e-6, + -1.78343643e-10, + 4.76534122e-6, + 1.63410736e-9, + 5.30848875e-6, + -3.03175128e-16, + -1.27934137e-17 + ] + + p1 = p1CF[0] + p1 += p1CF[1]*temperature + p1 += p1CF[2]*temperature*temperature + p1 += p1CF[3]*temperature*temperature*temperature + p1 += p1CF[4]*salinity + p1 += p1CF[5]*salinity*temperature + p1 += p1CF[6]*salinity*salinity + p1 += p1CF[7]*pressure + p1 += p1CF[8]*pressure*temperature*temperature + p1 += p1CF[9]*pressure*salinity + p1 += p1CF[10]*pressure*pressure + p1 += p1CF[11]*pressure*pressure*temperature*temperature + + p2 = p2CF[0] + p2 += p2CF[1]*temperature + p2 += p2CF[2]*temperature*temperature + p2 += p2CF[3]*temperature*temperature*temperature + p2 += p2CF[4]*temperature*temperature*temperature*temperature + p2 += p2CF[5]*salinity + p2 += p2CF[6]*salinity*temperature + p2 += p2CF[7]*salinity*temperature*temperature*temperature + p2 += p2CF[8]*math.pow(salinity, 1.5) + p2 += p2CF[9]*math.pow(salinity, 1.5)*temperature*temperature + p2 += p2CF[10]*pressure + p2 += p2CF[11]*pressure*pressure*temperature*temperature*temperature + p2 += p2CF[12]*pressure*pressure*pressure*temperature + + return p1/p2 + +def potentialTemperature(S, T, p): + # approximation for potential temperature given in McDougall et al 2003 (http://journals.ametsoc.org/doi/pdf/10.1175/1520-0426%282003%2920%3C730%3AAACEAF%3E2.0.CO%3B2) + # S in psu, T in degrees C, p in db + # note p_r = 0 for these fit values + + coef = [ + 0, + 1.067610e-5, + -1.434297e-6, + -7.566349e-9, + -8.535585e-6, + 3.074672e-8, + 1.918639e-8, + 1.788718e-10 + ] + + poly = coef[1] + poly += coef[2]*S + poly += coef[3]*p + poly += coef[4]*T + poly += coef[5]*S*T + poly += coef[6]*T*T + poly += coef[7]*T*p + + return T + p*poly + +uid = None +qc = None diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py new file mode 100644 index 0000000..44bdff2 --- /dev/null +++ b/qctests/EN_std_lev_bkg_and_buddy_check.py @@ -0,0 +1,369 @@ +""" +Implements the background check on standard levels and the buddy check +from the EN quality control system, +http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +from cotede.qctests.possible_speed import haversine +import datetime +import EN_background_check +import EN_constant_value_check +import EN_increasing_depth_check +import EN_range_check +import EN_spike_and_step_check +import EN_stability_check +import util.main as main +import data.ds +import numpy as np + +def test(p, allow_level_reinstating=True): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + + If allow_level_reinstating is set to True then rejected levels can be + reprieved by comparing with levels above and below. NB this is done by + default in EN processing. + """ + + # Define an array to hold results. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Obtain the obs minus background differences on standard levels. + result = stdLevelData(p) + if result is None: return qc + + # Unpack the results. + levels, origLevels, assocLevels = result + # Retrieve the background and observation error variances and + # the background values. + bgsl = EN_background_check.bgStdLevels + slev = EN_background_check.auxParam['depth'] + bgev = EN_background_check.bgevStdLevels + obev = EN_background_check.auxParam['obev'] + + #find initial pge + pgeData = determine_pge(levels, bgev, obev, p) + + # Find buddy. + profiles = data.ds.profiles + minDist = 1000000000.0 + iMinDist = None + for iProfile, profile in enumerate(profiles): + pDist = assessBuddyDistance(p, profile) + if pDist is not None and pDist < minDist: + minDist = pDist + iMinDist = iProfile + + # Check if we have found a buddy and process if so. + if minDist <= 400000: + fid = None + pBuddy, currentFile, fid = main.profileData(profiles[iMinDist], '', fid) + fid.close() + + # buddy vetos + Fail = False + if pBuddy.var_index() is None: + Fail = True + if Fail == False: + main.catchFlags(pBuddy) + if np.sum(pBuddy.t().mask == False) == 0: + Fail = True + + if Fail == False: + result = stdLevelData(pBuddy) + if result is not None: + levelsBuddy, origLevelsBuddy, assocLevelsBuddy = result + bgevBuddy = EN_background_check.bgevStdLevels + pgeBuddy = determine_pge(levels, bgevBuddy, obev, pBuddy) + pgeData = update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, p, pBuddy, obev, bgev, bgevBuddy) + + # Check if levels should be reinstated. + if allow_level_reinstating: + if np.abs(p.latitude()) < 20.0: + depthTol = 300.0 + else: + depthTol = 200.0 + stdLevelFlags = pgeData >= 0.5 + for i, slflag in enumerate(stdLevelFlags): + if slflag: + # Check for non rejected surrounding levels. + okbelow = False + if i > 0: + if stdLevelFlags[i - 1] == False and levels.mask[i - 1] == False and bgsl.mask[i - 1] == False: + okbelow = True + okabove = False + nsl = len(stdLevelFlags) + if i < nsl - 1: + if stdLevelFlags[i + 1] == False and levels.mask[i + 1] == False and bgsl.mask[i + 1] == False: + okabove = True + # Work out tolerances. + if slev[i] > depthTol + 100: + tolFactor = 0.5 + elif slev[i] > depthTol: + tolFactor = 1.0 - 0.005 * (slev[i] - depthTol) + else: + tolFactor = 1.0 + ttol = 0.5 * tolFactor + if okbelow == True and okabove == True: + xmax = levels[i - 1] + bgsl[i - 1] + ttol + xmin = levels[i + 1] + bgsl[i + 1] - ttol + elif okbelow == True: + xmax = levels[i - 1] + bgsl[i - 1] + ttol + xmin = levels[i - 1] + bgsl[i - 1] - ttol + elif okabove == True: + xmax = levels[i + 1] + bgsl[i + 1] + ttol + xmin = levels[i + 1] + bgsl[i + 1] - ttol + else: + continue + # Reassign PGE if level is within the tolerances. + if levels[i] + bgsl[i] >= xmin and levels[i] + bgsl[i] <= xmax: + pgeData[i] = 0.49 + + # Assign the QC flags to original levels. + for i, pge in enumerate(pgeData): + if pgeData.mask[i]: continue + if pge < 0.5: continue + for j, assocLevel in enumerate(assocLevels): + if assocLevel == i: + origLevel = origLevels[j] + qc[origLevel] = True + + return qc + +def determine_pge(levels, bgev, obev, profile): + ''' + determine the probability of gross error per level given: + levels: a list of observed - background temperatures per level (ie the first return of stdLevelData) + bgev: list of background error variance per level + obev: list of observational error variances per level + profile: the wodpy profile object in question + ''' + pge = np.ma.array(np.ndarray(len(levels))) + pge.mask = True + + for iLevel, level in enumerate(levels): + if levels.mask[iLevel] or bgev.mask[iLevel]: continue + bgevLevel = bgev[iLevel] + if np.abs(profile.latitude()) < 10.0: bgevLevel *= 1.5**2 + obevLevel = obev[iLevel] + pge_est = EN_background_check.estimatePGE(profile.probe_type(), False) + + kappa = 0.1 + evLevel = obevLevel + bgevLevel #V from the text + sdiff = level**2 / evLevel + pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) + pdTotal = kappa * pge_est + pdGood * (1.0 - pge_est) + pge[iLevel] = kappa * pge_est / pdTotal + + return pge + +def buddyCovariance(minDist, profile, buddyProfile, meso_ev_a, meso_ev_b, syn_ev_a, syn_ev_b): + ''' + coavariance formula for buddy profiles, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf pp.11 + meso_ev_a == mesoscale error variance for profile a, etc. + ''' + + corScaleA = 100.0 # In km. + corScaleB = 400.0 # In km. + corScaleT = 432000.0 # 5 days in secs. + mesSDist = minDist / (1000.0 * corScaleA) + synSDist = minDist / (1000.0 * corScaleB) + + timeDiff2 = timeDiff(profile, buddyProfile) + if timeDiff2 is None: + return None + timeDiff2 = (timeDiff2 / corScaleT)**2 + + covar = (np.sqrt(meso_ev_a * meso_ev_b) * + (1.0 + mesSDist) * np.exp(-mesSDist - timeDiff2) + + np.sqrt(syn_ev_a * syn_ev_b) * + (1.0 + synSDist) * np.exp(-synSDist - timeDiff2)) + + return covar + +def update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, profile, buddyProfile, obev, bgev, bgevBuddy): + ''' + update the PGE for the profile in question using the buddy pge. + ''' + + for iLevel in range(len(levelsBuddy)): + if levels.mask[iLevel] or levelsBuddy.mask[iLevel]: continue + + # For simplicity, going to assume that length scales + # are isotropic and the same everywhere; in the EN + # processing length scales are stretched in E/W direction + # near the equator and this functionality could be added + # later. + + covar = buddyCovariance(minDist, profile, buddyProfile, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0) + if covar is None: + continue; + + errVarA = obev[iLevel] + bgev[iLevel] + errVarB = obev[iLevel] + bgevBuddy[iLevel] + rho2 = covar**2 / (errVarA + errVarB) + expArg = (-(0.5 * rho2 / (1.0 - rho2)) * + (levels[iLevel]**2 / errVarA + + levelsBuddy[iLevel]**2 / errVarB - + 2.0 * levels[iLevel] * levelsBuddy[iLevel] / covar)) + expArg = -0.5 * np.log(1.0 - rho2) + expArg + expArg = min(80.0, max(-80.0, expArg)) + Z = 1.0 / (1.0 - (1.0 - pgeData[iLevel]) * + (1.0 - pgeBuddy[iLevel]) * (1.0 - expArg)) + if Z < 0.0: Z = 1.0 # In case of rounding errors. + Z = Z**0.5 + pgeData[iLevel] = pgeData[iLevel] * Z + + return pgeData + +def stdLevelData(p): + """ + Combines data that have passed other QC checks to create a + set of observation minus background data on standard levels. + """ + + # Combine other QC results. + preQC = (EN_background_check.test(p) | + EN_constant_value_check.test(p) | + EN_increasing_depth_check.test(p) | + EN_range_check.test(p) | + EN_spike_and_step_check.test(p) | + EN_stability_check.test(p)) + + # Get the data stored by the EN background check. + # As it was run above we know that the data held by the + # module corresponds to the correct profile. + origLevels = np.array(EN_background_check.origLevels) + diffLevels = (np.array(EN_background_check.ptLevels) - + np.array(EN_background_check.bgLevels)) + nLevels = len(origLevels) + if nLevels == 0: return None # Nothing more to do. + + # Remove any levels that failed previous QC. + nLevels, origLevels, diffLevels = filterLevels(preQC, origLevels, diffLevels) + if nLevels == 0: return None + + levels, assocLevs = meanDifferencesAtStandardLevels(origLevels, diffLevels, p.z()) + + return levels, origLevels, assocLevs + +def filterLevels(preQC, origLevels, diffLevels): + ''' + preQC: list or array of bools indicating a QC state for each level, determined from other tests + origLevels: list of level indices that passed EN_background + diffLevels: correpsonding to origLevels. + return (nLevels, origLevels, diffLevels) with all elements corresponding to a True entry in preQC removed. + ''' + + nLevels = len(origLevels) + use = np.ones(nLevels, dtype=bool) + for i, origLevel in enumerate(origLevels): + if preQC[origLevel]: use[i] = False + nLevels = np.count_nonzero(use) + origLevels = origLevels[use] + diffLevels = diffLevels[use] + + return nLevels, origLevels, diffLevels + +def meanDifferencesAtStandardLevels(origLevels, diffLevels, depths): + ''' + origLevels: list of level indices under consideration + diffLevels: list of differences corresponding to origLevels + depths: list of depths of all levels in profile. + returns (levels, assocLevs), where + levels == a masked array of mean differences at each standard level + assocLevs == a list of the indices of the closest standard levels to the levels indicated in origLevels + ''' + + # Get the set of standard levels. + stdLevels = EN_background_check.auxParam['depth'] + + # Create arrays to hold the standard level data and aggregate. + nStdLevels = len(stdLevels) + levels = np.zeros(nStdLevels) + nPerLev = np.zeros(nStdLevels) + assocLevs = [] + for i, origLevel in enumerate(origLevels): + # Find the closest standard level. + j = np.argmin(np.abs(depths[origLevel] - stdLevels)) + assocLevs.append(j) + levels[j] += diffLevels[i] + nPerLev[j] += 1 + + # Average the standard levels where there are data. + iGT1 = nPerLev > 1 + levels[iGT1] /= nPerLev[iGT1] + levels = np.ma.array(levels) + levels.mask = False + levels.mask[nPerLev == 0] = True + + return levels, assocLevs + + +def assessBuddyDistance(p, buddy): + """ + given a profile

and a possible buddy profile , + return None if is not a valid buddy, or the distance + to

if it is. + """ + + # Check that it is not the same profile and that they + # are near in time. The time criteria matches the EN + # processing but would probably be better if it checked + # that the profiles were within a time threshold. The + # cruise is compared as two profiles from the same instrument + # should not be compared. + if (buddy.uid() == p.uid() or + buddy.year() != p.year() or + buddy.month() != p.month() or + buddy.cruise() == p.cruise()): return None + lat = p.latitude() + lon = p.longitude() + latComp = buddy.latitude() + lonComp = buddy.longitude() + # Do a rough check of distance. + latDiff = np.abs(latComp - lat) + if latDiff > 5: return None + # Do a more detailed check of distance. + # Check in case they are either side of the edge of the map. + if np.abs(lonComp - lon) > 180: + if lonComp < lon: + lonComp += 360.0 + else: + lonComp -= 360.0 + # Calculate distance and return. + return haversine(lat, lon, latComp, lonComp) + +def timeDiff(p1, p2): + ''' + returns the time difference, in seconds, between two profiles + returns None if the year, month or day in either profile is invalid + ''' + + dts = [] + for prof in [p1, p2]: + year = prof.year() + month = prof.month() + day = prof.day() + if not (year > 0) or not (1 <= month <= 12) or not (1 <= day <= 31): + return None + time = prof.time() + if time is None or time < 0 or time >= 24: + hours = 0 + minutes = 0 + seconds = 0 + else: + hours = int(time) + minutesf = (time - hours) * 60 + minutes = int(minutesf) + seconds = int((minutesf - minutes) * 60) + + dts.append(datetime.datetime(year, month, day, hours, minutes, seconds)) + + diff = dts[0] - dts[1] + + return np.abs(diff.total_seconds()) + + diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py new file mode 100644 index 0000000..52342ee --- /dev/null +++ b/qctests/EN_track_check.py @@ -0,0 +1,392 @@ +""" +Implements the EN track check, described on pp 7 and 21 of +http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +import numpy as np +import data.ds as ds +import util.main as main +import util.geo as geo +import copy +import datetime +import math + +# module constants +DistRes = 20000. # meters +TimeRes = 600. # seconds + +EN_track_headers = {} +EN_track_results = {} +threadFile = {} + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + global EN_track_headers + global EN_track_results + global threadFile + + cruise = p.cruise() + uid = p.uid() + + # don't bother if cruise == 0 or None + if cruise in [0, None]: + return np.zeros(1, dtype=bool); + + # The headers from an entire cruise must be analyzed all at once; + # we'll write the results to the global data store, in a dictionary + # with ntuple keys (cruise, uid), and values as single element + # numpy arrays, containing either a true or a false (per all the other + # qc return objects) + + # check if this profile has been examined already + if (cruise, uid) in EN_track_results.keys(): + return EN_track_results[(cruise, uid)] + + # some detector types cannot be assessed by this test; do not raise flag. + if p.probe_type in [None]: + return np.zeros(1, dtype=bool) + + # the first time this test is run, sort ds.threadProfiles into a cruise-keyed dictionary: + if ds.threadFile != threadFile: + EN_track_headers = main.sort_headers(ds.threadProfiles) + threadFile = ds.threadFile + + # since we didn't find an answer already calculated, + # we still need to do the calculation for this cruise; + # all the relevant headers are sitting in the EN_track_headers list. + headers = EN_track_headers[cruise] + + # start all as passing by default: + for i in range(len(headers)): + EN_track_results[(headers[i].cruise(), headers[i].uid())] = np.zeros(1, dtype=bool) + + # copy the list of headers; + # remove entries as they are flagged. + passedHeaders = copy.deepcopy(headers) + rejects = findOutlier(passedHeaders) + while rejects != []: + passedIndex = [x for x in range(len(passedHeaders)) if x not in rejects ] + passedHeaders = [passedHeaders[index] for index in passedIndex ] + rejects = findOutlier(passedHeaders) + + # if more than half got rejected, reject everyone + if len(passedHeaders) < len(headers) / 2: + for i in range(len(headers)): + EN_track_results[(headers[i].cruise(), headers[i].uid())][0] = True + + return EN_track_results[(cruise, uid)] + +def findOutlier(headers): + ''' + given a list of , find the fastest one; + if it's too fast, reject it or the one before it, return a list of rejected indices; + once the fastest is within limits, return []. + ''' + + maxShipSpeed = 15. # m/s + maxBuoySpeed = 2. # m/s + + if headers == []: + return [] + + # determine speeds and angles for list of headers + speeds, angles = calculateTraj(headers) + + # decide if something needs to be flagged + maxSpeed = maxShipSpeed + if isBuoy(headers[0]): + maxSpeed = maxBuoySpeed + iMax = speeds.index(max(speeds)) + flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) + + # decide which profile to reject, flag it, and return a list of indices rejected at this step. + if flag: + rejects = chooseReject(headers, speeds, angles, iMax, maxSpeed) + + for reject in rejects: + EN_track_results[(headers[reject].cruise(), headers[reject].uid())][0] = True + return rejects + else: + return [] + +def chooseReject(headers, speeds, angles, index, maxSpeed): + ''' + decide which profile to reject, headers[index] or headers[index-1], or both, + and return a list of indices to reject. + ''' + + # chain of tests breaks when a reject is found: + reject = condition_a(headers, speeds, angles, index, maxSpeed)[0] + + # condition i needs to run at the end of the chain in all cases: + # if no decision, reject both: + if reject == -1: + reject = [index-1, index] + # if excessive speed is created by removing the flag, reject both instead + # can't create new excessive speed by removing last profile. + elif reject < len(headers)-1: + newHeaders = copy.deepcopy(headers) + del newHeaders[reject] + newSpeeds, newAngles = calculateTraj(newHeaders) + flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) + if flag: + reject = [index-1, index] + else: + reject = [reject] + else: + reject = [reject] + + return reject + +def calculateTraj(headers): + ''' + return a list of speeds and a list of angles describing the trajectory of the track described + by the time-ordered list of . + ''' + + speeds = [None] + angles = [None] + + # Find speed and angle for all profiles remaining in the list + for i in range(1, len(headers)): + + speeds.append(None) + angles.append(None) + + speeds[i] = trackSpeed(headers[i-1], headers[i]) + if i < len(headers)-1: # can't do angle on last point + angles[i] = abs(math.pi - geo.haversineAngle(headers[i-1], headers[i], headers[i+1])) + + return speeds, angles + +def isBuoy(header): + ''' + decide if header belongs to a buoy-based measurement + ''' + + return header.probe_type in [4,7,9,10,11,12,13,15] + +def detectExcessiveSpeed(speeds, angles, index, maxSpeed): + ''' + decide if there was an excessive speed at in the lists and + ''' + + flag = speeds[index] > maxSpeed + + if index > 0: + flag = flag or ( (speeds[index] > 0.8*maxSpeed) and (angles[index]>math.pi/2 or angles[index-1]>math.pi/2) ) + + return flag + +def meanSpeed(speeds, headers, maxSpeed): + ''' + determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) + ''' + + meanSpeed = 0 + speedCount = 0 + for iSpeed, speed in enumerate(speeds): + if speed == None or iSpeed == 0: + #missing values + continue + elif iSpeed > 0 and geo.deltaTime(headers[iSpeed-1], headers[iSpeed]) < 3600.: + #too close together in time + continue + elif speed > maxSpeed: + #too fast + continue + else: + meanSpeed += speed + speedCount += 1 + + if speedCount > 0: + meanSpeed = meanSpeed / speedCount + + return meanSpeed + + +def trackSpeed(prevHeader, header): + ''' + computes the speed, including rounding tolerance from the reference, + for the track at

. + return None if some necessary data is missing + ''' + + # check that all required data is present: + if None in [header.latitude(), header.longitude(), prevHeader.latitude(), prevHeader.longitude()]: + return None + if None in [header.year(), header.month(), header.day(), header.time(), prevHeader.year(), prevHeader.month(), prevHeader.day(), prevHeader.time()]: + return None + + dist = geo.haversineDistance(prevHeader, header) + DTime = geo.deltaTime(prevHeader, header) + speed = (dist - DistRes) / max(DTime, TimeRes) + + return speed + +def condition_a(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (a) from the text + ''' + + if index == 1 and len(headers) == 2: + return 0, 'a' + elif index == 1 and len(headers) > 2: # note 'M' in the text seems to count from 1, not 0. + impliedSpeed = trackSpeed(headers[0], headers[2]) + if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): + return 1, 'a' + else: + return 0, 'a' + elif index == len(headers)-1 and len(headers)>3: # why not >=? seems to cause problems, investigate. + impliedSpeed = trackSpeed(headers[-3], headers[-1]) + if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): + return index-1, 'a' + else: + return index, 'a' + else: + return condition_b(headers, speeds, angles, index, maxSpeed) + +def condition_b(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (b) from the text + ''' + if speeds[index-1] > maxSpeed: + return index-1, 'b' + elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: + return index, 'b' + + return condition_c(headers, speeds, angles, index, maxSpeed) + +def condition_c(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (c) from the text + ''' + + if index < len(headers)-1 and index > 0: + impliedSpeed = trackSpeed(headers[index-1], headers[index+1]) + if impliedSpeed > maxSpeed: + return index-1, 'c' + + if index > 1: + impliedSpeed = trackSpeed(headers[index-2], headers[index]) + if impliedSpeed > maxSpeed: + return index, 'c' + + return condition_d(headers, speeds, angles, index, maxSpeed) + + +def condition_d(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (d) from the text + ''' + + if None not in [angles[index-1], angles[index]] and angles[index-1] > 45./180.*math.pi + angles[index]: + return index-1, 'd' + + if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: + return index, 'd' + + return condition_e(headers, speeds, angles, index, maxSpeed) + +def condition_e(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (e) from the text + ''' + + if len(headers) > max(2, index+1): + + if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: + return index-1, 'e' + + if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: + return index, 'e' + + return condition_f(headers, speeds, angles, index, maxSpeed) + +def condition_f(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (f) from the text + ''' + + if index>0 and index < len(speeds)-1: + + ms = meanSpeed(speeds, headers, maxSpeed) + + if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): + return index-1, 'f' + + if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): + return index, 'f' + + return condition_g(headers, speeds, angles, index, maxSpeed) + +def condition_g(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (g) from the text + ''' + + if index > 1 and index < len(headers) - 1: + + dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) + dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + + distTol = geo.haversineDistance(headers[index-1], headers[index-2]) + distTol += geo.haversineDistance(headers[index], headers[index-1]) + distTol += geo.haversineDistance(headers[index+1], headers[index]) + distTol = max(DistRes, 0.1*distTol) + + if dist1 < dist2 - distTol: + return index-1, 'g' + + if dist2 < dist1 - distTol: + return index, 'g' + + return condition_h(headers, speeds, angles, index, maxSpeed) + +def condition_h(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (h) from the text + typeo in text, implementation incomplete + ''' + + if index > 1 and index < len(headers) - 1: + + dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) + dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + + PD1 = geo.haversineDistance(headers[index-1], headers[index-2]) / dist2 + PD2 = geo.haversineDistance(headers[index], headers[index-2]) / dist1 + + PT1 = geo.deltaTime(headers[index-2], headers[index-1]) / geo.deltaTime(headers[index-2], headers[index+1]) + PT2 = geo.deltaTime(headers[index-2], headers[index]) / geo.deltaTime(headers[index-2], headers[index+1]) + + if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): + return index-1, 'h' + if abs(PD2 - PT2) > 0.1 + abs(PD1 - PT1): + return index, 'h' + + return -1, 'i' + +def checkOrder(profiles): + ''' + check that a list of profiles is properly time ordered + ''' + + dates = [] + for pro in profiles: + if pro.time() is not None: + hour, minute, second = geo.parseTime(pro.time()) + else: + hour = 0 + minute = 0 + second = 0 + date = datetime.datetime(year=pro.year(), month=pro.month(), day=pro.day(), hour=hour, minute=minute, second=second ) + dates.append(date) + + for i in range(len(dates)-1): + assert dates[i] <= dates [i+1], 'dates out of order %s %s' % (dates[i], dates[i+1]) diff --git a/qctests/ICDC_aqc_01_level_order.py b/qctests/ICDC_aqc_01_level_order.py new file mode 100644 index 0000000..b64688c --- /dev/null +++ b/qctests/ICDC_aqc_01_level_order.py @@ -0,0 +1,111 @@ +''' +Python version of check_aqc_01_level_order.f with input/output +adjusted to work with the AutoQC testing suite. Details of the +original code are: + +c/ DATE: JANUARY 14 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: check_aqc_01_levels_order + +c/ PURPOSE: +c to check the original level order; +c if necessary to bring the original levels to increasing order +''' + +import numpy as np + +# Global variables to hold data to avoid having to recalculate order +# repeatedly for the same profile. +uid = None +nlevels = 0 +origlevels = None +zr = None +tr = None +qc = None + +def test(p): + '''Return a set of QC decisions. This corresponds to levels with + negative depths. + ''' + + level_order(p) + + return qc + +def reordered_data(p): + '''Return number levels and depth, temperature in depth order. + Only non-rejected levels are returned. + ''' + + level_order(p) + + return nlevels, zr, tr + +def revert_order(p, data): + '''Return data in the original profile order. Data rejected in + the level_order function are returned as missing data. + ''' + + level_order(p) + + datar = np.ma.array(np.ndarray(p.n_levels()), + dtype = data.dtype) + datar.mask = True + + for i, datum in enumerate(data): + datar[origlevels[i]] = datum + + return datar + +def revert_qc_order(p, qc): + '''Return QC array. Missing data values are set to False.''' + + qcr = revert_order(p, qc) + qcr[qcr.mask] = False + return qcr + +def level_order(p): + '''Reorders data into depth order and rejects levels with + negative depth. + ''' + global uid, nlevels, origlevels, zr, tr, qc + + # Check if the module already holds the results for this profile. + if uid == p.uid() and uid is not None: + return None + + # Extract data and define the index for each level. + z = p.z() + t = p.t() + origlevels = np.arange(p.n_levels()) + + # Implement the QC. For this test we only reject negative depths. + qc = z < 0 + + # Remove occurrences of no data at a level and rejected obs. + use = (z.mask == False) & (t.mask == False) & (qc == False) + z = z[use] + t = t[use] + origlevels = origlevels[use] + nlevels = np.count_nonzero(use) + + if nlevels > 1: + # Sort the data. Using mergesort keeps levels with the same depth + # in the same order. + isort = np.argsort(z, kind='mergesort') + zr = z[isort] + tr = t[isort] + origlevels = origlevels[isort] + else: + zr = z + tr = t + + return None + + diff --git a/qctests/ICDC_aqc_02_crude_range.py b/qctests/ICDC_aqc_02_crude_range.py new file mode 100644 index 0000000..18e560f --- /dev/null +++ b/qctests/ICDC_aqc_02_crude_range.py @@ -0,0 +1,68 @@ +''' +Python version of check_aqc_02_crude_range.f. Details of the +original code are: + +c/ DATE: JANUARY 19 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: check_aqc_02_crude_range + +c/ PURPOSE: +c to check weather the temperature value is within the crude range +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np + +def test(p): + '''Return a set of QC decisions. + ''' + + nlevels, z, t = ICDC.reordered_data(p) + + qc = (t < parminover) | (t > parmaxover) + + for i, tval in enumerate(t): + if qc[i]: continue # Already rejected. + + zval = z[i] + + if np.any((tval >= tcrude1) & (tval <= tcrude2) & + (zval <= zcrude1) & (zval >= zcrude2)): + qc[i] = True + + return ICDC.revert_qc_order(p, qc) + +# Ranges: +tcrude1 = np.array( + [-3.5,-2.5,-2.3,-2.0,-1.4,-1.0,-0.8,-0.5,-0.4,3.0, + 5.0,5.5,6.0,7.0,7.5,8.8,9.5,10.0,11.0,12.0,12.8,13.5, + 14.75,15.0,16.0,17.5,18.5,19.0,20.0,21.4,22.4,23.0,24.0, + 26.0,28.0,31.0,32.0]) + +tcrude2 = np.array( + [-2.5,-2.3,-2.0,-1.4,-1.0,-0.8,-0.5,-0.4,3.0, + 5.0,5.5,6.0,7.0,7.5,8.8,9.5,10.0,11.0,12.0,12.8,13.5, + 14.75,15.0,16.0,17.5,18.5,19.0,20.0,21.4,22.4,23.0,24.0, + 26.0,28.0,31.0,32.0,35.0]) + +zcrude1 = np.ndarray(37) +zcrude1[:] = 9000.0 + +zcrude2 = np.array( + [ 0., 500.,1200.,2000.,3800.,4200., + 5000.,6000.,9000.,7500.,4400.,1950., + 1900.,1800.,1700.,2200.,1700.,5200., + 1600.,1400.,3600.,5200.,1000., 800., + 1800., 800., 600., 400., 350.,2400., + 400., 350., 300., 250., 200., 100., 50.]) + +parminover = -2.3 +parmaxover = 33.0 + + diff --git a/qctests/ICDC_aqc_04_max_obs_depth.py b/qctests/ICDC_aqc_04_max_obs_depth.py new file mode 100644 index 0000000..878ce31 --- /dev/null +++ b/qctests/ICDC_aqc_04_max_obs_depth.py @@ -0,0 +1,54 @@ +''' +Python version of check_aqc_04_instrument_type_max_obs_depth.f. Details of the +original code are: + +c/ DATE: JANUARY 20 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + + +c/ TITLE: check_aqc_04_instrument_type_max_obs_depth + +c/ PURPOSE: +c compare observed depths with unstrument type maximum observed depth +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np +from util.wod import wod_database + +def test(p): + '''Return quality control decisions. + ''' + + # Get WOD database. + db = wod_database(p) + + # Set maximum allowed depth. If not defined, it is set to the highest + # possible float. + if db == 'OSD': + zlast = 9000.0 + elif db == 'CTD': + zlast = 9000.0 + elif db == 'PFL': + zlast = 2020.0 + elif db == 'APB': + zlast = 1200.0 + elif db == 'MBT' and p.primary_header['Country code'] == 'JP': + zlast = 295.00001 + elif db == 'XBT': + zlast = 1900.0 + else: + zlast = np.finfo(dtype=float).max + + # Set QC flags. + qc = p.z() >= zlast + + return qc + + + diff --git a/qctests/ICDC_aqc_05_stuck_value.py b/qctests/ICDC_aqc_05_stuck_value.py new file mode 100644 index 0000000..4c70829 --- /dev/null +++ b/qctests/ICDC_aqc_05_stuck_value.py @@ -0,0 +1,71 @@ +''' +Python version of check_aqc_05_stuck_value.f. Details of the original code are: + +c/ DATE: JANUARY 20 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: check_aqc_05_stuck_value + +c/ PURPOSE: +c to check temperature profile for stuck value/unrealistically thick thermostad +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np +from util.wod import wod_database + +def test(p): + '''Return quality control decisions. + ''' + + # Default set of QC flags to return. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Set minimum allowed levels. + db = wod_database(p) + if db == 'OSD': + minlevs = 7 + elif db == 'CTD': + minlevs = 50 + elif db == 'PFL': + minlevs = 20 + elif db == 'APB': + minlevs = 20 + elif db == 'MBT': + minlevs = 7 + elif db == 'XBT': + minlevs = 20 + else: + return qc # Do not have the information to QC other types. + + # Check that we have the levels we need. + nlevels, z, t = ICDC.reordered_data(p) + if nlevels <= minlevs: return qc + + # Count stuck values. + n = np.ones(nlevels, dtype=int) + for i in range(nlevels - minlevs): + for j in range(i + 1, nlevels): + diff = np.abs(t[i] - t[j]) + if diff > 0.0001: break + n[i] += 1 + + # Find the largest stuck value range. + i = np.argmax(n) + if n[i] < minlevs: return qc + thick = z[i + n[i] - 1] - z[i] + if thick >= 200.0: + # If setting the QC flags we need to be careful about level order. + qclo = qc[0:nlevels] + qclo[i:i+n[i]] = True + qc = ICDC.revert_qc_order(p, qclo) + + return qc + + + diff --git a/qctests/ICDC_aqc_06_n_temperature_extrema.py b/qctests/ICDC_aqc_06_n_temperature_extrema.py new file mode 100644 index 0000000..8e4bbee --- /dev/null +++ b/qctests/ICDC_aqc_06_n_temperature_extrema.py @@ -0,0 +1,62 @@ +''' +Python version of check_aqc_06_number_of_temperature_extrema.f. +Details of the original code are: + +c/ DATE: JANUARY 20 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: check_aqc_06_number_of_temperature_extrema + +c/ PURPOSE: +c find profiles with unrealistically large number of temperature extrema +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np + +def test(p): + '''Return quality control decisions. + ''' + + # Initialise data. + qc = np.zeros(p.n_levels(), dtype=bool) + parminover = -2.3 + parmaxover = 33.0 + levminext = 6 + deltaext = 0.5 + maxextre = 4 + + # Check that we have the levels we need. + nlevels, z, t = ICDC.reordered_data(p) + if nlevels <= levminext: return qc + + # Exclude data outside allowed range. + use = (t > parminover) & (t <= parmaxover) + nuse = np.count_nonzero(use) + if nuse < levminext: return qc + z = z[use] + t = t[use] + + # Find and count the extrema. + ima = 0 + for i in range(1, nuse - 1): + pcent = t[i] + pa = np.abs(pcent - t[i - 1]) + pb = np.abs(pcent - t[i + 1]) + pmin = min(pa, pb) + if pcent > t[i - 1] and pcent > t[i + 1] and pmin > deltaext: + ima += 1 + if pcent < t[i - 1] and pcent < t[i + 1] and pmin > deltaext: + ima += 1 + if ima > maxextre: + qc[:] = True + + return qc + + + diff --git a/qctests/ICDC_aqc_07_spike_check.py b/qctests/ICDC_aqc_07_spike_check.py new file mode 100644 index 0000000..5be4abc --- /dev/null +++ b/qctests/ICDC_aqc_07_spike_check.py @@ -0,0 +1,75 @@ +''' +Python version of check_aqc_07_spike_check.f. +Details of the original code are: + +c/ DATE: JANUARY 25 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + + +c/ TITLE: check_aqc_07_spike_check + +c/ PURPOSE: +c to check temperature profile for spikes +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np + +def test(p): + '''Return quality control decisions. + ''' + + # The test is run on re-ordered data. + nlevels, z, t = ICDC.reordered_data(p) + qc = np.zeros(nlevels, dtype=bool) + if nlevels < 3: return qc # Not enough levels to check. + + # Ignore any levels outside of limits. + parminover = -2.3 + parmaxover = 33.0 + use = (t > parminover) & (t < parmaxover) + nuse = np.count_nonzero(use) + if nuse < 3: return qc + zuse = z[use] + tuse = t[use] + origlevels = (np.arange(nlevels))[use] + + # Extract sections of the arrays. We are QCing the values + # in the z2 and v3 arrays. + z1 = zuse[0:-2] + z2 = zuse[1:-1] + z3 = zuse[2:] + v1 = tuse[0:-2] + v2 = tuse[1:-1] + v3 = tuse[2:] + ol = origlevels[1:-1] + + # Calculate the level of 'spike'. + z13 = z3 - z1 + z12 = z2 - z1 + z23 = z3 - z2 + + a = 0.5 * (v1 + v3) + q1 = np.abs(v2 - a) + q2 = np.abs(0.5 * (v3 - v1)) + + spike = q1 - q2 + + # Define the threshold at each level. + spikemax = np.ndarray(nuse - 2) + spikemax[:] = 4.0 + spikemax[z2 > 1000.0] = 3.0 + spikemax[z2 > 2000.0] = 2.0 + + # Set QC flags. + qc[ol[spike > spikemax]] = True + + return ICDC.revert_qc_order(p, qc) + + + diff --git a/qctests/ICDC_aqc_08_gradient_check.py b/qctests/ICDC_aqc_08_gradient_check.py new file mode 100644 index 0000000..4f463bc --- /dev/null +++ b/qctests/ICDC_aqc_08_gradient_check.py @@ -0,0 +1,63 @@ +''' +Python version of check_aqc_08_gradient_check.f. +Details of the original code are: + +c/ DATE: JANUARY 28 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: check_aqc_08_gradient_check + +c/ PURPOSE: +c to check temperature profile for unrealistic vertical gradients +''' + +import ICDC_aqc_01_level_order as ICDC +import numpy as np + +def test(p): + '''Return quality control decisions. + ''' + + # Global ranges - data outside these bounds are ignored. + parminover = -2.3 + parmaxover = 33.0 + + # The test is run on re-ordered data. + nlevels, z, t = ICDC.reordered_data(p) + qc = np.zeros(nlevels, dtype=bool) + + # Calculate gradients and thresholds. + z0 = z[0:-1] + z1 = z[1:] + t0 = t[0:-1] + t1 = t[1:] + + gradients = (t1 - t0) / (z1 - z0) + zmean = 0.5 * (z0 + z1) + zmean[zmean < 1.0] = 1.0 + + gradmin = -150.0 / zmean - 0.010 + gradmin[gradmin < -4.0] = -4.0 + + gradmax = 100.0 / zmean + 0.015 + gradmax[gradmax > 1.5] = 1.5 + + # Find where the gradients and outside the thresholds. + result = np.where(((gradients < gradmin) | (gradients > gradmax)) & + (t0 > parminover) & (t1 > parminover) & + (t0 < parmaxover) & (t1 < parmaxover))[0] + + # Both levels that form the gradient have to be rejected. + if len(result) > 0: + qc[result] = True + qc[result + 1] = True + + return ICDC.revert_qc_order(p, qc) + + + diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py new file mode 100644 index 0000000..b53224c --- /dev/null +++ b/qctests/ICDC_aqc_09_local_climatology_check.py @@ -0,0 +1,220 @@ +''' +Python version of check_aqc_09_gradient_check.f. +Details of the original code are: + +c/ DATE: FEBRUARY 4 2016 + +c/ AUTHOR: Viktor Gouretski + +c/ AUTHOR'S AFFILIATION: Integrated Climate Data Center, University of Hamburg, Hamburg, Germany + +c/ PROJECT: International Quality Controlled Ocean DataBase (IQuOD) + +c/ TITLE: local_climatological_range_check - check_aqc_09_climatological_range + +c/ PURPOSE: +c to check wheather temperature value is within the local climatological range + +c/ Local temperature median and absolute median deviation are calculated on the basis +c/ of the OSD, CTD, and PFL temperature profiles from the WOD13 (updates as of December 2015) +c/ The median and the amd are calculated on a regular 0.5x0.5 lat/lon grid at 60 depth levels +c/ with level spacing increasing with depth. +c/ Variable influence area size is used with the target number of 500 profiles within the influence +c/ area. This number is not achieved in the data sparse regions or nn the deep levels. + +c local climatological ranges for the level k are defined as: +c tminlocal(k)=tmedian(k) - rnumamd*tamd(k) +c tmaxlocal(k)=tmedian(k) + rnumamd*tamd(k) +''' + +import ICDC_aqc_01_level_order as ICDC +from netCDF4 import Dataset +import numpy as np +import os +import time + +def test(p): + '''Return quality control decisions. + ''' + + # The test is run on re-ordered data. + nlevels, z, t = ICDC.reordered_data(p) + + # Define default QC. + defaultqc = np.zeros(p.n_levels(), dtype=bool) + + # No check for the Caspian Sea or Great Lakes. + lat = p.latitude() + lon = p.longitude() + if ((lat >= 35.0 and lat <= 45.0 and lon >= 45.0 and lon <= 60.0) or + (lat >= 40.0 and lat <= 50.0 and lon >= -95.0 and lon <= -75.0)): + return defaultqc + + # Get range. + ranges = get_climatology_range(nlevels, z, lat, lon, p.month()) + if ranges is None: + return defaultqc + + # Perform the QC. + tmin, tmax = ranges + qc = ((t < tmin) | (t > tmax)) & (tmin != fillValue) & (tmax != fillValue) + + return ICDC.revert_qc_order(p, qc) + +def get_climatology_range(nlevels, z, lat, lon, month): + + # Define arrays for the results. + tmin = np.ndarray(nlevels) + tmax = np.ndarray(nlevels) + tmin[:] = fillValue + tmax[:] = fillValue + + # Calculate grid indices. + iy = int(np.floor((90.0 - lat) / 0.5)) + ix = int(np.floor((lon + 180.0) / 0.5)) + if (iy < 0 or iy > 360 or ix < 0 or ix > 720): + return None + + # Find the climatology range. + for k in range(nlevels): + # Find the corresponding climatology level. + arg = np.argwhere((z[k] >= zedqc[:-1]) & (z[k] < zedqc[1:])) + if len(arg) > 0: + kisel = arg[0] + else: + continue # No level found. + # Check if using monthly or annual fields. + if kisel <= 15: + useAnnual = False + else: + useAnnual = True + if month is None: useAnnual = True + # Extract the temperature. + if useAnnual == False: + amd = tamdM[ix, iy, kisel, month - 1] + if amd < 0.0: + useAnnual = True + else: + tmedian = tmedM[ix, iy, kisel, month - 1] + if tmedian < parminover: + useAnnual = True + if useAnnual: + amd = tamdA[ix, iy, kisel] + if amd < 0.0: + continue + else: + tmedian = tmedA[ix, iy, kisel] + if tmedian < parminover: + continue + if amd > 0.0 and amd < 0.05: amd = 0.05 + + rnumamd = 3.0 + tmaxa = tmedian + rnumamd * amd + tmina = tmedian - rnumamd * amd + if tmina < parminover: tmina = parminover + if tmaxa > parmaxover: tmaxa = parmaxover + + tmin[k] = tmina + tmax[k] = tmaxa + + return tmin, tmax + +def read_ascii_and_convert_to_netcdf(): + '''Coverts the ASCII data file to netCDF on first read. + This is much faster to access. + ''' + global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue + + # Load the data. + tmedM = np.ndarray([721, 361, 16, 12]) + tamdM = np.ndarray([721, 361, 16, 12]) + tmedA = np.ndarray([721, 361, 60]) + tamdA = np.ndarray([721, 361, 60]) + zedqc = np.ndarray(60) + # Do not use masked arrays to save on memory use. + fillValue = -9.0 # Has to be a negative number. + tmedM[:, :, :, :] = fillValue + tamdM[:, :, :, :] = fillValue + tmedA[:, :, :] = fillValue + tamdA[:, :, :] = fillValue + with open('data/climatological_t_median_and_amd_for_aqc.dat') as f: + for line in f: + vals = line.split() + m = int(vals[0]) - 1 + j = int(vals[1]) - 1 + i = int(vals[3]) - 1 + k = int(vals[5]) - 1 + z = float(vals[6]) + tmedian = float(vals[7]) + absmeddev = float(vals[8]) + + if m < 12 and k < 16: + tmedM[i, j, k, m] = tmedian + tamdM[i, j, k, m] = absmeddev + elif m == 12: + tmedA[i, j, k] = tmedian + tamdA[i, j, k] = absmeddev + zedqc[k] = z + + # Create the netCDF version. + nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'w') + idim = nc.createDimension('i', 721) + jdim = nc.createDimension('j', 361) + kmdim = nc.createDimension('km', 16) + kadim = nc.createDimension('ka', 60) + mdim = nc.createDimension('m', 12) + + sf = 0.0001 + tmedav = nc.createVariable('tmedA', 'i4', ('i', 'j', 'ka'), zlib=True) + tmedav.add_offset = 0.0 + tmedav.scale_factor = sf + tmedav[:, :, :] = tmedA + + tamdav = nc.createVariable('tamdA', 'i4', ('i', 'j', 'ka'), zlib=True) + tamdav.add_offset = 0.0 + tamdav.scale_factor = sf + tamdav[:, :, :] = tamdA + + tmedmv = nc.createVariable('tmedM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) + tmedmv.add_offset = 0.0 + tmedmv.scale_factor = sf + tmedmv[:, :, :, :] = tmedM + + tamdmv = nc.createVariable('tamdM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) + tamdmv.add_offset = 0.0 + tamdmv.scale_factor = sf + tamdmv[:, :, :, :] = tamdM + + zedqcv = nc.createVariable('zedqc', 'f4', ('ka',)) + zedqcv[:] = zedqc + + nc.fillValue = fillValue + nc.history = 'Created ' + time.ctime(time.time()) + ' from climatological_t_median_and_amd_for_aqc.dat provided by Viktor Gouretski, Integrated Climate Data Center, University of Hamburg, Hamburg, Germany, February 2016' + nc.close() + +def read_netcdf(): + '''Read climatological data from netCDF. + ''' + global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue + + nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') + tmedA = nc.variables['tmedA'][:, :, :] + tamdA = nc.variables['tamdA'][:, :, :] + tmedM = nc.variables['tmedM'][:, :, :, :] + tamdM = nc.variables['tamdM'][:, :, :, :] + zedqc = nc.variables['zedqc'][:] + fillValue = nc.fillValue + nc.close() + +# Global ranges - data outside these bounds are assumed not valid. +parminover = -2.3 +parmaxover = 33.0 + +# Read data. +if os.path.isfile('data/climatological_t_median_and_amd_for_aqc.nc'): + read_netcdf() +else: + read_ascii_and_convert_to_netcdf() + + + diff --git a/qctests/WOD_gradient_check.py b/qctests/WOD_gradient_check.py new file mode 100644 index 0000000..a982c61 --- /dev/null +++ b/qctests/WOD_gradient_check.py @@ -0,0 +1,45 @@ +""" +Implements the excessive gradient test on page 47 of http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf +""" + +import numpy + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + # Get temperature values from the profile. + t = p.t() + # Get depth values (m) from the profile. + d = p.z() + + assert len(t.data) == len(d.data), 'Number of temperature measurements does not equal number of depth measurements.' + + # initialize qc as a bunch of falses; + # implies all measurements pass when a gradient can't be calculated, such as at edges & gaps in data: + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isDepth = (d.mask==False) + isData = isTemperature & isDepth + + for i in range(0,len(t.data)-1): + if isData[i] & isData[i+1] & (d.data[i+1] - d.data[i] > 0): + + gradient = (t.data[i+1] - t.data[i]) / max([ (d.data[i+1] - d.data[i]) , 3.0]) + + # gradient & inversion check + qc[i] = (gradient > 0.3) or (gradient < -0.7) or qc[i] # in case qc[i] was set true by the zero sensitivity indicator in the previous step + qc[i+1] = (gradient > 0.3) or (gradient < -0.7) + + # zero sensitivity indicator + # flags data if temperature drops to 0 too abruptly, indicating a missing value. + if t.data[i+1] == 0: + if -1.0 * gradient > 5.0 * 0.7: + qc[i+1] = True + + return qc diff --git a/qctests/WOD_range_check.py b/qctests/WOD_range_check.py new file mode 100644 index 0000000..86a8941 --- /dev/null +++ b/qctests/WOD_range_check.py @@ -0,0 +1,71 @@ +""" +Implements the WOD range check, +pp 46 http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf +""" +import numpy +import data.ds as ds + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + + + # Get data from the profile. + t = p.t() + d = p.z() + latitude = p.latitude() + longitude = p.longitude() + + temperatures = {} + # initialize qc as a bunch of falses (pass by default) + qc = numpy.zeros(len(t.data), dtype=bool) + + # check for gaps in data + isTemperature = (t.mask==False) + isDepth = (d.mask==False) + isData = isTemperature & isDepth + isLat = isinstance(latitude, float) + isLong = isinstance(longitude, float) + + if not isLat or not isLong: + return qc + + depths = ds.WODtempRanges['depths'] + gLat, gLong = nearestGrid(latitude, longitude) + cellCode = ds.cellCodes[(gLat, gLong)] + region = ds.regionCodes[cellCode] + minima = ds.WODtempRanges[region]['min'] + maxima = ds.WODtempRanges[region]['max'] + + for i in range(1, p.n_levels()): + if isData[i] == False: continue + + # find depth bin + iDepth = 0 + while d[i] > depths[iDepth] and iDepth <= len(depths): + iDepth += 1 + + minTemp = minima[iDepth] + maxTemp = maxima[iDepth] + + if t[i] < minTemp or t[i] > maxTemp: + qc[i] = True + + return qc + + +def nearestGrid(lat, lng): + ''' + find the nearest grid point to lat, lng. + grid st. lat is on [-89.5, 89.5] in steps of 1 + and long is on [-179.5, 179.5] in steps of 1 + ''' + + gLat = (numpy.round(lat - 0.5) + 0.5 + 90) % 180 - 90 + gLong = (numpy.round(lng - 0.5) + 0.5 + 180) % 360 - 180 + + return gLat, gLong diff --git a/qctests/loose_location_at_sea.py b/qctests/loose_location_at_sea.py new file mode 100644 index 0000000..0aa8357 --- /dev/null +++ b/qctests/loose_location_at_sea.py @@ -0,0 +1,55 @@ +'''Checks the profile location against a global relief dataset to check it is in the ocean. + It is similar CoTeDe's location at sea test but instead of interpolating to the position + the surrounding points are checked to see if any are ocean points. This allows for + errors in the global relief data or imprecise locations close to the coast. This makes it + similar to the way the ICDC and EN tests work. +''' + +from netCDF4 import Dataset +import numpy as np + +# Define the area either side of the closest global relief point that is +# checked for ocean points. +width = 2 + +# Load data into memory. Include a halo so that we can handle points next the data line. +nc = Dataset('data/etopo5.nc') +etopx = nc.variables['ETOPO05_X'][:] +etopy = nc.variables['ETOPO05_Y'][:] +etoph = np.ndarray([len(etopy) + width * 2, len(etopx) + width * 2]) +etoph[:, :] = -1 # Default is ocean points. +etoph[width:-width, width:-width] = nc.variables['ROSE'][:, :] +etoph[width:-width, 0:width] = etoph[width:-width, -2*width:-width] +etoph[width:-width, -width:] = etoph[width:-width, width:2*width] +nc.close() + +def test(p): + '''Return an array of QC decisions. There is a QC result per level but these + are all set to the same value, determined by the location. + ''' + + qc = np.zeros(p.n_levels(), dtype=bool) + + # Ensure that lon is in the range -180 to 180 or 0 to 360 and lat is from -90 to 90. + lat = p.latitude() + lon = p.longitude() + if lat is None or lon is None: + return qc + if lon < -180 or lon >=360 or lat < -90 or lat > 90: + qc[:] = True + return qc + if lon < 0: lon += 360 # Needs to be in range 0 to 360. + + # Find closest global relief point and extract section of the array. + ilat = np.argmin(np.abs(etopy - lat)) + width # Add on the halo width. + ilon = np.argmin(np.abs(etopx - lon)) + width + data = etoph[ilat - width:ilat + width + 1, ilon - width:ilon + width + 1] + + # If any point is an ocean point then do not reject. + if np.all(data >= 0): + qc[:] = True + + return qc + + + From 83fec0a4c7fe82943bdca3061a94265fcbd03294 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 31 Jul 2016 00:13:33 +0000 Subject: [PATCH 48/79] nominally functioning database backend --- AutoQC.py | 10 +- build-db.py | 2 +- qctests/EN_std_lev_bkg_and_buddy_check.py | 369 -------------------- qctests/EN_track_check.py | 392 ---------------------- summarize-results.py | 4 +- 5 files changed, 6 insertions(+), 771 deletions(-) delete mode 100644 qctests/EN_std_lev_bkg_and_buddy_check.py delete mode 100644 qctests/EN_track_check.py diff --git a/AutoQC.py b/AutoQC.py index 73a8017..87430db 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -90,7 +90,7 @@ def process_row(uid): '''run all tests on the ith database row''' # extract profile - cur.execute('SELECT * FROM demo WHERE uid = ' + str(uid) ) + cur.execute('SELECT * FROM validate WHERE uid = ' + str(uid) ) row = cur.fetchall() fProfile = tempfile.TemporaryFile() fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row @@ -108,11 +108,9 @@ def process_row(uid): # run tests results = [row[0][1]] for itest, test in enumerate(testNames): - if test[0:5] != 'CSIRO': # testing on Argo suite for now - continue - + result = run(test, [profile]) - query = "UPDATE demo SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" + query = "UPDATE validate SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) print profile.uid() @@ -120,7 +118,7 @@ def process_row(uid): # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() - cur.execute('SELECT uid FROM demo') + cur.execute('SELECT uid FROM validate') uids = cur.fetchall() # launch async processes diff --git a/build-db.py b/build-db.py index 94ccdc9..a929936 100644 --- a/build-db.py +++ b/build-db.py @@ -37,7 +37,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) -while True: +for i in range(10): # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py deleted file mode 100644 index 44bdff2..0000000 --- a/qctests/EN_std_lev_bkg_and_buddy_check.py +++ /dev/null @@ -1,369 +0,0 @@ -""" -Implements the background check on standard levels and the buddy check -from the EN quality control system, -http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -from cotede.qctests.possible_speed import haversine -import datetime -import EN_background_check -import EN_constant_value_check -import EN_increasing_depth_check -import EN_range_check -import EN_spike_and_step_check -import EN_stability_check -import util.main as main -import data.ds -import numpy as np - -def test(p, allow_level_reinstating=True): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - - If allow_level_reinstating is set to True then rejected levels can be - reprieved by comparing with levels above and below. NB this is done by - default in EN processing. - """ - - # Define an array to hold results. - qc = np.zeros(p.n_levels(), dtype=bool) - - # Obtain the obs minus background differences on standard levels. - result = stdLevelData(p) - if result is None: return qc - - # Unpack the results. - levels, origLevels, assocLevels = result - # Retrieve the background and observation error variances and - # the background values. - bgsl = EN_background_check.bgStdLevels - slev = EN_background_check.auxParam['depth'] - bgev = EN_background_check.bgevStdLevels - obev = EN_background_check.auxParam['obev'] - - #find initial pge - pgeData = determine_pge(levels, bgev, obev, p) - - # Find buddy. - profiles = data.ds.profiles - minDist = 1000000000.0 - iMinDist = None - for iProfile, profile in enumerate(profiles): - pDist = assessBuddyDistance(p, profile) - if pDist is not None and pDist < minDist: - minDist = pDist - iMinDist = iProfile - - # Check if we have found a buddy and process if so. - if minDist <= 400000: - fid = None - pBuddy, currentFile, fid = main.profileData(profiles[iMinDist], '', fid) - fid.close() - - # buddy vetos - Fail = False - if pBuddy.var_index() is None: - Fail = True - if Fail == False: - main.catchFlags(pBuddy) - if np.sum(pBuddy.t().mask == False) == 0: - Fail = True - - if Fail == False: - result = stdLevelData(pBuddy) - if result is not None: - levelsBuddy, origLevelsBuddy, assocLevelsBuddy = result - bgevBuddy = EN_background_check.bgevStdLevels - pgeBuddy = determine_pge(levels, bgevBuddy, obev, pBuddy) - pgeData = update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, p, pBuddy, obev, bgev, bgevBuddy) - - # Check if levels should be reinstated. - if allow_level_reinstating: - if np.abs(p.latitude()) < 20.0: - depthTol = 300.0 - else: - depthTol = 200.0 - stdLevelFlags = pgeData >= 0.5 - for i, slflag in enumerate(stdLevelFlags): - if slflag: - # Check for non rejected surrounding levels. - okbelow = False - if i > 0: - if stdLevelFlags[i - 1] == False and levels.mask[i - 1] == False and bgsl.mask[i - 1] == False: - okbelow = True - okabove = False - nsl = len(stdLevelFlags) - if i < nsl - 1: - if stdLevelFlags[i + 1] == False and levels.mask[i + 1] == False and bgsl.mask[i + 1] == False: - okabove = True - # Work out tolerances. - if slev[i] > depthTol + 100: - tolFactor = 0.5 - elif slev[i] > depthTol: - tolFactor = 1.0 - 0.005 * (slev[i] - depthTol) - else: - tolFactor = 1.0 - ttol = 0.5 * tolFactor - if okbelow == True and okabove == True: - xmax = levels[i - 1] + bgsl[i - 1] + ttol - xmin = levels[i + 1] + bgsl[i + 1] - ttol - elif okbelow == True: - xmax = levels[i - 1] + bgsl[i - 1] + ttol - xmin = levels[i - 1] + bgsl[i - 1] - ttol - elif okabove == True: - xmax = levels[i + 1] + bgsl[i + 1] + ttol - xmin = levels[i + 1] + bgsl[i + 1] - ttol - else: - continue - # Reassign PGE if level is within the tolerances. - if levels[i] + bgsl[i] >= xmin and levels[i] + bgsl[i] <= xmax: - pgeData[i] = 0.49 - - # Assign the QC flags to original levels. - for i, pge in enumerate(pgeData): - if pgeData.mask[i]: continue - if pge < 0.5: continue - for j, assocLevel in enumerate(assocLevels): - if assocLevel == i: - origLevel = origLevels[j] - qc[origLevel] = True - - return qc - -def determine_pge(levels, bgev, obev, profile): - ''' - determine the probability of gross error per level given: - levels: a list of observed - background temperatures per level (ie the first return of stdLevelData) - bgev: list of background error variance per level - obev: list of observational error variances per level - profile: the wodpy profile object in question - ''' - pge = np.ma.array(np.ndarray(len(levels))) - pge.mask = True - - for iLevel, level in enumerate(levels): - if levels.mask[iLevel] or bgev.mask[iLevel]: continue - bgevLevel = bgev[iLevel] - if np.abs(profile.latitude()) < 10.0: bgevLevel *= 1.5**2 - obevLevel = obev[iLevel] - pge_est = EN_background_check.estimatePGE(profile.probe_type(), False) - - kappa = 0.1 - evLevel = obevLevel + bgevLevel #V from the text - sdiff = level**2 / evLevel - pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) - pdTotal = kappa * pge_est + pdGood * (1.0 - pge_est) - pge[iLevel] = kappa * pge_est / pdTotal - - return pge - -def buddyCovariance(minDist, profile, buddyProfile, meso_ev_a, meso_ev_b, syn_ev_a, syn_ev_b): - ''' - coavariance formula for buddy profiles, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf pp.11 - meso_ev_a == mesoscale error variance for profile a, etc. - ''' - - corScaleA = 100.0 # In km. - corScaleB = 400.0 # In km. - corScaleT = 432000.0 # 5 days in secs. - mesSDist = minDist / (1000.0 * corScaleA) - synSDist = minDist / (1000.0 * corScaleB) - - timeDiff2 = timeDiff(profile, buddyProfile) - if timeDiff2 is None: - return None - timeDiff2 = (timeDiff2 / corScaleT)**2 - - covar = (np.sqrt(meso_ev_a * meso_ev_b) * - (1.0 + mesSDist) * np.exp(-mesSDist - timeDiff2) + - np.sqrt(syn_ev_a * syn_ev_b) * - (1.0 + synSDist) * np.exp(-synSDist - timeDiff2)) - - return covar - -def update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, profile, buddyProfile, obev, bgev, bgevBuddy): - ''' - update the PGE for the profile in question using the buddy pge. - ''' - - for iLevel in range(len(levelsBuddy)): - if levels.mask[iLevel] or levelsBuddy.mask[iLevel]: continue - - # For simplicity, going to assume that length scales - # are isotropic and the same everywhere; in the EN - # processing length scales are stretched in E/W direction - # near the equator and this functionality could be added - # later. - - covar = buddyCovariance(minDist, profile, buddyProfile, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0) - if covar is None: - continue; - - errVarA = obev[iLevel] + bgev[iLevel] - errVarB = obev[iLevel] + bgevBuddy[iLevel] - rho2 = covar**2 / (errVarA + errVarB) - expArg = (-(0.5 * rho2 / (1.0 - rho2)) * - (levels[iLevel]**2 / errVarA + - levelsBuddy[iLevel]**2 / errVarB - - 2.0 * levels[iLevel] * levelsBuddy[iLevel] / covar)) - expArg = -0.5 * np.log(1.0 - rho2) + expArg - expArg = min(80.0, max(-80.0, expArg)) - Z = 1.0 / (1.0 - (1.0 - pgeData[iLevel]) * - (1.0 - pgeBuddy[iLevel]) * (1.0 - expArg)) - if Z < 0.0: Z = 1.0 # In case of rounding errors. - Z = Z**0.5 - pgeData[iLevel] = pgeData[iLevel] * Z - - return pgeData - -def stdLevelData(p): - """ - Combines data that have passed other QC checks to create a - set of observation minus background data on standard levels. - """ - - # Combine other QC results. - preQC = (EN_background_check.test(p) | - EN_constant_value_check.test(p) | - EN_increasing_depth_check.test(p) | - EN_range_check.test(p) | - EN_spike_and_step_check.test(p) | - EN_stability_check.test(p)) - - # Get the data stored by the EN background check. - # As it was run above we know that the data held by the - # module corresponds to the correct profile. - origLevels = np.array(EN_background_check.origLevels) - diffLevels = (np.array(EN_background_check.ptLevels) - - np.array(EN_background_check.bgLevels)) - nLevels = len(origLevels) - if nLevels == 0: return None # Nothing more to do. - - # Remove any levels that failed previous QC. - nLevels, origLevels, diffLevels = filterLevels(preQC, origLevels, diffLevels) - if nLevels == 0: return None - - levels, assocLevs = meanDifferencesAtStandardLevels(origLevels, diffLevels, p.z()) - - return levels, origLevels, assocLevs - -def filterLevels(preQC, origLevels, diffLevels): - ''' - preQC: list or array of bools indicating a QC state for each level, determined from other tests - origLevels: list of level indices that passed EN_background - diffLevels: correpsonding to origLevels. - return (nLevels, origLevels, diffLevels) with all elements corresponding to a True entry in preQC removed. - ''' - - nLevels = len(origLevels) - use = np.ones(nLevels, dtype=bool) - for i, origLevel in enumerate(origLevels): - if preQC[origLevel]: use[i] = False - nLevels = np.count_nonzero(use) - origLevels = origLevels[use] - diffLevels = diffLevels[use] - - return nLevels, origLevels, diffLevels - -def meanDifferencesAtStandardLevels(origLevels, diffLevels, depths): - ''' - origLevels: list of level indices under consideration - diffLevels: list of differences corresponding to origLevels - depths: list of depths of all levels in profile. - returns (levels, assocLevs), where - levels == a masked array of mean differences at each standard level - assocLevs == a list of the indices of the closest standard levels to the levels indicated in origLevels - ''' - - # Get the set of standard levels. - stdLevels = EN_background_check.auxParam['depth'] - - # Create arrays to hold the standard level data and aggregate. - nStdLevels = len(stdLevels) - levels = np.zeros(nStdLevels) - nPerLev = np.zeros(nStdLevels) - assocLevs = [] - for i, origLevel in enumerate(origLevels): - # Find the closest standard level. - j = np.argmin(np.abs(depths[origLevel] - stdLevels)) - assocLevs.append(j) - levels[j] += diffLevels[i] - nPerLev[j] += 1 - - # Average the standard levels where there are data. - iGT1 = nPerLev > 1 - levels[iGT1] /= nPerLev[iGT1] - levels = np.ma.array(levels) - levels.mask = False - levels.mask[nPerLev == 0] = True - - return levels, assocLevs - - -def assessBuddyDistance(p, buddy): - """ - given a profile

and a possible buddy profile , - return None if is not a valid buddy, or the distance - to

if it is. - """ - - # Check that it is not the same profile and that they - # are near in time. The time criteria matches the EN - # processing but would probably be better if it checked - # that the profiles were within a time threshold. The - # cruise is compared as two profiles from the same instrument - # should not be compared. - if (buddy.uid() == p.uid() or - buddy.year() != p.year() or - buddy.month() != p.month() or - buddy.cruise() == p.cruise()): return None - lat = p.latitude() - lon = p.longitude() - latComp = buddy.latitude() - lonComp = buddy.longitude() - # Do a rough check of distance. - latDiff = np.abs(latComp - lat) - if latDiff > 5: return None - # Do a more detailed check of distance. - # Check in case they are either side of the edge of the map. - if np.abs(lonComp - lon) > 180: - if lonComp < lon: - lonComp += 360.0 - else: - lonComp -= 360.0 - # Calculate distance and return. - return haversine(lat, lon, latComp, lonComp) - -def timeDiff(p1, p2): - ''' - returns the time difference, in seconds, between two profiles - returns None if the year, month or day in either profile is invalid - ''' - - dts = [] - for prof in [p1, p2]: - year = prof.year() - month = prof.month() - day = prof.day() - if not (year > 0) or not (1 <= month <= 12) or not (1 <= day <= 31): - return None - time = prof.time() - if time is None or time < 0 or time >= 24: - hours = 0 - minutes = 0 - seconds = 0 - else: - hours = int(time) - minutesf = (time - hours) * 60 - minutes = int(minutesf) - seconds = int((minutesf - minutes) * 60) - - dts.append(datetime.datetime(year, month, day, hours, minutes, seconds)) - - diff = dts[0] - dts[1] - - return np.abs(diff.total_seconds()) - - diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py deleted file mode 100644 index 52342ee..0000000 --- a/qctests/EN_track_check.py +++ /dev/null @@ -1,392 +0,0 @@ -""" -Implements the EN track check, described on pp 7 and 21 of -http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf -""" - -import numpy as np -import data.ds as ds -import util.main as main -import util.geo as geo -import copy -import datetime -import math - -# module constants -DistRes = 20000. # meters -TimeRes = 600. # seconds - -EN_track_headers = {} -EN_track_results = {} -threadFile = {} - -def test(p): - """ - Runs the quality control check on profile p and returns a numpy array - of quality control decisions with False where the data value has - passed the check and True where it failed. - """ - - global EN_track_headers - global EN_track_results - global threadFile - - cruise = p.cruise() - uid = p.uid() - - # don't bother if cruise == 0 or None - if cruise in [0, None]: - return np.zeros(1, dtype=bool); - - # The headers from an entire cruise must be analyzed all at once; - # we'll write the results to the global data store, in a dictionary - # with ntuple keys (cruise, uid), and values as single element - # numpy arrays, containing either a true or a false (per all the other - # qc return objects) - - # check if this profile has been examined already - if (cruise, uid) in EN_track_results.keys(): - return EN_track_results[(cruise, uid)] - - # some detector types cannot be assessed by this test; do not raise flag. - if p.probe_type in [None]: - return np.zeros(1, dtype=bool) - - # the first time this test is run, sort ds.threadProfiles into a cruise-keyed dictionary: - if ds.threadFile != threadFile: - EN_track_headers = main.sort_headers(ds.threadProfiles) - threadFile = ds.threadFile - - # since we didn't find an answer already calculated, - # we still need to do the calculation for this cruise; - # all the relevant headers are sitting in the EN_track_headers list. - headers = EN_track_headers[cruise] - - # start all as passing by default: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())] = np.zeros(1, dtype=bool) - - # copy the list of headers; - # remove entries as they are flagged. - passedHeaders = copy.deepcopy(headers) - rejects = findOutlier(passedHeaders) - while rejects != []: - passedIndex = [x for x in range(len(passedHeaders)) if x not in rejects ] - passedHeaders = [passedHeaders[index] for index in passedIndex ] - rejects = findOutlier(passedHeaders) - - # if more than half got rejected, reject everyone - if len(passedHeaders) < len(headers) / 2: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())][0] = True - - return EN_track_results[(cruise, uid)] - -def findOutlier(headers): - ''' - given a list of , find the fastest one; - if it's too fast, reject it or the one before it, return a list of rejected indices; - once the fastest is within limits, return []. - ''' - - maxShipSpeed = 15. # m/s - maxBuoySpeed = 2. # m/s - - if headers == []: - return [] - - # determine speeds and angles for list of headers - speeds, angles = calculateTraj(headers) - - # decide if something needs to be flagged - maxSpeed = maxShipSpeed - if isBuoy(headers[0]): - maxSpeed = maxBuoySpeed - iMax = speeds.index(max(speeds)) - flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) - - # decide which profile to reject, flag it, and return a list of indices rejected at this step. - if flag: - rejects = chooseReject(headers, speeds, angles, iMax, maxSpeed) - - for reject in rejects: - EN_track_results[(headers[reject].cruise(), headers[reject].uid())][0] = True - return rejects - else: - return [] - -def chooseReject(headers, speeds, angles, index, maxSpeed): - ''' - decide which profile to reject, headers[index] or headers[index-1], or both, - and return a list of indices to reject. - ''' - - # chain of tests breaks when a reject is found: - reject = condition_a(headers, speeds, angles, index, maxSpeed)[0] - - # condition i needs to run at the end of the chain in all cases: - # if no decision, reject both: - if reject == -1: - reject = [index-1, index] - # if excessive speed is created by removing the flag, reject both instead - # can't create new excessive speed by removing last profile. - elif reject < len(headers)-1: - newHeaders = copy.deepcopy(headers) - del newHeaders[reject] - newSpeeds, newAngles = calculateTraj(newHeaders) - flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) - if flag: - reject = [index-1, index] - else: - reject = [reject] - else: - reject = [reject] - - return reject - -def calculateTraj(headers): - ''' - return a list of speeds and a list of angles describing the trajectory of the track described - by the time-ordered list of . - ''' - - speeds = [None] - angles = [None] - - # Find speed and angle for all profiles remaining in the list - for i in range(1, len(headers)): - - speeds.append(None) - angles.append(None) - - speeds[i] = trackSpeed(headers[i-1], headers[i]) - if i < len(headers)-1: # can't do angle on last point - angles[i] = abs(math.pi - geo.haversineAngle(headers[i-1], headers[i], headers[i+1])) - - return speeds, angles - -def isBuoy(header): - ''' - decide if header belongs to a buoy-based measurement - ''' - - return header.probe_type in [4,7,9,10,11,12,13,15] - -def detectExcessiveSpeed(speeds, angles, index, maxSpeed): - ''' - decide if there was an excessive speed at in the lists and - ''' - - flag = speeds[index] > maxSpeed - - if index > 0: - flag = flag or ( (speeds[index] > 0.8*maxSpeed) and (angles[index]>math.pi/2 or angles[index-1]>math.pi/2) ) - - return flag - -def meanSpeed(speeds, headers, maxSpeed): - ''' - determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) - ''' - - meanSpeed = 0 - speedCount = 0 - for iSpeed, speed in enumerate(speeds): - if speed == None or iSpeed == 0: - #missing values - continue - elif iSpeed > 0 and geo.deltaTime(headers[iSpeed-1], headers[iSpeed]) < 3600.: - #too close together in time - continue - elif speed > maxSpeed: - #too fast - continue - else: - meanSpeed += speed - speedCount += 1 - - if speedCount > 0: - meanSpeed = meanSpeed / speedCount - - return meanSpeed - - -def trackSpeed(prevHeader, header): - ''' - computes the speed, including rounding tolerance from the reference, - for the track at

. - return None if some necessary data is missing - ''' - - # check that all required data is present: - if None in [header.latitude(), header.longitude(), prevHeader.latitude(), prevHeader.longitude()]: - return None - if None in [header.year(), header.month(), header.day(), header.time(), prevHeader.year(), prevHeader.month(), prevHeader.day(), prevHeader.time()]: - return None - - dist = geo.haversineDistance(prevHeader, header) - DTime = geo.deltaTime(prevHeader, header) - speed = (dist - DistRes) / max(DTime, TimeRes) - - return speed - -def condition_a(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (a) from the text - ''' - - if index == 1 and len(headers) == 2: - return 0, 'a' - elif index == 1 and len(headers) > 2: # note 'M' in the text seems to count from 1, not 0. - impliedSpeed = trackSpeed(headers[0], headers[2]) - if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): - return 1, 'a' - else: - return 0, 'a' - elif index == len(headers)-1 and len(headers)>3: # why not >=? seems to cause problems, investigate. - impliedSpeed = trackSpeed(headers[-3], headers[-1]) - if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): - return index-1, 'a' - else: - return index, 'a' - else: - return condition_b(headers, speeds, angles, index, maxSpeed) - -def condition_b(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (b) from the text - ''' - if speeds[index-1] > maxSpeed: - return index-1, 'b' - elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: - return index, 'b' - - return condition_c(headers, speeds, angles, index, maxSpeed) - -def condition_c(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (c) from the text - ''' - - if index < len(headers)-1 and index > 0: - impliedSpeed = trackSpeed(headers[index-1], headers[index+1]) - if impliedSpeed > maxSpeed: - return index-1, 'c' - - if index > 1: - impliedSpeed = trackSpeed(headers[index-2], headers[index]) - if impliedSpeed > maxSpeed: - return index, 'c' - - return condition_d(headers, speeds, angles, index, maxSpeed) - - -def condition_d(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (d) from the text - ''' - - if None not in [angles[index-1], angles[index]] and angles[index-1] > 45./180.*math.pi + angles[index]: - return index-1, 'd' - - if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: - return index, 'd' - - return condition_e(headers, speeds, angles, index, maxSpeed) - -def condition_e(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (e) from the text - ''' - - if len(headers) > max(2, index+1): - - if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: - return index-1, 'e' - - if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: - return index, 'e' - - return condition_f(headers, speeds, angles, index, maxSpeed) - -def condition_f(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (f) from the text - ''' - - if index>0 and index < len(speeds)-1: - - ms = meanSpeed(speeds, headers, maxSpeed) - - if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): - return index-1, 'f' - - if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): - return index, 'f' - - return condition_g(headers, speeds, angles, index, maxSpeed) - -def condition_g(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (g) from the text - ''' - - if index > 1 and index < len(headers) - 1: - - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) - - distTol = geo.haversineDistance(headers[index-1], headers[index-2]) - distTol += geo.haversineDistance(headers[index], headers[index-1]) - distTol += geo.haversineDistance(headers[index+1], headers[index]) - distTol = max(DistRes, 0.1*distTol) - - if dist1 < dist2 - distTol: - return index-1, 'g' - - if dist2 < dist1 - distTol: - return index, 'g' - - return condition_h(headers, speeds, angles, index, maxSpeed) - -def condition_h(headers, speeds, angles, index, maxSpeed): - ''' - assess condition (h) from the text - typeo in text, implementation incomplete - ''' - - if index > 1 and index < len(headers) - 1: - - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) - - PD1 = geo.haversineDistance(headers[index-1], headers[index-2]) / dist2 - PD2 = geo.haversineDistance(headers[index], headers[index-2]) / dist1 - - PT1 = geo.deltaTime(headers[index-2], headers[index-1]) / geo.deltaTime(headers[index-2], headers[index+1]) - PT2 = geo.deltaTime(headers[index-2], headers[index]) / geo.deltaTime(headers[index-2], headers[index+1]) - - if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): - return index-1, 'h' - if abs(PD2 - PT2) > 0.1 + abs(PD1 - PT1): - return index, 'h' - - return -1, 'i' - -def checkOrder(profiles): - ''' - check that a list of profiles is properly time ordered - ''' - - dates = [] - for pro in profiles: - if pro.time() is not None: - hour, minute, second = geo.parseTime(pro.time()) - else: - hour = 0 - minute = 0 - second = 0 - date = datetime.datetime(year=pro.year(), month=pro.month(), day=pro.day(), hour=hour, minute=minute, second=second ) - dates.append(date) - - for i in range(len(dates)-1): - assert dates[i] <= dates [i+1], 'dates out of order %s %s' % (dates[i], dates[i+1]) diff --git a/summarize-results.py b/summarize-results.py index c536010..5c1e5b3 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -5,8 +5,6 @@ testNames = main.importQC('qctests') testNames.sort() -testNames = [test for test in testNames if test[0:5] == 'CSIRO'] - # connect to database conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() @@ -15,7 +13,7 @@ query = 'SELECT truth' for test in testNames: query += ', ' + test.lower() -query += ' FROM demo' +query += ' FROM validate' cur.execute(query) rawresults = cur.fetchall() From 461eae85b78057277524daef425ef1a9729bed40 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 31 Jul 2016 00:47:13 +0000 Subject: [PATCH 49/79] cleanups to new database method before final debug & validation --- AutoQC.py | 59 +--- build-db.py | 1 + datafiles.json | 3 - qctests/EN_std_lev_bkg_and_buddy_check.py | 369 ++++++++++++++++++++ qctests/EN_track_check.py | 392 ++++++++++++++++++++++ summarize-results.py | 3 + tests/main_tests.py | 223 ------------ tests/wod_tests.py | 42 --- util/main.py | 213 ------------ 9 files changed, 768 insertions(+), 537 deletions(-) delete mode 100644 datafiles.json create mode 100644 qctests/EN_std_lev_bkg_and_buddy_check.py create mode 100644 qctests/EN_track_check.py delete mode 100644 tests/wod_tests.py diff --git a/AutoQC.py b/AutoQC.py index 87430db..4cacb39 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -1,7 +1,7 @@ from wodpy import wod import glob, time import numpy as np -import sys, os, json, data.ds +import sys, os, data.ds import util.main as main import pandas, psycopg2 from multiprocessing import Pool @@ -25,50 +25,6 @@ def run(test, profiles): verbose.append(result) return [qcResults, verbose] -def processFile(fName): - # run each test on each profile, and record its summary & verbose performance - testResults = [] - testVerbose = [] - trueResults = [] - trueVerbose = [] - profileIDs = [] - firstProfile = True - currentFile = '' - f = None - - # keep a list of only the profiles in this thread - data.ds.threadProfiles = main.extractProfiles([fName]) - data.ds.threadFile = fName - - for iprofile, pinfo in enumerate(data.ds.threadProfiles): - # Load the profile data. - p, currentFile, f = main.profileData(pinfo, currentFile, f) - # Check that there are temperature data in the profile, otherwise skip. - if p.var_index() is None: - continue - main.catchFlags(p) - if np.sum(p.t().mask == False) == 0: - continue - # Run each test. - for itest, test in enumerate(testNames): - result = run(test, [p]) - if firstProfile: - testResults.append(result[0]) - testVerbose.append(result[1]) - else: - testResults[itest].append(result[0][0]) - testVerbose[itest].append(result[1][0]) - firstProfile = False - # Read the reference result. - truth = main.referenceResults([p]) - trueResults.append(truth[0][0]) - trueVerbose.append(truth[1][0]) - profileIDs.append(p.uid()) - # testResults[i][j] now contains a flag indicating the exception raised by test i on profile j - - return trueResults, testResults, profileIDs - - ######################################## # main ######################################## @@ -77,6 +33,8 @@ def processFile(fName): # Identify and import tests testNames = main.importQC('qctests') testNames.sort() + testNames.remove('EN_std_lev_bkg_and_buddy_check') + testNames.remove('EN_track_check') print('{} quality control checks have been found'.format(len(testNames))) testNames = main.checkQCTestRequirements(testNames) print('{} quality control checks are able to be run:'.format(len(testNames))) @@ -113,8 +71,6 @@ def process_row(uid): query = "UPDATE validate SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) - print profile.uid() - # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() @@ -130,15 +86,6 @@ def process_row(uid): conn.commit() - - # ------------------------------------------- - - # # Recombine results - # truth, results, profileIDs = main.combineArrays(parallel_result) - - # # Print summary statistics and write output file. - # main.printSummary(truth, results, testNames) - # main.generateCSV(truth, results, testNames, profileIDs, sys.argv[1]) else: print 'Please add command line arguments to name your output file and set parallelization:' print 'python AutoQC myFile 4' diff --git a/build-db.py b/build-db.py index a929936..8e9ad5c 100644 --- a/build-db.py +++ b/build-db.py @@ -37,6 +37,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) +#while True: for i in range(10): # extract profile as wodpy object and raw text start = fid.tell() diff --git a/datafiles.json b/datafiles.json deleted file mode 100644 index 9b4ba6a..0000000 --- a/datafiles.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "data/quota_subset.dat" -] diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py new file mode 100644 index 0000000..44bdff2 --- /dev/null +++ b/qctests/EN_std_lev_bkg_and_buddy_check.py @@ -0,0 +1,369 @@ +""" +Implements the background check on standard levels and the buddy check +from the EN quality control system, +http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +from cotede.qctests.possible_speed import haversine +import datetime +import EN_background_check +import EN_constant_value_check +import EN_increasing_depth_check +import EN_range_check +import EN_spike_and_step_check +import EN_stability_check +import util.main as main +import data.ds +import numpy as np + +def test(p, allow_level_reinstating=True): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + + If allow_level_reinstating is set to True then rejected levels can be + reprieved by comparing with levels above and below. NB this is done by + default in EN processing. + """ + + # Define an array to hold results. + qc = np.zeros(p.n_levels(), dtype=bool) + + # Obtain the obs minus background differences on standard levels. + result = stdLevelData(p) + if result is None: return qc + + # Unpack the results. + levels, origLevels, assocLevels = result + # Retrieve the background and observation error variances and + # the background values. + bgsl = EN_background_check.bgStdLevels + slev = EN_background_check.auxParam['depth'] + bgev = EN_background_check.bgevStdLevels + obev = EN_background_check.auxParam['obev'] + + #find initial pge + pgeData = determine_pge(levels, bgev, obev, p) + + # Find buddy. + profiles = data.ds.profiles + minDist = 1000000000.0 + iMinDist = None + for iProfile, profile in enumerate(profiles): + pDist = assessBuddyDistance(p, profile) + if pDist is not None and pDist < minDist: + minDist = pDist + iMinDist = iProfile + + # Check if we have found a buddy and process if so. + if minDist <= 400000: + fid = None + pBuddy, currentFile, fid = main.profileData(profiles[iMinDist], '', fid) + fid.close() + + # buddy vetos + Fail = False + if pBuddy.var_index() is None: + Fail = True + if Fail == False: + main.catchFlags(pBuddy) + if np.sum(pBuddy.t().mask == False) == 0: + Fail = True + + if Fail == False: + result = stdLevelData(pBuddy) + if result is not None: + levelsBuddy, origLevelsBuddy, assocLevelsBuddy = result + bgevBuddy = EN_background_check.bgevStdLevels + pgeBuddy = determine_pge(levels, bgevBuddy, obev, pBuddy) + pgeData = update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, p, pBuddy, obev, bgev, bgevBuddy) + + # Check if levels should be reinstated. + if allow_level_reinstating: + if np.abs(p.latitude()) < 20.0: + depthTol = 300.0 + else: + depthTol = 200.0 + stdLevelFlags = pgeData >= 0.5 + for i, slflag in enumerate(stdLevelFlags): + if slflag: + # Check for non rejected surrounding levels. + okbelow = False + if i > 0: + if stdLevelFlags[i - 1] == False and levels.mask[i - 1] == False and bgsl.mask[i - 1] == False: + okbelow = True + okabove = False + nsl = len(stdLevelFlags) + if i < nsl - 1: + if stdLevelFlags[i + 1] == False and levels.mask[i + 1] == False and bgsl.mask[i + 1] == False: + okabove = True + # Work out tolerances. + if slev[i] > depthTol + 100: + tolFactor = 0.5 + elif slev[i] > depthTol: + tolFactor = 1.0 - 0.005 * (slev[i] - depthTol) + else: + tolFactor = 1.0 + ttol = 0.5 * tolFactor + if okbelow == True and okabove == True: + xmax = levels[i - 1] + bgsl[i - 1] + ttol + xmin = levels[i + 1] + bgsl[i + 1] - ttol + elif okbelow == True: + xmax = levels[i - 1] + bgsl[i - 1] + ttol + xmin = levels[i - 1] + bgsl[i - 1] - ttol + elif okabove == True: + xmax = levels[i + 1] + bgsl[i + 1] + ttol + xmin = levels[i + 1] + bgsl[i + 1] - ttol + else: + continue + # Reassign PGE if level is within the tolerances. + if levels[i] + bgsl[i] >= xmin and levels[i] + bgsl[i] <= xmax: + pgeData[i] = 0.49 + + # Assign the QC flags to original levels. + for i, pge in enumerate(pgeData): + if pgeData.mask[i]: continue + if pge < 0.5: continue + for j, assocLevel in enumerate(assocLevels): + if assocLevel == i: + origLevel = origLevels[j] + qc[origLevel] = True + + return qc + +def determine_pge(levels, bgev, obev, profile): + ''' + determine the probability of gross error per level given: + levels: a list of observed - background temperatures per level (ie the first return of stdLevelData) + bgev: list of background error variance per level + obev: list of observational error variances per level + profile: the wodpy profile object in question + ''' + pge = np.ma.array(np.ndarray(len(levels))) + pge.mask = True + + for iLevel, level in enumerate(levels): + if levels.mask[iLevel] or bgev.mask[iLevel]: continue + bgevLevel = bgev[iLevel] + if np.abs(profile.latitude()) < 10.0: bgevLevel *= 1.5**2 + obevLevel = obev[iLevel] + pge_est = EN_background_check.estimatePGE(profile.probe_type(), False) + + kappa = 0.1 + evLevel = obevLevel + bgevLevel #V from the text + sdiff = level**2 / evLevel + pdGood = np.exp(-0.5 * np.min([sdiff, 160.0])) / np.sqrt(2.0 * np.pi * evLevel) + pdTotal = kappa * pge_est + pdGood * (1.0 - pge_est) + pge[iLevel] = kappa * pge_est / pdTotal + + return pge + +def buddyCovariance(minDist, profile, buddyProfile, meso_ev_a, meso_ev_b, syn_ev_a, syn_ev_b): + ''' + coavariance formula for buddy profiles, http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf pp.11 + meso_ev_a == mesoscale error variance for profile a, etc. + ''' + + corScaleA = 100.0 # In km. + corScaleB = 400.0 # In km. + corScaleT = 432000.0 # 5 days in secs. + mesSDist = minDist / (1000.0 * corScaleA) + synSDist = minDist / (1000.0 * corScaleB) + + timeDiff2 = timeDiff(profile, buddyProfile) + if timeDiff2 is None: + return None + timeDiff2 = (timeDiff2 / corScaleT)**2 + + covar = (np.sqrt(meso_ev_a * meso_ev_b) * + (1.0 + mesSDist) * np.exp(-mesSDist - timeDiff2) + + np.sqrt(syn_ev_a * syn_ev_b) * + (1.0 + synSDist) * np.exp(-synSDist - timeDiff2)) + + return covar + +def update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, profile, buddyProfile, obev, bgev, bgevBuddy): + ''' + update the PGE for the profile in question using the buddy pge. + ''' + + for iLevel in range(len(levelsBuddy)): + if levels.mask[iLevel] or levelsBuddy.mask[iLevel]: continue + + # For simplicity, going to assume that length scales + # are isotropic and the same everywhere; in the EN + # processing length scales are stretched in E/W direction + # near the equator and this functionality could be added + # later. + + covar = buddyCovariance(minDist, profile, buddyProfile, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0, bgev[iLevel]/2.0, bgevBuddy[iLevel]/2.0) + if covar is None: + continue; + + errVarA = obev[iLevel] + bgev[iLevel] + errVarB = obev[iLevel] + bgevBuddy[iLevel] + rho2 = covar**2 / (errVarA + errVarB) + expArg = (-(0.5 * rho2 / (1.0 - rho2)) * + (levels[iLevel]**2 / errVarA + + levelsBuddy[iLevel]**2 / errVarB - + 2.0 * levels[iLevel] * levelsBuddy[iLevel] / covar)) + expArg = -0.5 * np.log(1.0 - rho2) + expArg + expArg = min(80.0, max(-80.0, expArg)) + Z = 1.0 / (1.0 - (1.0 - pgeData[iLevel]) * + (1.0 - pgeBuddy[iLevel]) * (1.0 - expArg)) + if Z < 0.0: Z = 1.0 # In case of rounding errors. + Z = Z**0.5 + pgeData[iLevel] = pgeData[iLevel] * Z + + return pgeData + +def stdLevelData(p): + """ + Combines data that have passed other QC checks to create a + set of observation minus background data on standard levels. + """ + + # Combine other QC results. + preQC = (EN_background_check.test(p) | + EN_constant_value_check.test(p) | + EN_increasing_depth_check.test(p) | + EN_range_check.test(p) | + EN_spike_and_step_check.test(p) | + EN_stability_check.test(p)) + + # Get the data stored by the EN background check. + # As it was run above we know that the data held by the + # module corresponds to the correct profile. + origLevels = np.array(EN_background_check.origLevels) + diffLevels = (np.array(EN_background_check.ptLevels) - + np.array(EN_background_check.bgLevels)) + nLevels = len(origLevels) + if nLevels == 0: return None # Nothing more to do. + + # Remove any levels that failed previous QC. + nLevels, origLevels, diffLevels = filterLevels(preQC, origLevels, diffLevels) + if nLevels == 0: return None + + levels, assocLevs = meanDifferencesAtStandardLevels(origLevels, diffLevels, p.z()) + + return levels, origLevels, assocLevs + +def filterLevels(preQC, origLevels, diffLevels): + ''' + preQC: list or array of bools indicating a QC state for each level, determined from other tests + origLevels: list of level indices that passed EN_background + diffLevels: correpsonding to origLevels. + return (nLevels, origLevels, diffLevels) with all elements corresponding to a True entry in preQC removed. + ''' + + nLevels = len(origLevels) + use = np.ones(nLevels, dtype=bool) + for i, origLevel in enumerate(origLevels): + if preQC[origLevel]: use[i] = False + nLevels = np.count_nonzero(use) + origLevels = origLevels[use] + diffLevels = diffLevels[use] + + return nLevels, origLevels, diffLevels + +def meanDifferencesAtStandardLevels(origLevels, diffLevels, depths): + ''' + origLevels: list of level indices under consideration + diffLevels: list of differences corresponding to origLevels + depths: list of depths of all levels in profile. + returns (levels, assocLevs), where + levels == a masked array of mean differences at each standard level + assocLevs == a list of the indices of the closest standard levels to the levels indicated in origLevels + ''' + + # Get the set of standard levels. + stdLevels = EN_background_check.auxParam['depth'] + + # Create arrays to hold the standard level data and aggregate. + nStdLevels = len(stdLevels) + levels = np.zeros(nStdLevels) + nPerLev = np.zeros(nStdLevels) + assocLevs = [] + for i, origLevel in enumerate(origLevels): + # Find the closest standard level. + j = np.argmin(np.abs(depths[origLevel] - stdLevels)) + assocLevs.append(j) + levels[j] += diffLevels[i] + nPerLev[j] += 1 + + # Average the standard levels where there are data. + iGT1 = nPerLev > 1 + levels[iGT1] /= nPerLev[iGT1] + levels = np.ma.array(levels) + levels.mask = False + levels.mask[nPerLev == 0] = True + + return levels, assocLevs + + +def assessBuddyDistance(p, buddy): + """ + given a profile

and a possible buddy profile , + return None if is not a valid buddy, or the distance + to

if it is. + """ + + # Check that it is not the same profile and that they + # are near in time. The time criteria matches the EN + # processing but would probably be better if it checked + # that the profiles were within a time threshold. The + # cruise is compared as two profiles from the same instrument + # should not be compared. + if (buddy.uid() == p.uid() or + buddy.year() != p.year() or + buddy.month() != p.month() or + buddy.cruise() == p.cruise()): return None + lat = p.latitude() + lon = p.longitude() + latComp = buddy.latitude() + lonComp = buddy.longitude() + # Do a rough check of distance. + latDiff = np.abs(latComp - lat) + if latDiff > 5: return None + # Do a more detailed check of distance. + # Check in case they are either side of the edge of the map. + if np.abs(lonComp - lon) > 180: + if lonComp < lon: + lonComp += 360.0 + else: + lonComp -= 360.0 + # Calculate distance and return. + return haversine(lat, lon, latComp, lonComp) + +def timeDiff(p1, p2): + ''' + returns the time difference, in seconds, between two profiles + returns None if the year, month or day in either profile is invalid + ''' + + dts = [] + for prof in [p1, p2]: + year = prof.year() + month = prof.month() + day = prof.day() + if not (year > 0) or not (1 <= month <= 12) or not (1 <= day <= 31): + return None + time = prof.time() + if time is None or time < 0 or time >= 24: + hours = 0 + minutes = 0 + seconds = 0 + else: + hours = int(time) + minutesf = (time - hours) * 60 + minutes = int(minutesf) + seconds = int((minutesf - minutes) * 60) + + dts.append(datetime.datetime(year, month, day, hours, minutes, seconds)) + + diff = dts[0] - dts[1] + + return np.abs(diff.total_seconds()) + + diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py new file mode 100644 index 0000000..52342ee --- /dev/null +++ b/qctests/EN_track_check.py @@ -0,0 +1,392 @@ +""" +Implements the EN track check, described on pp 7 and 21 of +http://www.metoffice.gov.uk/hadobs/en3/OQCpaper.pdf +""" + +import numpy as np +import data.ds as ds +import util.main as main +import util.geo as geo +import copy +import datetime +import math + +# module constants +DistRes = 20000. # meters +TimeRes = 600. # seconds + +EN_track_headers = {} +EN_track_results = {} +threadFile = {} + +def test(p): + """ + Runs the quality control check on profile p and returns a numpy array + of quality control decisions with False where the data value has + passed the check and True where it failed. + """ + + global EN_track_headers + global EN_track_results + global threadFile + + cruise = p.cruise() + uid = p.uid() + + # don't bother if cruise == 0 or None + if cruise in [0, None]: + return np.zeros(1, dtype=bool); + + # The headers from an entire cruise must be analyzed all at once; + # we'll write the results to the global data store, in a dictionary + # with ntuple keys (cruise, uid), and values as single element + # numpy arrays, containing either a true or a false (per all the other + # qc return objects) + + # check if this profile has been examined already + if (cruise, uid) in EN_track_results.keys(): + return EN_track_results[(cruise, uid)] + + # some detector types cannot be assessed by this test; do not raise flag. + if p.probe_type in [None]: + return np.zeros(1, dtype=bool) + + # the first time this test is run, sort ds.threadProfiles into a cruise-keyed dictionary: + if ds.threadFile != threadFile: + EN_track_headers = main.sort_headers(ds.threadProfiles) + threadFile = ds.threadFile + + # since we didn't find an answer already calculated, + # we still need to do the calculation for this cruise; + # all the relevant headers are sitting in the EN_track_headers list. + headers = EN_track_headers[cruise] + + # start all as passing by default: + for i in range(len(headers)): + EN_track_results[(headers[i].cruise(), headers[i].uid())] = np.zeros(1, dtype=bool) + + # copy the list of headers; + # remove entries as they are flagged. + passedHeaders = copy.deepcopy(headers) + rejects = findOutlier(passedHeaders) + while rejects != []: + passedIndex = [x for x in range(len(passedHeaders)) if x not in rejects ] + passedHeaders = [passedHeaders[index] for index in passedIndex ] + rejects = findOutlier(passedHeaders) + + # if more than half got rejected, reject everyone + if len(passedHeaders) < len(headers) / 2: + for i in range(len(headers)): + EN_track_results[(headers[i].cruise(), headers[i].uid())][0] = True + + return EN_track_results[(cruise, uid)] + +def findOutlier(headers): + ''' + given a list of , find the fastest one; + if it's too fast, reject it or the one before it, return a list of rejected indices; + once the fastest is within limits, return []. + ''' + + maxShipSpeed = 15. # m/s + maxBuoySpeed = 2. # m/s + + if headers == []: + return [] + + # determine speeds and angles for list of headers + speeds, angles = calculateTraj(headers) + + # decide if something needs to be flagged + maxSpeed = maxShipSpeed + if isBuoy(headers[0]): + maxSpeed = maxBuoySpeed + iMax = speeds.index(max(speeds)) + flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) + + # decide which profile to reject, flag it, and return a list of indices rejected at this step. + if flag: + rejects = chooseReject(headers, speeds, angles, iMax, maxSpeed) + + for reject in rejects: + EN_track_results[(headers[reject].cruise(), headers[reject].uid())][0] = True + return rejects + else: + return [] + +def chooseReject(headers, speeds, angles, index, maxSpeed): + ''' + decide which profile to reject, headers[index] or headers[index-1], or both, + and return a list of indices to reject. + ''' + + # chain of tests breaks when a reject is found: + reject = condition_a(headers, speeds, angles, index, maxSpeed)[0] + + # condition i needs to run at the end of the chain in all cases: + # if no decision, reject both: + if reject == -1: + reject = [index-1, index] + # if excessive speed is created by removing the flag, reject both instead + # can't create new excessive speed by removing last profile. + elif reject < len(headers)-1: + newHeaders = copy.deepcopy(headers) + del newHeaders[reject] + newSpeeds, newAngles = calculateTraj(newHeaders) + flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) + if flag: + reject = [index-1, index] + else: + reject = [reject] + else: + reject = [reject] + + return reject + +def calculateTraj(headers): + ''' + return a list of speeds and a list of angles describing the trajectory of the track described + by the time-ordered list of . + ''' + + speeds = [None] + angles = [None] + + # Find speed and angle for all profiles remaining in the list + for i in range(1, len(headers)): + + speeds.append(None) + angles.append(None) + + speeds[i] = trackSpeed(headers[i-1], headers[i]) + if i < len(headers)-1: # can't do angle on last point + angles[i] = abs(math.pi - geo.haversineAngle(headers[i-1], headers[i], headers[i+1])) + + return speeds, angles + +def isBuoy(header): + ''' + decide if header belongs to a buoy-based measurement + ''' + + return header.probe_type in [4,7,9,10,11,12,13,15] + +def detectExcessiveSpeed(speeds, angles, index, maxSpeed): + ''' + decide if there was an excessive speed at in the lists and + ''' + + flag = speeds[index] > maxSpeed + + if index > 0: + flag = flag or ( (speeds[index] > 0.8*maxSpeed) and (angles[index]>math.pi/2 or angles[index-1]>math.pi/2) ) + + return flag + +def meanSpeed(speeds, headers, maxSpeed): + ''' + determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) + ''' + + meanSpeed = 0 + speedCount = 0 + for iSpeed, speed in enumerate(speeds): + if speed == None or iSpeed == 0: + #missing values + continue + elif iSpeed > 0 and geo.deltaTime(headers[iSpeed-1], headers[iSpeed]) < 3600.: + #too close together in time + continue + elif speed > maxSpeed: + #too fast + continue + else: + meanSpeed += speed + speedCount += 1 + + if speedCount > 0: + meanSpeed = meanSpeed / speedCount + + return meanSpeed + + +def trackSpeed(prevHeader, header): + ''' + computes the speed, including rounding tolerance from the reference, + for the track at

. + return None if some necessary data is missing + ''' + + # check that all required data is present: + if None in [header.latitude(), header.longitude(), prevHeader.latitude(), prevHeader.longitude()]: + return None + if None in [header.year(), header.month(), header.day(), header.time(), prevHeader.year(), prevHeader.month(), prevHeader.day(), prevHeader.time()]: + return None + + dist = geo.haversineDistance(prevHeader, header) + DTime = geo.deltaTime(prevHeader, header) + speed = (dist - DistRes) / max(DTime, TimeRes) + + return speed + +def condition_a(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (a) from the text + ''' + + if index == 1 and len(headers) == 2: + return 0, 'a' + elif index == 1 and len(headers) > 2: # note 'M' in the text seems to count from 1, not 0. + impliedSpeed = trackSpeed(headers[0], headers[2]) + if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): + return 1, 'a' + else: + return 0, 'a' + elif index == len(headers)-1 and len(headers)>3: # why not >=? seems to cause problems, investigate. + impliedSpeed = trackSpeed(headers[-3], headers[-1]) + if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): + return index-1, 'a' + else: + return index, 'a' + else: + return condition_b(headers, speeds, angles, index, maxSpeed) + +def condition_b(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (b) from the text + ''' + if speeds[index-1] > maxSpeed: + return index-1, 'b' + elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: + return index, 'b' + + return condition_c(headers, speeds, angles, index, maxSpeed) + +def condition_c(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (c) from the text + ''' + + if index < len(headers)-1 and index > 0: + impliedSpeed = trackSpeed(headers[index-1], headers[index+1]) + if impliedSpeed > maxSpeed: + return index-1, 'c' + + if index > 1: + impliedSpeed = trackSpeed(headers[index-2], headers[index]) + if impliedSpeed > maxSpeed: + return index, 'c' + + return condition_d(headers, speeds, angles, index, maxSpeed) + + +def condition_d(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (d) from the text + ''' + + if None not in [angles[index-1], angles[index]] and angles[index-1] > 45./180.*math.pi + angles[index]: + return index-1, 'd' + + if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: + return index, 'd' + + return condition_e(headers, speeds, angles, index, maxSpeed) + +def condition_e(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (e) from the text + ''' + + if len(headers) > max(2, index+1): + + if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: + return index-1, 'e' + + if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: + return index, 'e' + + return condition_f(headers, speeds, angles, index, maxSpeed) + +def condition_f(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (f) from the text + ''' + + if index>0 and index < len(speeds)-1: + + ms = meanSpeed(speeds, headers, maxSpeed) + + if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): + return index-1, 'f' + + if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): + return index, 'f' + + return condition_g(headers, speeds, angles, index, maxSpeed) + +def condition_g(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (g) from the text + ''' + + if index > 1 and index < len(headers) - 1: + + dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) + dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + + distTol = geo.haversineDistance(headers[index-1], headers[index-2]) + distTol += geo.haversineDistance(headers[index], headers[index-1]) + distTol += geo.haversineDistance(headers[index+1], headers[index]) + distTol = max(DistRes, 0.1*distTol) + + if dist1 < dist2 - distTol: + return index-1, 'g' + + if dist2 < dist1 - distTol: + return index, 'g' + + return condition_h(headers, speeds, angles, index, maxSpeed) + +def condition_h(headers, speeds, angles, index, maxSpeed): + ''' + assess condition (h) from the text + typeo in text, implementation incomplete + ''' + + if index > 1 and index < len(headers) - 1: + + dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) + dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + + PD1 = geo.haversineDistance(headers[index-1], headers[index-2]) / dist2 + PD2 = geo.haversineDistance(headers[index], headers[index-2]) / dist1 + + PT1 = geo.deltaTime(headers[index-2], headers[index-1]) / geo.deltaTime(headers[index-2], headers[index+1]) + PT2 = geo.deltaTime(headers[index-2], headers[index]) / geo.deltaTime(headers[index-2], headers[index+1]) + + if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): + return index-1, 'h' + if abs(PD2 - PT2) > 0.1 + abs(PD1 - PT1): + return index, 'h' + + return -1, 'i' + +def checkOrder(profiles): + ''' + check that a list of profiles is properly time ordered + ''' + + dates = [] + for pro in profiles: + if pro.time() is not None: + hour, minute, second = geo.parseTime(pro.time()) + else: + hour = 0 + minute = 0 + second = 0 + date = datetime.datetime(year=pro.year(), month=pro.month(), day=pro.day(), hour=hour, minute=minute, second=second ) + dates.append(date) + + for i in range(len(dates)-1): + assert dates[i] <= dates [i+1], 'dates out of order %s %s' % (dates[i], dates[i+1]) diff --git a/summarize-results.py b/summarize-results.py index 5c1e5b3..9b5eea9 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -4,6 +4,9 @@ # what tests are available testNames = main.importQC('qctests') testNames.sort() +testNames.remove('EN_std_lev_bkg_and_buddy_check') +testNames.remove('EN_track_check') + # connect to database conn = psycopg2.connect("dbname='root' user='root'") diff --git a/tests/main_tests.py b/tests/main_tests.py index e63b88e..f17ace8 100644 --- a/tests/main_tests.py +++ b/tests/main_tests.py @@ -1,125 +1,7 @@ import util.main as main import os -from wodpy import wod -import numpy, pandas -from pandas.util.testing import assert_frame_equal -import util.testingProfile class TestClass(): - def setUp(self): - - #create an incorrectly formatted list of input files - file = open("notalist.json", "w") - file.write('{"not": "alist"}') - file.close() - - #create a list of input files that does not exist - file = open("dne.json", "w") - file.write('["data/doesnotexist.dat"]') - file.close() - - #create an artificial profile to trigger the temperature flag - #sets first temperature to 99.9; otherwise identical to data/example.dat - file = open("temp.dat", "w") - file.write('C41303567064US5112031934 8 744210374426193562-17227140 6110101201013011182205814\n') - file.write('01118220291601118220291901024721 8STOCS85A3 41032151032165-500632175-50023218273\n') - file.write('18117709500110134401427143303931722076210220602291107291110329977020133023846181\n') - file.write('24421800132207614110217330103192220521322011216442103723077095001101818115508527\n') - file.write('20012110000133312500021011060022022068002272214830228442684000230770421200000191\n') - file.write('15507911800121100001333125000151105002103302270022022068002274411816302284426840\n') - file.write('00230770426500000191155069459001211000013331250001511050021033011300220220680022\n') - file.write('73319043022844268400023077042620000019116601596680012110000133312500021022016002\n') - file.write('17110100220220680022733112830228442684000230770435700000181155088803001211000013\n') - file.write('33125000210220160022022068002273311283022844268400023077042120000019115508880300\n') - file.write('12110000133312500015110200210330535002202206800227441428030228442684000230770421\n') - file.write('20000019115508880300121100001333125000152204300210220320022022068002273312563022\n') - file.write('84426840002307704212000001911550853710012110000133312500015110200210220160022022\n') - file.write('06800227331128302284426840002307704212000001100001319990044230900033267500222650\n') - file.write('03312050033281000220100033289500442309000332670002227100331123003328100022025002\n') - file.write('22900044231910033286200222900033115400332810002205000342-12300442324100332728003\n') - file.write('32117003312560033280500 \n') - file.close() - - - return - - def tearDown(self): - os.remove('notalist.json') - os.remove('dne.json') - os.remove('temp.dat') - return - - def readInput_list_test(self): - ''' - main.readInput should assert it gets a list back - ''' - - try: - main.readInput('notalist.json') - except AssertionError: - assert True - return - - assert False, "readInput failed to raise an exception when given json that wasn't a list" - - def reatInput_dne_test(self): - ''' - main.readInput should raise exceptions if listed files don't exist - ''' - - try: - main.readInput('dne.json') - except AssertionError: - assert True - return - - assert False, "readInput failed to raise an exception when a listed data file was not found." - - def extractProfiles_test(self): - ''' - simple check to make sure only WodProfile objects are getting returned - ''' - - profiles = main.extractProfiles(["data/quota_subset.dat"]) - for i in profiles: - assert isinstance(i, wod.WodProfile), i + ' is not a WodProfile' - - def extractProfiles_example_test(self): - ''' - check the example from pp 137 of - http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf - is extracted correctly. - data is in `data/example.dat` - ''' - - profile = main.extractProfiles(['data/example.dat'])[0] - - assert profile.latitude() == 61.930, 'incorrect latitude extraction' - assert profile.longitude() == -172.270, 'incorrect longitude extraction' - assert profile.uid() == 67064, 'incorrect UID extraction' - assert profile.n_levels() == 4, 'incorrect # levels extraction' - assert profile.year() == 1934, 'incorrect year extraction' - assert profile.month() == 8, 'incorrect month extraction' - assert profile.day() == 7, 'incorrect day extraction' - assert profile.time() == 10.37, 'incorrect time extraction' - assert profile.probe_type() == 7, 'incorrect probe type extraction' - - def profileData_example_test(self): - ''' - continue examining data extracted from pp 137 of - http://data.nodc.noaa.gov/woa/WOD/DOC/wodreadme.pdf - ''' - - profile = main.extractProfiles(['data/example.dat'])[0] - current = '' - p, current, f = main.profileData(profile, current, None) - - assert numpy.array_equal(p.z(), [0.0, 10.0, 25.0, 50.0]) - assert numpy.array_equal(p.z_level_qc(), [0,0,0,0]) - assert numpy.array_equal(p.t(), [8.960, 8.950, 0.900, -1.230]) - assert numpy.array_equal(p.t_level_qc(), [0,0,0,0]) - assert numpy.array_equal(p.s(), [30.900, 30.900, 31.910, 32.410]) - assert numpy.array_equal(p.s_level_qc(), [0,0,0,0]) def importQC_test(self): ''' @@ -132,111 +14,6 @@ def importQC_test(self): for test in tests: assert os.path.isfile('qctests/'+test+'.py'), 'test ' + test + ' is not found.' - def catchFlags_example_test(self): - ''' - make sure main.catchFlags is flagging temperatures of 99.9 as missing, - using the artificial data generated in temp.dat above. - ''' - - profile = main.extractProfiles(['temp.dat'])[0] - current = '' - p, current, f = main.profileData(profile, current, None) - - main.catchFlags(p) - - assert p.profile_data[0]['variables'][0]['Missing'], 'failed to flag a temperature of 99.9 as a missing value' - - def referenceResults_example_test(self): - ''' - make sure main.referenceResults is extacting the correct references from data/example.dat - ''' - - profile = main.extractProfiles(['data/example.dat'])[0] - current = '' - p, current, f = main.profileData(profile, current, None) - - ref = main.referenceResults([p]) - - assert ref[0][0] == False, 'incorrect extraction of overall reference result for data/example.dat' - assert numpy.array_equal(ref[1][0], [False, False, False, False] ), 'incorrect extraction of verbose reference results for data/example.dat' - - def generateCSV_test(self): - ''' - make sure things are being packed into dataframes correctly; - assumes Pandas writes dataframes to csv correctly. - ''' - - truth = [True, False, False] - results = [ - [False, False, False], - [True, True, True] - ] - tests = ['x', 'y'] - keys = [1000,1001,1002] - - df = main.generateCSV(truth, results, tests, keys, 'test') - dfTrue = pandas.DataFrame([[True, False, True],[False, False, True],[False, False, True]], index=keys, columns=['True Flags', 'x', 'y']) - - assert_frame_equal(df, dfTrue, check_names=True) - - def parallelization_test(self): - ''' - simple test to check parallelization infrastructure - ''' - - dummy.parallel = main.parallel_function(dummy) - parallel_result = dummy.parallel([1,2]) - - assert numpy.array_equal(parallel_result[0][0], [2,3]) - assert numpy.array_equal(parallel_result[0][1], [4,5]) - assert numpy.array_equal(parallel_result[1][0], [4,6]) - assert numpy.array_equal(parallel_result[1][1], [8,10]) - - def combineArrays_test(self): - ''' - spotcheck combineArrays - ''' - - parallel = [ - [[0,1],[[100,101],[102,103],[104,105]], [992,993]], - [[2,3],[[200,201],[202,203],[204,205]], [994,995]], - [[4,5],[[300,301],[302,303],[304,305]], [996,997]], - [[6,7],[[400,401],[402,403],[404,405]], [998,999]] - ] - - truth, results, ids = main.combineArrays(parallel) - - assert numpy.array_equal(truth, [0,1,2,3,4,5,6,7]) - assert numpy.array_equal(results, [ [100,101, 200,201, 300,301, 400,401], [102,103, 202,203, 302,303, 402,403], [104,105, 204,205, 304,305, 404,405] ]) - assert numpy.array_equal(ids, [992, 993, 994, 995, 996, 997, 998, 999]) - - def sortHeaders_test(self): - ''' - check basic behavior of header sorting - ''' - - p = [] - - p.append(util.testingProfile.fakeProfile([0], [0], date=[2004, 3, 17, 11.3], cruise=1)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2004, 3, 17, 22.6], cruise=1)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2004, 3, 17, 1.1], cruise=1)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2004, 3, 17, 15.9], cruise=1)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2005, 1, 11, 11.5], cruise=2)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2005, 1, 11, 22.2], cruise=2)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2005, 1, 11, 1.0], cruise=2)) - p.append(util.testingProfile.fakeProfile([0], [0], date=[2005, 1, 11, 16.0], cruise=2)) - - sortedProfiles = main.sort_headers(p) - - truth = {1: [p[2], p[0], p[3], p[1]], - 2: [p[6], p[4], p[7], p[5]], - } - - assert sortedProfiles == truth, 'incorrectly sorted profiles' - -def dummy(x): - return [2*x, 3*x], [4*x, 5*x] - diff --git a/tests/wod_tests.py b/tests/wod_tests.py deleted file mode 100644 index 564e29a..0000000 --- a/tests/wod_tests.py +++ /dev/null @@ -1,42 +0,0 @@ -import util.main as main -from wodpy import wod - -class TestClass: - def setUp(self): - filenames = ["data/quota_subset.dat"] - profiles = main.extractProfiles(filenames) - - # identify and import tests - testNames = main.importQC('qctests') - testNames.sort() - for testName in testNames: - exec('from qctests import ' + testName) - - # Set up any keyword arguments needed by tests. - kwargs = {'profiles' : profiles} - - testResults = [] - testVerbose = [] - trueResults = [] - trueVerbose = [] - firstProfile = True - delete = [] - currentFile = '' - self.profiles = [] - for iprofile, pinfo in enumerate(profiles): - # Load the profile data. - if pinfo.file_name != currentFile: - if currentFile != '': f.close() - currentFile = pinfo.file_name - f = open(currentFile) - if f.tell() != pinfo.file_position: f.seek(pinfo.file_position) - self.profiles.append(wod.WodProfile(f)) - - - def tearDown(self): - return - - def test_check_time_type(self): - for p in self.profiles: - time = p.time() - assert type(time) is float or time is None, 'profile time should be either a float or None.' \ No newline at end of file diff --git a/util/main.py b/util/main.py index 16c078d..e004728 100644 --- a/util/main.py +++ b/util/main.py @@ -7,49 +7,6 @@ import testingProfile from numbers import Number -def readInput(JSONlist): - '''Create a list of data file names from a json array.''' - datafiles = json.loads(open(JSONlist).read()) - - # assert that a list of data files is found, and all those files exist: - assert type(datafiles) is list, 'Failed to read a list from the specified file.' - for i in datafiles: - assert os.path.isfile(i), 'datafile ' + i + ' is not found.' - - return datafiles - -def extractProfiles(filenames): - ''' - Read all profiles from the files and store in a list. Only the profile - descriptions are read, not the profile data, in order to avoid using - too much memory. - ''' - profiles = [] - for filename in filenames: - with open(filename) as f: - profiles.append(wod.WodProfile(f, load_profile_data=False)) - while profiles[-1].is_last_profile_in_file(f) == False: - profiles.append(wod.WodProfile(f, load_profile_data=False)) - - # assert all elements of profiles are WodProfiles - for i in profiles: - assert isinstance(i, wod.WodProfile), i + ' is not a WodProfile' - - return profiles - -def profileData(pinfo, currentFile, f): - ''' - takes a profile info stub as returned by extractProfiles and extracts the whole profile - from file f. - ''' - - if pinfo.file_name != currentFile: - if currentFile != '': f.close() - currentFile = pinfo.file_name - f = open(currentFile) - if f.tell() != pinfo.file_position: f.seek(pinfo.file_position) - return wod.WodProfile(f), currentFile, f - def importQC(dir): ''' return a list of names of tests found in : @@ -73,58 +30,6 @@ def catchFlags(profile): if profile.profile_data[i]['variables'][index]['Value'] == 99.9: profile.profile_data[i]['variables'][index]['Missing'] = True -def referenceResults(profiles): - ''' - extract the summary reference result for each profile: DEPRECATED - ''' - refResult = [] - verbose = [] - for profile in profiles: - refAssessment = profile.t_level_qc(originator=True) >= 3 - - #demand reference results returned bools, or masked constants for missing values: - for i in refAssessment: - assert isinstance(i, np.bool_) or isinstance(i, np.ma.core.MaskedConstant), str(i) + ' in reference result list is of type ' + str(type(i)) - - refResult.append(np.ma.any(refAssessment)) - verbose.append(refAssessment) - return [refResult, verbose] - - -def generateCSV(truth, results, tests, primaryKeys, name): - ''' - log resuls as a CSV, columns for tests, rows for profiles. - ''' - - d = {} - for i, testName in enumerate(tests): - d[testName] = results[i] - - df = pandas.DataFrame(d, index=primaryKeys) - - df.insert(0, 'True Flags', truth) - - df.to_csv('results-' + name + '.csv') - - return df # for testing - -def parallel_function(f, nfold=2): - ''' - thanks http://scottsievert.github.io/blog/2014/07/30/simple-python-parallelism/ DEPRECATED - ''' - def easy_parallize(f, sequence): - """ assumes f takes sequence as input, easy w/ Python's scope """ - from multiprocessing import Pool - pool = Pool(processes=int(nfold)) # depends on available cores - result = pool.map(f, sequence) # for i in sequence: result[i] = f(i) - cleaned = [x for x in result if not x is None] # getting results - cleaned = np.asarray(cleaned) - pool.close() # not optimal! but easy - pool.join() - return cleaned - from functools import partial - return partial(easy_parallize, f) - def checkQCTestRequirements(checks): '''Reads set of requirements from qctest_requirements.json and checks each QC test to see if their requirements are met. @@ -219,121 +124,3 @@ def calcRates(testResults, trueResults): tnr = nPP * 100.0 / nTruePasses return tpr, fpr, fnr, tnr - -def printSummary(truth, results, testNames): - - nProfiles = len(truth) - print('Number of profiles tested was %i\n' % nProfiles) - print('%35s %7s %7s %7s %7s %7s' % ('NAME OF TEST', 'FAILS', 'TPR', 'FPR', 'TNR', 'FNR')) - overallResults = np.zeros(nProfiles, dtype=bool) - for i in range (0, len(testNames)): - overallResults = np.logical_or(overallResults, results[i]) - tpr, fpr, fnr, tnr = calcRates(results[i], truth) - print('%35s %7i %6.1f%1s %6.1f%1s %6.1f%1s %6.1f%1s' % (testNames[i], np.sum(results[i]), tpr, '%', fpr, '%', tnr, '%', fnr, '%')) - tpr, fpr, fnr, tnr = calcRates(overallResults, truth) - print('%35s %7i %6.1f%1s %6.1f%1s %6.1f%1s %6.1f%1s' % ('RESULT OF OR OF ALL:', np.sum(overallResults), tpr, '%', fpr, '%', tnr, '%', fnr, '%')) - - -def combineArrays(parallelResults): - ''' - given the results of processFile() run in parallel on several datasets, - recombine the results into a single set of lists for output to CSV. - ''' - - truth = parallelResults[0][0] - results = parallelResults[0][1] - profileIDs = parallelResults[0][2] - for pr in parallelResults[1:]: - truth += pr[0] - for itr, tr in enumerate(pr[1]): - results[itr] += tr - profileIDs += pr[2] - - return truth, results, profileIDs - -def sort_headers(headers): - ''' - takes a list of headers, and sorts them into a dictionary keyed by cruise number - containing a list of corresponding headers; - header lists are then time sorted. DEPRECATED - ''' - - sortedHeaders = {} - - for header in headers: - if header.cruise() not in sortedHeaders.keys(): - sortedHeaders[header.cruise()] = [header] - else: - sortedHeaders[header.cruise()].append(header) - - for key in sortedHeaders.keys(): - sortedHeaders[key] = sorted(sortedHeaders[key], key=lambda header: (header.year(), header.month(), header.day(), header.time()) ) - - return sortedHeaders - -def mock_wodpy(row): - ''' - given a single row from a postgres cursor, return an object that mocks - a wodpy object with the same values - ''' - - return testingProfile.fakeProfile(row[10], row[9], latitude=row[0], longitude=row[1], date=[row[4], row[5], row[6], row[7]], probe_type=row[8], salinities=row[11], pressures=None, uid=row[2], cruise=row[3], qcflag=row[12]) - -def row2dict(row): - ''' - given a single row from a postgres cursor, return a dictionary containing the row's info, keyed as a wodpy object - ''' - - profile = { - 'latitude': row[0], - 'longitude': row[1], - 'uid': row[2], - 'cruise': row[3], - 'year': row[4], - 'month': row[5], - 'day': row[6], - 'time': row[7], - 'probe_type': row[8], - 'z': row[9], - 't': row[10], - 's': row[11], - 'qcflag': row[12], - 'n_levels': row[13] - } - - return profile - -def dataPresent(keys, level, profile): - ''' - keys: tuple of key names found in the return object of row2dict - level: index number of level in question - profile: return object from row2dict - returns true if all the listed keys have a sensible value in the provided profile at the indicated level; - false otherwise. - ''' - - present = True - - for key in keys: - if key in ['latitude', 'longitude', 'time']: - # must be float - present = present and isinstance(profile[key], Number) - - elif key in ['uid', 'cruise', 'year', 'month', 'day', 'probe_type', 'n_levels']: - # muse be int - present = present and isinstance(profile[key], (int, long)) - - elif key in ['z', 't', 's']: - # must be float at given level - if level >= len(profile[key]): - return False - present = present and isinstance(profile[key][level], Number) - if key == 't': - # t = 99.9 indicates missing value - present = present and profile[key][level] != 99.9 - - elif key in ['qcflag']: - # must be bool - present = present and isinstance(profile[key], bool) - - return present From 59d60b363fd5483509a9ecaf82801ef14fb3eef5 Mon Sep 17 00:00:00 2001 From: s-good Date: Mon, 1 Aug 2016 22:16:59 +0100 Subject: [PATCH 50/79] Added functionality to use sqlite database plus tidied up setting table name, added usage instructions. --- AutoQC.py | 26 ++++++--- build-db.py | 124 ++++++++++++++++++++++++------------------- summarize-results.py | 60 +++++++++++++-------- 3 files changed, 125 insertions(+), 85 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 4cacb39..e2d00f3 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -3,7 +3,16 @@ import numpy as np import sys, os, data.ds import util.main as main -import pandas, psycopg2 +import pandas +try: + import psycopg2 as db + dbtype = 'postgres' + concom = "dbname='root' user='root'" +except: + import sqlite3 as db + concom = 'qcresults.sqlite' + dbtype = 'sqlite' +print('Database type is ' + dbtype) from multiprocessing import Pool import tempfile @@ -48,7 +57,7 @@ def process_row(uid): '''run all tests on the ith database row''' # extract profile - cur.execute('SELECT * FROM validate WHERE uid = ' + str(uid) ) + cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) row = cur.fetchall() fProfile = tempfile.TemporaryFile() fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row @@ -68,13 +77,16 @@ def process_row(uid): for itest, test in enumerate(testNames): result = run(test, [profile]) - query = "UPDATE validate SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" + query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(int(result[0][0])) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) + if dbtype == 'sqlite': + # Seem to need to do this after every update for sqlite database. + conn.commit() # connect to database & fetch list of all uids - conn = psycopg2.connect("dbname='root' user='root'") + conn = db.connect(concom) cur = conn.cursor() - cur.execute('SELECT uid FROM validate') + cur.execute('SELECT uid FROM ' + sys.argv[1]) uids = cur.fetchall() # launch async processes @@ -88,5 +100,5 @@ def process_row(uid): else: print 'Please add command line arguments to name your output file and set parallelization:' - print 'python AutoQC myFile 4' - print 'will result in output written to results-myFile.csv, and will run the calculation parallelized across 4 cores.' + print 'python AutoQC databasetable 4' + print 'will result in output written to table in the database, and will run the calculation parallelized across 4 cores.' diff --git a/build-db.py b/build-db.py index 8e9ad5c..3aec5bd 100644 --- a/build-db.py +++ b/build-db.py @@ -1,69 +1,83 @@ # usage: python build-db.py
-import psycopg2 +try: + import psycopg2 as db + dbtype = 'postgres' + concom = "dbname='root' user='root'" +except: + import sqlite3 as db + concom = 'qcresults.sqlite' + dbtype = 'sqlite' +print('Database type is ' + dbtype) from wodpy import wod import sys import util.main as main -# connect to database and create a cursor by which to interact with it. -try: - conn = psycopg2.connect("dbname='root' user='root'") -except: - print "I am unable to connect to the database" +if len(sys.argv) == 3: -cur = conn.cursor() + # connect to database and create a cursor by which to interact with it. + try: + conn = db.connect(concom) + except: + print "I am unable to connect to the database" -# Identify tests -testNames = main.importQC('qctests') -testNames.sort() + cur = conn.cursor() -# set up our table -query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( - raw text, - truth boolean, - uid integer, - lat real, - long real, - cruise integer, - """ -for i in range(len(testNames)): - query += testNames[i].lower() + ' boolean' - if i= 3) >= 1 + # populate table from wod-ascii data + fid = open(sys.argv[1]) + #while True: + for i in range(10): + # extract profile as wodpy object and raw text + start = fid.tell() + profile = wod.WodProfile(fid) + end = fid.tell() + fid.seek(start) + raw = fid.read(end-start) + fid.seek(end) + + # set up dictionary for populating query string + wodDict = profile.npdict() + wodDict['raw'] = "'" + raw + "'" + wodDict['truth'] = int(sum(profile.t_level_qc(originator=True) >= 3) >= 1) - query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, lat, long, cruise) " + """ VALUES( - {p[raw]}, - {p[truth]}, - {p[uid]}, - {p[latitude]}, - {p[longitude]}, - {p[cruise]} - )""".format(p=wodDict) - query = query.replace('--', 'NULL') - query = query.replace('None', 'NULL') - cur.execute(query) - if profile.is_last_profile_in_file(fid) == True: - break + query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, lat, long, cruise) " + """ VALUES( + {p[raw]}, + {p[truth]}, + {p[uid]}, + {p[latitude]}, + {p[longitude]}, + {p[cruise]} + )""".format(p=wodDict) + query = query.replace('--', 'NULL') + query = query.replace('None', 'NULL') + cur.execute(query) + if profile.is_last_profile_in_file(fid) == True: + break + + conn.commit() + +else: -conn.commit() + print('Usage: python build-db.py inputdatafile databasetable') diff --git a/summarize-results.py b/summarize-results.py index 9b5eea9..597f899 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -1,31 +1,45 @@ import util.main as main -import psycopg2, pandas +import pandas +import sys +try: + import psycopg2 as db + dbtype = 'postgres' + concom = "dbname='root' user='root'" +except: + import sqlite3 as db + concom = 'qcresults.sqlite' + dbtype = 'sqlite' +print('Database type is ' + dbtype) -# what tests are available -testNames = main.importQC('qctests') -testNames.sort() -testNames.remove('EN_std_lev_bkg_and_buddy_check') -testNames.remove('EN_track_check') +if len(sys.argv) == 2: + # what tests are available + testNames = main.importQC('qctests') + testNames.sort() + testNames.remove('EN_std_lev_bkg_and_buddy_check') + testNames.remove('EN_track_check') -# connect to database -conn = psycopg2.connect("dbname='root' user='root'") -cur = conn.cursor() + # connect to database + conn = db.connect(concom) + cur = conn.cursor() -# extract matrix of test results and true flags into a dataframe -query = 'SELECT truth' -for test in testNames: - query += ', ' + test.lower() -query += ' FROM validate' + # extract matrix of test results and true flags into a dataframe + query = 'SELECT truth' + for test in testNames: + query += ', ' + test.lower() + query += ' FROM ' + sys.argv[1] -cur.execute(query) -rawresults = cur.fetchall() + cur.execute(query) + rawresults = cur.fetchall() + df = pandas.DataFrame(rawresults).astype('bool') + df.columns = ['Truth'] + testNames -df = pandas.DataFrame(rawresults) -df.columns = ['Truth'] + testNames + # summarize results + print('%35s %7s %7s %7s %7s %7s' % ('NAME OF TEST', 'FAILS', 'TPR', 'FPR', 'TNR', 'FNR')) + for test in testNames: + tpr, fpr, fnr, tnr = main.calcRates(df[test].tolist(), df['Truth'].tolist()) + print('%35s %7i %6.1f%1s %6.1f%1s %6.1f%1s %6.1f%1s' % (test, sum(df[test].tolist()), tpr, '%', fpr, '%', tnr, '%', fnr, '%')) -# summarize results -print('%35s %7s %7s %7s %7s %7s' % ('NAME OF TEST', 'FAILS', 'TPR', 'FPR', 'TNR', 'FNR')) -for test in testNames: - tpr, fpr, fnr, tnr = main.calcRates(df[test].tolist(), df['Truth'].tolist()) - print('%35s %7i %6.1f%1s %6.1f%1s %6.1f%1s %6.1f%1s' % (test, sum(df[test].tolist()), tpr, '%', fpr, '%', tnr, '%', fnr, '%')) +else: + + print('Usage: python summarize-results.py databasetable') From e2f883ebb425adc6bb3ad7869ffcdc82e67194b5 Mon Sep 17 00:00:00 2001 From: s-good Date: Tue, 2 Aug 2016 00:10:00 +0100 Subject: [PATCH 51/79] Version with EN std level check and tests working with the database. --- AutoQC.py | 11 +---- build-db.py | 13 +++--- qctests/EN_std_lev_bkg_and_buddy_check.py | 43 ++++++++++++++----- summarize-results.py | 2 - ...N_std_level_background_check_validation.py | 42 ++++++++++++------ util/main.py | 15 +++++++ 6 files changed, 85 insertions(+), 41 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index e2d00f3..88e1241 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -12,7 +12,6 @@ import sqlite3 as db concom = 'qcresults.sqlite' dbtype = 'sqlite' -print('Database type is ' + dbtype) from multiprocessing import Pool import tempfile @@ -42,7 +41,6 @@ def run(test, profiles): # Identify and import tests testNames = main.importQC('qctests') testNames.sort() - testNames.remove('EN_std_lev_bkg_and_buddy_check') testNames.remove('EN_track_check') print('{} quality control checks have been found'.format(len(testNames))) testNames = main.checkQCTestRequirements(testNames) @@ -57,13 +55,7 @@ def process_row(uid): '''run all tests on the ith database row''' # extract profile - cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) - row = cur.fetchall() - fProfile = tempfile.TemporaryFile() - fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row - fProfile.seek(0) - profile = wod.WodProfile(fProfile) - fProfile.close() + profile = main.get_profile_from_db(cur, uid) # Check that there are temperature data in the profile, otherwise skip. if profile.var_index() is None: @@ -73,7 +65,6 @@ def process_row(uid): return # run tests - results = [row[0][1]] for itest, test in enumerate(testNames): result = run(test, [profile]) diff --git a/build-db.py b/build-db.py index 3aec5bd..050759e 100644 --- a/build-db.py +++ b/build-db.py @@ -30,14 +30,16 @@ # set up our table query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( raw text, - truth boolean, + truth integer, uid integer, + year integer, + month integer, lat real, long real, cruise integer, """ for i in range(len(testNames)): - query += testNames[i].lower() + ' boolean' + query += testNames[i].lower() + ' integer' if i= 3) >= 1) - query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, lat, long, cruise) " + """ VALUES( + query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, year, month, lat, long, cruise) " + """ VALUES( {p[raw]}, {p[truth]}, {p[uid]}, + {p[year]}, + {p[month]}, {p[latitude]}, {p[longitude]}, {p[cruise]} diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py index 44bdff2..c728c2d 100644 --- a/qctests/EN_std_lev_bkg_and_buddy_check.py +++ b/qctests/EN_std_lev_bkg_and_buddy_check.py @@ -15,6 +15,15 @@ import util.main as main import data.ds import numpy as np +try: + import psycopg2 as db + dbtype = 'postgres' + concom = "dbname='root' user='root'" +except: + import sqlite3 as db + concom = 'qcresults.sqlite' + dbtype = 'sqlite' +import sys def test(p, allow_level_reinstating=True): """ @@ -47,7 +56,7 @@ def test(p, allow_level_reinstating=True): pgeData = determine_pge(levels, bgev, obev, p) # Find buddy. - profiles = data.ds.profiles + profiles = get_profile_info() minDist = 1000000000.0 iMinDist = None for iProfile, profile in enumerate(profiles): @@ -58,9 +67,7 @@ def test(p, allow_level_reinstating=True): # Check if we have found a buddy and process if so. if minDist <= 400000: - fid = None - pBuddy, currentFile, fid = main.profileData(profiles[iMinDist], '', fid) - fid.close() + pBuddy = main.get_profile_from_db(cur, profiles[iMinDist][0]) # buddy vetos Fail = False @@ -315,14 +322,14 @@ def assessBuddyDistance(p, buddy): # that the profiles were within a time threshold. The # cruise is compared as two profiles from the same instrument # should not be compared. - if (buddy.uid() == p.uid() or - buddy.year() != p.year() or - buddy.month() != p.month() or - buddy.cruise() == p.cruise()): return None + if (buddy[0] == p.uid() or + buddy[1] != p.year() or + buddy[2] != p.month() or + buddy[3] == p.cruise()): return None lat = p.latitude() lon = p.longitude() - latComp = buddy.latitude() - lonComp = buddy.longitude() + latComp = buddy[4] + lonComp = buddy[5] # Do a rough check of distance. latDiff = np.abs(latComp - lat) if latDiff > 5: return None @@ -366,4 +373,18 @@ def timeDiff(p1, p2): return np.abs(diff.total_seconds()) - +def get_profile_info(): + # Gets information about the profiles from the database. + # This is only done once and the results saved in the global variable. + # NB this could be done on module load but this would make it difficult + # to implement code tests. + global profiles_info_list, cur + if len(profiles_info_list) == 0: + conn = db.connect(concom) + cur = conn.cursor() + cur.execute('SELECT uid,year,month,cruise,lat,long FROM ' + sys.argv[1]) + profiles_info_list = cur.fetchall() + return profiles_info_list + +profiles_info_list = [] +cur = None diff --git a/summarize-results.py b/summarize-results.py index 597f899..9d63ab5 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -9,14 +9,12 @@ import sqlite3 as db concom = 'qcresults.sqlite' dbtype = 'sqlite' -print('Database type is ' + dbtype) if len(sys.argv) == 2: # what tests are available testNames = main.importQC('qctests') testNames.sort() - testNames.remove('EN_std_lev_bkg_and_buddy_check') testNames.remove('EN_track_check') # connect to database diff --git a/tests/EN_std_level_background_check_validation.py b/tests/EN_std_level_background_check_validation.py index 4918cc9..ffcba14 100644 --- a/tests/EN_std_level_background_check_validation.py +++ b/tests/EN_std_level_background_check_validation.py @@ -10,21 +10,33 @@ # work on a testing profile. def dummycatchflagsfunc(arg): pass -def dummyprofiledatafunc(p, dummy1, dummy2): - fid = open('data/quota_subset.dat') # Need an open file handle for program to close. - return p, '', fid realcatchflagsfunc = main.catchFlags -realprofiledatafunc = main.profileData +realgetproffunc = main.get_profile_from_db + +# Set up the profile information for the check to work using the information put into the data.ds module. +def profile_to_info_list(p): + return (p.uid(),p.year(),p.month(),p.cruise(),p.latitude(),p.longitude()) + +def get_profiles_info_list(): + ps = [] + for p in data.ds.profiles: + ps.append(profile_to_info_list(p)) + return ps + +def dummy_get_profile_from_db(cur, uid): + for profile in data.ds.profiles: + if profile.uid() == uid: + return profile ##### EN_std_lev_bkg_and_buddy_check --------------------------------------------------- def setUp(): main.catchFlags = dummycatchflagsfunc - main.profileData = dummyprofiledatafunc + main.get_profile_from_db = dummy_get_profile_from_db def tearDown(): main.catchFlags = realcatchflagsfunc - main.profileData = realprofiledatafunc + main.get_profile_from_db = realgetproffunc def test_EN_std_level_bkg_and_buddy_check_temperature(): ''' @@ -33,6 +45,7 @@ def test_EN_std_level_bkg_and_buddy_check_temperature(): p = util.testingProfile.fakeProfile([1.8, 1.8, 1.8, 7.1], [0.0, 2.5, 5.0, 7.5], latitude=55.6, longitude=12.9, date=[1900, 01, 15, 0], probe_type=7) data.ds.profiles = [p] + qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() qc = qctests.EN_std_lev_bkg_and_buddy_check.test(p) expected = [False, False, False, False] print qc @@ -134,23 +147,23 @@ def test_assessBuddyDistance_invalid_buddies(): p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 13], uid=0, cruise=2) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) is None, 'accepted buddies with same uid' + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) is None, 'accepted buddies with same uid' p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) - p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], date=[1901, 1, 1, 13], uid=1, cruise=2) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) is None, 'accepted buddies with different year' + p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1901, 1, 1, 13], uid=1, cruise=2) + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) is None, 'accepted buddies with different year' p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 2, 1, 13], uid=1, cruise=2) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) is None, 'accepted buddies with different month' + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) is None, 'accepted buddies with different month' p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 13], uid=1, cruise=1) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) is None, 'accepted buddies with same cruise' + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) is None, 'accepted buddies with same cruise' p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 5.01, 0, date=[1900, 1, 1, 13], uid=1, cruise=2) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) is None, 'accepted buddies too far apart in latitude' + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) is None, 'accepted buddies too far apart in latitude' def test_assessBuddyDistance_haversine(): ''' @@ -159,7 +172,7 @@ def test_assessBuddyDistance_haversine(): p1 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 0, 0, date=[1900, 1, 1, 12], uid=0, cruise=1) p2 = util.testingProfile.fakeProfile([0,0,0],[0,0,0], 1, 1, date=[1900, 1, 1, 13], uid=1, cruise=2) - assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, p2) == haversine(0,0,1,1), 'haversine calculation inconsistent with cotede.qctests.possible_speed.haversine' + assert qctests.EN_std_lev_bkg_and_buddy_check.assessBuddyDistance(p1, profile_to_info_list(p2)) == haversine(0,0,1,1), 'haversine calculation inconsistent with cotede.qctests.possible_speed.haversine' def test_timeDiff(): @@ -189,6 +202,7 @@ def test_EN_std_level_bkg_and_buddy_real_profiles_1(): ''' data.ds.profiles = [realProfile1] + qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile1) assert numpy.array_equal(qc, truthQC1), 'mismatch between qc results and expected values' @@ -199,6 +213,7 @@ def test_EN_std_level_bkg_and_buddy_real_profiles_2(): ''' data.ds.profiles = [realProfile2, realProfile3] + qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile2, allow_level_reinstating=False) assert numpy.array_equal(qc, truthQC2), 'mismatch between qc results and expected values' @@ -209,6 +224,7 @@ def test_EN_std_level_bkg_and_buddy_real_profiles_3(): ''' data.ds.profiles = [realProfile2, realProfile3] + qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile2) assert numpy.all(qc == False), 'mismatch between qc results and expected values' diff --git a/util/main.py b/util/main.py index e004728..f48990f 100644 --- a/util/main.py +++ b/util/main.py @@ -6,6 +6,9 @@ from netCDF4 import Dataset import testingProfile from numbers import Number +import sys +import tempfile +from wodpy import wod def importQC(dir): ''' @@ -124,3 +127,15 @@ def calcRates(testResults, trueResults): tnr = nPP * 100.0 / nTruePasses return tpr, fpr, fnr, tnr + +def get_profile_from_db(cur, uid): + # Given the database cursor and a unique id, return a WodPy profile object. + cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) + row = cur.fetchall() + fProfile = tempfile.TemporaryFile() + fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row + fProfile.seek(0) + profile = wod.WodProfile(fProfile) + fProfile.close() + return profile + From 8161d7e3d0a2d92181478457ec0aa2759e5046a0 Mon Sep 17 00:00:00 2001 From: s-good Date: Tue, 2 Aug 2016 22:06:45 +0100 Subject: [PATCH 52/79] Catch problem with missing data when creating the database. --- build-db.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/build-db.py b/build-db.py index 050759e..d5d7eeb 100644 --- a/build-db.py +++ b/build-db.py @@ -61,8 +61,15 @@ # set up dictionary for populating query string wodDict = profile.npdict() wodDict['raw'] = "'" + raw + "'" - wodDict['truth'] = int(sum(profile.t_level_qc(originator=True) >= 3) >= 1) - + # Below avoids failures if all profile data are missing. + # We have no use for this profile in that case so skip it. + try: + wodDict['truth'] = int(sum(profile.t_level_qc(originator=True) >= 3) >= 1) + except: + if profile.is_last_profile_in_file(fid) == True: + break + continue + query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, year, month, lat, long, cruise) " + """ VALUES( {p[raw]}, {p[truth]}, From 374b94d0e03d9fb72da18e09fc0eb1c27e73cc23 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Tue, 2 Aug 2016 22:40:49 +0000 Subject: [PATCH 53/79] consolidating standard level updates --- AutoQC.py | 14 ++------------ build-db.py | 17 ++++------------- qctests/EN_std_lev_bkg_and_buddy_check.py | 13 ++----------- summarize-results.py | 12 ++---------- util/main.py | 19 +++++++++---------- 5 files changed, 19 insertions(+), 56 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 88e1241..94cbcc4 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -4,14 +4,7 @@ import sys, os, data.ds import util.main as main import pandas -try: - import psycopg2 as db - dbtype = 'postgres' - concom = "dbname='root' user='root'" -except: - import sqlite3 as db - concom = 'qcresults.sqlite' - dbtype = 'sqlite' +import psycopg2 from multiprocessing import Pool import tempfile @@ -70,12 +63,9 @@ def process_row(uid): result = run(test, [profile]) query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(int(result[0][0])) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) - if dbtype == 'sqlite': - # Seem to need to do this after every update for sqlite database. - conn.commit() # connect to database & fetch list of all uids - conn = db.connect(concom) + conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() cur.execute('SELECT uid FROM ' + sys.argv[1]) uids = cur.fetchall() diff --git a/build-db.py b/build-db.py index d5d7eeb..fcceaec 100644 --- a/build-db.py +++ b/build-db.py @@ -1,23 +1,14 @@ # usage: python build-db.py
-try: - import psycopg2 as db - dbtype = 'postgres' - concom = "dbname='root' user='root'" -except: - import sqlite3 as db - concom = 'qcresults.sqlite' - dbtype = 'sqlite' -print('Database type is ' + dbtype) from wodpy import wod -import sys +import sys, psycopg2 import util.main as main if len(sys.argv) == 3: # connect to database and create a cursor by which to interact with it. try: - conn = db.connect(concom) + conn = psycopg2.connect("dbname='root' user='root'") except: print "I am unable to connect to the database" @@ -49,7 +40,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) - while True: + for xx in range(10): # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) @@ -90,4 +81,4 @@ else: - print('Usage: python build-db.py inputdatafile databasetable') + print 'Usage: python build-db.py inputdatafile databasetable' diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py index c728c2d..84c7fca 100644 --- a/qctests/EN_std_lev_bkg_and_buddy_check.py +++ b/qctests/EN_std_lev_bkg_and_buddy_check.py @@ -5,7 +5,7 @@ """ from cotede.qctests.possible_speed import haversine -import datetime +import datetime, psycopg2 import EN_background_check import EN_constant_value_check import EN_increasing_depth_check @@ -13,16 +13,7 @@ import EN_spike_and_step_check import EN_stability_check import util.main as main -import data.ds import numpy as np -try: - import psycopg2 as db - dbtype = 'postgres' - concom = "dbname='root' user='root'" -except: - import sqlite3 as db - concom = 'qcresults.sqlite' - dbtype = 'sqlite' import sys def test(p, allow_level_reinstating=True): @@ -380,7 +371,7 @@ def get_profile_info(): # to implement code tests. global profiles_info_list, cur if len(profiles_info_list) == 0: - conn = db.connect(concom) + conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() cur.execute('SELECT uid,year,month,cruise,lat,long FROM ' + sys.argv[1]) profiles_info_list = cur.fetchall() diff --git a/summarize-results.py b/summarize-results.py index 9d63ab5..ae726ab 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -1,14 +1,6 @@ import util.main as main import pandas -import sys -try: - import psycopg2 as db - dbtype = 'postgres' - concom = "dbname='root' user='root'" -except: - import sqlite3 as db - concom = 'qcresults.sqlite' - dbtype = 'sqlite' +import sys, psycopg2 if len(sys.argv) == 2: @@ -18,7 +10,7 @@ testNames.remove('EN_track_check') # connect to database - conn = db.connect(concom) + conn = psycopg2.connect("dbname='root' user='root'") cur = conn.cursor() # extract matrix of test results and true flags into a dataframe diff --git a/util/main.py b/util/main.py index f48990f..5102f4c 100644 --- a/util/main.py +++ b/util/main.py @@ -8,7 +8,6 @@ from numbers import Number import sys import tempfile -from wodpy import wod def importQC(dir): ''' @@ -129,13 +128,13 @@ def calcRates(testResults, trueResults): return tpr, fpr, fnr, tnr def get_profile_from_db(cur, uid): - # Given the database cursor and a unique id, return a WodPy profile object. - cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) - row = cur.fetchall() - fProfile = tempfile.TemporaryFile() - fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row - fProfile.seek(0) - profile = wod.WodProfile(fProfile) - fProfile.close() - return profile + # Given the database cursor and a unique id, return a WodPy profile object. + cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) + row = cur.fetchall() + fProfile = tempfile.TemporaryFile() + fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row + fProfile.seek(0) + profile = wod.WodProfile(fProfile) + fProfile.close() + return profile From 25264ce0206e005f9d4c5df71e558339f194d504 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Wed, 3 Aug 2016 03:18:21 +0000 Subject: [PATCH 54/79] nominal port of track check to database backend --- AutoQC.py | 8 +- build-db.py | 12 +- qctests/EN_track_check.py | 264 +++++++++++++++++--------------------- summarize-results.py | 1 - util/geo.py | 2 +- util/main.py | 31 ++++- 6 files changed, 161 insertions(+), 157 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 94cbcc4..22830f5 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -34,7 +34,6 @@ def run(test, profiles): # Identify and import tests testNames = main.importQC('qctests') testNames.sort() - testNames.remove('EN_track_check') print('{} quality control checks have been found'.format(len(testNames))) testNames = main.checkQCTestRequirements(testNames) print('{} quality control checks are able to be run:'.format(len(testNames))) @@ -45,8 +44,8 @@ def run(test, profiles): print('\nPlease wait while QC is performed\n') def process_row(uid): - '''run all tests on the ith database row''' - + '''run all tests on the indicated database row''' + # extract profile profile = main.get_profile_from_db(cur, uid) @@ -59,9 +58,8 @@ def process_row(uid): # run tests for itest, test in enumerate(testNames): - result = run(test, [profile]) - query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(int(result[0][0])) + " WHERE uid = " + str(profile.uid()) + ";" + query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) # connect to database & fetch list of all uids diff --git a/build-db.py b/build-db.py index fcceaec..814d711 100644 --- a/build-db.py +++ b/build-db.py @@ -21,16 +21,18 @@ # set up our table query = "CREATE TABLE IF NOT EXISTS " + sys.argv[2] + """( raw text, - truth integer, + truth boolean, uid integer, year integer, month integer, + day integer, + time real, lat real, long real, cruise integer, """ for i in range(len(testNames)): - query += testNames[i].lower() + ' integer' + query += testNames[i].lower() + ' boolean' if i= 3) >= 1) + wodDict['truth'] = sum(profile.t_level_qc(originator=True) >= 3) >= 1 except: if profile.is_last_profile_in_file(fid) == True: break continue - query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, year, month, lat, long, cruise) " + """ VALUES( + query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, year, month, day, time, lat, long, cruise) " + """ VALUES( {p[raw]}, {p[truth]}, {p[uid]}, {p[year]}, {p[month]}, + {p[day]}, + {p[time]}, {p[latitude]}, {p[longitude]}, {p[cruise]} diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index 52342ee..827b03c 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -4,124 +4,117 @@ """ import numpy as np -import data.ds as ds import util.main as main import util.geo as geo -import copy -import datetime -import math +import copy, datetime, math, psycopg2 +import sys # module constants DistRes = 20000. # meters TimeRes = 600. # seconds -EN_track_headers = {} -EN_track_results = {} -threadFile = {} - def test(p): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has passed the check and True where it failed. """ - - global EN_track_headers - global EN_track_results - global threadFile - + + conn = psycopg2.connect("dbname='root' user='root'") + cur = conn.cursor() + cruise = p.cruise() uid = p.uid() - + # don't bother if cruise == 0 or None if cruise in [0, None]: - return np.zeros(1, dtype=bool); - - # The headers from an entire cruise must be analyzed all at once; - # we'll write the results to the global data store, in a dictionary - # with ntuple keys (cruise, uid), and values as single element - # numpy arrays, containing either a true or a false (per all the other - # qc return objects) - - # check if this profile has been examined already - if (cruise, uid) in EN_track_results.keys(): - return EN_track_results[(cruise, uid)] + return np.zeros(1, dtype=bool) + + # don't bother if this has already been analyzed + cur.execute('SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';') + en_track_result = cur.fetchall() + if en_track_result[0][0] is not None: + result = np.zeros(1, dtype=bool) + result[0] = en_track_result[0][0] + return result # some detector types cannot be assessed by this test; do not raise flag. if p.probe_type in [None]: return np.zeros(1, dtype=bool) - - # the first time this test is run, sort ds.threadProfiles into a cruise-keyed dictionary: - if ds.threadFile != threadFile: - EN_track_headers = main.sort_headers(ds.threadProfiles) - threadFile = ds.threadFile - - # since we didn't find an answer already calculated, - # we still need to do the calculation for this cruise; - # all the relevant headers are sitting in the EN_track_headers list. - headers = EN_track_headers[cruise] - + + # fetch all profiles on track, sorted chronologically, earliest first (None sorted as highest) + cur.execute('SELECT raw, cruise, uid, year, month, day, time, lat, long FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + 'ORDER BY year, month, day, time ASC;') + track_rows = cur.fetchall() + track_rows = main.dictify(track_rows, ('raw', 'cruise', 'uid', 'year', 'month', 'day', 'time', 'lat', 'long')) + # start all as passing by default: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())] = np.zeros(1, dtype=bool) - + EN_track_results = {} + for i in range(len(track_rows)): + EN_track_results[track_rows[i]['uid']] = np.zeros(1, dtype=bool) + # copy the list of headers; # remove entries as they are flagged. - passedHeaders = copy.deepcopy(headers) - rejects = findOutlier(passedHeaders) + passed_rows = copy.deepcopy(track_rows) + rejects = findOutlier(passed_rows, EN_track_results) + while rejects != []: - passedIndex = [x for x in range(len(passedHeaders)) if x not in rejects ] - passedHeaders = [passedHeaders[index] for index in passedIndex ] - rejects = findOutlier(passedHeaders) - + passed_index = [x for x in range(len(passed_rows)) if x not in rejects ] + passed_rows = [passed_rows[index] for index in passed_index ] + rejects = findOutlier(passed_rows, EN_track_results) + # if more than half got rejected, reject everyone - if len(passedHeaders) < len(headers) / 2: - for i in range(len(headers)): - EN_track_results[(headers[i].cruise(), headers[i].uid())][0] = True + if len(passed_rows) < len(track_rows) / 2: + for i in range(len(track_rows)): + EN_track_results[track_rows[i]['uid']][0] = True + + # write all to db + for i in range(len(track_rows)): + query = "UPDATE " + sys.argv[1] + " SET en_track_check " + " = " + str(EN_track_results[track_rows[i]['uid']][0]) + " WHERE uid = " + str(track_rows[i]['uid']) + ";" + cur.execute(query) + conn.commit() - return EN_track_results[(cruise, uid)] + return EN_track_results[uid] -def findOutlier(headers): +def findOutlier(rows, results): ''' - given a list of , find the fastest one; + given a list of dictified db rows, find the fastest one; if it's too fast, reject it or the one before it, return a list of rejected indices; once the fastest is within limits, return []. ''' - + maxShipSpeed = 15. # m/s maxBuoySpeed = 2. # m/s - if headers == []: + if rows == []: return [] # determine speeds and angles for list of headers - speeds, angles = calculateTraj(headers) + speeds, angles = calculateTraj(rows) # decide if something needs to be flagged maxSpeed = maxShipSpeed - if isBuoy(headers[0]): + if isBuoy(rows[0]): maxSpeed = maxBuoySpeed iMax = speeds.index(max(speeds)) flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) - + # decide which profile to reject, flag it, and return a list of indices rejected at this step. if flag: - rejects = chooseReject(headers, speeds, angles, iMax, maxSpeed) - + rejects = chooseReject(rows, speeds, angles, iMax, maxSpeed) for reject in rejects: - EN_track_results[(headers[reject].cruise(), headers[reject].uid())][0] = True + results[rows[reject]['uid']][0] = True return rejects else: return [] -def chooseReject(headers, speeds, angles, index, maxSpeed): +def chooseReject(rows, speeds, angles, index, maxSpeed): ''' - decide which profile to reject, headers[index] or headers[index-1], or both, + decide which profile to reject, rows[index] or rows[index-1], or both, and return a list of indices to reject. ''' # chain of tests breaks when a reject is found: - reject = condition_a(headers, speeds, angles, index, maxSpeed)[0] + reject = condition_a(rows, speeds, angles, index, maxSpeed)[0] # condition i needs to run at the end of the chain in all cases: # if no decision, reject both: @@ -129,10 +122,10 @@ def chooseReject(headers, speeds, angles, index, maxSpeed): reject = [index-1, index] # if excessive speed is created by removing the flag, reject both instead # can't create new excessive speed by removing last profile. - elif reject < len(headers)-1: - newHeaders = copy.deepcopy(headers) - del newHeaders[reject] - newSpeeds, newAngles = calculateTraj(newHeaders) + elif reject < len(rows)-1: + new_rows = copy.deepcopy(rows) + del new_rows[reject] + newSpeeds, newAngles = calculateTraj(new_rows) flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) if flag: reject = [index-1, index] @@ -143,33 +136,35 @@ def chooseReject(headers, speeds, angles, index, maxSpeed): return reject -def calculateTraj(headers): +def calculateTraj(rows): ''' return a list of speeds and a list of angles describing the trajectory of the track described - by the time-ordered list of . + by the time-ordered list of dictified rows. ''' - + speeds = [None] angles = [None] # Find speed and angle for all profiles remaining in the list - for i in range(1, len(headers)): + for i in range(1, len(rows)): speeds.append(None) angles.append(None) - - speeds[i] = trackSpeed(headers[i-1], headers[i]) - if i < len(headers)-1: # can't do angle on last point - angles[i] = abs(math.pi - geo.haversineAngle(headers[i-1], headers[i], headers[i+1])) - + speeds[i] = trackSpeed(rows[i-1], rows[i]) + + if i < len(rows)-1: # can't do angle on last point + angles[i] = abs(math.pi - geo.haversineAngle(main.text2wod(rows[i-1]['raw']), main.text2wod(rows[i]['raw']), main.text2wod(rows[i+1]['raw']))) + return speeds, angles -def isBuoy(header): +def isBuoy(row): ''' - decide if header belongs to a buoy-based measurement + decide if row belongs to a buoy-based measurement ''' - return header.probe_type in [4,7,9,10,11,12,13,15] + profile = main.text2wod(row['raw']) + + return profile.probe_type() in [4,7,9,10,11,12,13,15] def detectExcessiveSpeed(speeds, angles, index, maxSpeed): ''' @@ -183,7 +178,7 @@ def detectExcessiveSpeed(speeds, angles, index, maxSpeed): return flag -def meanSpeed(speeds, headers, maxSpeed): +def meanSpeed(speeds, rows, maxSpeed): ''' determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) ''' @@ -194,7 +189,7 @@ def meanSpeed(speeds, headers, maxSpeed): if speed == None or iSpeed == 0: #missing values continue - elif iSpeed > 0 and geo.deltaTime(headers[iSpeed-1], headers[iSpeed]) < 3600.: + elif iSpeed > 0 and geo.deltaTime(main.text2wod(rows[iSpeed-1]['raw']), main.text2wod(rows[iSpeed]['raw'])) < 3600.: #too close together in time continue elif speed > maxSpeed: @@ -210,77 +205,78 @@ def meanSpeed(speeds, headers, maxSpeed): return meanSpeed -def trackSpeed(prevHeader, header): +def trackSpeed(prev_row, row): ''' computes the speed, including rounding tolerance from the reference, - for the track at
. + for the track at . return None if some necessary data is missing ''' # check that all required data is present: - if None in [header.latitude(), header.longitude(), prevHeader.latitude(), prevHeader.longitude()]: + if None in [row['lat'], row['long'], prev_row['lat'], prev_row['long']]: return None - if None in [header.year(), header.month(), header.day(), header.time(), prevHeader.year(), prevHeader.month(), prevHeader.day(), prevHeader.time()]: + if None in [row['year'], row['month'], row['day'], row['time'], prev_row['year'], prev_row['month'], prev_row['day'], prev_row['time']]: return None - dist = geo.haversineDistance(prevHeader, header) - DTime = geo.deltaTime(prevHeader, header) + dist = geo.haversineDistance(main.text2wod(prev_row['raw']), main.text2wod(row['raw'])) + DTime = geo.deltaTime(main.text2wod(prev_row['raw']), main.text2wod(row['raw'])) speed = (dist - DistRes) / max(DTime, TimeRes) return speed -def condition_a(headers, speeds, angles, index, maxSpeed): +def condition_a(rows, speeds, angles, index, maxSpeed): ''' assess condition (a) from the text ''' - if index == 1 and len(headers) == 2: + if index == 1 and len(rows) == 2: return 0, 'a' - elif index == 1 and len(headers) > 2: # note 'M' in the text seems to count from 1, not 0. - impliedSpeed = trackSpeed(headers[0], headers[2]) + elif index == 1 and len(rows) > 2: # note 'M' in the text seems to count from 1, not 0. + impliedSpeed = trackSpeed(rows[0], rows[2]) if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): return 1, 'a' else: return 0, 'a' - elif index == len(headers)-1 and len(headers)>3: # why not >=? seems to cause problems, investigate. - impliedSpeed = trackSpeed(headers[-3], headers[-1]) + elif index == len(rows)-1 and len(rows)>3: # why not >=? seems to cause problems, investigate. + impliedSpeed = trackSpeed(rows[-3], rows[-1]) if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): return index-1, 'a' else: return index, 'a' else: - return condition_b(headers, speeds, angles, index, maxSpeed) + return condition_b(rows, speeds, angles, index, maxSpeed) -def condition_b(headers, speeds, angles, index, maxSpeed): +def condition_b(rows, speeds, angles, index, maxSpeed): ''' assess condition (b) from the text ''' + if speeds[index-1] > maxSpeed: return index-1, 'b' elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: return index, 'b' - return condition_c(headers, speeds, angles, index, maxSpeed) + return condition_c(rows, speeds, angles, index, maxSpeed) -def condition_c(headers, speeds, angles, index, maxSpeed): +def condition_c(rows, speeds, angles, index, maxSpeed): ''' assess condition (c) from the text ''' - if index < len(headers)-1 and index > 0: - impliedSpeed = trackSpeed(headers[index-1], headers[index+1]) + if index < len(rows)-1 and index > 0: + impliedSpeed = trackSpeed(rows[index-1], rows[index+1]) if impliedSpeed > maxSpeed: return index-1, 'c' if index > 1: - impliedSpeed = trackSpeed(headers[index-2], headers[index]) + impliedSpeed = trackSpeed(rows[index-2], rows[index]) if impliedSpeed > maxSpeed: return index, 'c' - return condition_d(headers, speeds, angles, index, maxSpeed) + return condition_d(rows, speeds, angles, index, maxSpeed) -def condition_d(headers, speeds, angles, index, maxSpeed): +def condition_d(rows, speeds, angles, index, maxSpeed): ''' assess condition (d) from the text ''' @@ -291,14 +287,14 @@ def condition_d(headers, speeds, angles, index, maxSpeed): if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: return index, 'd' - return condition_e(headers, speeds, angles, index, maxSpeed) + return condition_e(rows, speeds, angles, index, maxSpeed) -def condition_e(headers, speeds, angles, index, maxSpeed): +def condition_e(rows, speeds, angles, index, maxSpeed): ''' assess condition (e) from the text ''' - if len(headers) > max(2, index+1): + if len(rows) > max(2, index+1): if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: return index-1, 'e' @@ -306,16 +302,16 @@ def condition_e(headers, speeds, angles, index, maxSpeed): if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: return index, 'e' - return condition_f(headers, speeds, angles, index, maxSpeed) + return condition_f(rows, speeds, angles, index, maxSpeed) -def condition_f(headers, speeds, angles, index, maxSpeed): +def condition_f(rows, speeds, angles, index, maxSpeed): ''' assess condition (f) from the text ''' if index>0 and index < len(speeds)-1: - ms = meanSpeed(speeds, headers, maxSpeed) + ms = meanSpeed(speeds, rows, maxSpeed) if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): return index-1, 'f' @@ -323,21 +319,21 @@ def condition_f(headers, speeds, angles, index, maxSpeed): if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): return index, 'f' - return condition_g(headers, speeds, angles, index, maxSpeed) + return condition_g(rows, speeds, angles, index, maxSpeed) -def condition_g(headers, speeds, angles, index, maxSpeed): +def condition_g(rows, speeds, angles, index, maxSpeed): ''' assess condition (g) from the text ''' - if index > 1 and index < len(headers) - 1: + if index > 1 and index < len(rows) - 1: - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + dist1 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index]['raw'])) + dist2 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index-1]['raw'])) - distTol = geo.haversineDistance(headers[index-1], headers[index-2]) - distTol += geo.haversineDistance(headers[index], headers[index-1]) - distTol += geo.haversineDistance(headers[index+1], headers[index]) + distTol = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) + distTol += geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-1]['raw'])) + distTol += geo.haversineDistance(main.text2wod(rows[index+1]['raw']), main.text2wod(rows[index]['raw'])) distTol = max(DistRes, 0.1*distTol) if dist1 < dist2 - distTol: @@ -346,24 +342,23 @@ def condition_g(headers, speeds, angles, index, maxSpeed): if dist2 < dist1 - distTol: return index, 'g' - return condition_h(headers, speeds, angles, index, maxSpeed) + return condition_h(rows, speeds, angles, index, maxSpeed) -def condition_h(headers, speeds, angles, index, maxSpeed): +def condition_h(rows, speeds, angles, index, maxSpeed): ''' assess condition (h) from the text - typeo in text, implementation incomplete ''' - if index > 1 and index < len(headers) - 1: + if index > 1 and index < len(rows) - 1: - dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) - dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) + dist1 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index]['raw'])) + dist2 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index-1]['raw'])) - PD1 = geo.haversineDistance(headers[index-1], headers[index-2]) / dist2 - PD2 = geo.haversineDistance(headers[index], headers[index-2]) / dist1 + PD1 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) / dist2 + PD2 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) / dist1 - PT1 = geo.deltaTime(headers[index-2], headers[index-1]) / geo.deltaTime(headers[index-2], headers[index+1]) - PT2 = geo.deltaTime(headers[index-2], headers[index]) / geo.deltaTime(headers[index-2], headers[index+1]) + PT1 = geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index-1]['raw'])) / geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index+1]['raw'])) + PT2 = geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index]['raw'])) / geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index+1]['raw'])) if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): return index-1, 'h' @@ -371,22 +366,3 @@ def condition_h(headers, speeds, angles, index, maxSpeed): return index, 'h' return -1, 'i' - -def checkOrder(profiles): - ''' - check that a list of profiles is properly time ordered - ''' - - dates = [] - for pro in profiles: - if pro.time() is not None: - hour, minute, second = geo.parseTime(pro.time()) - else: - hour = 0 - minute = 0 - second = 0 - date = datetime.datetime(year=pro.year(), month=pro.month(), day=pro.day(), hour=hour, minute=minute, second=second ) - dates.append(date) - - for i in range(len(dates)-1): - assert dates[i] <= dates [i+1], 'dates out of order %s %s' % (dates[i], dates[i+1]) diff --git a/summarize-results.py b/summarize-results.py index ae726ab..a01f2d6 100644 --- a/summarize-results.py +++ b/summarize-results.py @@ -7,7 +7,6 @@ # what tests are available testNames = main.importQC('qctests') testNames.sort() - testNames.remove('EN_track_check') # connect to database conn = psycopg2.connect("dbname='root' user='root'") diff --git a/util/geo.py b/util/geo.py index f17b315..8ad3be6 100644 --- a/util/geo.py +++ b/util/geo.py @@ -50,7 +50,7 @@ def haversineAngle(pro1, pro2, pro3): with that passing through pro2 and pro3 (all the pro* are WOD profiles or headers) return None if any required information is missing. ''' - + if None in [pro1.latitude(), pro1.longitude()]: return None if None in [pro2.latitude(), pro2.longitude()]: diff --git a/util/main.py b/util/main.py index 5102f4c..3ebd8dd 100644 --- a/util/main.py +++ b/util/main.py @@ -128,13 +128,40 @@ def calcRates(testResults, trueResults): return tpr, fpr, fnr, tnr def get_profile_from_db(cur, uid): - # Given the database cursor and a unique id, return a WodPy profile object. + ''' + Given the database cursor and a unique id, return a WodPy profile object. + ''' + cur.execute('SELECT * FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) ) row = cur.fetchall() + return text2wod(row[0][0]) + +def text2wod(raw): + ''' + given the raw text of a wod ascii profile, return a wodpy object representing the same. + ''' + fProfile = tempfile.TemporaryFile() - fProfile.write(row[0][0]) # a file-like object containing only the profile from the queried row + fProfile.write(raw) # a file-like object containing only the profile from the queried row fProfile.seek(0) profile = wod.WodProfile(fProfile) fProfile.close() + return profile +def dictify(rows, keys): + ''' + given a list of rows from the db, return a list of dicts in the same order + representing the same information keyed by the key names found in the tuple + ''' + + dicts = [] + + for i in range(len(rows)): + d = {} + for j in range(len(keys)): + d[keys[j]] = rows[i][j] + + dicts.append(d) + + return dicts From d96f54296ab457503b16e2ee5a5e5821566dc394 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Wed, 3 Aug 2016 23:51:22 +0000 Subject: [PATCH 55/79] all tests running quickly under new database scheme --- AutoQC.py | 4 +- qctests/EN_track_check.py | 20 +- .../ICDC_aqc_09_local_climatology_check.py | 200 ++++++++++-------- ...t_sea.py => Misc_loose_location_at_sea.py} | 0 4 files changed, 120 insertions(+), 104 deletions(-) rename qctests/{loose_location_at_sea.py => Misc_loose_location_at_sea.py} (100%) diff --git a/AutoQC.py b/AutoQC.py index 22830f5..5bbd7c0 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -79,5 +79,5 @@ def process_row(uid): else: print 'Please add command line arguments to name your output file and set parallelization:' - print 'python AutoQC databasetable 4' - print 'will result in output written to table in the database, and will run the calculation parallelized across 4 cores.' + print 'python AutoQC ' + print 'will write qc results to in the database, and run the calculation parallelized across cores.' diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index 827b03c..d28ee89 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -31,12 +31,12 @@ def test(p): return np.zeros(1, dtype=bool) # don't bother if this has already been analyzed - cur.execute('SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';') - en_track_result = cur.fetchall() - if en_track_result[0][0] is not None: - result = np.zeros(1, dtype=bool) - result[0] = en_track_result[0][0] - return result + # cur.execute('SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';') + # en_track_result = cur.fetchall() + # if en_track_result[0][0] is not None: + # result = np.zeros(1, dtype=bool) + # result[0] = en_track_result[0][0] + # return result # some detector types cannot be assessed by this test; do not raise flag. if p.probe_type in [None]: @@ -68,10 +68,10 @@ def test(p): EN_track_results[track_rows[i]['uid']][0] = True # write all to db - for i in range(len(track_rows)): - query = "UPDATE " + sys.argv[1] + " SET en_track_check " + " = " + str(EN_track_results[track_rows[i]['uid']][0]) + " WHERE uid = " + str(track_rows[i]['uid']) + ";" - cur.execute(query) - conn.commit() + # for i in range(len(track_rows)): + # query = "UPDATE " + sys.argv[1] + " SET en_track_check " + " = " + str(EN_track_results[track_rows[i]['uid']][0]) + " WHERE uid = " + str(track_rows[i]['uid']) + ";" + # cur.execute(query) + # conn.commit() return EN_track_results[uid] diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py index b53224c..5308036 100644 --- a/qctests/ICDC_aqc_09_local_climatology_check.py +++ b/qctests/ICDC_aqc_09_local_climatology_check.py @@ -69,6 +69,20 @@ def get_climatology_range(nlevels, z, lat, lon, month): tmin[:] = fillValue tmax[:] = fillValue + # parameters + nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') + tmedA = nc.variables['tmedA'][:, :, :] + tamdA = nc.variables['tamdA'][:, :, :] + tmedM = nc.variables['tmedM'][:, :, :, :] + tamdM = nc.variables['tamdM'][:, :, :, :] + zedqc = nc.variables['zedqc'][:] + fillValue = nc.fillValue + nc.close() + + # Global ranges - data outside these bounds are assumed not valid. + parminover = -2.3 + parmaxover = 33.0 + # Calculate grid indices. iy = int(np.floor((90.0 - lat) / 0.5)) ix = int(np.floor((lon + 180.0) / 0.5)) @@ -119,102 +133,104 @@ def get_climatology_range(nlevels, z, lat, lon, month): return tmin, tmax -def read_ascii_and_convert_to_netcdf(): - '''Coverts the ASCII data file to netCDF on first read. - This is much faster to access. - ''' - global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue - - # Load the data. - tmedM = np.ndarray([721, 361, 16, 12]) - tamdM = np.ndarray([721, 361, 16, 12]) - tmedA = np.ndarray([721, 361, 60]) - tamdA = np.ndarray([721, 361, 60]) - zedqc = np.ndarray(60) - # Do not use masked arrays to save on memory use. - fillValue = -9.0 # Has to be a negative number. - tmedM[:, :, :, :] = fillValue - tamdM[:, :, :, :] = fillValue - tmedA[:, :, :] = fillValue - tamdA[:, :, :] = fillValue - with open('data/climatological_t_median_and_amd_for_aqc.dat') as f: - for line in f: - vals = line.split() - m = int(vals[0]) - 1 - j = int(vals[1]) - 1 - i = int(vals[3]) - 1 - k = int(vals[5]) - 1 - z = float(vals[6]) - tmedian = float(vals[7]) - absmeddev = float(vals[8]) - - if m < 12 and k < 16: - tmedM[i, j, k, m] = tmedian - tamdM[i, j, k, m] = absmeddev - elif m == 12: - tmedA[i, j, k] = tmedian - tamdA[i, j, k] = absmeddev - zedqc[k] = z - - # Create the netCDF version. - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'w') - idim = nc.createDimension('i', 721) - jdim = nc.createDimension('j', 361) - kmdim = nc.createDimension('km', 16) - kadim = nc.createDimension('ka', 60) - mdim = nc.createDimension('m', 12) - - sf = 0.0001 - tmedav = nc.createVariable('tmedA', 'i4', ('i', 'j', 'ka'), zlib=True) - tmedav.add_offset = 0.0 - tmedav.scale_factor = sf - tmedav[:, :, :] = tmedA - - tamdav = nc.createVariable('tamdA', 'i4', ('i', 'j', 'ka'), zlib=True) - tamdav.add_offset = 0.0 - tamdav.scale_factor = sf - tamdav[:, :, :] = tamdA - - tmedmv = nc.createVariable('tmedM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) - tmedmv.add_offset = 0.0 - tmedmv.scale_factor = sf - tmedmv[:, :, :, :] = tmedM - - tamdmv = nc.createVariable('tamdM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) - tamdmv.add_offset = 0.0 - tamdmv.scale_factor = sf - tamdmv[:, :, :, :] = tamdM - - zedqcv = nc.createVariable('zedqc', 'f4', ('ka',)) - zedqcv[:] = zedqc - - nc.fillValue = fillValue - nc.history = 'Created ' + time.ctime(time.time()) + ' from climatological_t_median_and_amd_for_aqc.dat provided by Viktor Gouretski, Integrated Climate Data Center, University of Hamburg, Hamburg, Germany, February 2016' - nc.close() - -def read_netcdf(): - '''Read climatological data from netCDF. - ''' - global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue - - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') - tmedA = nc.variables['tmedA'][:, :, :] - tamdA = nc.variables['tamdA'][:, :, :] - tmedM = nc.variables['tmedM'][:, :, :, :] - tamdM = nc.variables['tamdM'][:, :, :, :] - zedqc = nc.variables['zedqc'][:] - fillValue = nc.fillValue - nc.close() +# def read_ascii_and_convert_to_netcdf(): +# '''Coverts the ASCII data file to netCDF on first read. +# This is much faster to access. +# ''' +# global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue + +# # Load the data. +# tmedM = np.ndarray([721, 361, 16, 12]) +# tamdM = np.ndarray([721, 361, 16, 12]) +# tmedA = np.ndarray([721, 361, 60]) +# tamdA = np.ndarray([721, 361, 60]) +# zedqc = np.ndarray(60) +# # Do not use masked arrays to save on memory use. +# fillValue = -9.0 # Has to be a negative number. +# tmedM[:, :, :, :] = fillValue +# tamdM[:, :, :, :] = fillValue +# tmedA[:, :, :] = fillValue +# tamdA[:, :, :] = fillValue +# with open('data/climatological_t_median_and_amd_for_aqc.dat') as f: +# for line in f: +# vals = line.split() +# m = int(vals[0]) - 1 +# j = int(vals[1]) - 1 +# i = int(vals[3]) - 1 +# k = int(vals[5]) - 1 +# z = float(vals[6]) +# tmedian = float(vals[7]) +# absmeddev = float(vals[8]) + +# if m < 12 and k < 16: +# tmedM[i, j, k, m] = tmedian +# tamdM[i, j, k, m] = absmeddev +# elif m == 12: +# tmedA[i, j, k] = tmedian +# tamdA[i, j, k] = absmeddev +# zedqc[k] = z + +# # Create the netCDF version. +# nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'w') +# idim = nc.createDimension('i', 721) +# jdim = nc.createDimension('j', 361) +# kmdim = nc.createDimension('km', 16) +# kadim = nc.createDimension('ka', 60) +# mdim = nc.createDimension('m', 12) + +# sf = 0.0001 +# tmedav = nc.createVariable('tmedA', 'i4', ('i', 'j', 'ka'), zlib=True) +# tmedav.add_offset = 0.0 +# tmedav.scale_factor = sf +# tmedav[:, :, :] = tmedA + +# tamdav = nc.createVariable('tamdA', 'i4', ('i', 'j', 'ka'), zlib=True) +# tamdav.add_offset = 0.0 +# tamdav.scale_factor = sf +# tamdav[:, :, :] = tamdA + +# tmedmv = nc.createVariable('tmedM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) +# tmedmv.add_offset = 0.0 +# tmedmv.scale_factor = sf +# tmedmv[:, :, :, :] = tmedM + +# tamdmv = nc.createVariable('tamdM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) +# tamdmv.add_offset = 0.0 +# tamdmv.scale_factor = sf +# tamdmv[:, :, :, :] = tamdM + +# zedqcv = nc.createVariable('zedqc', 'f4', ('ka',)) +# zedqcv[:] = zedqc + +# nc.fillValue = fillValue +# nc.history = 'Created ' + time.ctime(time.time()) + ' from climatological_t_median_and_amd_for_aqc.dat provided by Viktor Gouretski, Integrated Climate Data Center, University of Hamburg, Hamburg, Germany, February 2016' +# nc.close() + +# def read_netcdf(): +# '''Read climatological data from netCDF. +# ''' +# global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue + +# nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') +# tmedA = nc.variables['tmedA'][:, :, :] +# tamdA = nc.variables['tamdA'][:, :, :] +# tmedM = nc.variables['tmedM'][:, :, :, :] +# tamdM = nc.variables['tamdM'][:, :, :, :] +# zedqc = nc.variables['zedqc'][:] +# fillValue = nc.fillValue +# nc.close() # Global ranges - data outside these bounds are assumed not valid. -parminover = -2.3 -parmaxover = 33.0 +#parminover = -2.3 +#parmaxover = 33.0 # Read data. -if os.path.isfile('data/climatological_t_median_and_amd_for_aqc.nc'): - read_netcdf() -else: - read_ascii_and_convert_to_netcdf() +# if os.path.isfile('data/climatological_t_median_and_amd_for_aqc.nc'): +# print 1 +# read_netcdf() +# print 11 +# else: +# read_ascii_and_convert_to_netcdf() diff --git a/qctests/loose_location_at_sea.py b/qctests/Misc_loose_location_at_sea.py similarity index 100% rename from qctests/loose_location_at_sea.py rename to qctests/Misc_loose_location_at_sea.py From 9bb5b697473039f0f0d2280bcba0845ae73ebf82 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 4 Aug 2016 17:42:01 +0000 Subject: [PATCH 56/79] order of operations fix for ICDC-9 --- .../ICDC_aqc_09_local_climatology_check.py | 25 +++++++++++-------- ...c_09_local_climatology_check_validation.py | 5 +++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py index 5308036..daee6f1 100644 --- a/qctests/ICDC_aqc_09_local_climatology_check.py +++ b/qctests/ICDC_aqc_09_local_climatology_check.py @@ -50,34 +50,37 @@ def test(p): (lat >= 40.0 and lat <= 50.0 and lon >= -95.0 and lon <= -75.0)): return defaultqc + # parameters + nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') + # Get range. - ranges = get_climatology_range(nlevels, z, lat, lon, p.month()) + ranges = get_climatology_range(nlevels, z, lat, lon, p.month(), nc) if ranges is None: return defaultqc # Perform the QC. tmin, tmax = ranges - qc = ((t < tmin) | (t > tmax)) & (tmin != fillValue) & (tmax != fillValue) + qc = ((t < tmin) | (t > tmax)) & (tmin != nc.fillValue) & (tmax != nc.fillValue) + + nc.close() return ICDC.revert_qc_order(p, qc) -def get_climatology_range(nlevels, z, lat, lon, month): - - # Define arrays for the results. - tmin = np.ndarray(nlevels) - tmax = np.ndarray(nlevels) - tmin[:] = fillValue - tmax[:] = fillValue +def get_climatology_range(nlevels, z, lat, lon, month, nc): # parameters - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') tmedA = nc.variables['tmedA'][:, :, :] tamdA = nc.variables['tamdA'][:, :, :] tmedM = nc.variables['tmedM'][:, :, :, :] tamdM = nc.variables['tamdM'][:, :, :, :] zedqc = nc.variables['zedqc'][:] fillValue = nc.fillValue - nc.close() + + # Define arrays for the results. + tmin = np.ndarray(nlevels) + tmax = np.ndarray(nlevels) + tmin[:] = fillValue + tmax[:] = fillValue # Global ranges - data outside these bounds are assumed not valid. parminover = -2.3 diff --git a/tests/ICDC_aqc_09_local_climatology_check_validation.py b/tests/ICDC_aqc_09_local_climatology_check_validation.py index 5f15946..a488a3e 100644 --- a/tests/ICDC_aqc_09_local_climatology_check_validation.py +++ b/tests/ICDC_aqc_09_local_climatology_check_validation.py @@ -3,6 +3,7 @@ import util.testingProfile import numpy as np +from netCDF4 import Dataset ##### ICDC local climatology check. ##### -------------------------------------------------- @@ -13,6 +14,7 @@ def test_ICDC_local_climatology_check(): ''' lines = data.splitlines() + nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') for i, line in enumerate(lines): if line[0:2] == 'HH': header = line.split() @@ -49,7 +51,8 @@ def test_ICDC_local_climatology_check(): z, lat, lon, - p.month()) + p.month(), + nc) assert np.max(np.abs(tmin - climmin)) < 0.001, 'TMIN failed for profile with header ' + line assert np.max(np.abs(tmax - climmax)) < 0.001, 'TMAX failed for profile with header ' + line From 94444b900e9c295fc2fcba119870f156baa4e7bc Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 4 Aug 2016 19:00:54 +0000 Subject: [PATCH 57/79] remove redundant unpacking from en_track --- AutoQC.py | 1 + qctests/EN_track_check.py | 187 +++++++++++++++++++------------------- 2 files changed, 93 insertions(+), 95 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index 5bbd7c0..0c0b937 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -57,6 +57,7 @@ def process_row(uid): return # run tests + print uid for itest, test in enumerate(testNames): result = run(test, [profile]) query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index d28ee89..7900415 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -29,7 +29,7 @@ def test(p): # don't bother if cruise == 0 or None if cruise in [0, None]: return np.zeros(1, dtype=bool) - + # don't bother if this has already been analyzed # cur.execute('SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';') # en_track_result = cur.fetchall() @@ -41,31 +41,31 @@ def test(p): # some detector types cannot be assessed by this test; do not raise flag. if p.probe_type in [None]: return np.zeros(1, dtype=bool) - + # fetch all profiles on track, sorted chronologically, earliest first (None sorted as highest) - cur.execute('SELECT raw, cruise, uid, year, month, day, time, lat, long FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + 'ORDER BY year, month, day, time ASC;') + cur.execute('SELECT raw FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + 'ORDER BY year, month, day, time ASC;') track_rows = cur.fetchall() - track_rows = main.dictify(track_rows, ('raw', 'cruise', 'uid', 'year', 'month', 'day', 'time', 'lat', 'long')) - + track_profiles = [main.text2wod(raw[0]) for raw in track_rows] + # start all as passing by default: EN_track_results = {} - for i in range(len(track_rows)): - EN_track_results[track_rows[i]['uid']] = np.zeros(1, dtype=bool) - + for i in range(len(track_profiles)): + EN_track_results[track_profiles[i].uid()] = np.zeros(1, dtype=bool) + # copy the list of headers; # remove entries as they are flagged. - passed_rows = copy.deepcopy(track_rows) - rejects = findOutlier(passed_rows, EN_track_results) - - while rejects != []: - passed_index = [x for x in range(len(passed_rows)) if x not in rejects ] - passed_rows = [passed_rows[index] for index in passed_index ] - rejects = findOutlier(passed_rows, EN_track_results) + passed_profiles = copy.deepcopy(track_profiles) + rejects = findOutlier(passed_profiles, EN_track_results) + while rejects != []: + passed_index = [x for x in range(len(passed_profiles)) if x not in rejects ] + passed_profiles = [passed_profiles[index] for index in passed_index ] + rejects = findOutlier(passed_profiles, EN_track_results) + # if more than half got rejected, reject everyone - if len(passed_rows) < len(track_rows) / 2: - for i in range(len(track_rows)): - EN_track_results[track_rows[i]['uid']][0] = True + if len(passed_profiles) < len(track_rows) / 2: + for i in range(len(track_profiles)): + EN_track_results[track_profiles[i].uid()][0] = True # write all to db # for i in range(len(track_rows)): @@ -75,46 +75,46 @@ def test(p): return EN_track_results[uid] -def findOutlier(rows, results): +def findOutlier(profiles, results): ''' - given a list of dictified db rows, find the fastest one; + given a list of profiles, find the fastest one; if it's too fast, reject it or the one before it, return a list of rejected indices; once the fastest is within limits, return []. ''' - + maxShipSpeed = 15. # m/s maxBuoySpeed = 2. # m/s - if rows == []: + if profiles == []: return [] # determine speeds and angles for list of headers - speeds, angles = calculateTraj(rows) - + speeds, angles = calculateTraj(profiles) + # decide if something needs to be flagged maxSpeed = maxShipSpeed - if isBuoy(rows[0]): + if isBuoy(profiles[0]): maxSpeed = maxBuoySpeed iMax = speeds.index(max(speeds)) flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) - + # decide which profile to reject, flag it, and return a list of indices rejected at this step. if flag: - rejects = chooseReject(rows, speeds, angles, iMax, maxSpeed) + rejects = chooseReject(profiles, speeds, angles, iMax, maxSpeed) for reject in rejects: - results[rows[reject]['uid']][0] = True + results[profiles[reject].uid()][0] = True return rejects else: return [] -def chooseReject(rows, speeds, angles, index, maxSpeed): +def chooseReject(profiles, speeds, angles, index, maxSpeed): ''' - decide which profile to reject, rows[index] or rows[index-1], or both, + decide which profile to reject, profiles[index] or profiles[index-1], or both, and return a list of indices to reject. ''' # chain of tests breaks when a reject is found: - reject = condition_a(rows, speeds, angles, index, maxSpeed)[0] + reject = condition_a(profiles, speeds, angles, index, maxSpeed)[0] # condition i needs to run at the end of the chain in all cases: # if no decision, reject both: @@ -122,10 +122,10 @@ def chooseReject(rows, speeds, angles, index, maxSpeed): reject = [index-1, index] # if excessive speed is created by removing the flag, reject both instead # can't create new excessive speed by removing last profile. - elif reject < len(rows)-1: - new_rows = copy.deepcopy(rows) - del new_rows[reject] - newSpeeds, newAngles = calculateTraj(new_rows) + elif reject < len(profiles)-1: + new_profiles = copy.deepcopy(profiles) + del new_profiles[reject] + newSpeeds, newAngles = calculateTraj(new_profiles) flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) if flag: reject = [index-1, index] @@ -136,34 +136,31 @@ def chooseReject(rows, speeds, angles, index, maxSpeed): return reject -def calculateTraj(rows): +def calculateTraj(profiles): ''' return a list of speeds and a list of angles describing the trajectory of the track described - by the time-ordered list of dictified rows. + by the time-ordered list of profiles. ''' - + speeds = [None] angles = [None] # Find speed and angle for all profiles remaining in the list - for i in range(1, len(rows)): + for i in range(1, len(profiles)): speeds.append(None) angles.append(None) - speeds[i] = trackSpeed(rows[i-1], rows[i]) - - if i < len(rows)-1: # can't do angle on last point - angles[i] = abs(math.pi - geo.haversineAngle(main.text2wod(rows[i-1]['raw']), main.text2wod(rows[i]['raw']), main.text2wod(rows[i+1]['raw']))) - + speeds[i] = trackSpeed(profiles[i-1], profiles[i]) + + if i < len(profiles)-1: # can't do angle on last point + angles[i] = abs(math.pi - geo.haversineAngle(profiles[i-1], profiles[i], profiles[i+1])) + return speeds, angles -def isBuoy(row): +def isBuoy(profile): ''' - decide if row belongs to a buoy-based measurement + decide if profile belongs to a buoy-based measurement ''' - - profile = main.text2wod(row['raw']) - return profile.probe_type() in [4,7,9,10,11,12,13,15] def detectExcessiveSpeed(speeds, angles, index, maxSpeed): @@ -178,7 +175,7 @@ def detectExcessiveSpeed(speeds, angles, index, maxSpeed): return flag -def meanSpeed(speeds, rows, maxSpeed): +def meanSpeed(speeds, profiles, maxSpeed): ''' determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) ''' @@ -189,7 +186,7 @@ def meanSpeed(speeds, rows, maxSpeed): if speed == None or iSpeed == 0: #missing values continue - elif iSpeed > 0 and geo.deltaTime(main.text2wod(rows[iSpeed-1]['raw']), main.text2wod(rows[iSpeed]['raw'])) < 3600.: + elif iSpeed > 0 and geo.deltaTime(profiles[iSpeed-1], profiles[iSpeed]) < 3600.: #too close together in time continue elif speed > maxSpeed: @@ -205,48 +202,48 @@ def meanSpeed(speeds, rows, maxSpeed): return meanSpeed -def trackSpeed(prev_row, row): +def trackSpeed(prev_profile, profile): ''' computes the speed, including rounding tolerance from the reference, - for the track at . + for the track at . return None if some necessary data is missing ''' # check that all required data is present: - if None in [row['lat'], row['long'], prev_row['lat'], prev_row['long']]: + if None in [profile.latitude(), profile.longitude(), prev_profile.latitude(), prev_profile.longitude()]: return None - if None in [row['year'], row['month'], row['day'], row['time'], prev_row['year'], prev_row['month'], prev_row['day'], prev_row['time']]: + if None in [profile.year(), profile.month(), profile.day(), profile.time(), prev_profile.year(), prev_profile.month(), prev_profile.day(), prev_profile.time()]: return None - dist = geo.haversineDistance(main.text2wod(prev_row['raw']), main.text2wod(row['raw'])) - DTime = geo.deltaTime(main.text2wod(prev_row['raw']), main.text2wod(row['raw'])) + dist = geo.haversineDistance(prev_profile, profile) + DTime = geo.deltaTime(prev_profile, profile) speed = (dist - DistRes) / max(DTime, TimeRes) return speed -def condition_a(rows, speeds, angles, index, maxSpeed): +def condition_a(profiles, speeds, angles, index, maxSpeed): ''' assess condition (a) from the text ''' - if index == 1 and len(rows) == 2: + if index == 1 and len(profiles) == 2: return 0, 'a' - elif index == 1 and len(rows) > 2: # note 'M' in the text seems to count from 1, not 0. - impliedSpeed = trackSpeed(rows[0], rows[2]) + elif index == 1 and len(profiles) > 2: # note 'M' in the text seems to count from 1, not 0. + impliedSpeed = trackSpeed(profiles[0], profiles[2]) if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): return 1, 'a' else: return 0, 'a' - elif index == len(rows)-1 and len(rows)>3: # why not >=? seems to cause problems, investigate. - impliedSpeed = trackSpeed(rows[-3], rows[-1]) + elif index == len(profiles)-1 and len(profiles)>3: # why not >=? seems to cause problems, investigate. + impliedSpeed = trackSpeed(profiles[-3], profiles[-1]) if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): return index-1, 'a' else: return index, 'a' else: - return condition_b(rows, speeds, angles, index, maxSpeed) + return condition_b(profiles, speeds, angles, index, maxSpeed) -def condition_b(rows, speeds, angles, index, maxSpeed): +def condition_b(profiles, speeds, angles, index, maxSpeed): ''' assess condition (b) from the text ''' @@ -256,27 +253,27 @@ def condition_b(rows, speeds, angles, index, maxSpeed): elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: return index, 'b' - return condition_c(rows, speeds, angles, index, maxSpeed) + return condition_c(profiles, speeds, angles, index, maxSpeed) -def condition_c(rows, speeds, angles, index, maxSpeed): +def condition_c(profiles, speeds, angles, index, maxSpeed): ''' assess condition (c) from the text ''' - if index < len(rows)-1 and index > 0: - impliedSpeed = trackSpeed(rows[index-1], rows[index+1]) + if index < len(profiles)-1 and index > 0: + impliedSpeed = trackSpeed(profiles[index-1], profiles[index+1]) if impliedSpeed > maxSpeed: return index-1, 'c' if index > 1: - impliedSpeed = trackSpeed(rows[index-2], rows[index]) + impliedSpeed = trackSpeed(profiles[index-2], profiles[index]) if impliedSpeed > maxSpeed: return index, 'c' - return condition_d(rows, speeds, angles, index, maxSpeed) + return condition_d(profiles, speeds, angles, index, maxSpeed) -def condition_d(rows, speeds, angles, index, maxSpeed): +def condition_d(profiles, speeds, angles, index, maxSpeed): ''' assess condition (d) from the text ''' @@ -287,14 +284,14 @@ def condition_d(rows, speeds, angles, index, maxSpeed): if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: return index, 'd' - return condition_e(rows, speeds, angles, index, maxSpeed) + return condition_e(profiles, speeds, angles, index, maxSpeed) -def condition_e(rows, speeds, angles, index, maxSpeed): +def condition_e(profiles, speeds, angles, index, maxSpeed): ''' assess condition (e) from the text ''' - if len(rows) > max(2, index+1): + if len(profiles) > max(2, index+1): if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: return index-1, 'e' @@ -302,16 +299,16 @@ def condition_e(rows, speeds, angles, index, maxSpeed): if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: return index, 'e' - return condition_f(rows, speeds, angles, index, maxSpeed) + return condition_f(profiles, speeds, angles, index, maxSpeed) -def condition_f(rows, speeds, angles, index, maxSpeed): +def condition_f(profiles, speeds, angles, index, maxSpeed): ''' assess condition (f) from the text ''' if index>0 and index < len(speeds)-1: - ms = meanSpeed(speeds, rows, maxSpeed) + ms = meanSpeed(speeds, profiles, maxSpeed) if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): return index-1, 'f' @@ -319,21 +316,21 @@ def condition_f(rows, speeds, angles, index, maxSpeed): if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): return index, 'f' - return condition_g(rows, speeds, angles, index, maxSpeed) + return condition_g(profiles, speeds, angles, index, maxSpeed) -def condition_g(rows, speeds, angles, index, maxSpeed): +def condition_g(profiles, speeds, angles, index, maxSpeed): ''' assess condition (g) from the text ''' - if index > 1 and index < len(rows) - 1: + if index > 1 and index < len(profiles) - 1: - dist1 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index]['raw'])) - dist2 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index-1]['raw'])) + dist1 = geo.haversineDistance(profiles[index], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index]) + dist2 = geo.haversineDistance(profiles[index-1], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index-1]) - distTol = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) - distTol += geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-1]['raw'])) - distTol += geo.haversineDistance(main.text2wod(rows[index+1]['raw']), main.text2wod(rows[index]['raw'])) + distTol = geo.haversineDistance(profiles[index-1], profiles[index-2]) + distTol += geo.haversineDistance(profiles[index], profiles[index-1]) + distTol += geo.haversineDistance(profiles[index+1], profiles[index]) distTol = max(DistRes, 0.1*distTol) if dist1 < dist2 - distTol: @@ -342,23 +339,23 @@ def condition_g(rows, speeds, angles, index, maxSpeed): if dist2 < dist1 - distTol: return index, 'g' - return condition_h(rows, speeds, angles, index, maxSpeed) + return condition_h(profiles, speeds, angles, index, maxSpeed) -def condition_h(rows, speeds, angles, index, maxSpeed): +def condition_h(profiles, speeds, angles, index, maxSpeed): ''' assess condition (h) from the text ''' - if index > 1 and index < len(rows) - 1: + if index > 1 and index < len(profiles) - 1: - dist1 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index]['raw'])) - dist2 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) + geo.haversineDistance(main.text2wod(rows[index + 1]['raw']), main.text2wod(rows[index-1]['raw'])) + dist1 = geo.haversineDistance(profiles[index], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index]) + dist2 = geo.haversineDistance(profiles[index-1], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index-1]) - PD1 = geo.haversineDistance(main.text2wod(rows[index-1]['raw']), main.text2wod(rows[index-2]['raw'])) / dist2 - PD2 = geo.haversineDistance(main.text2wod(rows[index]['raw']), main.text2wod(rows[index-2]['raw'])) / dist1 + PD1 = geo.haversineDistance(profiles[index-1], profiles[index-2]) / dist2 + PD2 = geo.haversineDistance(profiles[index], profiles[index-2]) / dist1 - PT1 = geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index-1]['raw'])) / geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index+1]['raw'])) - PT2 = geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index]['raw'])) / geo.deltaTime(main.text2wod(rows[index-2]['raw']), main.text2wod(rows[index+1]['raw'])) + PT1 = geo.deltaTime(profiles[index-2], profiles[index-1]) / geo.deltaTime(profiles[index-2], profiles[index+1]) + PT2 = geo.deltaTime(profiles[index-2], profiles[index]) / geo.deltaTime(profiles[index-2], profiles[index+1]) if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): return index-1, 'h' From 5a4ca7c026be9ce7640538341304492fde8e653b Mon Sep 17 00:00:00 2001 From: BillMills Date: Thu, 4 Aug 2016 15:15:03 -0400 Subject: [PATCH 58/79] suppress en_track integration testing until dummy wod ascii generation is available --- tests/EN_track_validation.py | 1097 +++++++++++++++++----------------- 1 file changed, 549 insertions(+), 548 deletions(-) diff --git a/tests/EN_track_validation.py b/tests/EN_track_validation.py index 44f4ab4..7565344 100644 --- a/tests/EN_track_validation.py +++ b/tests/EN_track_validation.py @@ -461,555 +461,556 @@ def condition_h_test(self): ############################ # Integration Tests + # Integration tests rely on being able to generate raw wod ascii text for dummy testing profiles - tbd ############################ - def all_for_one_test(self): - ''' - 10 profiles in a straight slow line should pass - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) - - # pass in any arbitrary profiles should catch all of them - qctests.EN_track_check.test(ds.threadProfiles[3]) - truth = {} - - for i in range(1,11): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'all profiles on a nominal profile should pass no matter which one is provided to EN_track' - - def multi_track_test(self): - ''' - a wild outlier on a different track shouldn't hurt anything - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=10, date=[1999, 12, 31, 9.5], cruise=1001, uid=11)) - - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) - - qctests.EN_track_check.test(ds.threadProfiles[3]) - truth = {} - - for i in range(1,11): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'profiles from a different track should not cause failures' - - def wild_outlier_test(self): - ''' - flag an extreme outlier - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=10, date=[1999, 12, 31, 9.5], cruise=1000, uid=11)) - - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) - - qctests.EN_track_check.test(ds.threadProfiles[3]) - - assert numpy.array_equal(numpy.ones(1, dtype=bool), qctests.EN_track_check.EN_track_results[(1000,11)]), 'should reject wild outlier' - - def condition_i_gap_test(self): - ''' - if removing a profile makes an excessive speed between m-1 and m+1, remove both m and m-1. - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 30, 7], cruise=1000, uid=3)) - - #end of first pass: reject on (i) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - - #first pass: reject on (b) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) - - qctests.EN_track_check.test(ds.threadProfiles[7]) - - truth = {} - for i in range(1,11): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 4)] = numpy.ones(1, dtype=bool) - truth[(1000, 5)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (b) & (i) reject' - - - def condition_c_integration_test(self): - ''' - track passes until condition c - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) - #first pass: reject profile[2] on (c) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) - #inital speed check: flag profile[3] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - - qctests.EN_track_check.test(ds.threadProfiles[3]) - - truth = {} - for i in range(1,7): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 3)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (c) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] - assert flag == 'c', 'Correct profile flagged, but not by the expected step.' - - def condition_d_integration_test(self): - ''' - track passes until condition d - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) - #initial speed check: flag profile[3] - #first pass: reject profile[3] on (d) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) - - qctests.EN_track_check.test(ds.threadProfiles[5]) - - truth = {} - for i in range(1,7): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 4)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (d) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] - assert flag == 'd', 'Correct profile flagged, but not by the expected step.' - - def condition_e_integration_test(self): - ''' - track passes until condition e - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 30, 7], cruise=1000, uid=3)) - #first pass: reject profile[3] on (e) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) - #initial speed check: flag profile[4] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=15.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=15, longitude=90, date=[2000, 01, 01, 10], cruise=1000, uid=6)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=14.5, longitude=90, date=[2000, 01, 01, 11], cruise=1000, uid=7)) - - qctests.EN_track_check.test(ds.threadProfiles[5]) - - truth = {} - for i in range(1,8): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 4)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (e) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 4, 15)[1] - assert flag == 'e', 'Correct profile flagged, but not by the expected step.' - - def condition_f_integration_test(self): - ''' - track passes until condition f - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 3], cruise=1000, uid=2)) - #first pass: reject profile[2] on (f) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=3)) - #initial speed check: flag profile[3] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=5)) - - qctests.EN_track_check.test(ds.threadProfiles[4]) - - truth = {} - for i in range(1,6): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 3)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (f) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] - print flag - assert flag == 'f', 'Correct profile flagged, but not by the expected step.' - - def condition_g_integration_test(self): - ''' - track passes until condition g - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1998, 12, 31, 1], cruise=1000, uid=1)) - #first pass: reject profile[1] on (g) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=89, date=[1999, 12, 31, 1], cruise=1000, uid=2)) - #inital speed check: flag profile[2] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 2], cruise=1000, uid=3)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[2000, 12, 31, 3], cruise=1000, uid=4)) - - qctests.EN_track_check.test(ds.threadProfiles[3]) - - truth = {} - for i in range(1,5): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 2)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (g) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 2, 15)[1] - assert flag == 'g', 'Correct profile flagged, but not by the expected step.' - - def condition_h_integration_test(self): - ''' - track passes until condition h - ''' - - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 15], cruise=1000, uid=3)) - #initial speed check: flag profile [3] - #first pass: reject profile[3] on (h) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 16], cruise=1000, uid=4)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 20], cruise=1000, uid=5)) - #PD1: 1/3 - #PD2: 2/3 - #PT1: 3/8 - #PT2: 1/2 - - qctests.EN_track_check.test(ds.threadProfiles[4]) - - truth = {} - for i in range(1,6): - truth[(1000, i)] = numpy.zeros(1, dtype=bool) - truth[(1000, 4)] = numpy.ones(1, dtype=bool) - - assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (h) reject' - - speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) - flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] - assert flag == 'h', 'Correct profile flagged, but not by the expected step.' - - def unusual_case_one_prof_test(self): - ''' - spot check on handling of cruise with only one profile. - ''' - - # Some fake profiles - ds.threadProfiles = [] - - # Only one profile available. - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) - - assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle single profile' - - def unusual_case_no_time_test(self): - ''' - spot check on handling of profiles with incomplete data (missing time) - ''' - - # Some fake profiles - ds.threadProfiles = [] - - # Time is missing. - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=2)) - ds.threadProfiles[0].primary_header['Time'] = None - - assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle missing time' - - def unusual_case_identical_positions_test(self): - ''' - spot check on handling of profiles with incomplete data (identical positions) - ''' - - # Some fake profiles - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=2)) - - assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle identical positions' - - def unusual_case_identical_times_test(self): - ''' - spot check on handling of profiles with incomplete data (identical times) - ''' + # def all_for_one_test(self): + # ''' + # 10 profiles in a straight slow line should pass + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) - # Some fake profiles - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=2)) - - assert qctests.EN_track_check.test(ds.threadProfiles[0]) == True, 'Failed to handle identical times' - - def real_case_1_test(self): - ''' - A real instance of a series of a track with a failed track check reject. - ''' - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 3, 12.000000], cruise=45, uid=72, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.050000, longitude=12.000000, date=[1925, 6, 5, 12.000000], cruise=45, uid=112, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.470000, longitude=11.080000, date=[1925, 6, 6, 12.000000], cruise=45, uid=130, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.470000, longitude=12.000000, date=[1925, 6, 6, 12.000000], cruise=45, uid=134, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.130000, longitude=12.000000, date=[1925, 6, 6, 12.000000], cruise=45, uid=137, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.930000, longitude=-52.680000, date=[1925, 6, 9, 12.000000], cruise=45, uid=189, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.230000, date=[1925, 6, 15, 12.000000], cruise=45, uid=301, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.220000, date=[1925, 6, 15, 12.000000], cruise=45, uid=303, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.650000, date=[1925, 6, 16, 12.000000], cruise=45, uid=316, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=68.830000, longitude=-52.800000, date=[1925, 6, 22, 12.000000], cruise=45, uid=489, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.030000, longitude=-52.620000, date=[1925, 6, 28, 12.000000], cruise=45, uid=577, probe_type=7)) - qc= [False, False, False, False, True, False, False, False, False, False, False] - - tcqc = [] - for p in ds.threadProfiles: - tcqc.append(qctests.EN_track_check.test(p)[0]) - - assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' - - def real_case_2_test(self): - ''' - A real instance of a series of a track with a failed track check reject. - ''' - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.350000, longitude=-13.520000, date=[1925, 6, 11, 15.170000], cruise=843883, uid=222, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.300000, longitude=-13.000000, date=[1925, 6, 12, 11.830000], cruise=843883, uid=252, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.500000, longitude=-12.420000, date=[1925, 6, 12, 17.830000], cruise=843883, uid=256, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.820000, longitude=-12.430000, date=[1925, 6, 12, 23.330000], cruise=843883, uid=260, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.820000, longitude=-12.430000, date=[1925, 6, 12, 12.000000], cruise=843883, uid=261, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.500000, longitude=-12.420000, date=[1925, 6, 12, 12.000000], cruise=843883, uid=262, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.750000, longitude=-14.170000, date=[1925, 6, 13, 14.500000], cruise=843883, uid=272, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.270000, longitude=-14.370000, date=[1925, 6, 14, 2.750000], cruise=843883, uid=277, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.570000, longitude=-15.420000, date=[1925, 6, 14, 14.670000], cruise=843883, uid=279, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.600000, longitude=-16.450000, date=[1925, 6, 14, 18.500000], cruise=843883, uid=280, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.320000, longitude=-16.670000, date=[1925, 6, 15, 11.500000], cruise=843883, uid=289, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.020000, longitude=-17.400000, date=[1925, 6, 15, 18.500000], cruise=843883, uid=297, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.220000, longitude=-18.080000, date=[1925, 6, 17, 8.830000], cruise=843883, uid=325, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.350000, longitude=-18.320000, date=[1925, 6, 17, 12.500000], cruise=843883, uid=327, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.280000, longitude=-19.220000, date=[1925, 6, 17, 20.000000], cruise=843883, uid=331, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.180000, longitude=-20.170000, date=[1925, 6, 18, 0.500000], cruise=843883, uid=350, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.720000, longitude=-20.370000, date=[1925, 6, 18, 7.500000], cruise=843883, uid=351, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.080000, longitude=-20.930000, date=[1925, 6, 18, 13.500000], cruise=843883, uid=356, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.350000, longitude=-21.370000, date=[1925, 6, 18, 17.500000], cruise=843883, uid=358, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.530000, longitude=-22.050000, date=[1925, 6, 18, 23.000000], cruise=843883, uid=359, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.630000, longitude=-23.130000, date=[1925, 6, 19, 21.000000], cruise=843883, uid=378, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.600000, longitude=-23.380000, date=[1925, 6, 20, 1.750000], cruise=843883, uid=389, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.380000, longitude=-23.770000, date=[1925, 6, 20, 6.250000], cruise=843883, uid=392, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.830000, longitude=-23.950000, date=[1925, 6, 20, 14.500000], cruise=843883, uid=394, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.770000, longitude=-25.500000, date=[1925, 6, 20, 22.000000], cruise=843883, uid=396, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.270000, longitude=-24.780000, date=[1925, 6, 21, 5.420000], cruise=843883, uid=414, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.880000, longitude=-24.220000, date=[1925, 6, 21, 10.500000], cruise=843883, uid=418, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.550000, longitude=-23.430000, date=[1925, 6, 21, 19.000000], cruise=843883, uid=429, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.180000, longitude=-23.280000, date=[1925, 6, 22, 0.000000], cruise=843883, uid=462, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 22, 6.000000], cruise=843883, uid=467, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 24, 5.670000], cruise=843883, uid=503, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.130000, longitude=-22.400000, date=[1925, 6, 24, 11.000000], cruise=843883, uid=510, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.100000, longitude=-22.570000, date=[1925, 6, 24, 15.000000], cruise=843883, uid=512, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.870000, longitude=-22.820000, date=[1925, 6, 26, 1.500000], cruise=843883, uid=526, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.800000, longitude=-23.080000, date=[1925, 6, 26, 7.000000], cruise=843883, uid=528, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.670000, longitude=-22.800000, date=[1925, 6, 26, 23.000000], cruise=843883, uid=535, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.730000, longitude=-21.580000, date=[1925, 6, 27, 8.170000], cruise=843883, uid=547, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.320000, longitude=-20.800000, date=[1925, 6, 27, 16.000000], cruise=843883, uid=549, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.570000, longitude=-20.430000, date=[1925, 6, 27, 22.000000], cruise=843883, uid=550, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.300000, longitude=-20.080000, date=[1925, 6, 30, 13.000000], cruise=843883, uid=598, probe_type=7)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.420000, longitude=-19.420000, date=[1925, 6, 30, 21.000000], cruise=843883, uid=602, probe_type=7)) - qc= [False, True, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - - tcqc = [] - for p in ds.threadProfiles: - tcqc.append(qctests.EN_track_check.test(p)[0]) - - assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' - - def real_case_3_test(self): - ''' - A real instance of a series of a track with a failed track check reject. - ''' - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=46.230000, longitude=-7.430000, date=[1975, 6, 3, 17.000000], cruise=9710419, uid=841, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.820000, longitude=-17.330000, date=[1975, 6, 10, 16.250000], cruise=9710419, uid=1419, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.680000, longitude=-17.400000, date=[1975, 6, 10, 19.420000], cruise=9710419, uid=1433, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.220000, longitude=-17.430000, date=[1975, 6, 11, 9.250000], cruise=9710419, uid=1486, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.530000, longitude=-17.430000, date=[1975, 6, 12, 3.080000], cruise=9710419, uid=1543, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.330000, longitude=-17.450000, date=[1975, 6, 12, 4.420000], cruise=9710419, uid=1547, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.170000, longitude=-17.500000, date=[1975, 6, 12, 5.580000], cruise=9710419, uid=1548, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.000000, longitude=-17.580000, date=[1975, 6, 12, 7.080000], cruise=9710419, uid=1556, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.830000, longitude=-17.630000, date=[1975, 6, 12, 10.080000], cruise=9710419, uid=1566, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 12, 11.330000], cruise=9710419, uid=1569, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.670000, date=[1975, 6, 12, 14.920000], cruise=9710419, uid=1584, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.650000, date=[1975, 6, 12, 19.250000], cruise=9710419, uid=1607, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.650000, date=[1975, 6, 12, 21.000000], cruise=9710419, uid=1610, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.570000, date=[1975, 6, 12, 22.250000], cruise=9710419, uid=1614, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.580000, date=[1975, 6, 14, 8.670000], cruise=9710419, uid=1739, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.200000, longitude=-17.620000, date=[1975, 6, 14, 18.000000], cruise=9710419, uid=1779, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.350000, longitude=-17.620000, date=[1975, 6, 15, 2.500000], cruise=9710419, uid=1804, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.100000, longitude=-17.600000, date=[1975, 6, 15, 14.920000], cruise=9710419, uid=1841, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.630000, date=[1975, 6, 15, 18.580000], cruise=9710419, uid=1851, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.600000, date=[1975, 6, 16, 5.000000], cruise=9710419, uid=1880, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.130000, longitude=-17.570000, date=[1975, 6, 16, 9.000000], cruise=9710419, uid=1899, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.380000, longitude=-17.630000, date=[1975, 6, 16, 19.330000], cruise=9710419, uid=1943, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.630000, longitude=-17.650000, date=[1975, 6, 17, 0.000000], cruise=9710419, uid=1961, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.600000, date=[1975, 6, 17, 19.330000], cruise=9710419, uid=2041, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.120000, longitude=-17.620000, date=[1975, 6, 18, 0.500000], cruise=9710419, uid=2059, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.180000, longitude=-17.500000, date=[1975, 6, 18, 21.580000], cruise=9710419, uid=2137, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.670000, date=[1975, 6, 19, 0.500000], cruise=9710419, uid=2159, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.700000, date=[1975, 6, 19, 2.500000], cruise=9710419, uid=2162, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.350000, longitude=-17.700000, date=[1975, 6, 19, 4.830000], cruise=9710419, uid=2171, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.700000, date=[1975, 6, 19, 6.500000], cruise=9710419, uid=2179, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.600000, date=[1975, 6, 19, 20.670000], cruise=9710419, uid=2273, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.620000, longitude=-17.650000, date=[1975, 6, 19, 22.250000], cruise=9710419, uid=2282, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.920000, longitude=-17.500000, date=[1975, 6, 20, 21.580000], cruise=9710419, uid=2365, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.670000, date=[1975, 6, 21, 0.166944], cruise=9710419, uid=2376, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.700000, date=[1975, 6, 21, 2.420000], cruise=9710419, uid=2385, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.700000, date=[1975, 6, 21, 4.000000], cruise=9710419, uid=2392, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.700000, date=[1975, 6, 21, 6.170000], cruise=9710419, uid=2402, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.630000, longitude=-17.650000, date=[1975, 6, 21, 7.670000], cruise=9710419, uid=2409, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.580000, date=[1975, 6, 23, 9.330000], cruise=9710419, uid=2633, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 23, 18.170000], cruise=9710419, uid=2698, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.900000, longitude=-17.480000, date=[1975, 6, 23, 20.170000], cruise=9710419, uid=2709, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.970000, longitude=-17.430000, date=[1975, 6, 24, 20.420000], cruise=9710419, uid=2806, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.800000, longitude=-17.430000, date=[1975, 6, 25, 0.500000], cruise=9710419, uid=2824, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.830000, longitude=-17.500000, date=[1975, 6, 26, 6.170000], cruise=9710419, uid=2928, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.920000, longitude=-17.500000, date=[1975, 6, 26, 10.170000], cruise=9710419, uid=2940, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.950000, longitude=-17.480000, date=[1975, 6, 27, 6.920000], cruise=9710419, uid=3016, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 27, 14.670000], cruise=9710419, uid=3053, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.680000, date=[1975, 6, 27, 15.750000], cruise=9710419, uid=3061, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.650000, date=[1975, 6, 27, 16.920000], cruise=9710419, uid=3063, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 27, 18.170000], cruise=9710419, uid=3070, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.570000, date=[1975, 6, 27, 19.170000], cruise=9710419, uid=3077, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.830000, longitude=-17.500000, date=[1975, 6, 27, 20.170000], cruise=9710419, uid=3080, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.670000, longitude=-17.450000, date=[1975, 6, 27, 21.330000], cruise=9710419, uid=3085, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.500000, longitude=-17.400000, date=[1975, 6, 27, 22.420000], cruise=9710419, uid=3088, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.670000, date=[1975, 6, 28, 11.750000], cruise=9710419, uid=3112, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.580000, date=[1975, 6, 28, 13.330000], cruise=9710419, uid=3117, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.830000, longitude=-17.500000, date=[1975, 6, 28, 14.830000], cruise=9710419, uid=3121, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.670000, longitude=-17.450000, date=[1975, 6, 28, 15.920000], cruise=9710419, uid=3123, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.500000, longitude=-17.570000, date=[1975, 6, 28, 17.000000], cruise=9710419, uid=3128, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.330000, longitude=-17.330000, date=[1975, 6, 28, 18.000000], cruise=9710419, uid=3129, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.170000, longitude=-17.300000, date=[1975, 6, 28, 19.000000], cruise=9710419, uid=3133, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.000000, longitude=-17.180000, date=[1975, 6, 28, 20.170000], cruise=9710419, uid=3135, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.830000, longitude=-17.080000, date=[1975, 6, 28, 21.250000], cruise=9710419, uid=3140, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.600000, longitude=-17.630000, date=[1975, 6, 30, 6.330000], cruise=9710419, uid=3205, probe_type=1)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.650000, longitude=-17.650000, date=[1975, 6, 30, 19.500000], cruise=9710419, uid=3244, probe_type=1)) - qc= [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - - tcqc = [] - for p in ds.threadProfiles: - tcqc.append(qctests.EN_track_check.test(p)[0]) - - assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' - - def real_case_4_test(self): - ''' - A real instance of a series of a track with a failed track check reject. - ''' - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.070000, longitude=-18.920000, date=[1975, 6, 1, 7.580000], cruise=5546547, uid=8104, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.270000, longitude=-18.730000, date=[1975, 6, 4, 18.430000], cruise=5546547, uid=8593, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.450000, longitude=-10.330000, date=[1975, 6, 7, 15.250000], cruise=5546547, uid=9026, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.280000, longitude=-13.120000, date=[1975, 6, 8, 2.830000], cruise=5546547, uid=9097, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.300000, longitude=-17.000000, date=[1975, 6, 8, 8.170000], cruise=5546547, uid=9137, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.750000, longitude=-14.770000, date=[1975, 6, 8, 10.050000], cruise=5546547, uid=9148, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.000000, longitude=-15.880000, date=[1975, 6, 8, 15.030000], cruise=5546547, uid=9182, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.580000, longitude=-14.670000, date=[1975, 6, 8, 21.080000], cruise=5546547, uid=9235, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.220000, longitude=-13.630000, date=[1975, 6, 9, 2.080000], cruise=5546547, uid=9278, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.450000, longitude=-10.780000, date=[1975, 6, 9, 15.020000], cruise=5546547, uid=9368, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.130000, longitude=-9.980000, date=[1975, 6, 9, 21.170000], cruise=5546547, uid=9410, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.020000, longitude=-19.200000, date=[1975, 6, 13, 9.580000], cruise=5546547, uid=9989, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.220000, longitude=-19.400000, date=[1975, 6, 16, 21.400000], cruise=5546547, uid=10516, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.770000, longitude=-19.420000, date=[1975, 6, 22, 8.150000], cruise=5546547, uid=11446, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.730000, longitude=-19.330000, date=[1975, 6, 23, 1.000000], cruise=5546547, uid=11580, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.850000, longitude=-19.400000, date=[1975, 6, 23, 10.250000], cruise=5546547, uid=11644, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.820000, longitude=-19.420000, date=[1975, 6, 24, 7.720000], cruise=5546547, uid=11821, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.820000, longitude=-19.380000, date=[1975, 6, 25, 9.670000], cruise=5546547, uid=12029, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.750000, longitude=-19.400000, date=[1975, 6, 26, 8.250000], cruise=5546547, uid=12208, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.830000, longitude=-19.620000, date=[1975, 6, 27, 9.000000], cruise=5546547, uid=12370, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.770000, longitude=-19.550000, date=[1975, 6, 28, 8.000000], cruise=5546547, uid=12515, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.750000, longitude=-19.580000, date=[1975, 6, 29, 7.920000], cruise=5546547, uid=12647, probe_type=2)) - qc= [False, False, False, False, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - - tcqc = [] - for p in ds.threadProfiles: - tcqc.append(qctests.EN_track_check.test(p)[0]) - - assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' - - def real_case_5_test(self): - ''' - A real instance of a series of a track with a failed track check reject. - ''' - ds.threadProfiles = [] - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-20.920000, longitude=112.862000, date=[1975, 6, 7, 18.000000], cruise=5670710, uid=9040, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-19.350000, longitude=113.795000, date=[1975, 6, 8, 0.020000], cruise=5670710, uid=9077, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-17.380000, longitude=114.162000, date=[1975, 6, 8, 6.000000], cruise=5670710, uid=9116, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-15.500000, longitude=115.512000, date=[1975, 6, 8, 12.000000], cruise=5670710, uid=9164, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-12.470000, longitude=114.800000, date=[1975, 6, 8, 18.000000], cruise=5670710, uid=9212, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-10.980000, longitude=115.220000, date=[1975, 6, 9, 0.020000], cruise=5670710, uid=9257, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-9.370000, longitude=115.580000, date=[1975, 6, 9, 7.000000], cruise=5670710, uid=9323, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-7.750000, longitude=115.050000, date=[1975, 6, 9, 12.000000], cruise=5670710, uid=9360, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-6.630000, longitude=116.700000, date=[1975, 6, 9, 18.000000], cruise=5670710, uid=9384, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-3.700000, longitude=118.130000, date=[1975, 6, 10, 0.020000], cruise=5670710, uid=9451, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-1.770000, longitude=118.780000, date=[1975, 6, 10, 6.000000], cruise=5670710, uid=9481, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0.267000, longitude=119.220000, date=[1975, 6, 10, 12.000000], cruise=5670710, uid=9527, probe_type=2)) - ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=2.170000, longitude=119.480000, date=[1975, 6, 10, 18.000000], cruise=5670710, uid=9562, probe_type=2)) - qc= [False, False, False, True, True, False, False, False, True, False, False, False, False] - - tcqc = [] - for p in ds.threadProfiles: - tcqc.append(qctests.EN_track_check.test(p)[0]) - - assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' + # # pass in any arbitrary profiles should catch all of them + # qctests.EN_track_check.test(ds.threadProfiles[3]) + # truth = {} + + # for i in range(1,11): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'all profiles on a nominal profile should pass no matter which one is provided to EN_track' + + # def multi_track_test(self): + # ''' + # a wild outlier on a different track shouldn't hurt anything + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=10, date=[1999, 12, 31, 9.5], cruise=1001, uid=11)) + + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) + + # qctests.EN_track_check.test(ds.threadProfiles[3]) + # truth = {} + + # for i in range(1,11): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'profiles from a different track should not cause failures' + + # def wild_outlier_test(self): + # ''' + # flag an extreme outlier + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=10, date=[1999, 12, 31, 9.5], cruise=1000, uid=11)) + + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) + + # qctests.EN_track_check.test(ds.threadProfiles[3]) + + # assert numpy.array_equal(numpy.ones(1, dtype=bool), qctests.EN_track_check.EN_track_results[(1000,11)]), 'should reject wild outlier' + + # def condition_i_gap_test(self): + # ''' + # if removing a profile makes an excessive speed between m-1 and m+1, remove both m and m-1. + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 30, 7], cruise=1000, uid=3)) + + # #end of first pass: reject on (i) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + + # #first pass: reject on (b) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.5, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=8)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21, longitude=90, date=[1999, 12, 31, 13], cruise=1000, uid=9)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.5, longitude=90, date=[1999, 12, 31, 14], cruise=1000, uid=10)) + + # qctests.EN_track_check.test(ds.threadProfiles[7]) + + # truth = {} + # for i in range(1,11): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 4)] = numpy.ones(1, dtype=bool) + # truth[(1000, 5)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (b) & (i) reject' + + + # def condition_c_integration_test(self): + # ''' + # track passes until condition c + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) + # #first pass: reject profile[2] on (c) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) + # #inital speed check: flag profile[3] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + + # qctests.EN_track_check.test(ds.threadProfiles[3]) + + # truth = {} + # for i in range(1,7): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 3)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (c) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] + # assert flag == 'c', 'Correct profile flagged, but not by the expected step.' + + # def condition_d_integration_test(self): + # ''' + # track passes until condition d + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7], cruise=1000, uid=3)) + # #initial speed check: flag profile[3] + # #first pass: reject profile[3] on (d) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 10], cruise=1000, uid=6)) + + # qctests.EN_track_check.test(ds.threadProfiles[5]) + + # truth = {} + # for i in range(1,7): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 4)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (d) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] + # assert flag == 'd', 'Correct profile flagged, but not by the expected step.' + + # def condition_e_integration_test(self): + # ''' + # track passes until condition e + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 30, 5], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 30, 6], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 30, 7], cruise=1000, uid=3)) + # #first pass: reject profile[3] on (e) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=4)) + # #initial speed check: flag profile[4] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=15.5, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=5)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=15, longitude=90, date=[2000, 01, 01, 10], cruise=1000, uid=6)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=14.5, longitude=90, date=[2000, 01, 01, 11], cruise=1000, uid=7)) + + # qctests.EN_track_check.test(ds.threadProfiles[5]) + + # truth = {} + # for i in range(1,8): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 4)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (e) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 4, 15)[1] + # assert flag == 'e', 'Correct profile flagged, but not by the expected step.' + + # def condition_f_integration_test(self): + # ''' + # track passes until condition f + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 3], cruise=1000, uid=2)) + # #first pass: reject profile[2] on (f) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 8], cruise=1000, uid=3)) + # #initial speed check: flag profile[3] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 11], cruise=1000, uid=5)) + + # qctests.EN_track_check.test(ds.threadProfiles[4]) + + # truth = {} + # for i in range(1,6): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 3)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (f) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] + # print flag + # assert flag == 'f', 'Correct profile flagged, but not by the expected step.' + + # def condition_g_integration_test(self): + # ''' + # track passes until condition g + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1998, 12, 31, 1], cruise=1000, uid=1)) + # #first pass: reject profile[1] on (g) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=89, date=[1999, 12, 31, 1], cruise=1000, uid=2)) + # #inital speed check: flag profile[2] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 2], cruise=1000, uid=3)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[2000, 12, 31, 3], cruise=1000, uid=4)) + + # qctests.EN_track_check.test(ds.threadProfiles[3]) + + # truth = {} + # for i in range(1,5): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 2)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (g) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 2, 15)[1] + # assert flag == 'g', 'Correct profile flagged, but not by the expected step.' + + # def condition_h_integration_test(self): + # ''' + # track passes until condition h + # ''' + + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 9], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 12], cruise=1000, uid=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 15], cruise=1000, uid=3)) + # #initial speed check: flag profile [3] + # #first pass: reject profile[3] on (h) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 16], cruise=1000, uid=4)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20, longitude=90, date=[1999, 12, 31, 20], cruise=1000, uid=5)) + # #PD1: 1/3 + # #PD2: 2/3 + # #PT1: 3/8 + # #PT2: 1/2 + + # qctests.EN_track_check.test(ds.threadProfiles[4]) + + # truth = {} + # for i in range(1,6): + # truth[(1000, i)] = numpy.zeros(1, dtype=bool) + # truth[(1000, 4)] = numpy.ones(1, dtype=bool) + + # assert numpy.array_equal(truth, qctests.EN_track_check.EN_track_results), 'condition (h) reject' + + # speeds, angles = qctests.EN_track_check.calculateTraj(ds.threadProfiles) + # flag = qctests.EN_track_check.condition_a(ds.threadProfiles, speeds, angles, 3, 15)[1] + # assert flag == 'h', 'Correct profile flagged, but not by the expected step.' + + # def unusual_case_one_prof_test(self): + # ''' + # spot check on handling of cruise with only one profile. + # ''' + + # # Some fake profiles + # ds.threadProfiles = [] + + # # Only one profile available. + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) + + # assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle single profile' + + # def unusual_case_no_time_test(self): + # ''' + # spot check on handling of profiles with incomplete data (missing time) + # ''' + + # # Some fake profiles + # ds.threadProfiles = [] + + # # Time is missing. + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=2)) + # ds.threadProfiles[0].primary_header['Time'] = None + + # assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle missing time' + + # def unusual_case_identical_positions_test(self): + # ''' + # spot check on handling of profiles with incomplete data (identical positions) + # ''' + + # # Some fake profiles + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 1], cruise=1000, uid=2)) + + # assert qctests.EN_track_check.test(ds.threadProfiles[0]) == False, 'Failed to handle identical positions' + + # def unusual_case_identical_times_test(self): + # ''' + # spot check on handling of profiles with incomplete data (identical times) + # ''' + + # # Some fake profiles + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 0], cruise=1000, uid=2)) + + # assert qctests.EN_track_check.test(ds.threadProfiles[0]) == True, 'Failed to handle identical times' + + # def real_case_1_test(self): + # ''' + # A real instance of a series of a track with a failed track check reject. + # ''' + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 3, 12.000000], cruise=45, uid=72, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.050000, longitude=12.000000, date=[1925, 6, 5, 12.000000], cruise=45, uid=112, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.470000, longitude=11.080000, date=[1925, 6, 6, 12.000000], cruise=45, uid=130, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.470000, longitude=12.000000, date=[1925, 6, 6, 12.000000], cruise=45, uid=134, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=80.130000, longitude=12.000000, date=[1925, 6, 6, 12.000000], cruise=45, uid=137, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.930000, longitude=-52.680000, date=[1925, 6, 9, 12.000000], cruise=45, uid=189, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.230000, date=[1925, 6, 15, 12.000000], cruise=45, uid=301, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.220000, date=[1925, 6, 15, 12.000000], cruise=45, uid=303, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.430000, longitude=-50.650000, date=[1925, 6, 16, 12.000000], cruise=45, uid=316, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=68.830000, longitude=-52.800000, date=[1925, 6, 22, 12.000000], cruise=45, uid=489, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.030000, longitude=-52.620000, date=[1925, 6, 28, 12.000000], cruise=45, uid=577, probe_type=7)) + # qc= [False, False, False, False, True, False, False, False, False, False, False] + + # tcqc = [] + # for p in ds.threadProfiles: + # tcqc.append(qctests.EN_track_check.test(p)[0]) + + # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' + + # def real_case_2_test(self): + # ''' + # A real instance of a series of a track with a failed track check reject. + # ''' + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.350000, longitude=-13.520000, date=[1925, 6, 11, 15.170000], cruise=843883, uid=222, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.300000, longitude=-13.000000, date=[1925, 6, 12, 11.830000], cruise=843883, uid=252, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.500000, longitude=-12.420000, date=[1925, 6, 12, 17.830000], cruise=843883, uid=256, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.820000, longitude=-12.430000, date=[1925, 6, 12, 23.330000], cruise=843883, uid=260, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.820000, longitude=-12.430000, date=[1925, 6, 12, 12.000000], cruise=843883, uid=261, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.500000, longitude=-12.420000, date=[1925, 6, 12, 12.000000], cruise=843883, uid=262, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.750000, longitude=-14.170000, date=[1925, 6, 13, 14.500000], cruise=843883, uid=272, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.270000, longitude=-14.370000, date=[1925, 6, 14, 2.750000], cruise=843883, uid=277, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.570000, longitude=-15.420000, date=[1925, 6, 14, 14.670000], cruise=843883, uid=279, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.600000, longitude=-16.450000, date=[1925, 6, 14, 18.500000], cruise=843883, uid=280, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.320000, longitude=-16.670000, date=[1925, 6, 15, 11.500000], cruise=843883, uid=289, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.020000, longitude=-17.400000, date=[1925, 6, 15, 18.500000], cruise=843883, uid=297, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.220000, longitude=-18.080000, date=[1925, 6, 17, 8.830000], cruise=843883, uid=325, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.350000, longitude=-18.320000, date=[1925, 6, 17, 12.500000], cruise=843883, uid=327, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.280000, longitude=-19.220000, date=[1925, 6, 17, 20.000000], cruise=843883, uid=331, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.180000, longitude=-20.170000, date=[1925, 6, 18, 0.500000], cruise=843883, uid=350, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.720000, longitude=-20.370000, date=[1925, 6, 18, 7.500000], cruise=843883, uid=351, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.080000, longitude=-20.930000, date=[1925, 6, 18, 13.500000], cruise=843883, uid=356, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.350000, longitude=-21.370000, date=[1925, 6, 18, 17.500000], cruise=843883, uid=358, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.530000, longitude=-22.050000, date=[1925, 6, 18, 23.000000], cruise=843883, uid=359, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.630000, longitude=-23.130000, date=[1925, 6, 19, 21.000000], cruise=843883, uid=378, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.600000, longitude=-23.380000, date=[1925, 6, 20, 1.750000], cruise=843883, uid=389, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=66.380000, longitude=-23.770000, date=[1925, 6, 20, 6.250000], cruise=843883, uid=392, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.830000, longitude=-23.950000, date=[1925, 6, 20, 14.500000], cruise=843883, uid=394, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.770000, longitude=-25.500000, date=[1925, 6, 20, 22.000000], cruise=843883, uid=396, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=65.270000, longitude=-24.780000, date=[1925, 6, 21, 5.420000], cruise=843883, uid=414, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.880000, longitude=-24.220000, date=[1925, 6, 21, 10.500000], cruise=843883, uid=418, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.550000, longitude=-23.430000, date=[1925, 6, 21, 19.000000], cruise=843883, uid=429, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.180000, longitude=-23.280000, date=[1925, 6, 22, 0.000000], cruise=843883, uid=462, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 22, 6.000000], cruise=843883, uid=467, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.230000, longitude=-22.220000, date=[1925, 6, 24, 5.670000], cruise=843883, uid=503, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.130000, longitude=-22.400000, date=[1925, 6, 24, 11.000000], cruise=843883, uid=510, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=64.100000, longitude=-22.570000, date=[1925, 6, 24, 15.000000], cruise=843883, uid=512, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.870000, longitude=-22.820000, date=[1925, 6, 26, 1.500000], cruise=843883, uid=526, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.800000, longitude=-23.080000, date=[1925, 6, 26, 7.000000], cruise=843883, uid=528, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.670000, longitude=-22.800000, date=[1925, 6, 26, 23.000000], cruise=843883, uid=535, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.730000, longitude=-21.580000, date=[1925, 6, 27, 8.170000], cruise=843883, uid=547, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.320000, longitude=-20.800000, date=[1925, 6, 27, 16.000000], cruise=843883, uid=549, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.570000, longitude=-20.430000, date=[1925, 6, 27, 22.000000], cruise=843883, uid=550, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.300000, longitude=-20.080000, date=[1925, 6, 30, 13.000000], cruise=843883, uid=598, probe_type=7)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=63.420000, longitude=-19.420000, date=[1925, 6, 30, 21.000000], cruise=843883, uid=602, probe_type=7)) + # qc= [False, True, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + + # tcqc = [] + # for p in ds.threadProfiles: + # tcqc.append(qctests.EN_track_check.test(p)[0]) + + # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' + + # def real_case_3_test(self): + # ''' + # A real instance of a series of a track with a failed track check reject. + # ''' + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=46.230000, longitude=-7.430000, date=[1975, 6, 3, 17.000000], cruise=9710419, uid=841, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.820000, longitude=-17.330000, date=[1975, 6, 10, 16.250000], cruise=9710419, uid=1419, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.680000, longitude=-17.400000, date=[1975, 6, 10, 19.420000], cruise=9710419, uid=1433, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.220000, longitude=-17.430000, date=[1975, 6, 11, 9.250000], cruise=9710419, uid=1486, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.530000, longitude=-17.430000, date=[1975, 6, 12, 3.080000], cruise=9710419, uid=1543, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.330000, longitude=-17.450000, date=[1975, 6, 12, 4.420000], cruise=9710419, uid=1547, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.170000, longitude=-17.500000, date=[1975, 6, 12, 5.580000], cruise=9710419, uid=1548, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=21.000000, longitude=-17.580000, date=[1975, 6, 12, 7.080000], cruise=9710419, uid=1556, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.830000, longitude=-17.630000, date=[1975, 6, 12, 10.080000], cruise=9710419, uid=1566, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 12, 11.330000], cruise=9710419, uid=1569, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.670000, date=[1975, 6, 12, 14.920000], cruise=9710419, uid=1584, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.650000, date=[1975, 6, 12, 19.250000], cruise=9710419, uid=1607, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.650000, date=[1975, 6, 12, 21.000000], cruise=9710419, uid=1610, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.570000, date=[1975, 6, 12, 22.250000], cruise=9710419, uid=1614, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.580000, date=[1975, 6, 14, 8.670000], cruise=9710419, uid=1739, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.200000, longitude=-17.620000, date=[1975, 6, 14, 18.000000], cruise=9710419, uid=1779, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.350000, longitude=-17.620000, date=[1975, 6, 15, 2.500000], cruise=9710419, uid=1804, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.100000, longitude=-17.600000, date=[1975, 6, 15, 14.920000], cruise=9710419, uid=1841, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.630000, date=[1975, 6, 15, 18.580000], cruise=9710419, uid=1851, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.600000, date=[1975, 6, 16, 5.000000], cruise=9710419, uid=1880, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.130000, longitude=-17.570000, date=[1975, 6, 16, 9.000000], cruise=9710419, uid=1899, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.380000, longitude=-17.630000, date=[1975, 6, 16, 19.330000], cruise=9710419, uid=1943, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.630000, longitude=-17.650000, date=[1975, 6, 17, 0.000000], cruise=9710419, uid=1961, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.250000, longitude=-17.600000, date=[1975, 6, 17, 19.330000], cruise=9710419, uid=2041, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.120000, longitude=-17.620000, date=[1975, 6, 18, 0.500000], cruise=9710419, uid=2059, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.180000, longitude=-17.500000, date=[1975, 6, 18, 21.580000], cruise=9710419, uid=2137, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.670000, date=[1975, 6, 19, 0.500000], cruise=9710419, uid=2159, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.700000, date=[1975, 6, 19, 2.500000], cruise=9710419, uid=2162, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.350000, longitude=-17.700000, date=[1975, 6, 19, 4.830000], cruise=9710419, uid=2171, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.700000, date=[1975, 6, 19, 6.500000], cruise=9710419, uid=2179, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.600000, date=[1975, 6, 19, 20.670000], cruise=9710419, uid=2273, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.620000, longitude=-17.650000, date=[1975, 6, 19, 22.250000], cruise=9710419, uid=2282, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.920000, longitude=-17.500000, date=[1975, 6, 20, 21.580000], cruise=9710419, uid=2365, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.670000, date=[1975, 6, 21, 0.166944], cruise=9710419, uid=2376, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.170000, longitude=-17.700000, date=[1975, 6, 21, 2.420000], cruise=9710419, uid=2385, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.700000, date=[1975, 6, 21, 4.000000], cruise=9710419, uid=2392, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.700000, date=[1975, 6, 21, 6.170000], cruise=9710419, uid=2402, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.630000, longitude=-17.650000, date=[1975, 6, 21, 7.670000], cruise=9710419, uid=2409, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.580000, date=[1975, 6, 23, 9.330000], cruise=9710419, uid=2633, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 23, 18.170000], cruise=9710419, uid=2698, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.900000, longitude=-17.480000, date=[1975, 6, 23, 20.170000], cruise=9710419, uid=2709, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.970000, longitude=-17.430000, date=[1975, 6, 24, 20.420000], cruise=9710419, uid=2806, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.800000, longitude=-17.430000, date=[1975, 6, 25, 0.500000], cruise=9710419, uid=2824, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.830000, longitude=-17.500000, date=[1975, 6, 26, 6.170000], cruise=9710419, uid=2928, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.920000, longitude=-17.500000, date=[1975, 6, 26, 10.170000], cruise=9710419, uid=2940, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.950000, longitude=-17.480000, date=[1975, 6, 27, 6.920000], cruise=9710419, uid=3016, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 27, 14.670000], cruise=9710419, uid=3053, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.500000, longitude=-17.680000, date=[1975, 6, 27, 15.750000], cruise=9710419, uid=3061, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.650000, date=[1975, 6, 27, 16.920000], cruise=9710419, uid=3063, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.670000, longitude=-17.630000, date=[1975, 6, 27, 18.170000], cruise=9710419, uid=3070, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.570000, date=[1975, 6, 27, 19.170000], cruise=9710419, uid=3077, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.830000, longitude=-17.500000, date=[1975, 6, 27, 20.170000], cruise=9710419, uid=3080, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.670000, longitude=-17.450000, date=[1975, 6, 27, 21.330000], cruise=9710419, uid=3085, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.500000, longitude=-17.400000, date=[1975, 6, 27, 22.420000], cruise=9710419, uid=3088, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.330000, longitude=-17.670000, date=[1975, 6, 28, 11.750000], cruise=9710419, uid=3112, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.000000, longitude=-17.580000, date=[1975, 6, 28, 13.330000], cruise=9710419, uid=3117, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.830000, longitude=-17.500000, date=[1975, 6, 28, 14.830000], cruise=9710419, uid=3121, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.670000, longitude=-17.450000, date=[1975, 6, 28, 15.920000], cruise=9710419, uid=3123, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.500000, longitude=-17.570000, date=[1975, 6, 28, 17.000000], cruise=9710419, uid=3128, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.330000, longitude=-17.330000, date=[1975, 6, 28, 18.000000], cruise=9710419, uid=3129, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.170000, longitude=-17.300000, date=[1975, 6, 28, 19.000000], cruise=9710419, uid=3133, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.000000, longitude=-17.180000, date=[1975, 6, 28, 20.170000], cruise=9710419, uid=3135, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.830000, longitude=-17.080000, date=[1975, 6, 28, 21.250000], cruise=9710419, uid=3140, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.600000, longitude=-17.630000, date=[1975, 6, 30, 6.330000], cruise=9710419, uid=3205, probe_type=1)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=20.650000, longitude=-17.650000, date=[1975, 6, 30, 19.500000], cruise=9710419, uid=3244, probe_type=1)) + # qc= [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + + # tcqc = [] + # for p in ds.threadProfiles: + # tcqc.append(qctests.EN_track_check.test(p)[0]) + + # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' + + # def real_case_4_test(self): + # ''' + # A real instance of a series of a track with a failed track check reject. + # ''' + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.070000, longitude=-18.920000, date=[1975, 6, 1, 7.580000], cruise=5546547, uid=8104, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.270000, longitude=-18.730000, date=[1975, 6, 4, 18.430000], cruise=5546547, uid=8593, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.450000, longitude=-10.330000, date=[1975, 6, 7, 15.250000], cruise=5546547, uid=9026, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.280000, longitude=-13.120000, date=[1975, 6, 8, 2.830000], cruise=5546547, uid=9097, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.300000, longitude=-17.000000, date=[1975, 6, 8, 8.170000], cruise=5546547, uid=9137, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.750000, longitude=-14.770000, date=[1975, 6, 8, 10.050000], cruise=5546547, uid=9148, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.000000, longitude=-15.880000, date=[1975, 6, 8, 15.030000], cruise=5546547, uid=9182, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.580000, longitude=-14.670000, date=[1975, 6, 8, 21.080000], cruise=5546547, uid=9235, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=57.220000, longitude=-13.630000, date=[1975, 6, 9, 2.080000], cruise=5546547, uid=9278, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.450000, longitude=-10.780000, date=[1975, 6, 9, 15.020000], cruise=5546547, uid=9368, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=56.130000, longitude=-9.980000, date=[1975, 6, 9, 21.170000], cruise=5546547, uid=9410, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.020000, longitude=-19.200000, date=[1975, 6, 13, 9.580000], cruise=5546547, uid=9989, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=59.220000, longitude=-19.400000, date=[1975, 6, 16, 21.400000], cruise=5546547, uid=10516, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.770000, longitude=-19.420000, date=[1975, 6, 22, 8.150000], cruise=5546547, uid=11446, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.730000, longitude=-19.330000, date=[1975, 6, 23, 1.000000], cruise=5546547, uid=11580, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.850000, longitude=-19.400000, date=[1975, 6, 23, 10.250000], cruise=5546547, uid=11644, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.820000, longitude=-19.420000, date=[1975, 6, 24, 7.720000], cruise=5546547, uid=11821, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.820000, longitude=-19.380000, date=[1975, 6, 25, 9.670000], cruise=5546547, uid=12029, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.750000, longitude=-19.400000, date=[1975, 6, 26, 8.250000], cruise=5546547, uid=12208, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.830000, longitude=-19.620000, date=[1975, 6, 27, 9.000000], cruise=5546547, uid=12370, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.770000, longitude=-19.550000, date=[1975, 6, 28, 8.000000], cruise=5546547, uid=12515, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=58.750000, longitude=-19.580000, date=[1975, 6, 29, 7.920000], cruise=5546547, uid=12647, probe_type=2)) + # qc= [False, False, False, False, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + + # tcqc = [] + # for p in ds.threadProfiles: + # tcqc.append(qctests.EN_track_check.test(p)[0]) + + # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' + + # def real_case_5_test(self): + # ''' + # A real instance of a series of a track with a failed track check reject. + # ''' + # ds.threadProfiles = [] + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-20.920000, longitude=112.862000, date=[1975, 6, 7, 18.000000], cruise=5670710, uid=9040, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-19.350000, longitude=113.795000, date=[1975, 6, 8, 0.020000], cruise=5670710, uid=9077, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-17.380000, longitude=114.162000, date=[1975, 6, 8, 6.000000], cruise=5670710, uid=9116, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-15.500000, longitude=115.512000, date=[1975, 6, 8, 12.000000], cruise=5670710, uid=9164, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-12.470000, longitude=114.800000, date=[1975, 6, 8, 18.000000], cruise=5670710, uid=9212, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-10.980000, longitude=115.220000, date=[1975, 6, 9, 0.020000], cruise=5670710, uid=9257, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-9.370000, longitude=115.580000, date=[1975, 6, 9, 7.000000], cruise=5670710, uid=9323, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-7.750000, longitude=115.050000, date=[1975, 6, 9, 12.000000], cruise=5670710, uid=9360, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-6.630000, longitude=116.700000, date=[1975, 6, 9, 18.000000], cruise=5670710, uid=9384, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-3.700000, longitude=118.130000, date=[1975, 6, 10, 0.020000], cruise=5670710, uid=9451, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=-1.770000, longitude=118.780000, date=[1975, 6, 10, 6.000000], cruise=5670710, uid=9481, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0.267000, longitude=119.220000, date=[1975, 6, 10, 12.000000], cruise=5670710, uid=9527, probe_type=2)) + # ds.threadProfiles.append(util.testingProfile.fakeProfile([0], [0], latitude=2.170000, longitude=119.480000, date=[1975, 6, 10, 18.000000], cruise=5670710, uid=9562, probe_type=2)) + # qc= [False, False, False, True, True, False, False, False, True, False, False, False, False] + + # tcqc = [] + # for p in ds.threadProfiles: + # tcqc.append(qctests.EN_track_check.test(p)[0]) + + # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' From 7881e680573f556a4fa5d19b5b566d1b9daf9c44 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Fri, 5 Aug 2016 01:59:47 +0000 Subject: [PATCH 59/79] moved loose location test back to original location --- .../{Misc_loose_location_at_sea.py => loose_location_at_sea.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename qctests/{Misc_loose_location_at_sea.py => loose_location_at_sea.py} (100%) diff --git a/qctests/Misc_loose_location_at_sea.py b/qctests/loose_location_at_sea.py similarity index 100% rename from qctests/Misc_loose_location_at_sea.py rename to qctests/loose_location_at_sea.py From 847a3c737b44f5feca868b244226696dbcc05fe2 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Fri, 5 Aug 2016 21:27:48 +0000 Subject: [PATCH 60/79] postgres and master mostly matching --- AutoQC.py | 1 + build-db.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/AutoQC.py b/AutoQC.py index 0c0b937..d674e01 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -59,6 +59,7 @@ def process_row(uid): # run tests print uid for itest, test in enumerate(testNames): + print test result = run(test, [profile]) query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) diff --git a/build-db.py b/build-db.py index 814d711..7a017f7 100644 --- a/build-db.py +++ b/build-db.py @@ -42,7 +42,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) - for xx in range(10): + while True: # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) From 1a5e8642351e0e807f1bd0c0a3b0cca4664cc2a9 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 7 Aug 2016 19:34:16 +0000 Subject: [PATCH 61/79] attempting en_track speedup --- AutoQC.py | 6 +++--- qctests/EN_track_check.py | 8 ++++---- util/main.py | 28 +++++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index d674e01..c8e74c6 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -34,6 +34,7 @@ def run(test, profiles): # Identify and import tests testNames = main.importQC('qctests') testNames.sort() + testNames.remove('ICDC_aqc_09_local_climatology_check') print('{} quality control checks have been found'.format(len(testNames))) testNames = main.checkQCTestRequirements(testNames) print('{} quality control checks are able to be run:'.format(len(testNames))) @@ -66,6 +67,7 @@ def process_row(uid): # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") + conn.autocommit = True cur = conn.cursor() cur.execute('SELECT uid FROM ' + sys.argv[1]) uids = cur.fetchall() @@ -76,9 +78,7 @@ def process_row(uid): pool.apply_async(process_row, (uids[i][0],)) pool.close() pool.join() - - conn.commit() - + else: print 'Please add command line arguments to name your output file and set parallelization:' print 'python AutoQC ' diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index 7900415..ddc566c 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -21,6 +21,7 @@ def test(p): """ conn = psycopg2.connect("dbname='root' user='root'") + conn.autocommit = True cur = conn.cursor() cruise = p.cruise() @@ -68,10 +69,9 @@ def test(p): EN_track_results[track_profiles[i].uid()][0] = True # write all to db - # for i in range(len(track_rows)): - # query = "UPDATE " + sys.argv[1] + " SET en_track_check " + " = " + str(EN_track_results[track_rows[i]['uid']][0]) + " WHERE uid = " + str(track_rows[i]['uid']) + ";" - # cur.execute(query) - # conn.commit() + for i in range(len(track_profiles)): + query = "UPDATE " + sys.argv[1] + " SET en_track_check " + " = " + str(EN_track_results[track_profiles[i].uid()][0]) + " WHERE uid = " + str(track_profiles[i].uid()) + ";" + main.dbinteract(query) return EN_track_results[uid] diff --git a/util/main.py b/util/main.py index 3ebd8dd..8be824f 100644 --- a/util/main.py +++ b/util/main.py @@ -7,7 +7,7 @@ import testingProfile from numbers import Number import sys -import tempfile +import tempfile, psycopg2 def importQC(dir): ''' @@ -165,3 +165,29 @@ def dictify(rows, keys): dicts.append(d) return dicts + +def dbinteract(command, tries=0): + ''' + execute the given command with the cursor provided; + catch errors and retry a maximum number of times. + ''' + + max_retry = 99 + conn = psycopg2.connect("dbname='root' user='root'") + conn.autocommit = True + cur = conn.cursor() + try: + print 'attempting', command, tries + cur.execute(command) + cur.close() + conn.close() + except psycopg2.Error as e: + conn.rollback() + cur.close() + conn.close() + if tries < max_retries: + dbinteract(cur, command, tries+1) + else: + return -1 + + return tries From a81f669504596c7c9a309935cdcf44da60e39c68 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 7 Aug 2016 19:37:39 +0000 Subject: [PATCH 62/79] skip en_track for profiles already done --- build-db.py | 2 +- qctests/EN_track_check.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build-db.py b/build-db.py index 549e99b..2b3d4d8 100644 --- a/build-db.py +++ b/build-db.py @@ -43,7 +43,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) - while True: + for xx in range(10): # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index ddc566c..7e3fc3e 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -32,12 +32,12 @@ def test(p): return np.zeros(1, dtype=bool) # don't bother if this has already been analyzed - # cur.execute('SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';') - # en_track_result = cur.fetchall() - # if en_track_result[0][0] is not None: - # result = np.zeros(1, dtype=bool) - # result[0] = en_track_result[0][0] - # return result + cur.execute('SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';') + en_track_result = cur.fetchall() + if en_track_result[0][0] is not None: + result = np.zeros(1, dtype=bool) + result[0] = en_track_result[0][0] + return result # some detector types cannot be assessed by this test; do not raise flag. if p.probe_type in [None]: From 49f5240e666cecf51f62057d1be7ce193b255b1b Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 7 Aug 2016 19:42:50 +0000 Subject: [PATCH 63/79] cleanup --- build-db.py | 2 +- util/main.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/build-db.py b/build-db.py index 2b3d4d8..549e99b 100644 --- a/build-db.py +++ b/build-db.py @@ -43,7 +43,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) - for xx in range(10): + while True: # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) diff --git a/util/main.py b/util/main.py index 8be824f..1b4f38f 100644 --- a/util/main.py +++ b/util/main.py @@ -177,7 +177,6 @@ def dbinteract(command, tries=0): conn.autocommit = True cur = conn.cursor() try: - print 'attempting', command, tries cur.execute(command) cur.close() conn.close() From 620ff07dbeb6021c88a3150523cdfdbedd81c8bc Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Wed, 10 Aug 2016 05:51:15 +0000 Subject: [PATCH 64/79] corrections to en_track --- build-db.py | 2 +- qctests/EN_track_check.py | 26 +++++++++++--------------- util/main.py | 10 +++++++--- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/build-db.py b/build-db.py index 549e99b..ccca69f 100644 --- a/build-db.py +++ b/build-db.py @@ -43,7 +43,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) - while True: + for xx in range(1000): # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index 7e3fc3e..2d37de2 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -20,39 +20,35 @@ def test(p): passed the check and True where it failed. """ - conn = psycopg2.connect("dbname='root' user='root'") - conn.autocommit = True - cur = conn.cursor() - cruise = p.cruise() uid = p.uid() # don't bother if cruise == 0 or None if cruise in [0, None]: return np.zeros(1, dtype=bool) - + # don't bother if this has already been analyzed - cur.execute('SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';') - en_track_result = cur.fetchall() + command = 'SELECT en_track_check FROM ' + sys.argv[1] + ' WHERE uid = ' + str(uid) + ';' + en_track_result = main.dbinteract(command) if en_track_result[0][0] is not None: result = np.zeros(1, dtype=bool) result[0] = en_track_result[0][0] return result - + # some detector types cannot be assessed by this test; do not raise flag. if p.probe_type in [None]: return np.zeros(1, dtype=bool) - + # fetch all profiles on track, sorted chronologically, earliest first (None sorted as highest) - cur.execute('SELECT raw FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + 'ORDER BY year, month, day, time ASC;') - track_rows = cur.fetchall() + command = 'SELECT raw FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + 'ORDER BY year, month, day, time ASC;' + track_rows = main.dbinteract(command) track_profiles = [main.text2wod(raw[0]) for raw in track_rows] - + # start all as passing by default: EN_track_results = {} for i in range(len(track_profiles)): EN_track_results[track_profiles[i].uid()] = np.zeros(1, dtype=bool) - + # copy the list of headers; # remove entries as they are flagged. passed_profiles = copy.deepcopy(track_profiles) @@ -62,12 +58,12 @@ def test(p): passed_index = [x for x in range(len(passed_profiles)) if x not in rejects ] passed_profiles = [passed_profiles[index] for index in passed_index ] rejects = findOutlier(passed_profiles, EN_track_results) - + # if more than half got rejected, reject everyone if len(passed_profiles) < len(track_rows) / 2: for i in range(len(track_profiles)): EN_track_results[track_profiles[i].uid()][0] = True - + # write all to db for i in range(len(track_profiles)): query = "UPDATE " + sys.argv[1] + " SET en_track_check " + " = " + str(EN_track_results[track_profiles[i].uid()][0]) + " WHERE uid = " + str(track_profiles[i].uid()) + ";" diff --git a/util/main.py b/util/main.py index 1b4f38f..88e6e42 100644 --- a/util/main.py +++ b/util/main.py @@ -178,15 +178,19 @@ def dbinteract(command, tries=0): cur = conn.cursor() try: cur.execute(command) + try: + result = cur.fetchall() + except: + result = None cur.close() conn.close() + return result except psycopg2.Error as e: + print 'failed', command, 'on try number', tries conn.rollback() cur.close() conn.close() if tries < max_retries: - dbinteract(cur, command, tries+1) + dbinteract(command, tries+1) else: return -1 - - return tries From 9bacbee96e1072eaff976193707c3e3a9097acfe Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 11 Aug 2016 15:35:25 +0000 Subject: [PATCH 65/79] fiddling with EN_track --- qctests/EN_track_check.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index 2d37de2..c6498b4 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -23,8 +23,8 @@ def test(p): cruise = p.cruise() uid = p.uid() - # don't bother if cruise == 0 or None - if cruise in [0, None]: + # don't bother if cruise == 0 or None, or if timestamp is corrupt + if (cruise in [0, None]) or (None in [p.year(), p.month(), p.day(), p.time()]): return np.zeros(1, dtype=bool) # don't bother if this has already been analyzed @@ -40,7 +40,7 @@ def test(p): return np.zeros(1, dtype=bool) # fetch all profiles on track, sorted chronologically, earliest first (None sorted as highest) - command = 'SELECT raw FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + 'ORDER BY year, month, day, time ASC;' + command = 'SELECT raw FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + ' and year is not null and month is not null and day is not null and time is not null ORDER BY year, month, day, time ASC;' track_rows = main.dbinteract(command) track_profiles = [main.text2wod(raw[0]) for raw in track_rows] From ac5920127c813a2ae777f186fefa8940381bd894 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Fri, 12 Aug 2016 17:23:20 +0000 Subject: [PATCH 66/79] implement global parameter store upstream of parallelization --- AutoQC.py | 19 ++++++++++++++----- build-db.py | 2 +- qctests/Argo_global_range_check.py | 2 +- qctests/Argo_gradient_test.py | 2 +- qctests/Argo_impossible_date_test.py | 2 +- qctests/Argo_impossible_location_test.py | 2 +- qctests/Argo_pressure_increasing_test.py | 2 +- qctests/Argo_regional_range_test.py | 2 +- qctests/Argo_spike_test.py | 2 +- qctests/CSIRO_constant_bottom.py | 4 ++-- qctests/CSIRO_depth.py | 4 ++-- qctests/CSIRO_long_gradient.py | 4 ++-- qctests/CSIRO_short_gradient.py | 4 ++-- qctests/CSIRO_surface_spikes.py | 4 ++-- qctests/CSIRO_wire_break.py | 4 ++-- qctests/CoTeDe_Argo_density_inversion.py | 2 +- qctests/CoTeDe_GTSPP_WOA_normbias.py | 2 +- qctests/CoTeDe_GTSPP_global_range.py | 2 +- qctests/CoTeDe_GTSPP_gradient.py | 2 +- qctests/CoTeDe_GTSPP_profile_envelop.py | 2 +- qctests/CoTeDe_GTSPP_spike_check.py | 2 +- qctests/CoTeDe_Morello2014.py | 2 +- qctests/CoTeDe_WOA_normbias.py | 2 +- qctests/CoTeDe_anomaly_detection.py | 2 +- qctests/CoTeDe_digit_roll_over.py | 2 +- qctests/CoTeDe_fuzzy_logic.py | 2 +- qctests/CoTeDe_gradient.py | 2 +- qctests/CoTeDe_location_at_sea_test.py | 2 +- qctests/CoTeDe_rate_of_change.py | 2 +- qctests/CoTeDe_spike.py | 2 +- qctests/CoTeDe_tukey53H_norm.py | 2 +- qctests/EN_background_available_check.py | 2 +- qctests/EN_background_check.py | 8 ++++---- qctests/EN_constant_value_check.py | 2 +- qctests/EN_increasing_depth_check.py | 8 ++++---- qctests/EN_range_check.py | 2 +- qctests/EN_spike_and_step_check.py | 2 +- qctests/EN_spike_and_step_suspect.py | 4 ++-- qctests/EN_stability_check.py | 2 +- qctests/EN_std_lev_bkg_and_buddy_check.py | 14 +++++++------- qctests/EN_track_check.py | 2 +- qctests/ICDC_aqc_01_level_order.py | 4 ++-- qctests/ICDC_aqc_02_crude_range.py | 4 ++-- qctests/ICDC_aqc_04_max_obs_depth.py | 4 ++-- qctests/ICDC_aqc_05_stuck_value.py | 4 ++-- qctests/ICDC_aqc_06_n_temperature_extrema.py | 4 ++-- qctests/ICDC_aqc_07_spike_check.py | 4 ++-- qctests/ICDC_aqc_08_gradient_check.py | 4 ++-- .../ICDC_aqc_09_local_climatology_check.py | 10 +++++++--- qctests/WOD_gradient_check.py | 2 +- qctests/WOD_range_check.py | 2 +- qctests/loose_location_at_sea.py | 2 +- 52 files changed, 97 insertions(+), 84 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index c8e74c6..b582bad 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -8,7 +8,7 @@ from multiprocessing import Pool import tempfile -def run(test, profiles): +def run(test, profiles, parameters): ''' run on a list of , return an array summarizing when exceptions were raised ''' @@ -16,7 +16,7 @@ def run(test, profiles): verbose = [] exec('from qctests import ' + test) for profile in profiles: - exec('result = ' + test + '.test(profile)') + exec('result = ' + test + '.test(profile, parameters)') #demand tests returned bools: for i in result: @@ -34,7 +34,7 @@ def run(test, profiles): # Identify and import tests testNames = main.importQC('qctests') testNames.sort() - testNames.remove('ICDC_aqc_09_local_climatology_check') + testNames = ['ICDC_aqc_01_level_order', 'ICDC_aqc_04_max_obs_depth', 'ICDC_aqc_06_n_temperature_extrema', 'ICDC_aqc_08_gradient_check', 'ICDC_aqc_02_crude_range', 'ICDC_aqc_05_stuck_value', 'ICDC_aqc_07_spike_check', 'ICDC_aqc_09_local_climatology_check'] print('{} quality control checks have been found'.format(len(testNames))) testNames = main.checkQCTestRequirements(testNames) print('{} quality control checks are able to be run:'.format(len(testNames))) @@ -46,7 +46,7 @@ def run(test, profiles): def process_row(uid): '''run all tests on the indicated database row''' - + # extract profile profile = main.get_profile_from_db(cur, uid) @@ -61,9 +61,18 @@ def process_row(uid): print uid for itest, test in enumerate(testNames): print test - result = run(test, [profile]) + result = run(test, [profile], parameterStore) query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) + + # set up global parmaeter store + parameterStore = {} + for test in testNames: + exec('from qctests import ' + test) + try: + exec(test + '.loadParameters(parameterStore)') + except: + print 'No parameters to load for', test # connect to database & fetch list of all uids conn = psycopg2.connect("dbname='root' user='root'") diff --git a/build-db.py b/build-db.py index ccca69f..5f3a9c5 100644 --- a/build-db.py +++ b/build-db.py @@ -43,7 +43,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) - for xx in range(1000): + for xx in range(1): # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) diff --git a/qctests/Argo_global_range_check.py b/qctests/Argo_global_range_check.py index f20cc95..184e95c 100644 --- a/qctests/Argo_global_range_check.py +++ b/qctests/Argo_global_range_check.py @@ -7,7 +7,7 @@ from util import obs_utils -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/Argo_gradient_test.py b/qctests/Argo_gradient_test.py index 4daddf6..06648be 100644 --- a/qctests/Argo_gradient_test.py +++ b/qctests/Argo_gradient_test.py @@ -5,7 +5,7 @@ import numpy from util import obs_utils -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/Argo_impossible_date_test.py b/qctests/Argo_impossible_date_test.py index 963736b..1c6ccd1 100644 --- a/qctests/Argo_impossible_date_test.py +++ b/qctests/Argo_impossible_date_test.py @@ -7,7 +7,7 @@ import numpy import calendar -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/Argo_impossible_location_test.py b/qctests/Argo_impossible_location_test.py index 8a2276f..ac4dfce 100644 --- a/qctests/Argo_impossible_location_test.py +++ b/qctests/Argo_impossible_location_test.py @@ -5,7 +5,7 @@ import numpy import calendar -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/Argo_pressure_increasing_test.py b/qctests/Argo_pressure_increasing_test.py index 6f25b89..e813d86 100644 --- a/qctests/Argo_pressure_increasing_test.py +++ b/qctests/Argo_pressure_increasing_test.py @@ -9,7 +9,7 @@ import numpy as np from util import obs_utils -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/Argo_regional_range_test.py b/qctests/Argo_regional_range_test.py index 3e2d89e..c035278 100644 --- a/qctests/Argo_regional_range_test.py +++ b/qctests/Argo_regional_range_test.py @@ -6,7 +6,7 @@ import pyproj from shapely.geometry import Polygon, Point -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/Argo_spike_test.py b/qctests/Argo_spike_test.py index a302571..69e387f 100644 --- a/qctests/Argo_spike_test.py +++ b/qctests/Argo_spike_test.py @@ -5,7 +5,7 @@ import numpy from util import obs_utils -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/CSIRO_constant_bottom.py b/qctests/CSIRO_constant_bottom.py index 1a0efde..2442010 100644 --- a/qctests/CSIRO_constant_bottom.py +++ b/qctests/CSIRO_constant_bottom.py @@ -5,7 +5,7 @@ import numpy -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has @@ -37,4 +37,4 @@ def test(p): if t.data[-1] == t.data[-2] and latitude > -40 and d.data[-1] - d.data[-2] > 30: qc[-1] = True - return qc \ No newline at end of file + return qc diff --git a/qctests/CSIRO_depth.py b/qctests/CSIRO_depth.py index d86d9d4..7ebc8d3 100644 --- a/qctests/CSIRO_depth.py +++ b/qctests/CSIRO_depth.py @@ -5,7 +5,7 @@ import numpy -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has @@ -30,4 +30,4 @@ def test(p): if isXBT and d.data[i] < 3.6: qc[i] = True - return qc \ No newline at end of file + return qc diff --git a/qctests/CSIRO_long_gradient.py b/qctests/CSIRO_long_gradient.py index ad3308d..888d2e2 100644 --- a/qctests/CSIRO_long_gradient.py +++ b/qctests/CSIRO_long_gradient.py @@ -5,7 +5,7 @@ import numpy -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has @@ -49,4 +49,4 @@ def test(p): if abs(gradlong) < 4: qc[potential_flag] = True - return qc \ No newline at end of file + return qc diff --git a/qctests/CSIRO_short_gradient.py b/qctests/CSIRO_short_gradient.py index 959756a..c5cd3e6 100644 --- a/qctests/CSIRO_short_gradient.py +++ b/qctests/CSIRO_short_gradient.py @@ -5,7 +5,7 @@ import numpy -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has @@ -34,4 +34,4 @@ def test(p): if abs(deltaT) > 0.4: qc[i] = True - return qc \ No newline at end of file + return qc diff --git a/qctests/CSIRO_surface_spikes.py b/qctests/CSIRO_surface_spikes.py index f88c601..8f62894 100644 --- a/qctests/CSIRO_surface_spikes.py +++ b/qctests/CSIRO_surface_spikes.py @@ -5,7 +5,7 @@ import numpy -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has @@ -35,4 +35,4 @@ def test(p): else: break - return qc \ No newline at end of file + return qc diff --git a/qctests/CSIRO_wire_break.py b/qctests/CSIRO_wire_break.py index 68fc2e7..a8f13a8 100644 --- a/qctests/CSIRO_wire_break.py +++ b/qctests/CSIRO_wire_break.py @@ -5,7 +5,7 @@ import numpy -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has @@ -28,4 +28,4 @@ def test(p): if t.data[-1] < -2.8 or t.data[-1] > 36: qc[-1] = True - return qc \ No newline at end of file + return qc diff --git a/qctests/CoTeDe_Argo_density_inversion.py b/qctests/CoTeDe_Argo_density_inversion.py index 26b9493..dcce7b0 100644 --- a/qctests/CoTeDe_Argo_density_inversion.py +++ b/qctests/CoTeDe_Argo_density_inversion.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the density inversion QC from the CoTeDe Argo config.''' config = 'argo' diff --git a/qctests/CoTeDe_GTSPP_WOA_normbias.py b/qctests/CoTeDe_GTSPP_WOA_normbias.py index e040cd2..5f6bc98 100644 --- a/qctests/CoTeDe_GTSPP_WOA_normbias.py +++ b/qctests/CoTeDe_GTSPP_WOA_normbias.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the WOA normbias QC from the CoTeDe GTSPP config.''' config = 'gtspp' diff --git a/qctests/CoTeDe_GTSPP_global_range.py b/qctests/CoTeDe_GTSPP_global_range.py index 4d4896d..6e3588c 100644 --- a/qctests/CoTeDe_GTSPP_global_range.py +++ b/qctests/CoTeDe_GTSPP_global_range.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the global range QC from the CoTeDe GTSPP config.''' config = 'gtspp' diff --git a/qctests/CoTeDe_GTSPP_gradient.py b/qctests/CoTeDe_GTSPP_gradient.py index da97a9d..32e9acd 100644 --- a/qctests/CoTeDe_GTSPP_gradient.py +++ b/qctests/CoTeDe_GTSPP_gradient.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the gradient QC from the CoTeDe GTSPP config.''' config = 'gtspp' diff --git a/qctests/CoTeDe_GTSPP_profile_envelop.py b/qctests/CoTeDe_GTSPP_profile_envelop.py index 1645451..cecdfc1 100644 --- a/qctests/CoTeDe_GTSPP_profile_envelop.py +++ b/qctests/CoTeDe_GTSPP_profile_envelop.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the profile_envelop QC from the CoTeDe config.''' config = 'cotede' diff --git a/qctests/CoTeDe_GTSPP_spike_check.py b/qctests/CoTeDe_GTSPP_spike_check.py index eaa68fe..564a083 100644 --- a/qctests/CoTeDe_GTSPP_spike_check.py +++ b/qctests/CoTeDe_GTSPP_spike_check.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the spike QC from the CoTeDe GTSPP config.''' config = 'gtspp' diff --git a/qctests/CoTeDe_Morello2014.py b/qctests/CoTeDe_Morello2014.py index fbdcf6d..6df15a4 100644 --- a/qctests/CoTeDe_Morello2014.py +++ b/qctests/CoTeDe_Morello2014.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the CoTeDe Morello 2014 QC.''' config = 'morello2014' diff --git a/qctests/CoTeDe_WOA_normbias.py b/qctests/CoTeDe_WOA_normbias.py index 2b9bc1c..af6e58c 100644 --- a/qctests/CoTeDe_WOA_normbias.py +++ b/qctests/CoTeDe_WOA_normbias.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the WOA normbias QC from the CoTeDe config.''' config = 'cotede' diff --git a/qctests/CoTeDe_anomaly_detection.py b/qctests/CoTeDe_anomaly_detection.py index d1c4f05..6a5d615 100644 --- a/qctests/CoTeDe_anomaly_detection.py +++ b/qctests/CoTeDe_anomaly_detection.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the CoTeDe Anomaly Detection QC.''' config = 'anomaly_detection' diff --git a/qctests/CoTeDe_digit_roll_over.py b/qctests/CoTeDe_digit_roll_over.py index f1d0c0a..4cf1e4a 100644 --- a/qctests/CoTeDe_digit_roll_over.py +++ b/qctests/CoTeDe_digit_roll_over.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the digit roll over QC from the CoTeDe config.''' config = 'cotede' diff --git a/qctests/CoTeDe_fuzzy_logic.py b/qctests/CoTeDe_fuzzy_logic.py index 39449b3..692511a 100644 --- a/qctests/CoTeDe_fuzzy_logic.py +++ b/qctests/CoTeDe_fuzzy_logic.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the CoTeDe fuzzy logic QC.''' config = 'fuzzylogic' diff --git a/qctests/CoTeDe_gradient.py b/qctests/CoTeDe_gradient.py index 820bf6c..18acc1d 100644 --- a/qctests/CoTeDe_gradient.py +++ b/qctests/CoTeDe_gradient.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the gradient QC from the CoTeDe config.''' config = 'cotede' diff --git a/qctests/CoTeDe_location_at_sea_test.py b/qctests/CoTeDe_location_at_sea_test.py index 48cb346..0cdc83f 100644 --- a/qctests/CoTeDe_location_at_sea_test.py +++ b/qctests/CoTeDe_location_at_sea_test.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the CoTeDe location at sea QC.''' config = 'cotede' diff --git a/qctests/CoTeDe_rate_of_change.py b/qctests/CoTeDe_rate_of_change.py index f852aa0..3dcd16e 100644 --- a/qctests/CoTeDe_rate_of_change.py +++ b/qctests/CoTeDe_rate_of_change.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the rate_of_change QC from the CoTeDe config.''' config = 'cotede' diff --git a/qctests/CoTeDe_spike.py b/qctests/CoTeDe_spike.py index 004ebd2..6e03851 100644 --- a/qctests/CoTeDe_spike.py +++ b/qctests/CoTeDe_spike.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the spike QC from the CoTeDe config.''' config = 'cotede' diff --git a/qctests/CoTeDe_tukey53H_norm.py b/qctests/CoTeDe_tukey53H_norm.py index a444708..48c59a7 100644 --- a/qctests/CoTeDe_tukey53H_norm.py +++ b/qctests/CoTeDe_tukey53H_norm.py @@ -1,6 +1,6 @@ from cotede_qc.cotede_test import get_qc -def test(p): +def test(p, parameters): '''Run the tukey53H norm QC from the CoTeDe config.''' config = 'cotede' diff --git a/qctests/EN_background_available_check.py b/qctests/EN_background_available_check.py index ca9f93e..8bd19b8 100644 --- a/qctests/EN_background_available_check.py +++ b/qctests/EN_background_available_check.py @@ -9,7 +9,7 @@ from qctests.EN_background_check import auxParam from qctests.EN_background_check import findGridCell -def test(p, *args): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/EN_background_check.py b/qctests/EN_background_check.py index af3f455..d98e554 100644 --- a/qctests/EN_background_check.py +++ b/qctests/EN_background_check.py @@ -8,7 +8,7 @@ import util.obs_utils as outils from netCDF4 import Dataset -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has @@ -18,12 +18,12 @@ def test(p): # Check if the QC of this profile was already done and if not # run the QC. if p.uid() != uid or p.uid() is None: - run_qc(p) + run_qc(p, parameters) # QC results are in the module variable. return qc -def run_qc(p): +def run_qc(p, parameters): """ Performs the QC check. """ @@ -70,7 +70,7 @@ def run_qc(p): isData = isTemperature & isDepth # Use the EN_spike_and_step_check to find suspect values. - suspect = EN_spike_and_step_check.test(p, suspect=True) + suspect = EN_spike_and_step_check.test(p, parameters, suspect=True) # Loop over levels. for iLevel in range(p.n_levels()): diff --git a/qctests/EN_constant_value_check.py b/qctests/EN_constant_value_check.py index 82df764..3993413 100644 --- a/qctests/EN_constant_value_check.py +++ b/qctests/EN_constant_value_check.py @@ -5,7 +5,7 @@ import numpy -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/EN_increasing_depth_check.py b/qctests/EN_increasing_depth_check.py index 68cf77d..19eced3 100644 --- a/qctests/EN_increasing_depth_check.py +++ b/qctests/EN_increasing_depth_check.py @@ -6,7 +6,7 @@ import numpy as np from collections import Counter -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has @@ -14,12 +14,12 @@ def test(p): """ if p.uid() != uid or p.uid() is None: - run_qc(p) + run_qc(p, parameters) # QC results are in the module variable. return qc -def run_qc(p): +def run_qc(p, parameters): global qc, uid @@ -79,7 +79,7 @@ def run_qc(p): try: spikeqc except: - spikeqc = EN_spike_and_step_check.test(p) + spikeqc = EN_spike_and_step_check.test(p, parameters) if spikeqc[currentLev]: qc[currentLev] = True if spikeqc[otherLev]: qc[otherLev] = True if spikeqc[currentLev] == False and spikeqc[otherLev] == False: diff --git a/qctests/EN_range_check.py b/qctests/EN_range_check.py index 95205be..ee62108 100644 --- a/qctests/EN_range_check.py +++ b/qctests/EN_range_check.py @@ -3,7 +3,7 @@ system. """ -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/EN_spike_and_step_check.py b/qctests/EN_spike_and_step_check.py index b35ab7a..adeb664 100644 --- a/qctests/EN_spike_and_step_check.py +++ b/qctests/EN_spike_and_step_check.py @@ -10,7 +10,7 @@ import numpy as np -def test(p, suspect=False): +def test(p, parameters, suspect=False): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/EN_spike_and_step_suspect.py b/qctests/EN_spike_and_step_suspect.py index e90dda4..485aa17 100644 --- a/qctests/EN_spike_and_step_suspect.py +++ b/qctests/EN_spike_and_step_suspect.py @@ -2,6 +2,6 @@ import EN_spike_and_step_check -def test(p): +def test(p, parameters): - return EN_spike_and_step_check.test(p, suspect=True) + return EN_spike_and_step_check.test(p, parameters, suspect=True) diff --git a/qctests/EN_stability_check.py b/qctests/EN_stability_check.py index 2c8ee51..84500af 100644 --- a/qctests/EN_stability_check.py +++ b/qctests/EN_stability_check.py @@ -5,7 +5,7 @@ import math, numpy -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py index 84c7fca..e55bafc 100644 --- a/qctests/EN_std_lev_bkg_and_buddy_check.py +++ b/qctests/EN_std_lev_bkg_and_buddy_check.py @@ -16,7 +16,7 @@ import numpy as np import sys -def test(p, allow_level_reinstating=True): +def test(p, parameters, allow_level_reinstating=True): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has @@ -223,12 +223,12 @@ def stdLevelData(p): """ # Combine other QC results. - preQC = (EN_background_check.test(p) | - EN_constant_value_check.test(p) | - EN_increasing_depth_check.test(p) | - EN_range_check.test(p) | - EN_spike_and_step_check.test(p) | - EN_stability_check.test(p)) + preQC = (EN_background_check.test(p, parameters) | + EN_constant_value_check.test(p, parameters) | + EN_increasing_depth_check.test(p, parameters) | + EN_range_check.test(p, parameters) | + EN_spike_and_step_check.test(p, parameters) | + EN_stability_check.test(p, parameters)) # Get the data stored by the EN background check. # As it was run above we know that the data held by the diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index c6498b4..f430ec0 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -13,7 +13,7 @@ DistRes = 20000. # meters TimeRes = 600. # seconds -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/ICDC_aqc_01_level_order.py b/qctests/ICDC_aqc_01_level_order.py index b64688c..4130e5c 100644 --- a/qctests/ICDC_aqc_01_level_order.py +++ b/qctests/ICDC_aqc_01_level_order.py @@ -29,11 +29,11 @@ tr = None qc = None -def test(p): +def test(p, parameters): '''Return a set of QC decisions. This corresponds to levels with negative depths. ''' - + level_order(p) return qc diff --git a/qctests/ICDC_aqc_02_crude_range.py b/qctests/ICDC_aqc_02_crude_range.py index 18e560f..fd34869 100644 --- a/qctests/ICDC_aqc_02_crude_range.py +++ b/qctests/ICDC_aqc_02_crude_range.py @@ -19,10 +19,10 @@ import ICDC_aqc_01_level_order as ICDC import numpy as np -def test(p): +def test(p, parameters): '''Return a set of QC decisions. ''' - + nlevels, z, t = ICDC.reordered_data(p) qc = (t < parminover) | (t > parmaxover) diff --git a/qctests/ICDC_aqc_04_max_obs_depth.py b/qctests/ICDC_aqc_04_max_obs_depth.py index 878ce31..105c5f8 100644 --- a/qctests/ICDC_aqc_04_max_obs_depth.py +++ b/qctests/ICDC_aqc_04_max_obs_depth.py @@ -21,10 +21,10 @@ import numpy as np from util.wod import wod_database -def test(p): +def test(p, parameters): '''Return quality control decisions. ''' - + # Get WOD database. db = wod_database(p) diff --git a/qctests/ICDC_aqc_05_stuck_value.py b/qctests/ICDC_aqc_05_stuck_value.py index 4c70829..eef68bd 100644 --- a/qctests/ICDC_aqc_05_stuck_value.py +++ b/qctests/ICDC_aqc_05_stuck_value.py @@ -19,10 +19,10 @@ import numpy as np from util.wod import wod_database -def test(p): +def test(p, parameters): '''Return quality control decisions. ''' - + # Default set of QC flags to return. qc = np.zeros(p.n_levels(), dtype=bool) diff --git a/qctests/ICDC_aqc_06_n_temperature_extrema.py b/qctests/ICDC_aqc_06_n_temperature_extrema.py index 8e4bbee..b0c46e5 100644 --- a/qctests/ICDC_aqc_06_n_temperature_extrema.py +++ b/qctests/ICDC_aqc_06_n_temperature_extrema.py @@ -19,10 +19,10 @@ import ICDC_aqc_01_level_order as ICDC import numpy as np -def test(p): +def test(p, parameters): '''Return quality control decisions. ''' - + # Initialise data. qc = np.zeros(p.n_levels(), dtype=bool) parminover = -2.3 diff --git a/qctests/ICDC_aqc_07_spike_check.py b/qctests/ICDC_aqc_07_spike_check.py index 5be4abc..03facd3 100644 --- a/qctests/ICDC_aqc_07_spike_check.py +++ b/qctests/ICDC_aqc_07_spike_check.py @@ -20,10 +20,10 @@ import ICDC_aqc_01_level_order as ICDC import numpy as np -def test(p): +def test(p, parameters): '''Return quality control decisions. ''' - + # The test is run on re-ordered data. nlevels, z, t = ICDC.reordered_data(p) qc = np.zeros(nlevels, dtype=bool) diff --git a/qctests/ICDC_aqc_08_gradient_check.py b/qctests/ICDC_aqc_08_gradient_check.py index 4f463bc..d6b43b0 100644 --- a/qctests/ICDC_aqc_08_gradient_check.py +++ b/qctests/ICDC_aqc_08_gradient_check.py @@ -19,10 +19,10 @@ import ICDC_aqc_01_level_order as ICDC import numpy as np -def test(p): +def test(p, parameters): '''Return quality control decisions. ''' - + # Global ranges - data outside these bounds are ignored. parminover = -2.3 parmaxover = 33.0 diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py index daee6f1..f9eb815 100644 --- a/qctests/ICDC_aqc_09_local_climatology_check.py +++ b/qctests/ICDC_aqc_09_local_climatology_check.py @@ -33,10 +33,10 @@ import os import time -def test(p): +def test(p, parameters): '''Return quality control decisions. ''' - + # The test is run on re-ordered data. nlevels, z, t = ICDC.reordered_data(p) @@ -51,7 +51,7 @@ def test(p): return defaultqc # parameters - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') + nc = parameters['nc'] # Get range. ranges = get_climatology_range(nlevels, z, lat, lon, p.month(), nc) @@ -136,6 +136,10 @@ def get_climatology_range(nlevels, z, lat, lon, month, nc): return tmin, tmax +def loadParameters(parameterStore): + + parameterStore['nc'] = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') + # def read_ascii_and_convert_to_netcdf(): # '''Coverts the ASCII data file to netCDF on first read. # This is much faster to access. diff --git a/qctests/WOD_gradient_check.py b/qctests/WOD_gradient_check.py index a982c61..9179907 100644 --- a/qctests/WOD_gradient_check.py +++ b/qctests/WOD_gradient_check.py @@ -4,7 +4,7 @@ import numpy -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/WOD_range_check.py b/qctests/WOD_range_check.py index 86a8941..a45ae9a 100644 --- a/qctests/WOD_range_check.py +++ b/qctests/WOD_range_check.py @@ -5,7 +5,7 @@ import numpy import data.ds as ds -def test(p): +def test(p, parameters): """ Runs the quality control check on profile p and returns a numpy array of quality control decisions with False where the data value has diff --git a/qctests/loose_location_at_sea.py b/qctests/loose_location_at_sea.py index 0aa8357..f3171d3 100644 --- a/qctests/loose_location_at_sea.py +++ b/qctests/loose_location_at_sea.py @@ -23,7 +23,7 @@ etoph[width:-width, -width:] = etoph[width:-width, width:2*width] nc.close() -def test(p): +def test(p, parameters): '''Return an array of QC decisions. There is a QC result per level but these are all set to the same value, determined by the location. ''' From 495bcc405fe5a5c475f6152631eb6a694160ddca Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Fri, 12 Aug 2016 19:36:48 +0000 Subject: [PATCH 67/79] icdc-9 working as expected --- AutoQC.py | 3 --- build-db.py | 2 +- qctests/ICDC_aqc_09_local_climatology_check.py | 14 ++++++-------- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index b582bad..d68773b 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -34,7 +34,6 @@ def run(test, profiles, parameters): # Identify and import tests testNames = main.importQC('qctests') testNames.sort() - testNames = ['ICDC_aqc_01_level_order', 'ICDC_aqc_04_max_obs_depth', 'ICDC_aqc_06_n_temperature_extrema', 'ICDC_aqc_08_gradient_check', 'ICDC_aqc_02_crude_range', 'ICDC_aqc_05_stuck_value', 'ICDC_aqc_07_spike_check', 'ICDC_aqc_09_local_climatology_check'] print('{} quality control checks have been found'.format(len(testNames))) testNames = main.checkQCTestRequirements(testNames) print('{} quality control checks are able to be run:'.format(len(testNames))) @@ -58,9 +57,7 @@ def process_row(uid): return # run tests - print uid for itest, test in enumerate(testNames): - print test result = run(test, [profile], parameterStore) query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) diff --git a/build-db.py b/build-db.py index 5f3a9c5..549e99b 100644 --- a/build-db.py +++ b/build-db.py @@ -43,7 +43,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) - for xx in range(1): + while True: # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py index f9eb815..b026413 100644 --- a/qctests/ICDC_aqc_09_local_climatology_check.py +++ b/qctests/ICDC_aqc_09_local_climatology_check.py @@ -36,34 +36,32 @@ def test(p, parameters): '''Return quality control decisions. ''' - + # The test is run on re-ordered data. nlevels, z, t = ICDC.reordered_data(p) - + # Define default QC. defaultqc = np.zeros(p.n_levels(), dtype=bool) - + # No check for the Caspian Sea or Great Lakes. lat = p.latitude() lon = p.longitude() if ((lat >= 35.0 and lat <= 45.0 and lon >= 45.0 and lon <= 60.0) or (lat >= 40.0 and lat <= 50.0 and lon >= -95.0 and lon <= -75.0)): return defaultqc - + # parameters nc = parameters['nc'] - + # Get range. ranges = get_climatology_range(nlevels, z, lat, lon, p.month(), nc) if ranges is None: return defaultqc - + # Perform the QC. tmin, tmax = ranges qc = ((t < tmin) | (t > tmax)) & (tmin != nc.fillValue) & (tmax != nc.fillValue) - nc.close() - return ICDC.revert_qc_order(p, qc) def get_climatology_range(nlevels, z, lat, lon, month, nc): From 5d78a98350363706f45b70f9b24d8135eb35200b Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sat, 13 Aug 2016 23:55:47 +0000 Subject: [PATCH 68/79] un-broke all the tests that recent changes broke --- qctests/EN_std_lev_bkg_and_buddy_check.py | 6 ++-- tests/Argo_global_range_check_validation.py | 12 +++---- tests/Argo_gradient_test_validation.py | 20 +++++------ tests/Argo_impossible_date_test_validation.py | 12 +++---- ...rgo_impossible_location_test_validation.py | 4 +-- ...rgo_pressure_increasing_test_validation.py | 4 +-- tests/Argo_regional_range_test_validation.py | 4 +-- tests/Argo_spike_test_validation.py | 20 +++++------ tests/CSIRO_constant_bottom_validation.py | 12 +++---- tests/CSIRO_depth_validation.py | 6 ++-- tests/CSIRO_long_gradient_validation.py | 6 ++-- tests/CSIRO_short_gradient_validation.py | 6 ++-- tests/CSIRO_surface_spikes.py | 6 ++-- tests/CSIRO_wire_break_validation.py | 12 +++---- tests/CoTeDe_checks_validation.py | 36 +++++++++---------- ...N_background_available_check_validation.py | 4 +-- tests/EN_background_check_validation.py | 2 +- tests/EN_constant_value_check_validation.py | 8 ++--- tests/EN_increasing_depth_check_validation.py | 12 +++---- tests/EN_range_check_validation.py | 8 ++--- tests/EN_spike_and_step_check_validation.py | 18 +++++----- tests/EN_stability_check_validation.py | 4 +-- ...N_std_level_background_check_validation.py | 8 ++--- tests/EN_track_validation.py | 10 +++--- tests/ICDC_aqc_01_level_order_validation.py | 4 +-- tests/ICDC_aqc_02_crude_range_validation.py | 2 +- tests/ICDC_aqc_04_max_obs_depth_validation.py | 2 +- tests/ICDC_aqc_05_stuck_value_validation.py | 2 +- ...aqc_06_n_temperature_extrema_validation.py | 2 +- tests/ICDC_aqc_07_spike_check_validation.py | 2 +- .../ICDC_aqc_08_gradient_check_validation.py | 2 +- ...c_09_local_climatology_check_validation.py | 7 ++-- tests/WOD_gradient_check_validation.py | 8 ++--- tests/WOD_range_check_validation.py | 4 +-- tests/loose_location_at_sea_validation.py | 16 ++++----- 35 files changed, 146 insertions(+), 145 deletions(-) diff --git a/qctests/EN_std_lev_bkg_and_buddy_check.py b/qctests/EN_std_lev_bkg_and_buddy_check.py index e55bafc..cb926f5 100644 --- a/qctests/EN_std_lev_bkg_and_buddy_check.py +++ b/qctests/EN_std_lev_bkg_and_buddy_check.py @@ -31,7 +31,7 @@ def test(p, parameters, allow_level_reinstating=True): qc = np.zeros(p.n_levels(), dtype=bool) # Obtain the obs minus background differences on standard levels. - result = stdLevelData(p) + result = stdLevelData(p, parameters) if result is None: return qc # Unpack the results. @@ -70,7 +70,7 @@ def test(p, parameters, allow_level_reinstating=True): Fail = True if Fail == False: - result = stdLevelData(pBuddy) + result = stdLevelData(pBuddy, parameters) if result is not None: levelsBuddy, origLevelsBuddy, assocLevelsBuddy = result bgevBuddy = EN_background_check.bgevStdLevels @@ -216,7 +216,7 @@ def update_pgeData(pgeData, pgeBuddy, levels, levelsBuddy, minDist, profile, bud return pgeData -def stdLevelData(p): +def stdLevelData(p, parameters): """ Combines data that have passed other QC checks to create a set of observation minus background data on standard levels. diff --git a/tests/Argo_global_range_check_validation.py b/tests/Argo_global_range_check_validation.py index a81adfd..6f870f3 100644 --- a/tests/Argo_global_range_check_validation.py +++ b/tests/Argo_global_range_check_validation.py @@ -12,26 +12,26 @@ def test_Argo_global_range_check_temperature(): # should fail despite rounding p = util.testingProfile.fakeProfile([-2.500000001], [100], latitude=0.0) - qc = qctests.Argo_global_range_check.test(p) + qc = qctests.Argo_global_range_check.test(p, None) truth = numpy.zeros(1, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'failed to flag temperature slightly colder than -2.5 C' # -2.5 OK p = util.testingProfile.fakeProfile([-2.5], [100], latitude=0.0) - qc = qctests.Argo_global_range_check.test(p) + qc = qctests.Argo_global_range_check.test(p, None) truth = numpy.zeros(1, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging -2.5 C' # 40 OK p = util.testingProfile.fakeProfile([40], [100], latitude=0.0) - qc = qctests.Argo_global_range_check.test(p) + qc = qctests.Argo_global_range_check.test(p, None) truth = numpy.zeros(1, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging 40 C' # should fail despite rounding p = util.testingProfile.fakeProfile([40.0000001], [100], latitude=0.0) - qc = qctests.Argo_global_range_check.test(p) + qc = qctests.Argo_global_range_check.test(p, None) truth = numpy.zeros(1, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'failed to flag temperature slightly warmer than 40 C' @@ -43,13 +43,13 @@ def test_Argo_global_range_check_pressure(): # should fail despite rounding p = util.testingProfile.fakeProfile([5], obs_utils.pressure_to_depth([-5.00000001], 0.0), latitude=0.0) - qc = qctests.Argo_global_range_check.test(p) + qc = qctests.Argo_global_range_check.test(p, None) truth = numpy.zeros(1, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'failed to flag pressure slightly below -5 ' # -5 OK p = util.testingProfile.fakeProfile([5], obs_utils.pressure_to_depth([-5], 0.0), latitude=0.0) - qc = qctests.Argo_global_range_check.test(p) + qc = qctests.Argo_global_range_check.test(p, None) truth = numpy.zeros(1, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging pressure of -5' diff --git a/tests/Argo_gradient_test_validation.py b/tests/Argo_gradient_test_validation.py index d323c4d..f53b3bd 100644 --- a/tests/Argo_gradient_test_validation.py +++ b/tests/Argo_gradient_test_validation.py @@ -17,26 +17,26 @@ def test_Argo_gradient_test_temperature_shallow(): # pass a marginal positive spike (criteria exactly 9 C): p = util.testingProfile.fakeProfile([2,11,2], [100,200,300], latitude=0.0) - qc = qctests.Argo_gradient_test.test(p) + qc = qctests.Argo_gradient_test.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging a positive spike exactly at threshold (shallow).' # pass a marginal negative spike (criteria exactly 9 C): p = util.testingProfile.fakeProfile([2,-7,2], [100,200,300], latitude=0.0) - qc = qctests.Argo_gradient_test.test(p) + qc = qctests.Argo_gradient_test.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging a negative spike exactly at threshold (shallow).' # fail a marginal positive spike (criteria > 9 C): p = util.testingProfile.fakeProfile([2,11.0001,2], [100,200,300], latitude=0.0) - qc = qctests.Argo_gradient_test.test(p) + qc = qctests.Argo_gradient_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failing to flag a positive spike just above threshold (shallow).' # fail a marginal negative spike (criteria > 9 C): p = util.testingProfile.fakeProfile([2,-7.0001,2], [100,200,300], latitude=0.0) - qc = qctests.Argo_gradient_test.test(p) + qc = qctests.Argo_gradient_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failing to flag a negative spike just above threshold (shallow).' @@ -52,26 +52,26 @@ def test_Argo_gradient_test_temperature_deep(): # pass a marginal positive spike (criteria exactly 9 C): p = util.testingProfile.fakeProfile([2,5,2], [1000,2000,3000], latitude=0.0) - qc = qctests.Argo_gradient_test.test(p) + qc = qctests.Argo_gradient_test.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging a positive spike exactly at threshold. (deep)' # pass a marginal negative spike (criteria exactly 9 C): p = util.testingProfile.fakeProfile([2,-1,2], [1000,2000,3000], latitude=0.0) - qc = qctests.Argo_gradient_test.test(p) + qc = qctests.Argo_gradient_test.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging a negative spike exactly at threshold. (deep)' # fail a marginal positive spike (criteria > 9 C): p = util.testingProfile.fakeProfile([2,5.0001,2], [1000,2000,3000], latitude=0.0) - qc = qctests.Argo_gradient_test.test(p) + qc = qctests.Argo_gradient_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failing to flag a positive spike just above threshold. (deep)' # fail a marginal negative spike (criteria > 9 C): p = util.testingProfile.fakeProfile([2,-1.0001,2], [1000,2000,3000], latitude=0.0) - qc = qctests.Argo_gradient_test.test(p) + qc = qctests.Argo_gradient_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failing to flag a negative spike just above threshold. (deep)' @@ -83,13 +83,13 @@ def test_Argo_gradient_test_temperature_threshold(): # middle value should fail the deep check but pass the shallow check; # at threshold, use deep criteria p = util.testingProfile.fakeProfile([2,5.0001,2], obs_utils.pressure_to_depth([400,500,600], 0.0), latitude=0.0) - qc = qctests.Argo_gradient_test.test(p) + qc = qctests.Argo_gradient_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failing to flag a positive spike just above threshold. (threshold)' # as above, but passes just above 500m p = util.testingProfile.fakeProfile([2,5.0001,2], obs_utils.pressure_to_depth([400,499,600], 0.0), latitude=0.0) - qc = qctests.Argo_gradient_test.test(p) + qc = qctests.Argo_gradient_test.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'flagged a spike using deep criteria when shallow should have been used. (threshold)' diff --git a/tests/Argo_impossible_date_test_validation.py b/tests/Argo_impossible_date_test_validation.py index 43b1541..e43a7d4 100644 --- a/tests/Argo_impossible_date_test_validation.py +++ b/tests/Argo_impossible_date_test_validation.py @@ -10,7 +10,7 @@ def test_Argo_impossible_date_test_year(): year limit in impossible date test ''' p = util.testingProfile.fakeProfile([0], [0], date=[1699, 1, 1, 0]) - qc = qctests.Argo_impossible_date_test.test(p) + qc = qctests.Argo_impossible_date_test.test(p, None) truth = numpy.zeros(1, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'Argo impossible date test must reject everything before 1700.' @@ -20,7 +20,7 @@ def test_Argo_impossible_date_test_month(): month limit in impossible date test ''' p = util.testingProfile.fakeProfile([0], [0], date=[2001, 0, 1, 0]) - qc = qctests.Argo_impossible_date_test.test(p) + qc = qctests.Argo_impossible_date_test.test(p, None) truth = numpy.zeros(1, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'Argo impossible date test should reject month=0 (months counted [1-12])' @@ -30,7 +30,7 @@ def test_Argo_impossible_date_test_day_basic(): basic day check in impossible date test ''' p = util.testingProfile.fakeProfile([0], [0], date=[2001, 2, 29, 0]) - qc = qctests.Argo_impossible_date_test.test(p) + qc = qctests.Argo_impossible_date_test.test(p, None) truth = numpy.zeros(1, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'Argo impossible date test failing to find correct number of days in month presented' @@ -40,7 +40,7 @@ def test_Argo_impossible_date_test_day_leap_year(): make sure impossible date check knows about leap years ''' p = util.testingProfile.fakeProfile([0], [0], date=[2004, 2, 29, 0]) - qc = qctests.Argo_impossible_date_test.test(p) + qc = qctests.Argo_impossible_date_test.test(p, None) truth = numpy.zeros(1, dtype=bool) assert numpy.array_equal(qc, truth), 'Argo impossible date test not correctly identifying leap years' @@ -49,7 +49,7 @@ def test_Argo_impossible_date_test_hour(): hour range in impossible date test ''' p = util.testingProfile.fakeProfile([0], [0], date=[2004, 2, 29, 24]) - qc = qctests.Argo_impossible_date_test.test(p) + qc = qctests.Argo_impossible_date_test.test(p, None) truth = numpy.zeros(1, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'Argo impossible date test not correctly flagging an out of range time; times fall on [0,24)' @@ -59,7 +59,7 @@ def test_Argo_impossible_date_test_hour_missing(): pass the dataset if the time is missing ''' p = util.testingProfile.fakeProfile([0], [0], date=[2004, 1, 29, None]) - qc = qctests.Argo_impossible_date_test.test(p) + qc = qctests.Argo_impossible_date_test.test(p, None) truth = numpy.zeros(1, dtype=bool) assert numpy.array_equal(qc, truth), 'Argo impossible date test not correctly handling missing time data.' diff --git a/tests/Argo_impossible_location_test_validation.py b/tests/Argo_impossible_location_test_validation.py index 21ba4e6..33b94c0 100644 --- a/tests/Argo_impossible_location_test_validation.py +++ b/tests/Argo_impossible_location_test_validation.py @@ -10,7 +10,7 @@ def test_Argo_impossible_location_nominal_lat(): check for flagging an out-of-range latitude ''' p = util.testingProfile.fakeProfile([0], [0], 91, 0) - qc = qctests.Argo_impossible_location_test.test(p) + qc = qctests.Argo_impossible_location_test.test(p, None) truth = numpy.zeros(1, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'failed to flag latitude outside of range [-90, 90]' @@ -20,7 +20,7 @@ def test_Argo_impossible_location_nominal_long(): check for flagging an out-of-range long ''' p = util.testingProfile.fakeProfile([0], [0], 0, 181) - qc = qctests.Argo_impossible_location_test.test(p) + qc = qctests.Argo_impossible_location_test.test(p, None) truth = numpy.zeros(1, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'failed to flag long outside of range [-180, 180]' \ No newline at end of file diff --git a/tests/Argo_pressure_increasing_test_validation.py b/tests/Argo_pressure_increasing_test_validation.py index 7567934..e449383 100644 --- a/tests/Argo_pressure_increasing_test_validation.py +++ b/tests/Argo_pressure_increasing_test_validation.py @@ -11,7 +11,7 @@ def test_Argo_pressure_increasing_test_constantPressure(): ''' p = util.testingProfile.fakeProfile([2,2,2], [100,100,100], latitude=0.0) - qc = qctests.Argo_pressure_increasing_test.test(p) + qc = qctests.Argo_pressure_increasing_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True truth[2] = True @@ -23,7 +23,7 @@ def test_Argo_pressure_increasing_test_pressureInversion(): ''' p = util.testingProfile.fakeProfile([2,2,2], [100,200,100], latitude=0.0) - qc = qctests.Argo_pressure_increasing_test.test(p) + qc = qctests.Argo_pressure_increasing_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True truth[2] = True diff --git a/tests/Argo_regional_range_test_validation.py b/tests/Argo_regional_range_test_validation.py index 3717c0a..b08724b 100644 --- a/tests/Argo_regional_range_test_validation.py +++ b/tests/Argo_regional_range_test_validation.py @@ -11,7 +11,7 @@ def Argo_regional_range_test_mediterranean_hot(): ''' p = util.testingProfile.fakeProfile([40.1, 39.9], [10, 20], 35., 18.) - qc = qctests.Argo_regional_range_test.test(p) + qc = qctests.Argo_regional_range_test.test(p, None) truth = numpy.zeros(2, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'failed to flag hot temperatures in Mediterranean Sea' @@ -22,7 +22,7 @@ def Argo_regional_range_test_red_cold(): ''' p = util.testingProfile.fakeProfile([21.6, 21.8], [10, 20], 22., 38.) - qc = qctests.Argo_regional_range_test.test(p) + qc = qctests.Argo_regional_range_test.test(p, None) truth = numpy.zeros(2, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'failed to flag cold temperatures Red Sea' diff --git a/tests/Argo_spike_test_validation.py b/tests/Argo_spike_test_validation.py index 913e9f0..7a35f3f 100644 --- a/tests/Argo_spike_test_validation.py +++ b/tests/Argo_spike_test_validation.py @@ -17,26 +17,26 @@ def test_Argo_spike_test_temperature_shallow(): # pass a marginal positive spike (criteria exactly 6 C): p = util.testingProfile.fakeProfile([5,11,5], [100,200,300], latitude=0.0) - qc = qctests.Argo_spike_test.test(p) + qc = qctests.Argo_spike_test.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging a positive spike exactly at threshold (shallow).' # pass a marginal negative spike (criteria exactly 6 C): p = util.testingProfile.fakeProfile([5,-1,5], [100,200,300], latitude=0.0) - qc = qctests.Argo_spike_test.test(p) + qc = qctests.Argo_spike_test.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging a negative spike exactly at threshold (shallow).' # fail a marginal positive spike (criteria > 6 C): p = util.testingProfile.fakeProfile([5,11.0001,5], [100,200,300], latitude=0.0) - qc = qctests.Argo_spike_test.test(p) + qc = qctests.Argo_spike_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failing to flag a positive spike just above threshold (shallow).' # fail a marginal negative spike (criteria > 6 C): p = util.testingProfile.fakeProfile([5,-1.0001,5], [100,200,300], latitude=0.0) - qc = qctests.Argo_spike_test.test(p) + qc = qctests.Argo_spike_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failing to flag a negative spike just above threshold (shallow).' @@ -52,26 +52,26 @@ def test_Argo_spike_test_temperature_deep(): # pass a marginal positive spike (criteria exactly 2 C): p = util.testingProfile.fakeProfile([5,7,5], [1000,2000,3000], latitude=0.0) - qc = qctests.Argo_spike_test.test(p) + qc = qctests.Argo_spike_test.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging a positive spike exactly at threshold. (deep)' # pass a marginal negative spike (criteria exactly 2 C): p = util.testingProfile.fakeProfile([5,3,5], [1000,2000,3000], latitude=0.0) - qc = qctests.Argo_spike_test.test(p) + qc = qctests.Argo_spike_test.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging a negative spike exactly at threshold. (deep)' # fail a marginal positive spike (criteria > 2 C): p = util.testingProfile.fakeProfile([5,7.0001,5], [1000,2000,3000], latitude=0.0) - qc = qctests.Argo_spike_test.test(p) + qc = qctests.Argo_spike_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failing to flag a positive spike just above threshold. (deep)' # fail a marginal negative spike (criteria > 2 C): p = util.testingProfile.fakeProfile([5,2.999,5], [1000,2000,3000], latitude=0.0) - qc = qctests.Argo_spike_test.test(p) + qc = qctests.Argo_spike_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failing to flag a negative spike just above threshold. (deep)' @@ -83,13 +83,13 @@ def test_Argo_spike_test_temperature_threshold(): # middle value should fail the deep check but pass the shallow check; # at threshold, use deep criteria p = util.testingProfile.fakeProfile([5,7.0001,5], obs_utils.pressure_to_depth([400,500,600], 0.0), latitude=0.0) - qc = qctests.Argo_spike_test.test(p) + qc = qctests.Argo_spike_test.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failing to flag a positive spike just above threshold. (threshold)' # as above, but passes just above 500m p = util.testingProfile.fakeProfile([5,7.0001,5], obs_utils.pressure_to_depth([400,499,600], 0.0), latitude=0.0) - qc = qctests.Argo_spike_test.test(p) + qc = qctests.Argo_spike_test.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'flagged a spike using deep criteria when shallow should have been used. (threshold)' diff --git a/tests/CSIRO_constant_bottom_validation.py b/tests/CSIRO_constant_bottom_validation.py index f8e44df..4d186c2 100644 --- a/tests/CSIRO_constant_bottom_validation.py +++ b/tests/CSIRO_constant_bottom_validation.py @@ -11,7 +11,7 @@ def test_CSIRO_constant_bottom(): # nominal p = util.testingProfile.fakeProfile([0,0,0], [0,100,200], latitude=0, longitude=0, probe_type=2) - qc = qctests.CSIRO_constant_bottom.test(p) + qc = qctests.CSIRO_constant_bottom.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[2] = True @@ -19,31 +19,31 @@ def test_CSIRO_constant_bottom(): # inappropriate probe type p = util.testingProfile.fakeProfile([0,0,0], [0,100,200], latitude=0, longitude=0, probe_type=1) - qc = qctests.CSIRO_constant_bottom.test(p) + qc = qctests.CSIRO_constant_bottom.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'flagged a constant temperature for an inappropriate probe type' # inappropriate latitude p = util.testingProfile.fakeProfile([0,0,0], [0,100,200], latitude=-41, longitude=0, probe_type=2) - qc = qctests.CSIRO_constant_bottom.test(p) + qc = qctests.CSIRO_constant_bottom.test(p, None) assert numpy.array_equal(qc, truth), 'flagged a constant temperature for an inappropriate latitude' # inappropriate depth difference p = util.testingProfile.fakeProfile([0,0,0], [0,100,100], latitude=0, longitude=0, probe_type=2) - qc = qctests.CSIRO_constant_bottom.test(p) + qc = qctests.CSIRO_constant_bottom.test(p, None) assert numpy.array_equal(qc, truth), 'flagged a constant temperature for an inappropriate depth distance' # not at bottom of profile p = util.testingProfile.fakeProfile([0,0, -1], [100,200,300], latitude=0, longitude=0, probe_type=2) - qc = qctests.CSIRO_constant_bottom.test(p) + qc = qctests.CSIRO_constant_bottom.test(p, None) assert numpy.array_equal(qc, truth), 'flagged a constant temperature not at the bottom of the profile' # don't run with only one level p = util.testingProfile.fakeProfile([0], [100], latitude=0, longitude=0, probe_type=2) - qc = qctests.CSIRO_constant_bottom.test(p) + qc = qctests.CSIRO_constant_bottom.test(p, None) truth = numpy.zeros(1, dtype=bool) assert numpy.array_equal(qc, truth), 'cant perform this check with a single-level profile' diff --git a/tests/CSIRO_depth_validation.py b/tests/CSIRO_depth_validation.py index 2c5015d..122a947 100644 --- a/tests/CSIRO_depth_validation.py +++ b/tests/CSIRO_depth_validation.py @@ -11,7 +11,7 @@ def test_CSIRO_depth(): # too shallow for an xbt p = util.testingProfile.fakeProfile([0,0,0], [0,1,20], probe_type=2) - qc = qctests.CSIRO_depth.test(p) + qc = qctests.CSIRO_depth.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[0] = True truth[1] = True @@ -19,13 +19,13 @@ def test_CSIRO_depth(): # shallow but not an xbt - don't flag p = util.testingProfile.fakeProfile([0,0,0], [0,1,20], probe_type=1) - qc = qctests.CSIRO_depth.test(p) + qc = qctests.CSIRO_depth.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'flagged a non-xbt measurement' # threshold value - don't flag p = util.testingProfile.fakeProfile([0,0,0], [0,3.6,20], probe_type=2) - qc = qctests.CSIRO_depth.test(p) + qc = qctests.CSIRO_depth.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[0] = True print qc diff --git a/tests/CSIRO_long_gradient_validation.py b/tests/CSIRO_long_gradient_validation.py index 6e69f68..8a20383 100644 --- a/tests/CSIRO_long_gradient_validation.py +++ b/tests/CSIRO_long_gradient_validation.py @@ -11,7 +11,7 @@ def test_CSIRO_long_gradient(): # nominal p = util.testingProfile.fakeProfile([20,10,15,15,15,10], [0,5,10,15,20,25]) - qc = qctests.CSIRO_long_gradient.test(p) + qc = qctests.CSIRO_long_gradient.test(p, None) truth = numpy.zeros(6, dtype=bool) truth[1] = True @@ -19,14 +19,14 @@ def test_CSIRO_long_gradient(): # gradlong too large p = util.testingProfile.fakeProfile([20,10,15,15,15,10], [0,10,20,30,40,50]) - qc = qctests.CSIRO_long_gradient.test(p) + qc = qctests.CSIRO_long_gradient.test(p, None) truth = numpy.zeros(6, dtype=bool) assert numpy.array_equal(qc, truth), 'should not flag a long inversion with such a large gradient' # too shallow p = util.testingProfile.fakeProfile([20,10,15,15,15,10], [0,1,6,11,16,21]) - qc = qctests.CSIRO_long_gradient.test(p) + qc = qctests.CSIRO_long_gradient.test(p, None) truth = numpy.zeros(6, dtype=bool) print truth, qc diff --git a/tests/CSIRO_short_gradient_validation.py b/tests/CSIRO_short_gradient_validation.py index 9f6563c..90cb9d2 100644 --- a/tests/CSIRO_short_gradient_validation.py +++ b/tests/CSIRO_short_gradient_validation.py @@ -11,20 +11,20 @@ def test_CSIRO_short_gradient(): # nominal p = util.testingProfile.fakeProfile([0,1], [0,10]) - qc = qctests.CSIRO_short_gradient.test(p) + qc = qctests.CSIRO_short_gradient.test(p, None) truth = numpy.zeros(2, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'failed to flag a gradient at small delta-temp and delta-depth' p = util.testingProfile.fakeProfile([0,10], [0,100]) - qc = qctests.CSIRO_short_gradient.test(p) + qc = qctests.CSIRO_short_gradient.test(p, None) assert numpy.array_equal(qc, truth), 'failed to flag a gradient outside of delta temp and depth ranges, but inside gradshort ranges' # temperature change too small p = util.testingProfile.fakeProfile([0,0.1], [0,0.2]) - qc = qctests.CSIRO_short_gradient.test(p) + qc = qctests.CSIRO_short_gradient.test(p, None) truth = numpy.zeros(2, dtype=bool) assert numpy.array_equal(qc, truth), 'flagged a gradient even though its temperature change was too small to consider' \ No newline at end of file diff --git a/tests/CSIRO_surface_spikes.py b/tests/CSIRO_surface_spikes.py index 03c4250..8f58a5a 100644 --- a/tests/CSIRO_surface_spikes.py +++ b/tests/CSIRO_surface_spikes.py @@ -11,7 +11,7 @@ def test_CSIRO_surface_spikes(): # nominal p = util.testingProfile.fakeProfile([0,0,0], [1,2,3], probe_type=2) - qc = qctests.CSIRO_surface_spikes.test(p) + qc = qctests.CSIRO_surface_spikes.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[0] = True truth[1] = True @@ -20,14 +20,14 @@ def test_CSIRO_surface_spikes(): # inappropriate probe type p = util.testingProfile.fakeProfile([0,0,0], [1,2,3], probe_type=1) - qc = qctests.CSIRO_surface_spikes.test(p) + qc = qctests.CSIRO_surface_spikes.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'flagged shallow profiles for an inappropriate probe type' # no cluster p = util.testingProfile.fakeProfile([0,0,0], [1,20,30], probe_type=1) - qc = qctests.CSIRO_surface_spikes.test(p) + qc = qctests.CSIRO_surface_spikes.test(p, None) truth = numpy.zeros(3, dtype=bool) assert numpy.array_equal(qc, truth), 'flagged shallow profile without a cluster' \ No newline at end of file diff --git a/tests/CSIRO_wire_break_validation.py b/tests/CSIRO_wire_break_validation.py index 90d33c3..10eb772 100644 --- a/tests/CSIRO_wire_break_validation.py +++ b/tests/CSIRO_wire_break_validation.py @@ -11,41 +11,41 @@ def test_CSIRO_wire_break(): # too cold at the bottom of xbt profile p = util.testingProfile.fakeProfile([0,0,-20], [10,20,30], probe_type=2) - qc = qctests.CSIRO_wire_break.test(p) + qc = qctests.CSIRO_wire_break.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[2] = True assert numpy.array_equal(qc, truth), 'failed to flag too-cold temperature at bottom of profile' # too hot at bottom of xbt profile p = util.testingProfile.fakeProfile([0,0,100], [10,20,30], probe_type=2) - qc = qctests.CSIRO_wire_break.test(p) + qc = qctests.CSIRO_wire_break.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[2] = True assert numpy.array_equal(qc, truth), 'failed to flag too-hot temperature at bottom of profile' # right on border - no flag p = util.testingProfile.fakeProfile([0,0,-2.8], [10,20,30], probe_type=2) - qc = qctests.CSIRO_wire_break.test(p) + qc = qctests.CSIRO_wire_break.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[2] = False assert numpy.array_equal(qc, truth), 'flagged marginally cold temperature at bottom of profile' p = util.testingProfile.fakeProfile([0,0,36], [10,20,30], probe_type=2) - qc = qctests.CSIRO_wire_break.test(p) + qc = qctests.CSIRO_wire_break.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[2] = False assert numpy.array_equal(qc, truth), 'flagged marginally hot temperature at bottom of profile' # don't flag if not an xbt p = util.testingProfile.fakeProfile([0,0,-100], [10,20,30], probe_type=1) - qc = qctests.CSIRO_wire_break.test(p) + qc = qctests.CSIRO_wire_break.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[2] = False assert numpy.array_equal(qc, truth), 'flagged non-xbt profile' # don't flag if not at bottom of profile p = util.testingProfile.fakeProfile([0,-100,0], [10,20,30], probe_type=2) - qc = qctests.CSIRO_wire_break.test(p) + qc = qctests.CSIRO_wire_break.test(p, None) truth = numpy.zeros(3, dtype=bool) truth[1] = False assert numpy.array_equal(qc, truth), "flagged cold temperature that wasn't at bottom of profile" \ No newline at end of file diff --git a/tests/CoTeDe_checks_validation.py b/tests/CoTeDe_checks_validation.py index ed7c9ef..6a8e5fc 100644 --- a/tests/CoTeDe_checks_validation.py +++ b/tests/CoTeDe_checks_validation.py @@ -12,7 +12,7 @@ def test_CoTeDe_anomaly_detection(): Make sure CoTeDe anomaly detection is working as expected. ''' import qctests.CoTeDe_anomaly_detection - qc = qctests.CoTeDe_anomaly_detection.test(p) + qc = qctests.CoTeDe_anomaly_detection.test(p, None) assert np.array_equal(qc, expected_qc_anomaly_detection), 'mismatch between qc results and expected values' def test_CoTeDe_Argo_density_inversion(): @@ -30,7 +30,7 @@ def test_CoTeDe_Argo_density_inversion(): longitude = -38.0133333333, date = [2008, 04, 17, 0.94361111], uid = 888) - qc = qctests.CoTeDe_Argo_density_inversion.test(padi) + qc = qctests.CoTeDe_Argo_density_inversion.test(padi, None) assert np.array_equal(qc, expected_qc_Argo_density_inversion), 'mismatch between qc results and expected values' def test_CoTeDe_digit_roll_over(): @@ -38,7 +38,7 @@ def test_CoTeDe_digit_roll_over(): Make sure CoTeDe digit roll over is working as expected. ''' import qctests.CoTeDe_digit_roll_over - qc = qctests.CoTeDe_digit_roll_over.test(p) + qc = qctests.CoTeDe_digit_roll_over.test(p, None) assert np.array_equal(qc, expected_qc_digit_roll_over), 'mismatch between qc results and expected values' def test_CoTeDe_fuzzy_logic(): @@ -46,7 +46,7 @@ def test_CoTeDe_fuzzy_logic(): Make sure CoTeDe fuzzy logic is working as expected. ''' import qctests.CoTeDe_fuzzy_logic - qc = qctests.CoTeDe_fuzzy_logic.test(p) + qc = qctests.CoTeDe_fuzzy_logic.test(p, None) assert np.array_equal(qc, expected_qc_fuzzy_logic), 'mismatch between qc results and expected values' def test_CoTeDe_Morello2014(): @@ -54,7 +54,7 @@ def test_CoTeDe_Morello2014(): Make sure CoTeDe Morello 2014 is working as expected. ''' import qctests.CoTeDe_Morello2014 - qc = qctests.CoTeDe_Morello2014.test(p) + qc = qctests.CoTeDe_Morello2014.test(p, None) for i,j in enumerate(qc): print j, expected_qc_Morello2014[i] assert np.array_equal(qc, expected_qc_Morello2014), 'mismatch between qc results and expected values' @@ -63,7 +63,7 @@ def test_CoTeDe_gradient(): Make sure CoTeDe gradient is working as expected. ''' import qctests.CoTeDe_gradient - qc = qctests.CoTeDe_gradient.test(p) + qc = qctests.CoTeDe_gradient.test(p, None) assert np.array_equal(qc, expected_qc_gradient), 'mismatch between qc results and expected values' def test_CoTeDe_GTSPP_global_range(): @@ -71,7 +71,7 @@ def test_CoTeDe_GTSPP_global_range(): Make sure CoTeDe GTSPP global range is working as expected. ''' import qctests.CoTeDe_GTSPP_global_range - qc = qctests.CoTeDe_GTSPP_global_range.test(p) + qc = qctests.CoTeDe_GTSPP_global_range.test(p, None) assert np.array_equal(qc, expected_qc_GTSPP_global_range), 'mismatch between qc results and expected values' def test_CoTeDe_GTSPP_gradient(): @@ -79,7 +79,7 @@ def test_CoTeDe_GTSPP_gradient(): Make sure CoTeDe gradient is working as expected. ''' import qctests.CoTeDe_GTSPP_gradient - qc = qctests.CoTeDe_GTSPP_gradient.test(p) + qc = qctests.CoTeDe_GTSPP_gradient.test(p, None) assert np.array_equal(qc, expected_qc_GTSPP_gradient), 'mismatch between qc results and expected values' def test_CoTeDe_GTSPP_spike_check(): @@ -87,7 +87,7 @@ def test_CoTeDe_GTSPP_spike_check(): Make sure CoTeDe spike check is working as expected. ''' import qctests.CoTeDe_GTSPP_spike_check - qc = qctests.CoTeDe_GTSPP_spike_check.test(p) + qc = qctests.CoTeDe_GTSPP_spike_check.test(p, None) assert np.array_equal(qc, expected_qc_GTSPP_spike_check), 'mismatch between qc results and expected values' def CoTeDe_GTSPP_WOA_normbias(): @@ -95,7 +95,7 @@ def CoTeDe_GTSPP_WOA_normbias(): Make sure CoTeDe WOA normbias is working as expected. ''' import qctests.CoTeDe_GTSPP_WOA_normbias - qc = qctests.CoTeDe_GTSPP_WOA_normbias.test(p) + qc = qctests.CoTeDe_GTSPP_WOA_normbias.test(p, None) assert np.array_equal(qc, expected_qc_GTSPP_WOA_normbias), 'mismatch between qc results and expected values' def test_CoTeDe_location_at_sea_test_ocean_point(): @@ -103,7 +103,7 @@ def test_CoTeDe_location_at_sea_test_ocean_point(): Make sure CoTeDe location at sea test is working as expected when given an ocean location. ''' import qctests.CoTeDe_location_at_sea_test - qc = qctests.CoTeDe_location_at_sea_test.test(p) + qc = qctests.CoTeDe_location_at_sea_test.test(p, None) assert np.all(qc == False), 'mismatch between qc results and expected values' def test_CoTeDe_location_at_sea_test_land_point(): @@ -118,7 +118,7 @@ def test_CoTeDe_location_at_sea_test_land_point(): longitude = -38.5133333333, date = [2008, 04, 17, 0.94361111], uid = 999) - qc = qctests.CoTeDe_location_at_sea_test.test(pland) + qc = qctests.CoTeDe_location_at_sea_test.test(pland, None) assert np.all(qc), 'mismatch between qc results and expected values' def test_CoTeDe_GTSPP_profile_envelop(): @@ -126,7 +126,7 @@ def test_CoTeDe_GTSPP_profile_envelop(): Make sure CoTeDe profile_envelop is working as expected. ''' import qctests.CoTeDe_GTSPP_profile_envelop - qc = qctests.CoTeDe_GTSPP_profile_envelop.test(p) + qc = qctests.CoTeDe_GTSPP_profile_envelop.test(p, None) assert np.array_equal(qc, expected_qc_profile_envelop), 'mismatch between qc results and expected values' def test_CoTeDe_rate_of_change(): @@ -134,7 +134,7 @@ def test_CoTeDe_rate_of_change(): Make sure CoTeDe rate_of_change is working as expected. ''' import qctests.CoTeDe_rate_of_change - qc = qctests.CoTeDe_rate_of_change.test(p) + qc = qctests.CoTeDe_rate_of_change.test(p, None) assert np.array_equal(qc, expected_qc_roc), 'mismatch between qc results and expected values' def test_CoTeDe_spike(): @@ -142,7 +142,7 @@ def test_CoTeDe_spike(): Make sure CoTeDe spike is working as expected. ''' import qctests.CoTeDe_spike - qc = qctests.CoTeDe_spike.test(p) + qc = qctests.CoTeDe_spike.test(p, None) assert np.array_equal(qc, expected_qc_spike), 'mismatch between qc results and expected values' def test_CoTeDe_tukey53H_norm(): @@ -151,8 +151,8 @@ def test_CoTeDe_tukey53H_norm(): ''' import qctests.CoTeDe_tukey53H_norm import qctests.CoTeDe_GTSPP_gradient - qc = qctests.CoTeDe_GTSPP_gradient.test(p) - qc = qctests.CoTeDe_tukey53H_norm.test(p) + qc = qctests.CoTeDe_GTSPP_gradient.test(p, None) + qc = qctests.CoTeDe_tukey53H_norm.test(p, None) assert np.array_equal(qc, expected_qc_tukey53H_norm), 'mismatch between qc results and expected values' @@ -161,7 +161,7 @@ def test_CoTeDe_WOA_normbias(): Make sure CoTeDe WOA normbias is working as expected. ''' import qctests.CoTeDe_WOA_normbias - qc = qctests.CoTeDe_WOA_normbias.test(p) + qc = qctests.CoTeDe_WOA_normbias.test(p, None) assert np.array_equal(qc, expected_qc_WOA_normbias), 'mismatch between qc results and expected values' diff --git a/tests/EN_background_available_check_validation.py b/tests/EN_background_available_check_validation.py index 887fde8..ef13a1d 100644 --- a/tests/EN_background_available_check_validation.py +++ b/tests/EN_background_available_check_validation.py @@ -11,7 +11,7 @@ def test_EN_background_available_check_depth(): ''' p = util.testingProfile.fakeProfile([1.8, 1.8, 1.8, 1.8], [0.0, 2.5, 5.0, 5600.0], latitude=55.6, longitude=12.9, date=[1900, 01, 15, 0], probe_type=7) - qc = qctests.EN_background_available_check.test(p) + qc = qctests.EN_background_available_check.test(p, None) expected = [False, False, False, True] assert numpy.array_equal(qc, expected), 'mismatch between qc results and expected values' @@ -21,7 +21,7 @@ def test_EN_background_available_check_location(): ''' p = util.testingProfile.fakeProfile([1.8, 1.8, 1.8, 1.8], [0.0, 2.5, 5.0, 7.5], latitude=0.0, longitude=20.0, date=[1900, 01, 15, 0], probe_type=7) - qc = qctests.EN_background_available_check.test(p) + qc = qctests.EN_background_available_check.test(p, None) expected = [True, True, True, True] assert numpy.array_equal(qc, expected), 'mismatch between qc results and expected values' diff --git a/tests/EN_background_check_validation.py b/tests/EN_background_check_validation.py index 29abddf..fc02e9e 100644 --- a/tests/EN_background_check_validation.py +++ b/tests/EN_background_check_validation.py @@ -11,7 +11,7 @@ def test_EN_background_check_temperature(): ''' p = util.testingProfile.fakeProfile([1.8, 1.8, 1.8, 7.1], [0.0, 2.5, 5.0, 7.5], latitude=55.6, longitude=12.9, date=[1900, 01, 15, 0], probe_type=7) - qc = qctests.EN_background_check.test(p) + qc = qctests.EN_background_check.test(p, None) expected = [False, False, False, True] assert numpy.array_equal(qc, expected), 'mismatch between qc results and expected values' diff --git a/tests/EN_constant_value_check_validation.py b/tests/EN_constant_value_check_validation.py index a5a68fe..fffe043 100644 --- a/tests/EN_constant_value_check_validation.py +++ b/tests/EN_constant_value_check_validation.py @@ -11,12 +11,12 @@ def test_EN_constant_value_threshold(): ''' p = util.testingProfile.fakeProfile([0,0,0,0,0,0,0,0,0,10], [100,200,300,400,500,600,700,800,900,1000]) - qc = qctests.EN_constant_value_check.test(p) + qc = qctests.EN_constant_value_check.test(p, None) truth = numpy.ones(10, dtype=bool) assert numpy.array_equal(qc, truth), 'failing to flag when exactly 90% of measurements are identical' p = util.testingProfile.fakeProfile([0,0,0,0,0,0,0,0,10,10], [100,200,300,400,500,600,700,800,900,1000]) - qc = qctests.EN_constant_value_check.test(p) + qc = qctests.EN_constant_value_check.test(p, None) truth = numpy.zeros(10, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging when less than 90% of measurements are identical' @@ -26,7 +26,7 @@ def test_EN_constant_value_spacing(): ''' p = util.testingProfile.fakeProfile([0,0,0,0,0,0,0,0,0,10], [1,2,3,4,5,6,7,8,9,10]) - qc = qctests.EN_constant_value_check.test(p) + qc = qctests.EN_constant_value_check.test(p, None) truth = numpy.zeros(10, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging identical measurements that do not span 100 m of depth.' @@ -36,6 +36,6 @@ def test_EN_constant_value_missing_depth(): ''' p = util.testingProfile.fakeProfile([0,0,0,0,0,0,0,0,0,0], [100,200,300,400,500,600,700,800,900,None]) - qc = qctests.EN_constant_value_check.test(p) + qc = qctests.EN_constant_value_check.test(p, None) truth = numpy.ones(10, dtype=bool) assert numpy.array_equal(qc, truth), 'failing to flag when the deepest depth in a run of constant temperature is missing.' \ No newline at end of file diff --git a/tests/EN_increasing_depth_check_validation.py b/tests/EN_increasing_depth_check_validation.py index 88e6b4f..249f31d 100644 --- a/tests/EN_increasing_depth_check_validation.py +++ b/tests/EN_increasing_depth_check_validation.py @@ -11,13 +11,13 @@ def test_EN_increasing_depth_outside_valid_range(): ''' p = util.testingProfile.fakeProfile([0,0,0,0,0,0,0,0,0,0], [-1,200,300,400,500,600,700,800,900,1000]) - qc = qctests.EN_increasing_depth_check.test(p) + qc = qctests.EN_increasing_depth_check.test(p, None) truth = np.zeros(10, dtype=bool) truth[0] = True assert np.array_equal(qc, truth), 'Failed to flag depth < 0' p = util.testingProfile.fakeProfile([0,0,0,0,0,0,0,0,0,0], [100,200,300,400,500,600,700,800,900,11001]) - qc = qctests.EN_increasing_depth_check.test(p) + qc = qctests.EN_increasing_depth_check.test(p, None) truth = np.zeros(10, dtype=bool) truth[-1] = True assert np.array_equal(qc, truth), 'Failed to flag depth > 11000' @@ -28,19 +28,19 @@ def test_EN_increasing_depth_flagging(): ''' p = util.testingProfile.fakeProfile([0,0,0,0,0,0,0,0,0,0], [100,200,300,500,500,600,700,800,900,1000], latitude=0.0) - qc = qctests.EN_increasing_depth_check.test(p) + qc = qctests.EN_increasing_depth_check.test(p, None) truth = np.zeros(10, dtype=bool) truth[3:5] = True assert np.array_equal(qc, truth), 'Failed to constant depth' p = util.testingProfile.fakeProfile([0,0,0,0,0,0,0,0,0,0], [100,200,300,510,500,600,700,800,900,1000], latitude=0.0) - qc = qctests.EN_increasing_depth_check.test(p) + qc = qctests.EN_increasing_depth_check.test(p, None) truth = np.zeros(10, dtype=bool) truth[3:5] = True assert np.array_equal(qc, truth), 'Failed to incorrect depths when cannot determine which is wrong' p = util.testingProfile.fakeProfile([0,0,0,0,0,0,0,0,0,0], [100,200,300,610,500,600,700,800,900,1000], latitude=0.0) - qc = qctests.EN_increasing_depth_check.test(p) + qc = qctests.EN_increasing_depth_check.test(p, None) truth = np.zeros(10, dtype=bool) truth[3] = True print qc @@ -52,7 +52,7 @@ def test_EN_increasing_depth_all_zero(): ''' p = util.testingProfile.fakeProfile([0]*1000, [0]*1000) - qc = qctests.EN_increasing_depth_check.test(p) + qc = qctests.EN_increasing_depth_check.test(p, None) truth = np.ones(1000, dtype=bool) print qc, truth diff --git a/tests/EN_range_check_validation.py b/tests/EN_range_check_validation.py index 501c890..dfb6171 100644 --- a/tests/EN_range_check_validation.py +++ b/tests/EN_range_check_validation.py @@ -12,26 +12,26 @@ def test_EN_range_check_temperature(): # should fail despite rounding p = util.testingProfile.fakeProfile([-4.00000001], [100]) - qc = qctests.EN_range_check.test(p) + qc = qctests.EN_range_check.test(p, None) truth = numpy.zeros(1, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'failed to flag temperature slightly colder than -4 C' # -4 OK p = util.testingProfile.fakeProfile([-4], [100]) - qc = qctests.EN_range_check.test(p) + qc = qctests.EN_range_check.test(p, None) truth = numpy.zeros(1, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging -4 C' # 40 OK p = util.testingProfile.fakeProfile([40], [100]) - qc = qctests.EN_range_check.test(p) + qc = qctests.EN_range_check.test(p, None) truth = numpy.zeros(1, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagging 40 C' # should fail despite rounding p = util.testingProfile.fakeProfile([40.0000001], [100]) - qc = qctests.EN_range_check.test(p) + qc = qctests.EN_range_check.test(p, None) truth = numpy.zeros(1, dtype=bool) truth[0] = True assert numpy.array_equal(qc, truth), 'failed to flag temperature slightly warmer than 40 C' \ No newline at end of file diff --git a/tests/EN_spike_and_step_check_validation.py b/tests/EN_spike_and_step_check_validation.py index 7383843..5fa082e 100644 --- a/tests/EN_spike_and_step_check_validation.py +++ b/tests/EN_spike_and_step_check_validation.py @@ -52,7 +52,7 @@ def test_EN_spike_and_step_check_tropics_prelim(): test preliminary tropical rejection ''' p = util.testingProfile.fakeProfile([0, 0, 0, 0], [0, 10, 20, 30], latitude=0.0) - qc = qctests.EN_spike_and_step_check.test(p, True) + qc = qctests.EN_spike_and_step_check.test(p, None, True) truth = numpy.zeros(4, dtype=bool) truth[:] = True assert numpy.array_equal(qc, truth), 'failed to flag cold temperatures in the tropics' @@ -80,7 +80,7 @@ def test_EN_spike_and_step_check_A_nominal(): test condition A spike check in context ''' p = util.testingProfile.fakeProfile([20, 24, 18, 17], [0, 10, 20, 30], latitude=20.0) - qc = qctests.EN_spike_and_step_check.test(p) + qc = qctests.EN_spike_and_step_check.test(p, None) truth = numpy.zeros(4, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failed to flag spike identified by condiion A' @@ -107,7 +107,7 @@ def test_EN_spike_and_step_check_spike_A_depth_constraint_shallow(): condition A spike *except* measurements too far apart to count as spike (shallow) ''' p = util.testingProfile.fakeProfile([21, 24, 18, 17], [0, 10, 70, 80], latitude=20.0) - qc = qctests.EN_spike_and_step_check.test(p) + qc = qctests.EN_spike_and_step_check.test(p, None) truth = numpy.zeros(4, dtype=bool) assert numpy.array_equal(qc, truth), 'flagged a type A temperature spike spread out too far in depth (shallow)' @@ -116,7 +116,7 @@ def test_EN_spike_and_step_check_spike_A_depth_constraint_deep(): condition A spike *except* measurements too far apart to count as spike (deep). ''' p = util.testingProfile.fakeProfile([20, 21, 18, 17], [500, 510, 670, 680], latitude=20.0) - qc = qctests.EN_spike_and_step_check.test(p) + qc = qctests.EN_spike_and_step_check.test(p, None) truth = numpy.zeros(4, dtype=bool) assert numpy.array_equal(qc, truth), 'flagged a type A temperature spike spread out too far in depth (deep)' @@ -143,7 +143,7 @@ def test_EN_spike_and_step_check_B_nominal(): test condition B spike check in context ''' p = util.testingProfile.fakeProfile([22.5, 24, 22.5, 22], [500, 510, 520, 530], latitude=20.0) - qc = qctests.EN_spike_and_step_check.test(p) + qc = qctests.EN_spike_and_step_check.test(p, None) truth = numpy.zeros(4, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failed to flag spike identified by condition B' @@ -172,7 +172,7 @@ def test_EN_spike_and_step_check_C_nominal(): suspect == True since condition C is a suspected reject ''' p = util.testingProfile.fakeProfile([24, 24, 2, 1], [10, 20, 30, 40], latitude=20.0) - qc = qctests.EN_spike_and_step_check.test(p, True) + qc = qctests.EN_spike_and_step_check.test(p, None, True) truth = numpy.zeros(4, dtype=bool) truth[1] = True truth[2] = True @@ -217,7 +217,7 @@ def test_EN_spike_and_step_check_excpetion_C_iii(): suspect == True since condition C is a suspected reject ''' p = util.testingProfile.fakeProfile([13, 13, 13, 1], [310, 320, 330, 340], latitude=50.0) - qc = qctests.EN_spike_and_step_check.test(p, True) + qc = qctests.EN_spike_and_step_check.test(p, None, True) truth = numpy.zeros(4, dtype=bool) truth[3] = True assert numpy.array_equal(qc, truth), 'flag only the last temperature when a step is found at the end of the profile' @@ -227,7 +227,7 @@ def test_EN_spike_and_step_check_trailing_zero(): make sure trailing 0s are getting flagged as suspect ''' p = util.testingProfile.fakeProfile([0, 0, 0, 0], [10, 20, 30, 40], latitude=50.0) - qc = qctests.EN_spike_and_step_check.test(p, True) + qc = qctests.EN_spike_and_step_check.test(p, None, True) truth = numpy.zeros(4, dtype=bool) truth[3] = True - assert numpy.array_equal(qc, truth), 'failed to flag a trailing zero' \ No newline at end of file + assert numpy.array_equal(qc, truth), 'failed to flag a trailing zero' diff --git a/tests/EN_stability_check_validation.py b/tests/EN_stability_check_validation.py index f336d1f..bf93e94 100644 --- a/tests/EN_stability_check_validation.py +++ b/tests/EN_stability_check_validation.py @@ -32,7 +32,7 @@ def test_EN_stability_check_padded(): ''' p = util.testingProfile.fakeProfile([13.5, 25.5, 20.4, 13.5, 13.5, 13.5, 13.5, 13.5, 13.5], [0, 10, 20, 30, 40, 50, 60, 70, 80], salinities=[40, 35, 20, 40, 40, 40, 40, 40, 40], pressures=[8000, 2000, 1000, 8000, 8000, 8000, 8000, 8000, 8000]) - qc = qctests.EN_stability_check.test(p) + qc = qctests.EN_stability_check.test(p, None) truth = numpy.ma.array([False, True, True, False, False, False, False, False, False], mask=False) assert numpy.array_equal(qc, truth), 'failed to flag padded stability example' @@ -44,6 +44,6 @@ def test_EN_stability_check_unpadded(): ''' p = util.testingProfile.fakeProfile([13.5, 25.5, 20.4, 13.5], [0, 10, 20, 30], salinities=[40, 35, 20, 40], pressures=[8000, 2000, 1000, 8000]) - qc = qctests.EN_stability_check.test(p) + qc = qctests.EN_stability_check.test(p, None) truth = numpy.ma.array([True, True, True, True], mask=False) assert numpy.array_equal(qc, truth), 'failed to flag unpadded stability example' diff --git a/tests/EN_std_level_background_check_validation.py b/tests/EN_std_level_background_check_validation.py index ffcba14..7ee51d9 100644 --- a/tests/EN_std_level_background_check_validation.py +++ b/tests/EN_std_level_background_check_validation.py @@ -46,7 +46,7 @@ def test_EN_std_level_bkg_and_buddy_check_temperature(): p = util.testingProfile.fakeProfile([1.8, 1.8, 1.8, 7.1], [0.0, 2.5, 5.0, 7.5], latitude=55.6, longitude=12.9, date=[1900, 01, 15, 0], probe_type=7) data.ds.profiles = [p] qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() - qc = qctests.EN_std_lev_bkg_and_buddy_check.test(p) + qc = qctests.EN_std_lev_bkg_and_buddy_check.test(p, None) expected = [False, False, False, False] print qc assert numpy.array_equal(qc, expected), 'mismatch between qc results and expected values' @@ -203,7 +203,7 @@ def test_EN_std_level_bkg_and_buddy_real_profiles_1(): data.ds.profiles = [realProfile1] qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() - qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile1) + qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile1, None) assert numpy.array_equal(qc, truthQC1), 'mismatch between qc results and expected values' @@ -214,7 +214,7 @@ def test_EN_std_level_bkg_and_buddy_real_profiles_2(): data.ds.profiles = [realProfile2, realProfile3] qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() - qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile2, allow_level_reinstating=False) + qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile2, None, allow_level_reinstating=False) assert numpy.array_equal(qc, truthQC2), 'mismatch between qc results and expected values' @@ -225,7 +225,7 @@ def test_EN_std_level_bkg_and_buddy_real_profiles_3(): data.ds.profiles = [realProfile2, realProfile3] qctests.EN_std_lev_bkg_and_buddy_check.profiles_info_list = get_profiles_info_list() - qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile2) + qc = qctests.EN_std_lev_bkg_and_buddy_check.test(realProfile2, None) assert numpy.all(qc == False), 'mismatch between qc results and expected values' realProfile1 = util.testingProfile.fakeProfile( diff --git a/tests/EN_track_validation.py b/tests/EN_track_validation.py index 7565344..0031645 100644 --- a/tests/EN_track_validation.py +++ b/tests/EN_track_validation.py @@ -817,7 +817,7 @@ def condition_h_test(self): # tcqc = [] # for p in ds.threadProfiles: - # tcqc.append(qctests.EN_track_check.test(p)[0]) + # tcqc.append(qctests.EN_track_check.test(p, None)[0]) # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' @@ -871,7 +871,7 @@ def condition_h_test(self): # tcqc = [] # for p in ds.threadProfiles: - # tcqc.append(qctests.EN_track_check.test(p)[0]) + # tcqc.append(qctests.EN_track_check.test(p, None)[0]) # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' @@ -949,7 +949,7 @@ def condition_h_test(self): # tcqc = [] # for p in ds.threadProfiles: - # tcqc.append(qctests.EN_track_check.test(p)[0]) + # tcqc.append(qctests.EN_track_check.test(p, None)[0]) # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' @@ -984,7 +984,7 @@ def condition_h_test(self): # tcqc = [] # for p in ds.threadProfiles: - # tcqc.append(qctests.EN_track_check.test(p)[0]) + # tcqc.append(qctests.EN_track_check.test(p, None)[0]) # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' @@ -1010,7 +1010,7 @@ def condition_h_test(self): # tcqc = [] # for p in ds.threadProfiles: - # tcqc.append(qctests.EN_track_check.test(p)[0]) + # tcqc.append(qctests.EN_track_check.test(p, None)[0]) # assert numpy.array_equal(qc, tcqc), 'QC results do not match those produced by EN system' diff --git a/tests/ICDC_aqc_01_level_order_validation.py b/tests/ICDC_aqc_01_level_order_validation.py index 734c363..4f58e61 100644 --- a/tests/ICDC_aqc_01_level_order_validation.py +++ b/tests/ICDC_aqc_01_level_order_validation.py @@ -11,7 +11,7 @@ def test_ICDC_level_order_simple(): ''' p = util.testingProfile.fakeProfile([1.0, 2.0, 3.0], [2.0, -1.0, 1.0]) - qc = ICDC.test(p) + qc = ICDC.test(p, None) nlevels, zr, tr = ICDC.reordered_data(p) zreverted = ICDC.revert_order(p, zr) zreverted_truth = np.ma.array([2.0, -1.0, 1.0], @@ -47,7 +47,7 @@ def test_ICDC_level_order(): p = util.testingProfile.fakeProfile(torig, zorig) # Check the QC results are returned correctly. - qc = ICDC.test(p) + qc = ICDC.test(p, None) assert np.array_equal(qc, qctruth), 'Example %i QC wrong' % (i + 1) # Check that the reordering is correct. diff --git a/tests/ICDC_aqc_02_crude_range_validation.py b/tests/ICDC_aqc_02_crude_range_validation.py index 2b481cb..3850561 100644 --- a/tests/ICDC_aqc_02_crude_range_validation.py +++ b/tests/ICDC_aqc_02_crude_range_validation.py @@ -21,7 +21,7 @@ def test_ICDC_crude_range(): qctruth = f > 0 p = util.testingProfile.fakeProfile(t, z) - qc = ICDC_crude_range.test(p) + qc = ICDC_crude_range.test(p, None) assert np.array_equal(qc, qctruth), 'Example %i failed' % (i + 1) diff --git a/tests/ICDC_aqc_04_max_obs_depth_validation.py b/tests/ICDC_aqc_04_max_obs_depth_validation.py index 481673b..e52a659 100644 --- a/tests/ICDC_aqc_04_max_obs_depth_validation.py +++ b/tests/ICDC_aqc_04_max_obs_depth_validation.py @@ -28,7 +28,7 @@ def test_ICDC_max_obs_level(): p = util.testingProfile.fakeProfile(depths, depths, probe_type=probe_type) p.primary_header['Country code'] = 'JP' - qc = ICDC_mol.test(p) + qc = ICDC_mol.test(p, None) assert np.array_equal(qc, qctruth), 'Failed profile with header ' + line diff --git a/tests/ICDC_aqc_05_stuck_value_validation.py b/tests/ICDC_aqc_05_stuck_value_validation.py index b608ba8..aa3122b 100644 --- a/tests/ICDC_aqc_05_stuck_value_validation.py +++ b/tests/ICDC_aqc_05_stuck_value_validation.py @@ -29,7 +29,7 @@ def test_ICDC_stuck_value(): qctruth.append(int(d[2]) > 0) p = util.testingProfile.fakeProfile(temps, depths, probe_type=probe_type) - qc = ICDC_sv.test(p) + qc = ICDC_sv.test(p, None) assert np.array_equal(qc, qctruth), 'Failed profile with header ' + line diff --git a/tests/ICDC_aqc_06_n_temperature_extrema_validation.py b/tests/ICDC_aqc_06_n_temperature_extrema_validation.py index 6f9e6a4..207521a 100644 --- a/tests/ICDC_aqc_06_n_temperature_extrema_validation.py +++ b/tests/ICDC_aqc_06_n_temperature_extrema_validation.py @@ -27,7 +27,7 @@ def test_ICDC_n_temperature_extrema(): qctruth.append(int(d[2]) > 0) p = util.testingProfile.fakeProfile(temps, depths) - qc = ICDC_nte.test(p) + qc = ICDC_nte.test(p, None) assert np.array_equal(qc, qctruth), 'Failed profile with header ' + line diff --git a/tests/ICDC_aqc_07_spike_check_validation.py b/tests/ICDC_aqc_07_spike_check_validation.py index 22f588f..3286b30 100644 --- a/tests/ICDC_aqc_07_spike_check_validation.py +++ b/tests/ICDC_aqc_07_spike_check_validation.py @@ -27,7 +27,7 @@ def test_ICDC_spike_check(): qctruth.append(int(d[2]) > 0) p = util.testingProfile.fakeProfile(temps, depths) - qc = ICDC_sc.test(p) + qc = ICDC_sc.test(p, None) assert np.array_equal(qc, qctruth), 'Failed profile with header ' + line diff --git a/tests/ICDC_aqc_08_gradient_check_validation.py b/tests/ICDC_aqc_08_gradient_check_validation.py index 8901b92..d8e979b 100644 --- a/tests/ICDC_aqc_08_gradient_check_validation.py +++ b/tests/ICDC_aqc_08_gradient_check_validation.py @@ -27,7 +27,7 @@ def test_ICDC_gradient_check(): qctruth.append(int(d[2]) > 0) p = util.testingProfile.fakeProfile(temps, depths) - qc = ICDC_gc.test(p) + qc = ICDC_gc.test(p, None) assert np.array_equal(qc, qctruth), 'Failed profile with header ' + line diff --git a/tests/ICDC_aqc_09_local_climatology_check_validation.py b/tests/ICDC_aqc_09_local_climatology_check_validation.py index a488a3e..8a3e671 100644 --- a/tests/ICDC_aqc_09_local_climatology_check_validation.py +++ b/tests/ICDC_aqc_09_local_climatology_check_validation.py @@ -14,7 +14,8 @@ def test_ICDC_local_climatology_check(): ''' lines = data.splitlines() - nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') + parameterStore = {} + ICDC_lc.loadParameters(parameterStore) for i, line in enumerate(lines): if line[0:2] == 'HH': header = line.split() @@ -52,12 +53,12 @@ def test_ICDC_local_climatology_check(): lat, lon, p.month(), - nc) + parameterStore['nc']) assert np.max(np.abs(tmin - climmin)) < 0.001, 'TMIN failed for profile with header ' + line assert np.max(np.abs(tmax - climmax)) < 0.001, 'TMAX failed for profile with header ' + line - qc = ICDC_lc.test(p) + qc = ICDC_lc.test(p, parameterStore) assert np.array_equal(qc, qctruth), 'QC failed profile with header ' + line # Data provided by Viktor Gouretski, ICDC, University of Hamburg. diff --git a/tests/WOD_gradient_check_validation.py b/tests/WOD_gradient_check_validation.py index ea42360..bc724ba 100644 --- a/tests/WOD_gradient_check_validation.py +++ b/tests/WOD_gradient_check_validation.py @@ -12,13 +12,13 @@ def test_WOD_gradient_check_temperature_inversion(): # should just barely pass; gradient exactly at threshold p = util.testingProfile.fakeProfile([100, 130], [100, 200]) - qc = qctests.WOD_gradient_check.test(p) + qc = qctests.WOD_gradient_check.test(p, None) truth = numpy.zeros(2, dtype=bool) assert numpy.array_equal(qc, truth), 'flagged temperature inversion at threshold' # should just barely fail; gradient slightly over threshold p = util.testingProfile.fakeProfile([100, 130.00001], [100, 200]) - qc = qctests.WOD_gradient_check.test(p) + qc = qctests.WOD_gradient_check.test(p, None) truth = numpy.zeros(2, dtype=bool) truth[0] = True truth[1] = True @@ -31,13 +31,13 @@ def test_WOD_gradient_check_temperature_gradient(): # should just barely pass; gradient exactly at threshold p = util.testingProfile.fakeProfile([100, 30], [100, 200]) - qc = qctests.WOD_gradient_check.test(p) + qc = qctests.WOD_gradient_check.test(p, None) truth = numpy.zeros(2, dtype=bool) assert numpy.array_equal(qc, truth), 'flagged temperature gradient at threshold' # should just barely fail; inversion slightly over threshold p = util.testingProfile.fakeProfile([100, 29.9999], [100, 200]) - qc = qctests.WOD_gradient_check.test(p) + qc = qctests.WOD_gradient_check.test(p, None) truth = numpy.zeros(2, dtype=bool) truth[0] = True truth[1] = True diff --git a/tests/WOD_range_check_validation.py b/tests/WOD_range_check_validation.py index b345fd1..e48eeae 100644 --- a/tests/WOD_range_check_validation.py +++ b/tests/WOD_range_check_validation.py @@ -12,13 +12,13 @@ def test_WOD_range_check_spotcheck(): # should just barely pass; temperatures at threshold for these depths p = util.testingProfile.fakeProfile([15, -2.4], [0, 50], -89.5, 0.5) # region 20 == antarctic - qc = qctests.WOD_range_check.test(p) + qc = qctests.WOD_range_check.test(p, None) truth = numpy.zeros(2, dtype=bool) assert numpy.array_equal(qc, truth), 'incorrectly flagged temperatures within range' # should fail: 10 degrees too warm for 2400 m depth in antarctic p = util.testingProfile.fakeProfile([0, 10], [0, 2400], -89.5, 0.5) - qc = qctests.WOD_range_check.test(p) + qc = qctests.WOD_range_check.test(p, None) truth = numpy.zeros(2, dtype=bool) truth[1] = True assert numpy.array_equal(qc, truth), 'failed to flag deep warm temperatures in antarctic' \ No newline at end of file diff --git a/tests/loose_location_at_sea_validation.py b/tests/loose_location_at_sea_validation.py index 4aac837..4916179 100644 --- a/tests/loose_location_at_sea_validation.py +++ b/tests/loose_location_at_sea_validation.py @@ -16,43 +16,43 @@ def test_invalid_locations(): '''Test that the check is able to handle invalid locations.''' p = fakeProfile([0], [0], latitude=-91, longitude=10) - qc = las.test(p) + qc = las.test(p, None) assert np.all(qc), 'Latitude < -90 not handled correctly' p = fakeProfile([0], [0], latitude=91, longitude=10) - qc = las.test(p) + qc = las.test(p, None) assert np.all(qc), 'Latitude > 90 not handled correctly' p = fakeProfile([0], [0], latitude=0, longitude=-181) - qc = las.test(p) + qc = las.test(p, None) assert np.all(qc), 'Longitude < -180 not handled correctly' p = fakeProfile([0], [0], latitude=0, longitude=361) - qc = las.test(p) + qc = las.test(p, None) assert np.all(qc), 'Longitude > 360 not handled correctly' p = fakeProfile([0], [0], latitude=0, longitude=-180) - qc = las.test(p) + qc = las.test(p, None) assert np.all(qc == False), 'Latitude == -180 not handled correctly' def test_ocean_point(): '''Check that the test correctly handles an ocean point.''' p = fakeProfile([0], [0], latitude = 4.10566666667, longitude = -38.0133333333) - qc = las.test(p) + qc = las.test(p, None) assert np.all(qc == False), 'Ocean point not handled correctly' def test_land_point(): '''Check that the test correctly handles a land point.''' p = fakeProfile([0], [0], latitude = -4.10566666667, longitude = -39) - qc = las.test(p) + qc = las.test(p, None) assert np.all(qc == True), 'Land point not handled correctly' def test_coast_point(): '''Check that the test correctly handles a point right on the coast.''' p = fakeProfile([0], [0], latitude = -4.1, longitude = -38.15) - qc = las.test(p) + qc = las.test(p, None) assert np.all(qc == False), 'Coast point not handled correctly' From 69135df9820d69fe52d94cd6ccbfc73989e38e77 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sun, 14 Aug 2016 00:01:08 +0000 Subject: [PATCH 69/79] docs update --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e49dbf8..701d3aa 100644 --- a/README.md +++ b/README.md @@ -22,10 +22,10 @@ docker pull iquod/autoqc Start the image via ``` -docker run -i -t iquod/autoqc /bin/bash +docker run --sysctl "kernel.shmmax=18446744073692774399" -v $PWD:/rawdata --rm -i -t iquod/autoqc /bin/bash ``` -And you'll find AutoQC all set up and ready to use in the directory `/AutoQC`. Note that the version of AutoQC that ships with the docker image may be behind master on GitHub; you can always do `git pull origin master` from the `/AutoQC` directory inside the image, if you need an update. +And you'll find AutoQC all set up and ready to use in the directory `/AutoQC`. Note that the version of AutoQC that ships with the docker image may be behind master on GitHub; you can always do `git pull origin master` from the `/AutoQC` directory inside the container, if you need an update. Also, whatever directory you launched this command from will be mounted on `/rawdata` inside your Docker container; use this to bring data into the container, or copy logs and files from within the container to this location to access them after Docker exits. If you want to run AutoQC without Docker, have a look at the setup steps in `docker/Dockerfile`; these correspond to the same setup steps you'll need to do on a similar machine (i.e. on Debian with miniconda already installed). @@ -65,7 +65,7 @@ cd data Finally, launch your docker image with the `data` directory mounted inside it at `/rawdata`: ``` -sudo docker run -v $PWD:/rawdata -i -t iquod/autoqc /bin/bash +sudo docker run --sysctl "kernel.shmmax=18446744073692774399" -v $PWD:/rawdata --rm -i -t iquod/autoqc /bin/bash ``` And once again, AutoQC will be all set up in `/AutoQC`. Remember to `git pull` if necessary, and add any external data or parameter files to the correct places. From cd480a40d22dcf150176c3e45d77c76daa225bca Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Mon, 15 Aug 2016 04:54:35 +0000 Subject: [PATCH 70/79] remove unneccessary parameter slices from ICDC-9 --- .../ICDC_aqc_09_local_climatology_check.py | 123 +----------------- 1 file changed, 7 insertions(+), 116 deletions(-) diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py index b026413..15ae79b 100644 --- a/qctests/ICDC_aqc_09_local_climatology_check.py +++ b/qctests/ICDC_aqc_09_local_climatology_check.py @@ -66,19 +66,11 @@ def test(p, parameters): def get_climatology_range(nlevels, z, lat, lon, month, nc): - # parameters - tmedA = nc.variables['tmedA'][:, :, :] - tamdA = nc.variables['tamdA'][:, :, :] - tmedM = nc.variables['tmedM'][:, :, :, :] - tamdM = nc.variables['tamdM'][:, :, :, :] - zedqc = nc.variables['zedqc'][:] - fillValue = nc.fillValue - # Define arrays for the results. tmin = np.ndarray(nlevels) tmax = np.ndarray(nlevels) - tmin[:] = fillValue - tmax[:] = fillValue + tmin[:] = nc.fillValue + tmax[:] = nc.fillValue # Global ranges - data outside these bounds are assumed not valid. parminover = -2.3 @@ -93,7 +85,7 @@ def get_climatology_range(nlevels, z, lat, lon, month, nc): # Find the climatology range. for k in range(nlevels): # Find the corresponding climatology level. - arg = np.argwhere((z[k] >= zedqc[:-1]) & (z[k] < zedqc[1:])) + arg = np.argwhere((z[k] >= nc.variables['zedqc'][:-1][0]) & (z[k] < nc.variables['zedqc'][1:][0])) if len(arg) > 0: kisel = arg[0] else: @@ -106,19 +98,19 @@ def get_climatology_range(nlevels, z, lat, lon, month, nc): if month is None: useAnnual = True # Extract the temperature. if useAnnual == False: - amd = tamdM[ix, iy, kisel, month - 1] + amd = nc.variables['tamdM'][ix, iy, kisel, month - 1][0] if amd < 0.0: useAnnual = True else: - tmedian = tmedM[ix, iy, kisel, month - 1] + tmedian = nc.variables['tmedM'][ix, iy, kisel, month - 1][0] if tmedian < parminover: useAnnual = True if useAnnual: - amd = tamdA[ix, iy, kisel] + amd = nc.variables['tamdA'][ix, iy, kisel][0] if amd < 0.0: continue else: - tmedian = tmedA[ix, iy, kisel] + tmedian = nc.variables['tmedA'][ix, iy, kisel][0] if tmedian < parminover: continue if amd > 0.0 and amd < 0.05: amd = 0.05 @@ -138,104 +130,3 @@ def loadParameters(parameterStore): parameterStore['nc'] = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') -# def read_ascii_and_convert_to_netcdf(): -# '''Coverts the ASCII data file to netCDF on first read. -# This is much faster to access. -# ''' -# global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue - -# # Load the data. -# tmedM = np.ndarray([721, 361, 16, 12]) -# tamdM = np.ndarray([721, 361, 16, 12]) -# tmedA = np.ndarray([721, 361, 60]) -# tamdA = np.ndarray([721, 361, 60]) -# zedqc = np.ndarray(60) -# # Do not use masked arrays to save on memory use. -# fillValue = -9.0 # Has to be a negative number. -# tmedM[:, :, :, :] = fillValue -# tamdM[:, :, :, :] = fillValue -# tmedA[:, :, :] = fillValue -# tamdA[:, :, :] = fillValue -# with open('data/climatological_t_median_and_amd_for_aqc.dat') as f: -# for line in f: -# vals = line.split() -# m = int(vals[0]) - 1 -# j = int(vals[1]) - 1 -# i = int(vals[3]) - 1 -# k = int(vals[5]) - 1 -# z = float(vals[6]) -# tmedian = float(vals[7]) -# absmeddev = float(vals[8]) - -# if m < 12 and k < 16: -# tmedM[i, j, k, m] = tmedian -# tamdM[i, j, k, m] = absmeddev -# elif m == 12: -# tmedA[i, j, k] = tmedian -# tamdA[i, j, k] = absmeddev -# zedqc[k] = z - -# # Create the netCDF version. -# nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'w') -# idim = nc.createDimension('i', 721) -# jdim = nc.createDimension('j', 361) -# kmdim = nc.createDimension('km', 16) -# kadim = nc.createDimension('ka', 60) -# mdim = nc.createDimension('m', 12) - -# sf = 0.0001 -# tmedav = nc.createVariable('tmedA', 'i4', ('i', 'j', 'ka'), zlib=True) -# tmedav.add_offset = 0.0 -# tmedav.scale_factor = sf -# tmedav[:, :, :] = tmedA - -# tamdav = nc.createVariable('tamdA', 'i4', ('i', 'j', 'ka'), zlib=True) -# tamdav.add_offset = 0.0 -# tamdav.scale_factor = sf -# tamdav[:, :, :] = tamdA - -# tmedmv = nc.createVariable('tmedM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) -# tmedmv.add_offset = 0.0 -# tmedmv.scale_factor = sf -# tmedmv[:, :, :, :] = tmedM - -# tamdmv = nc.createVariable('tamdM', 'i4', ('i', 'j', 'km', 'm'), zlib=True) -# tamdmv.add_offset = 0.0 -# tamdmv.scale_factor = sf -# tamdmv[:, :, :, :] = tamdM - -# zedqcv = nc.createVariable('zedqc', 'f4', ('ka',)) -# zedqcv[:] = zedqc - -# nc.fillValue = fillValue -# nc.history = 'Created ' + time.ctime(time.time()) + ' from climatological_t_median_and_amd_for_aqc.dat provided by Viktor Gouretski, Integrated Climate Data Center, University of Hamburg, Hamburg, Germany, February 2016' -# nc.close() - -# def read_netcdf(): -# '''Read climatological data from netCDF. -# ''' -# global tmedM, tamdM, tmedA, tamdA, zedqc, fillValue - -# nc = Dataset('data/climatological_t_median_and_amd_for_aqc.nc', 'r') -# tmedA = nc.variables['tmedA'][:, :, :] -# tamdA = nc.variables['tamdA'][:, :, :] -# tmedM = nc.variables['tmedM'][:, :, :, :] -# tamdM = nc.variables['tamdM'][:, :, :, :] -# zedqc = nc.variables['zedqc'][:] -# fillValue = nc.fillValue -# nc.close() - -# Global ranges - data outside these bounds are assumed not valid. -#parminover = -2.3 -#parmaxover = 33.0 - -# Read data. -# if os.path.isfile('data/climatological_t_median_and_amd_for_aqc.nc'): -# print 1 -# read_netcdf() -# print 11 -# else: -# read_ascii_and_convert_to_netcdf() - - - From 60534cab439edffa90dfa6ef17fad3ad9b63d9f1 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Mon, 15 Aug 2016 15:58:02 +0000 Subject: [PATCH 71/79] speeds up ICDC-9, validates correctly --- qctests/ICDC_aqc_09_local_climatology_check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qctests/ICDC_aqc_09_local_climatology_check.py b/qctests/ICDC_aqc_09_local_climatology_check.py index 15ae79b..bf17378 100644 --- a/qctests/ICDC_aqc_09_local_climatology_check.py +++ b/qctests/ICDC_aqc_09_local_climatology_check.py @@ -85,7 +85,7 @@ def get_climatology_range(nlevels, z, lat, lon, month, nc): # Find the climatology range. for k in range(nlevels): # Find the corresponding climatology level. - arg = np.argwhere((z[k] >= nc.variables['zedqc'][:-1][0]) & (z[k] < nc.variables['zedqc'][1:][0])) + arg = np.argwhere((z[k] >= nc.variables['zedqc'][:][:-1]) & (z[k] < nc.variables['zedqc'][:][1:])) if len(arg) > 0: kisel = arg[0] else: From 93a3eebb21dc4e1914c35150ab53208fa93b22ab Mon Sep 17 00:00:00 2001 From: s-good Date: Tue, 16 Aug 2016 20:58:36 +0100 Subject: [PATCH 72/79] Updated expected QC for CoTeDe anomaly detection test. --- tests/CoTeDe_checks_validation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CoTeDe_checks_validation.py b/tests/CoTeDe_checks_validation.py index 1ed2083..67c8619 100644 --- a/tests/CoTeDe_checks_validation.py +++ b/tests/CoTeDe_checks_validation.py @@ -1211,7 +1211,7 @@ def test_CoTeDe_WOA_normbias(): uid = 0) -expected_qc_anomaly_detection = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, False, True, True, True, True, False, True, False, False, False, False, True, True, True, True, True, True, True, True, False, False, False, False, False, True, True, True, False, False] +expected_qc_anomaly_detection = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, True, True, True, True, True, True, True, True, True, True, False, False, False, False, True, True, True, True, True] expected_qc_Argo_density_inversion = [False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, False, False, True, True, True, True, True, True, True, True, True, True, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, True, True, True, True, True, False, False, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, True, False, False, False, True, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, True, False, False, True, True, False, False, False, False, True, False, True, False, False, False, True, False, False, False, True, False, False, False, True, False, False, False, False, False, True, False, False, True, False] From e02f9a07ddde93928ed1b6f5298d9124314a0527 Mon Sep 17 00:00:00 2001 From: s-good Date: Tue, 16 Aug 2016 21:08:00 +0100 Subject: [PATCH 73/79] Updated expected QC results for CoTeDe WOA norm bias test. --- tests/CoTeDe_checks_validation.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/CoTeDe_checks_validation.py b/tests/CoTeDe_checks_validation.py index 67c8619..981bcd5 100644 --- a/tests/CoTeDe_checks_validation.py +++ b/tests/CoTeDe_checks_validation.py @@ -1236,5 +1236,4 @@ def test_CoTeDe_WOA_normbias(): expected_qc_spike = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, True, False, False, False, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, True, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, False, False] expected_qc_tukey53H_norm = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, True, False, True, False, True, True, True, False, False, True, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, False, False, False, False, False, False, True, True, True, False, False] - -expected_qc_WOA_normbias = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, False, True, True, True, False, False, False, False, True, True, True, True, True, True, True, True, True, False, False, False, False, True, True, True, True, True] +expected_qc_WOA_normbias = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False, True, True, True, False, True, True, True, True, True, True, True, True, False, True, False, True, False, False, False, False, True, True, True, True, True, True, True, True, True, False, False, False, False, True, True, True, True, True] From ae8401f6d8a131f9fe8c74c4ebc2c92e14d427bc Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Thu, 18 Aug 2016 22:46:35 +0000 Subject: [PATCH 74/79] fix en_track bug --- qctests/EN_track_check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index f430ec0..6188970 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -36,7 +36,7 @@ def test(p, parameters): return result # some detector types cannot be assessed by this test; do not raise flag. - if p.probe_type in [None]: + if p.probe_type() in [None]: return np.zeros(1, dtype=bool) # fetch all profiles on track, sorted chronologically, earliest first (None sorted as highest) From 946eff6fbcd9ee1763ca2b8f157edd64d9044f31 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Fri, 19 Aug 2016 00:32:19 +0000 Subject: [PATCH 75/79] address en_track memory issue --- qctests/EN_track_check.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index 6188970..d43d0e5 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -40,8 +40,11 @@ def test(p, parameters): return np.zeros(1, dtype=bool) # fetch all profiles on track, sorted chronologically, earliest first (None sorted as highest) + # if there's more than 100 profiles on track, return no flag - large tracks cause memory-related crash command = 'SELECT raw FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + ' and year is not null and month is not null and day is not null and time is not null ORDER BY year, month, day, time ASC;' track_rows = main.dbinteract(command) + if len(track_rows) > 100: + return np.zeros(1, dtype=bool) track_profiles = [main.text2wod(raw[0]) for raw in track_rows] # start all as passing by default: From 7ef6fa4bdb23591bfac52530d9e5d961da513bf6 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Sat, 20 Aug 2016 21:32:19 +0000 Subject: [PATCH 76/79] en_track consumes database columns instead of raw profile text --- AutoQC.py | 3 + build-db.py | 8 +- qctests/EN_track_check.py | 192 ++++++++-------- tests/EN_track_validation.py | 426 +++++++++++++++++------------------ tests/geo_tests.py | 50 ++-- util/geo.py | 39 ++-- 6 files changed, 366 insertions(+), 352 deletions(-) diff --git a/AutoQC.py b/AutoQC.py index d68773b..bd4f6be 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -34,6 +34,7 @@ def run(test, profiles, parameters): # Identify and import tests testNames = main.importQC('qctests') testNames.sort() + testNames = ['EN_track_check'] print('{} quality control checks have been found'.format(len(testNames))) testNames = main.checkQCTestRequirements(testNames) print('{} quality control checks are able to be run:'.format(len(testNames))) @@ -57,7 +58,9 @@ def process_row(uid): return # run tests + print uid for itest, test in enumerate(testNames): + print test result = run(test, [profile], parameterStore) query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) diff --git a/build-db.py b/build-db.py index 549e99b..35e36d1 100644 --- a/build-db.py +++ b/build-db.py @@ -30,6 +30,7 @@ lat real, long real, cruise integer, + probe integer, """ for i in range(len(testNames)): query += testNames[i].lower() + ' boolean' @@ -43,7 +44,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) - while True: + for xx in range(1000): # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) @@ -64,7 +65,7 @@ break continue - query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, year, month, day, time, lat, long, cruise) " + """ VALUES( + query = "INSERT INTO " + sys.argv[2] + " (raw, truth, uid, year, month, day, time, lat, long, cruise, probe) " + """ VALUES( {p[raw]}, {p[truth]}, {p[uid]}, @@ -74,7 +75,8 @@ {p[time]}, {p[latitude]}, {p[longitude]}, - {p[cruise]} + {p[cruise]}, + {p[probe_type]} )""".format(p=wodDict) query = query.replace('--', 'NULL') query = query.replace('None', 'NULL') diff --git a/qctests/EN_track_check.py b/qctests/EN_track_check.py index d43d0e5..f7f4e0f 100644 --- a/qctests/EN_track_check.py +++ b/qctests/EN_track_check.py @@ -7,7 +7,7 @@ import util.main as main import util.geo as geo import copy, datetime, math, psycopg2 -import sys +import sys, datetime, calendar # module constants DistRes = 20000. # meters @@ -40,43 +40,57 @@ def test(p, parameters): return np.zeros(1, dtype=bool) # fetch all profiles on track, sorted chronologically, earliest first (None sorted as highest) - # if there's more than 100 profiles on track, return no flag - large tracks cause memory-related crash - command = 'SELECT raw FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + ' and year is not null and month is not null and day is not null and time is not null ORDER BY year, month, day, time ASC;' + command = 'SELECT uid, year, month, day, time, lat, long, probe FROM ' + sys.argv[1] + ' WHERE cruise = ' + str(cruise) + ' and year is not null and month is not null and day is not null and time is not null ORDER BY year, month, day, time ASC;' track_rows = main.dbinteract(command) - if len(track_rows) > 100: - return np.zeros(1, dtype=bool) - track_profiles = [main.text2wod(raw[0]) for raw in track_rows] - + # start all as passing by default: EN_track_results = {} - for i in range(len(track_profiles)): - EN_track_results[track_profiles[i].uid()] = np.zeros(1, dtype=bool) + for i in range(len(track_rows)): + EN_track_results[track_rows[i][0]] = np.zeros(1, dtype=bool) # copy the list of headers; # remove entries as they are flagged. - passed_profiles = copy.deepcopy(track_profiles) - rejects = findOutlier(passed_profiles, EN_track_results) + passed_rows = copy.deepcopy(track_rows) + rejects = findOutlier(passed_rows, EN_track_results) while rejects != []: - passed_index = [x for x in range(len(passed_profiles)) if x not in rejects ] - passed_profiles = [passed_profiles[index] for index in passed_index ] - rejects = findOutlier(passed_profiles, EN_track_results) + passed_index = [x for x in range(len(passed_rows)) if x not in rejects ] + passed_rows = [passed_rows[index] for index in passed_index ] + rejects = findOutlier(passed_rows, EN_track_results) # if more than half got rejected, reject everyone - if len(passed_profiles) < len(track_rows) / 2: - for i in range(len(track_profiles)): - EN_track_results[track_profiles[i].uid()][0] = True + if len(passed_rows) < len(track_rows) / 2: + for i in range(len(track_rows)): + EN_track_results[track_rows[i][0]][0] = True # write all to db - for i in range(len(track_profiles)): - query = "UPDATE " + sys.argv[1] + " SET en_track_check " + " = " + str(EN_track_results[track_profiles[i].uid()][0]) + " WHERE uid = " + str(track_profiles[i].uid()) + ";" + for i in range(len(track_rows)): + query = "UPDATE " + sys.argv[1] + " SET en_track_check " + " = " + str(EN_track_results[track_rows[i][0]][0]) + " WHERE uid = " + str(track_rows[i][0]) + ";" main.dbinteract(query) return EN_track_results[uid] -def findOutlier(profiles, results): +#def sliceTrack(p, rows, margin=7): +# ''' +# remove all table rows from rows whose dates are more than margin days before or after the month that p falls in +# each row has row[1] = year, row[2] = month, row[3] = day +# ''' + +# m = datetime.timedelta(days=margin) +# earliest = datetime.datetime(p.year(), p.month(), 1) - m +# latest = datetime.datetime(p.year(), p.month(), calendar.monthrange(p.year(), p.month())[1] ) + m + +# inrange = [] +# for row in rows: +# date = datetime.datetime(row[1], row[2], row[3]) +# if date >= earliest and date <= latest: +# inrange.append(row) + +# return inrange + +def findOutlier(rows, results): ''' - given a list of profiles, find the fastest one; + given a list of rows, find the fastest one; if it's too fast, reject it or the one before it, return a list of rejected indices; once the fastest is within limits, return []. ''' @@ -84,36 +98,36 @@ def findOutlier(profiles, results): maxShipSpeed = 15. # m/s maxBuoySpeed = 2. # m/s - if profiles == []: + if rows == []: return [] # determine speeds and angles for list of headers - speeds, angles = calculateTraj(profiles) + speeds, angles = calculateTraj(rows) # decide if something needs to be flagged maxSpeed = maxShipSpeed - if isBuoy(profiles[0]): + if isBuoy(rows[0]): maxSpeed = maxBuoySpeed iMax = speeds.index(max(speeds)) flag = detectExcessiveSpeed(speeds, angles, iMax, maxSpeed) # decide which profile to reject, flag it, and return a list of indices rejected at this step. if flag: - rejects = chooseReject(profiles, speeds, angles, iMax, maxSpeed) + rejects = chooseReject(rows, speeds, angles, iMax, maxSpeed) for reject in rejects: - results[profiles[reject].uid()][0] = True + results[rows[reject][0]][0] = True return rejects else: return [] -def chooseReject(profiles, speeds, angles, index, maxSpeed): +def chooseReject(rows, speeds, angles, index, maxSpeed): ''' - decide which profile to reject, profiles[index] or profiles[index-1], or both, + decide which row to reject, rows[index] or rows[index-1], or both, and return a list of indices to reject. ''' # chain of tests breaks when a reject is found: - reject = condition_a(profiles, speeds, angles, index, maxSpeed)[0] + reject = condition_a(rows, speeds, angles, index, maxSpeed)[0] # condition i needs to run at the end of the chain in all cases: # if no decision, reject both: @@ -121,10 +135,10 @@ def chooseReject(profiles, speeds, angles, index, maxSpeed): reject = [index-1, index] # if excessive speed is created by removing the flag, reject both instead # can't create new excessive speed by removing last profile. - elif reject < len(profiles)-1: - new_profiles = copy.deepcopy(profiles) - del new_profiles[reject] - newSpeeds, newAngles = calculateTraj(new_profiles) + elif reject < len(rows)-1: + new_rows = copy.deepcopy(rows) + del new_rows[reject] + newSpeeds, newAngles = calculateTraj(new_rows) flag = detectExcessiveSpeed(newSpeeds, newAngles, reject, maxSpeed) if flag: reject = [index-1, index] @@ -135,32 +149,32 @@ def chooseReject(profiles, speeds, angles, index, maxSpeed): return reject -def calculateTraj(profiles): +def calculateTraj(rows): ''' return a list of speeds and a list of angles describing the trajectory of the track described - by the time-ordered list of profiles. + by the time-ordered list of rows. ''' speeds = [None] angles = [None] # Find speed and angle for all profiles remaining in the list - for i in range(1, len(profiles)): + for i in range(1, len(rows)): speeds.append(None) angles.append(None) - speeds[i] = trackSpeed(profiles[i-1], profiles[i]) + speeds[i] = trackSpeed(rows[i-1], rows[i]) - if i < len(profiles)-1: # can't do angle on last point - angles[i] = abs(math.pi - geo.haversineAngle(profiles[i-1], profiles[i], profiles[i+1])) + if i < len(rows)-1: # can't do angle on last point + angles[i] = abs(math.pi - geo.haversineAngle(rows[i-1][5], rows[i-1][6], rows[i][5], rows[i][6], rows[i+1][5], rows[i+1][6])) return speeds, angles -def isBuoy(profile): +def isBuoy(row): ''' - decide if profile belongs to a buoy-based measurement + decide if row belongs to a buoy-based measurement ''' - return profile.probe_type() in [4,7,9,10,11,12,13,15] + return row[7] in [4,7,9,10,11,12,13,15] def detectExcessiveSpeed(speeds, angles, index, maxSpeed): ''' @@ -174,7 +188,7 @@ def detectExcessiveSpeed(speeds, angles, index, maxSpeed): return flag -def meanSpeed(speeds, profiles, maxSpeed): +def meanSpeed(speeds, rows, maxSpeed): ''' determine mean speed, neglecting missing data, intervals less than 1h, and speeds over maxspeed, for use in condition (f) ''' @@ -185,7 +199,7 @@ def meanSpeed(speeds, profiles, maxSpeed): if speed == None or iSpeed == 0: #missing values continue - elif iSpeed > 0 and geo.deltaTime(profiles[iSpeed-1], profiles[iSpeed]) < 3600.: + elif iSpeed > 0 and geo.deltaTime((rows[iSpeed-1][1], rows[iSpeed-1][2], rows[iSpeed-1][3], rows[iSpeed-1][4]), (rows[iSpeed][1], rows[iSpeed][2], rows[iSpeed][3], rows[iSpeed][4])): #too close together in time continue elif speed > maxSpeed: @@ -201,48 +215,48 @@ def meanSpeed(speeds, profiles, maxSpeed): return meanSpeed -def trackSpeed(prev_profile, profile): +def trackSpeed(prev_row, row): ''' computes the speed, including rounding tolerance from the reference, - for the track at . + for the track at . return None if some necessary data is missing ''' - # check that all required data is present: - if None in [profile.latitude(), profile.longitude(), prev_profile.latitude(), prev_profile.longitude()]: + # check that all required data (full timestamp + lat + long) is present: + if None in [row[1], row[2], row[3], row[4], row[5], row[6]]: return None - if None in [profile.year(), profile.month(), profile.day(), profile.time(), prev_profile.year(), prev_profile.month(), prev_profile.day(), prev_profile.time()]: + if None in [prev_row[1], prev_row[2], prev_row[3], prev_row[4], prev_row[5], prev_row[6] ]: return None - dist = geo.haversineDistance(prev_profile, profile) - DTime = geo.deltaTime(prev_profile, profile) + dist = geo.haversineDistance(prev_row[5], prev_row[6], row[5], row[6]) + DTime = geo.deltaTime((prev_row[1], prev_row[2], prev_row[3], prev_row[4]), (row[1], row[2], row[3], row[4])) speed = (dist - DistRes) / max(DTime, TimeRes) return speed -def condition_a(profiles, speeds, angles, index, maxSpeed): +def condition_a(rows, speeds, angles, index, maxSpeed): ''' assess condition (a) from the text ''' - if index == 1 and len(profiles) == 2: + if index == 1 and len(rows) == 2: return 0, 'a' - elif index == 1 and len(profiles) > 2: # note 'M' in the text seems to count from 1, not 0. - impliedSpeed = trackSpeed(profiles[0], profiles[2]) + elif index == 1 and len(rows) > 2: # note 'M' in the text seems to count from 1, not 0. + impliedSpeed = trackSpeed(rows[0], rows[2]) if impliedSpeed < maxSpeed and (speeds[2]>maxSpeed or angles[2]>45./180.*math.pi): return 1, 'a' else: return 0, 'a' - elif index == len(profiles)-1 and len(profiles)>3: # why not >=? seems to cause problems, investigate. - impliedSpeed = trackSpeed(profiles[-3], profiles[-1]) + elif index == len(rows)-1 and len(rows)>3: # why not >=? seems to cause problems, investigate. + impliedSpeed = trackSpeed(rows[-3], rows[-1]) if impliedSpeed < maxSpeed and (speeds[-2] > maxSpeed or angles[-3]>45./180.*math.pi): return index-1, 'a' else: return index, 'a' else: - return condition_b(profiles, speeds, angles, index, maxSpeed) + return condition_b(rows, speeds, angles, index, maxSpeed) -def condition_b(profiles, speeds, angles, index, maxSpeed): +def condition_b(rows, speeds, angles, index, maxSpeed): ''' assess condition (b) from the text ''' @@ -252,27 +266,27 @@ def condition_b(profiles, speeds, angles, index, maxSpeed): elif index < len(speeds) - 1 and speeds[index+1] > maxSpeed: return index, 'b' - return condition_c(profiles, speeds, angles, index, maxSpeed) + return condition_c(rows, speeds, angles, index, maxSpeed) -def condition_c(profiles, speeds, angles, index, maxSpeed): +def condition_c(rows, speeds, angles, index, maxSpeed): ''' assess condition (c) from the text ''' - if index < len(profiles)-1 and index > 0: - impliedSpeed = trackSpeed(profiles[index-1], profiles[index+1]) + if index < len(rows)-1 and index > 0: + impliedSpeed = trackSpeed(rows[index-1], rows[index+1]) if impliedSpeed > maxSpeed: return index-1, 'c' if index > 1: - impliedSpeed = trackSpeed(profiles[index-2], profiles[index]) + impliedSpeed = trackSpeed(rows[index-2], rows[index]) if impliedSpeed > maxSpeed: return index, 'c' - return condition_d(profiles, speeds, angles, index, maxSpeed) + return condition_d(rows, speeds, angles, index, maxSpeed) -def condition_d(profiles, speeds, angles, index, maxSpeed): +def condition_d(rows, speeds, angles, index, maxSpeed): ''' assess condition (d) from the text ''' @@ -283,14 +297,14 @@ def condition_d(profiles, speeds, angles, index, maxSpeed): if None not in [angles[index-1], angles[index]] and angles[index] > 45./180.*math.pi + angles[index-1]: return index, 'd' - return condition_e(profiles, speeds, angles, index, maxSpeed) + return condition_e(rows, speeds, angles, index, maxSpeed) -def condition_e(profiles, speeds, angles, index, maxSpeed): +def condition_e(rows, speeds, angles, index, maxSpeed): ''' assess condition (e) from the text ''' - if len(profiles) > max(2, index+1): + if len(rows) > max(2, index+1): if None not in [angles[index-2], angles[index+1]] and angles[index-2] > 45./180.*math.pi and angles[index-2] > angles[index+1]: return index-1, 'e' @@ -298,16 +312,16 @@ def condition_e(profiles, speeds, angles, index, maxSpeed): if None not in [angles[index+1]] and angles[index+1] > 45./180.*math.pi: return index, 'e' - return condition_f(profiles, speeds, angles, index, maxSpeed) + return condition_f(rows, speeds, angles, index, maxSpeed) -def condition_f(profiles, speeds, angles, index, maxSpeed): +def condition_f(rows, speeds, angles, index, maxSpeed): ''' assess condition (f) from the text ''' if index>0 and index < len(speeds)-1: - ms = meanSpeed(speeds, profiles, maxSpeed) + ms = meanSpeed(speeds, rows, maxSpeed) if None not in [speeds[index-1], speeds[index+1]] and speeds[index-1] < min([speeds[index+1], 0.5*ms]): return index-1, 'f' @@ -315,21 +329,21 @@ def condition_f(profiles, speeds, angles, index, maxSpeed): if None not in [speeds[index-1], speeds[index+1]] and speeds[index+1] < min([speeds[index-1], 0.5*ms]): return index, 'f' - return condition_g(profiles, speeds, angles, index, maxSpeed) + return condition_g(rows, speeds, angles, index, maxSpeed) -def condition_g(profiles, speeds, angles, index, maxSpeed): +def condition_g(rows, speeds, angles, index, maxSpeed): ''' assess condition (g) from the text ''' - if index > 1 and index < len(profiles) - 1: + if index > 1 and index < len(rows) - 1: - dist1 = geo.haversineDistance(profiles[index], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index]) - dist2 = geo.haversineDistance(profiles[index-1], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index-1]) + dist1 = geo.haversineDistance(rows[index][5], rows[index][6], rows[index-2][5], rows[index-2][6]) + geo.haversineDistance(rows[index+1][5], rows[index+1][6], rows[index][5], rows[index][6]) + dist2 = geo.haversineDistance(rows[index-1][5], rows[index-1][6], rows[index-2][5], rows[index-2][6]) + geo.haversineDistance(rows[index+1][5], rows[index+1][6], rows[index-1][5], rows[index-1][6]) - distTol = geo.haversineDistance(profiles[index-1], profiles[index-2]) - distTol += geo.haversineDistance(profiles[index], profiles[index-1]) - distTol += geo.haversineDistance(profiles[index+1], profiles[index]) + distTol = geo.haversineDistance(rows[index-1][5], rows[index-1][6], rows[index-2][5], rows[index-2][6]) + distTol += geo.haversineDistance(rows[index][5], rows[index][6], rows[index-1][5], rows[index-1][6]) + distTol += geo.haversineDistance(rows[index+1][5], rows[index+1][6], rows[index][5], rows[index][6]) distTol = max(DistRes, 0.1*distTol) if dist1 < dist2 - distTol: @@ -338,23 +352,23 @@ def condition_g(profiles, speeds, angles, index, maxSpeed): if dist2 < dist1 - distTol: return index, 'g' - return condition_h(profiles, speeds, angles, index, maxSpeed) + return condition_h(rows, speeds, angles, index, maxSpeed) -def condition_h(profiles, speeds, angles, index, maxSpeed): +def condition_h(rows, speeds, angles, index, maxSpeed): ''' assess condition (h) from the text ''' - if index > 1 and index < len(profiles) - 1: + if index > 1 and index < len(rows) - 1: - dist1 = geo.haversineDistance(profiles[index], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index]) - dist2 = geo.haversineDistance(profiles[index-1], profiles[index-2]) + geo.haversineDistance(profiles[index + 1], profiles[index-1]) + dist1 = geo.haversineDistance(rows[index][5], rows[index][6], rows[index-2][5], rows[index-2][6]) + geo.haversineDistance(rows[index+1][5], rows[index+1][6], rows[index][5], rows[index][6]) + dist2 = geo.haversineDistance(rows[index-1][5], rows[index-1][6], rows[index-2][5], rows[index-2][6]) + geo.haversineDistance(rows[index+1][5], rows[index+1][6], rows[index-1][5], rows[index-1][6]) - PD1 = geo.haversineDistance(profiles[index-1], profiles[index-2]) / dist2 - PD2 = geo.haversineDistance(profiles[index], profiles[index-2]) / dist1 + PD1 = geo.haversineDistance(rows[index-1][5], rows[index-1][6], rows[index-2][5], rows[index-2][6]) / dist2 + PD2 = geo.haversineDistance(rows[index][5], rows[index][6], rows[index-2][5], rows[index-2][6]) / dist1 - PT1 = geo.deltaTime(profiles[index-2], profiles[index-1]) / geo.deltaTime(profiles[index-2], profiles[index+1]) - PT2 = geo.deltaTime(profiles[index-2], profiles[index]) / geo.deltaTime(profiles[index-2], profiles[index+1]) + PT1 = geo.deltaTime((rows[index-2][1], rows[index-2][2], rows[index-2][3], rows[index-2][4]), (rows[index-1][1], rows[index-1][2], rows[index-1][3], rows[index-1][4])) / geo.deltaTime((rows[index-2][1], rows[index-2][2], rows[index-2][3], rows[index-2][4]), (rows[index+1][1], rows[index+1][2], rows[index+1][3], rows[index+1][4])) + PT2 = geo.deltaTime((rows[index-2][1], rows[index-2][2], rows[index-2][3], rows[index-2][4]), (rows[index][1], rows[index][2], rows[index][3], rows[index][4])) / geo.deltaTime((rows[index-2][1], rows[index-2][2], rows[index-2][3], rows[index-2][4]), (rows[index+1][1], rows[index+1][2], rows[index+1][3], rows[index+1][4])) if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): return index-1, 'h' diff --git a/tests/EN_track_validation.py b/tests/EN_track_validation.py index 0031645..f5cae72 100644 --- a/tests/EN_track_validation.py +++ b/tests/EN_track_validation.py @@ -1,3 +1,5 @@ +# Recall parameters are queried from the database in the order uid, year, month, day, time, lat, long, probe + import util.main as main import os, math from wodpy import wod @@ -28,21 +30,21 @@ def trackSpeed_test(self): spot check on trackSpeed function ''' - # some fake profiles - profiles = [] + # some fake rows + rows = [] # first 5 profiles in a straight line - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 1])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=2, longitude=90, date=[1999, 12, 31, 2])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=3, longitude=90, date=[1999, 12, 31, 3])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=4, longitude=90, date=[1999, 12, 31, 4])) + rows.append([0, 1999, 12, 31, 0, 0, 90, 0]) + rows.append([0, 1999, 12, 31, 1, 1, 90, 0]) + rows.append([0, 1999, 12, 31, 2, 2, 90, 0]) + rows.append([0, 1999, 12, 31, 3, 3, 90, 0]) + rows.append([0, 1999, 12, 31, 4, 4, 90, 0]) # reverse one - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=3, longitude=90, date=[1999, 12, 31, 5])) + rows.append([0, 1999, 12, 31, 5, 3, 90, 0]) - trueDistance = util.geo.haversineDistance(profiles[0], profiles[1]) + trueDistance = util.geo.haversineDistance(0, 90, 1, 90) # lat/long from rows[0] and [1] trueSpeed = (trueDistance - self.distRes)/max(3600., self.timeRes) - assert qctests.EN_track_check.trackSpeed(profiles[0], profiles[1]) == trueSpeed + assert qctests.EN_track_check.trackSpeed(rows[0], rows[1]) == trueSpeed def detectExcessiveSpeed_test(self): ''' @@ -62,24 +64,24 @@ def calculateTraj_test(self): spot check on trajectory summary ''' - # some fake profiles - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 1])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=2, longitude=90, date=[1999, 12, 31, 2])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=3, longitude=90, date=[1999, 12, 31, 3])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=4, longitude=90, date=[1999, 12, 31, 4])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=3, longitude=90, date=[1999, 12, 31, 5])) + # some fake rows + rows = [] + rows.append([0, 1999, 12, 31, 0, 0, 90, 0]) + rows.append([0, 1999, 12, 31, 1, 1, 90, 0]) + rows.append([0, 1999, 12, 31, 2, 2, 90, 0]) + rows.append([0, 1999, 12, 31, 3, 3, 90, 0]) + rows.append([0, 1999, 12, 31, 4, 4, 90, 0]) + rows.append([0, 1999, 12, 31, 5, 3, 90, 0]) trueSpeeds = [None] trueAngles = [None, 0, 0, 0, math.pi, None] - for i in range(len(profiles)-1): - trueDistance = util.geo.haversineDistance(profiles[i], profiles[i+1]) + for i in range(len(rows)-1): + trueDistance = util.geo.haversineDistance(rows[i][5], rows[i][6], rows[i+1][5], rows[i+1][6]) trueSpeed = (trueDistance - self.distRes)/max(3600., self.timeRes) trueSpeeds.append(trueSpeed) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) assert numpy.array_equal(speeds, trueSpeeds) assert numpy.array_equal(angles, trueAngles) @@ -89,18 +91,17 @@ def meanSpeed_test(self): make sure mean speed rejects speeds that are too fast ''' - profiles = [] - - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 1])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 3])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=39, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=40, longitude=90, date=[1999, 12, 31, 9])) + rows = [] + rows.append([0, 1999, 12, 31, 1, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 3, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 5, 18, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 39, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 40, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) - individualSpeed = qctests.EN_track_check.trackSpeed(profiles[0], profiles[1]) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) + individualSpeed = qctests.EN_track_check.trackSpeed(rows[0], rows[1]) - ms = qctests.EN_track_check.meanSpeed(speeds, profiles, 15) + ms = qctests.EN_track_check.meanSpeed(speeds, rows, 15) assert ms - individualSpeed < 1E-10, 'all steps between profiles were equal except for one that should have been dropped => mean speed should equal speed between two adjacent profiles' @@ -109,14 +110,14 @@ def condition_a_fast_test(self): condition a checks that the speed from 2->3 isn't too fast ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0.01, longitude=90, date=[1999, 12, 31, 1])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 2])) + rows = [] + rows.append([0, 1999, 12, 31, 0, 0, 90, 0]) + rows.append([0, 1999, 12, 31, 1, 0.01, 90, 0]) + rows.append([0, 1999, 12, 31, 2, 1, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_a(profiles, speeds, angles, 1, 15)[0] + flag = qctests.EN_track_check.condition_a(rows, speeds, angles, 1, 15)[0] assert flag == 1, 'should have rejected the second profile due to high speed from second to third profile.' @@ -125,15 +126,15 @@ def condition_a_angle_test(self): condition a checks that the angle at 3 isn't too large ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0.5, longitude=90, date=[1999, 12, 31, 1])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 2])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0.5, longitude=90, date=[1999, 12, 31, 3])) + rows = [] + rows.append([0, 1999, 12, 31, 0, 0, 90, 0]) + rows.append([0, 1999, 12, 31, 1, 0.5, 90, 0]) + rows.append([0, 1999, 12, 31, 2, 1, 90, 0]) + rows.append([0, 1999, 12, 31, 3, 0.5, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_a(profiles, speeds, angles, 1, 15)[0] + flag = qctests.EN_track_check.condition_a(rows, speeds, angles, 1, 15)[0] assert flag == 1, 'should have rejected the second profile due to high angle at third profile.' @@ -142,14 +143,14 @@ def condition_a_speed2_test(self): condition a rejects the first profile if the speed from 1->3 is too large ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0.5, longitude=90, date=[1999, 12, 31, 1])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=2, longitude=90, date=[1999, 12, 31, 2])) + rows = [] + rows.append([0, 1999, 12, 31, 0, 0, 90, 0]) + rows.append([0, 1999, 12, 31, 1, 0.5, 90, 0]) + rows.append([0, 1999, 12, 31, 2, 2, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_a(profiles, speeds, angles, 1, 15)[0] + flag = qctests.EN_track_check.condition_a(rows, speeds, angles, 1, 15)[0] assert flag == 0, 'should have rejected the first profile due to high speed from first to third.' @@ -158,14 +159,14 @@ def condition_a_nominal_test(self): condition a rejects the first profile if the second passes muster ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=90, date=[1999, 12, 31, 0])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=0.5, longitude=90, date=[1999, 12, 31, 1])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=1, longitude=90, date=[1999, 12, 31, 2])) + rows = [] + rows.append([0, 1999, 12, 31, 0, 0, 90, 0]) + rows.append([0, 1999, 12, 31, 1, 0.5, 90, 0]) + rows.append([0, 1999, 12, 31, 2, 1, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_a(profiles, speeds, angles, 1, 15)[0] + flag = qctests.EN_track_check.condition_a(rows, speeds, angles, 1, 15)[0] assert flag == 0, 'should have rejected the first profile since the second seems ok.' @@ -174,17 +175,17 @@ def condition_a_fast_end_test(self): speed test at end of profile ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.49, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 10])) - - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 18.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 19.49, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 19.5, 90, 0]) + + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_a(profiles, speeds, angles, 5, 15)[0] + flag = qctests.EN_track_check.condition_a(rows, speeds, angles, 5, 15)[0] assert flag == 4, 'should have rejected the second to last profile due to high speed from third to last to second to last profile.' @@ -193,17 +194,17 @@ def condition_a_angle_end_test(self): angle test at end of profile ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 16.5, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_a(profiles, speeds, angles, 5, 15)[0] + flag = qctests.EN_track_check.condition_a(rows, speeds, angles, 5, 15)[0] assert flag == 4, 'should have rejected the second to last profile due to high angle at third to final profile.' @@ -212,17 +213,17 @@ def condition_a_nominal_end_test(self): condition a rejects the last profile if the second to last passes muster ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 18, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 18.5, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_a(profiles, speeds, angles, 5, 15)[0] + flag = qctests.EN_track_check.condition_a(rows, speeds, angles, 5, 15)[0] assert flag == 5, 'should have rejected the last profile since the second to last seems ok.' @@ -231,31 +232,31 @@ def condition_b_test(self): nominal behavior of condition b ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 18, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 19, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 19.5, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_b(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_b(rows, speeds, angles, 4, 15)[0] assert flag == 3, 'speed 4 too fast, speed 3 too fast -> should reject 3' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 18.5, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 19.5, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_b(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_b(rows, speeds, angles, 4, 15)[0] assert flag == 4, 'speed 4 too fast, speed 5 too fast -> should reject 4' @@ -264,31 +265,31 @@ def condition_c_test(self): nominal behavior of condition c ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=19.5, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 18.5, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 19.5, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_c(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_c(rows, speeds, angles, 4, 15)[0] assert flag == 3, 'speed 4 too fast, speed 3 to 5 too fast -> should reject 3' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=15.5, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 15.5, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 18.5, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 18.5, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_c(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_c(rows, speeds, angles, 4, 15)[0] assert flag == 4, 'speed 4 too fast, speed 2 to 4 too fast -> should reject 4' @@ -297,31 +298,31 @@ def condition_d_test(self): nominal behavior of condition d ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 16, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_d(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_d(rows, speeds, angles, 4, 15)[0] assert flag == 3, 'speed 4 too fast, angle at 3 too large -> should reject 3' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 18.5, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 18, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_d(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_d(rows, speeds, angles, 4, 15)[0] assert flag == 4, 'speed 4 too fast, angle at 4 too large -> should reject 4' @@ -330,33 +331,33 @@ def condition_e_test(self): nominal behavior of condition e ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=15.5, longitude=90, date=[1999, 12, 31, 10])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=15, longitude=90, date=[1999, 12, 31, 11])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 15.5, 90, 0]) + rows.append([0, 1999, 12, 31, 11, 15, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_e(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_e(rows, speeds, angles, 4, 15)[0] assert flag == 3, 'speed 4 too fast, angle at 2 too large -> should reject 3' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 11])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 18, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 18.5, 90, 0]) + rows.append([0, 1999, 12, 31, 11, 18, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_e(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_e(rows, speeds, angles, 4, 15)[0] assert flag == 4, 'speed 4 too fast, angle at 5 too large -> should reject 4' @@ -365,31 +366,31 @@ def condition_f_test(self): nominal behavior of condition f ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 18, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 18.5, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_f(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_f(rows, speeds, angles, 4, 15)[0] assert flag == 3, 'speed 4 too fast, speed 3 very small -> should reject 3' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 18.5, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 18.5, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_f(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_f(rows, speeds, angles, 4, 15)[0] assert flag == 4, 'speed 4 too fast, speed 5 very small -> should reject 4' @@ -398,31 +399,31 @@ def condition_g_test(self): nominal behavior of condition g ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=10, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 18, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 10, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 18, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 18, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_g(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_g(rows, speeds, angles, 4, 15)[0] assert flag == 3, 'positions 2, 4 and 5 all closely clustered but 3 far away -> should reject 3' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=10, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 18, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 18, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 10, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 18, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_g(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_g(rows, speeds, angles, 4, 15)[0] assert flag == 4, 'positions 2, 3 and 5 closely clustered but 4 far away -> should reject 4' @@ -431,37 +432,36 @@ def condition_h_test(self): nominal behavior of condition h ''' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 18, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 18.5, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_h(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_h(rows, speeds, angles, 4, 15)[0] assert flag == 3, 'nonsmooth behavior at profile 3 -> should reject 3' - profiles = [] - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16, longitude=90, date=[1999, 12, 31, 5])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=16.5, longitude=90, date=[1999, 12, 31, 6])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17, longitude=90, date=[1999, 12, 31, 7])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=17.5, longitude=90, date=[1999, 12, 31, 8])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 9])) - profiles.append(util.testingProfile.fakeProfile([0], [0], latitude=18.5, longitude=90, date=[1999, 12, 31, 10])) + rows = [] + rows.append([0, 1999, 12, 31, 5, 16, 90, 0]) + rows.append([0, 1999, 12, 31, 6, 16.5, 90, 0]) + rows.append([0, 1999, 12, 31, 7, 17, 90, 0]) + rows.append([0, 1999, 12, 31, 8, 17.5, 90, 0]) + rows.append([0, 1999, 12, 31, 9, 18.5, 90, 0]) + rows.append([0, 1999, 12, 31, 10, 18.5, 90, 0]) - speeds, angles = qctests.EN_track_check.calculateTraj(profiles) + speeds, angles = qctests.EN_track_check.calculateTraj(rows) - flag = qctests.EN_track_check.condition_h(profiles, speeds, angles, 4, 15)[0] + flag = qctests.EN_track_check.condition_h(rows, speeds, angles, 4, 15)[0] assert flag == 4, 'nonsmooth behavior at 4 -> should reject 4' ############################ # Integration Tests - # Integration tests rely on being able to generate raw wod ascii text for dummy testing profiles - tbd ############################ # def all_for_one_test(self): diff --git a/tests/geo_tests.py b/tests/geo_tests.py index f0fa4dd..1e11161 100644 --- a/tests/geo_tests.py +++ b/tests/geo_tests.py @@ -8,29 +8,29 @@ def test_deltaTime_dateAware(): ''' # 2 days on a leap year: - early = util.testingProfile.fakeProfile([0], [0], date=[2004, 2, 28, 0]) - late = util.testingProfile.fakeProfile([0], [0], date=[2004, 3, 1, 0]) + early = (2004, 2, 28, 0) + late = (2004, 3, 1, 0) diff = geo.deltaTime(early, late) assert diff == 172800., 'incorrect date difference on leap year' # 1 day on not a leap year: - early = util.testingProfile.fakeProfile([0], [0], date=[2005, 2, 28, 0]) - late = util.testingProfile.fakeProfile([0], [0], date=[2005, 3, 1, 0]) + early = (2005, 2, 28, 0) + late = (2005, 3, 1, 0) diff = geo.deltaTime(early, late) assert diff == 86400., 'incorrect date difference on non-leap year' # 30 days in June: - early = util.testingProfile.fakeProfile([0], [0], date=[2004, 6, 30, 0]) - late = util.testingProfile.fakeProfile([0], [0], date=[2004, 7, 1, 0]) + early = (2004, 6, 30, 0) + late = (2004, 7, 1, 0) diff = geo.deltaTime(early, late) assert diff == 86400., 'should only be 1 day between June 30 and July 1' # 31 days in July: - early = util.testingProfile.fakeProfile([0], [0], date=[2004, 7, 30, 0]) - late = util.testingProfile.fakeProfile([0], [0], date=[2004, 8, 1, 0]) + early = (2004, 7, 30, 0) + late = (2004, 8, 1, 0) diff = geo.deltaTime(early, late) assert diff == 172800., 'should be 2 days between July 30 and August 1' @@ -41,23 +41,23 @@ def test_deltaTime_times(): ''' # same day, same time: - early = util.testingProfile.fakeProfile([0], [0], date=[2004, 2, 28, 0]) - late = util.testingProfile.fakeProfile([0], [0], date=[2004, 2, 28, 0]) + early = (2004, 2, 28, 0) + late = (2004, 2, 28, 0) diff = geo.deltaTime(early, late) assert diff == 0., 'incorrect time difference for identical dates and times' # same day, different time: - early = util.testingProfile.fakeProfile([0], [0], date=[2004, 2, 28, 0]) - late = util.testingProfile.fakeProfile([0], [0], date=[2004, 2, 28, 1.5]) + early = (2004, 2, 28, 0) + late = (2004, 2, 28, 1.5) diff = geo.deltaTime(early, late) assert diff == 5400., 'incorrect time difference for identical dates and different times' # earlier time on later day - early = util.testingProfile.fakeProfile([0], [0], date=[2005, 2, 27, 2]) - late = util.testingProfile.fakeProfile([0], [0], date=[2005, 2, 28, 1]) + early = (2005, 2, 27, 2) + late = (2005, 2, 28, 1) diff = geo.deltaTime(early, late) assert diff == 82800., 'incorrect time difference for earlier times but later days' @@ -66,16 +66,20 @@ def test_haversineAngle(): ''' check some nominal behavior of great circle intersections. ''' - - A = util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=10) - B = util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=20) - C = util.testingProfile.fakeProfile([0], [0], latitude=0, longitude=30) - - angle = geo.haversineAngle(A,B,C) + + lat1 = 0 + lon1 = 10 + lat2 = 0 + lon2 = 20 + lat3 = 0 + lon3 = 30 + + angle = geo.haversineAngle(lat1, lon1, lat2, lon2, lat3, lon3) assert angle - math.pi < 0.000001, 'point on a circle had a non-zero angle between them: %f' % angle - C = util.testingProfile.fakeProfile([0], [0], latitude=90, longitude=20) - angle = geo.haversineAngle(A,B,C) + lat3 = 90 + lon3 = 20 + angle = geo.haversineAngle(lat1, lon1, lat2, lon2, lat3, lon3) assert angle - math.pi/2 < 0.000001, 'orthogonal great circles had an angle of %f between them.' % angle def test_archaversine_domain(): @@ -83,4 +87,4 @@ def test_archaversine_domain(): make sure archaversine does something sensible if it ends up with an argument of 1+epislon or -1-epsilon ''' - assert geo.arcHaversine(1.00000000000000004) == geo.arcHaversine(1.0), 'archaversine fooled by floating point problems' \ No newline at end of file + assert geo.arcHaversine(1.00000000000000004) == geo.arcHaversine(1.0), 'archaversine fooled by floating point problems' diff --git a/util/geo.py b/util/geo.py index 8ad3be6..1c5fa2c 100644 --- a/util/geo.py +++ b/util/geo.py @@ -21,18 +21,13 @@ def arcHaversine(hs): return 2 * math.asin(sqrths) -def haversineDistance(pro1, pro2): +def haversineDistance(lat1, lon1, lat2, lon2): """ Calculate the great circle distance in meters between two points on the earth (specified in decimal degrees) implementation from http://gis.stackexchange.com/questions/44064/how-to-calculate-distances-in-a-point-sequence """ - lon1 = pro1.longitude() - lat1 = pro1.latitude() - lon2 = pro2.longitude() - lat2 = pro2.latitude() - # convert decimal degrees to radians lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2]) # haversine formula @@ -44,23 +39,19 @@ def haversineDistance(pro1, pro2): assert km >= 0, 'haversine returned negative distance' return km*1000. -def haversineAngle(pro1, pro2, pro3): +def haversineAngle(lat1, lon1, lat2, lon2, lat3, lon3): ''' - Calculate the angle subtended by the great circle passing through pro1 and pro2, - with that passing through pro2 and pro3 (all the pro* are WOD profiles or headers) + Calculate the angle subtended by the great circle passing through lat/lon1 and lat/lon2, + with that passing through lat/lon2 and lat/lon3 return None if any required information is missing. ''' - if None in [pro1.latitude(), pro1.longitude()]: - return None - if None in [pro2.latitude(), pro2.longitude()]: - return None - if None in [pro3.latitude(), pro3.longitude()]: + if None in [lat1, lon1, lat2, lon2, lat3, lon3]: return None - a = haversineDistance(pro1, pro2) / 6367000. - b = haversineDistance(pro2, pro3) / 6367000. - c = haversineDistance(pro3, pro1) / 6367000. + a = haversineDistance(lat1, lon1, lat2, lon2) / 6367000. + b = haversineDistance(lat2, lon2, lat3, lon3) / 6367000. + c = haversineDistance(lat3, lon3, lat1, lon1) / 6367000. if a == 0 or b == 0: return 0 @@ -71,22 +62,22 @@ def haversineAngle(pro1, pro2, pro3): def deltaTime(earlier, later): ''' - Calculate the time difference between two profiles, later and earlier, + Calculate the time difference between two tuples (year, month, day, time), in seconds. return None if information is missing. ''' - if None in [earlier.year(), earlier.month(), earlier.day(), earlier.time()]: + if None in [earlier[0], earlier[1], earlier[2], earlier[3]]: return None - if None in [later.year(), later.month(), later.day(), later.time()]: + if None in [later[0], later[1], later[2], later[3]]: return None - eHour, eMinute, eSecond = parseTime(earlier.time()) - lHour, lMinute, lSecond = parseTime(later.time()) + eHour, eMinute, eSecond = parseTime(earlier[3]) + lHour, lMinute, lSecond = parseTime(later[3]) try: - early = datetime(year=earlier.year(), month=earlier.month(), day=earlier.day(), hour=eHour, minute=eMinute, second=eSecond ) - late = datetime(year=later.year(), month=later.month(), day=later.day(), hour=lHour, minute=lMinute, second=lSecond ) + early = datetime(year=earlier[0], month=earlier[1], day=earlier[2], hour=eHour, minute=eMinute, second=eSecond ) + late = datetime(year=later[0], month=later[1], day=later[2], hour=lHour, minute=lMinute, second=lSecond ) except: return None From dbe42433fc493396ba9c4e8dbe69aead34882da5 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Tue, 23 Aug 2016 00:11:13 +0000 Subject: [PATCH 77/79] cleanup --- AutoQC.py | 3 - build-db.py | 2 +- .../Hsu-Chang-Lin.ipynb | 308 - .../baseline-performance.ipynb | 1319 -- .../01-basic-machine-learning/pip_freeze.dat | 118 - .../production-combination.ipynb | 306 - .../03-production/results-most.csv | 12788 ---------------- 7 files changed, 1 insertion(+), 14843 deletions(-) delete mode 100644 learningAnalysis/01-basic-machine-learning/Hsu-Chang-Lin.ipynb delete mode 100644 learningAnalysis/01-basic-machine-learning/baseline-performance.ipynb delete mode 100644 learningAnalysis/01-basic-machine-learning/pip_freeze.dat delete mode 100644 learningAnalysis/03-production/production-combination.ipynb delete mode 100644 learningAnalysis/03-production/results-most.csv diff --git a/AutoQC.py b/AutoQC.py index bd4f6be..d68773b 100644 --- a/AutoQC.py +++ b/AutoQC.py @@ -34,7 +34,6 @@ def run(test, profiles, parameters): # Identify and import tests testNames = main.importQC('qctests') testNames.sort() - testNames = ['EN_track_check'] print('{} quality control checks have been found'.format(len(testNames))) testNames = main.checkQCTestRequirements(testNames) print('{} quality control checks are able to be run:'.format(len(testNames))) @@ -58,9 +57,7 @@ def process_row(uid): return # run tests - print uid for itest, test in enumerate(testNames): - print test result = run(test, [profile], parameterStore) query = "UPDATE " + sys.argv[1] + " SET " + test.lower() + " = " + str(result[0][0]) + " WHERE uid = " + str(profile.uid()) + ";" cur.execute(query) diff --git a/build-db.py b/build-db.py index 35e36d1..55d6078 100644 --- a/build-db.py +++ b/build-db.py @@ -44,7 +44,7 @@ # populate table from wod-ascii data fid = open(sys.argv[1]) - for xx in range(1000): + while True: # extract profile as wodpy object and raw text start = fid.tell() profile = wod.WodProfile(fid) diff --git a/learningAnalysis/01-basic-machine-learning/Hsu-Chang-Lin.ipynb b/learningAnalysis/01-basic-machine-learning/Hsu-Chang-Lin.ipynb deleted file mode 100644 index 5c8c2f5..0000000 --- a/learningAnalysis/01-basic-machine-learning/Hsu-Chang-Lin.ipynb +++ /dev/null @@ -1,308 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Grid-Search Crossvalidation\n", - "\n", - "Here we implement the procedure recommended by [Hsu, Chang and Lin](http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf) for a robust application of an SVM via grid-searched model parameters optimized by training crossvalidation. No great improvement is found for this dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# helpers\n", - "\n", - "import json\n", - "import random\n", - "import numpy as np\n", - "\n", - "def printSummary(title, TT, TF, FT, FF):\n", - " print title\n", - " print '\\t Correct flags:', TT\n", - " print '\\t False positive:', TF\n", - " print '\\t False negative:', FT\n", - " print '\\t Correct pass:', FF\n", - "\n", - "def shuffleLists(a, b):\n", - " '''\n", - " given two lists a, b, shuffle them maintaining pairwise correspondence.\n", - " thanks http://stackoverflow.com/questions/13343347/randomizing-two-lists-and-maintaining-order-in-python\n", - " '''\n", - "\n", - " combined = zip(a, b)\n", - " random.seed(2154)\n", - " random.shuffle(combined)\n", - "\n", - " a[:], b[:] = zip(*combined)\n", - "\n", - "def reloadData(): \n", - " ## read raw data\n", - " with open('../../../AutoQC_raw/true.dat') as true_data: \n", - " truth = json.load(true_data)\n", - "\n", - " with open('../../../AutoQC_raw/results.dat') as results_data: \n", - " rawResults = json.load(results_data)\n", - " \n", - " return truth, rawResults\n", - "\n", - "def transpose(lists):\n", - " '''\n", - " return the transpose of lists, a list of lists.\n", - " all the inner lists had better be the same length!\n", - " '''\n", - "\n", - " T = []\n", - " for i in range(len(lists[0])):\n", - " T.append([None]*len(lists))\n", - "\n", - " for i in range(len(lists)):\n", - " for j in range(len(lists[0])):\n", - " T[j][i] = lists[i][j]\n", - "\n", - " return T\n", - "\n", - "def reloadData(): \n", - " ## read raw data\n", - " with open('../../../AutoQC_raw/true.dat') as true_data: \n", - " truth = json.load(true_data)\n", - "\n", - " with open('../../../AutoQC_raw/results.dat') as results_data: \n", - " rawResults = json.load(results_data)\n", - " \n", - " return truth, rawResults\n", - "\n", - "def runClassifier(classifier, trainingSize):\n", - " '''\n", - " given a scikit-learn classifier, train it on the first trainingSize points of data and truth,\n", - " and return the prediction classes on the remainder of data\n", - " '''\n", - " #load and arrange data\n", - " truth, rawResults = reloadData()\n", - " data = transpose(rawResults) #arrange data into rows by profile for consumption by scikit-learn\n", - " shuffleLists(data, truth) #randomize order of profiles\n", - " \n", - " #train svm\n", - " classifier.fit(data[0:trainingSize], truth[0:trainingSize])\n", - "\n", - " #predict values for remainder of profiles\n", - " TT = 0.\n", - " TF = 0.\n", - " FT = 0.\n", - " FF = 0.\n", - "\n", - " for i in range(trainingSize, len(truth)):\n", - " assessment = classifier.predict(data[i])\n", - " if assessment and truth[i]:\n", - " TT += 1\n", - " elif assessment and not truth[i]:\n", - " TF += 1\n", - " elif not assessment and truth[i]:\n", - " FT += 1\n", - " elif not assessment and not truth[i]:\n", - " FF += 1 \n", - " \n", - " return TT, TF, FT, FF\n", - "\n", - "truth, rawResults = reloadData()\n", - "datasetSize = len(truth)\n", - "data = transpose(rawResults)\n", - "shuffleLists(data, truth)\n", - "trainingSize = 5000\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "#crossvalidation\n", - "\n", - "def crossvalidate(classifier, data, truth, folds):\n", - " '''\n", - " run an n-fold crossvalidation on the training data and classifier provided\n", - " '''\n", - " \n", - " foldSize = len(truth) / folds\n", - " correct = 0.\n", - " \n", - " for i in range(folds):\n", - " testData = data[i*foldSize : (i+1)*foldSize]\n", - " testTruth = truth[i*foldSize : (i+1)*foldSize]\n", - " trainingData = data[: i*foldSize] + data[(i+1)*foldSize:]\n", - " trainingTruth = truth[: i*foldSize] + truth[(i+1)*foldSize:]\n", - " \n", - " classifier.fit(trainingData, trainingTruth)\n", - " \n", - " for j in range(foldSize):\n", - " guess = classifier.predict(testData[j])\n", - " if guess and testTruth[j]:\n", - " correct += 1\n", - " elif not guess and not testTruth[j]:\n", - " correct += 1\n", - " \n", - " return correct / len(truth)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.919, 0.125, 2)" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sklearn import svm\n", - "\n", - "gammaGrid = [2**-15, 2**-13, 2**-11, 2**-9, 2**-7, 2**-5, 2**-3, 2**-1, 2, 8]\n", - "cGrid = [2**-5, 2**-3, 2**-1, 2, 2**3, 2**5, 2**7, 2**9, 2**11, 2**13, 2**15]\n", - "results = []\n", - "\n", - "for g in gammaGrid:\n", - " for c in cGrid:\n", - " clf = svm.SVC(C=c, gamma=g, kernel='rbf')\n", - " results.append((crossvalidate(clf, data[0:trainingSize], truth[0:trainingSize], 5), c, g))\n", - "\n", - "from operator import itemgetter\n", - "max(results,key=itemgetter(0))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SVM with grid-searched RBF kernel\n", - "\t Correct flags: 0.0553164397461\n", - "\t False positive: 0.0200149880295\n", - "\t False negative: 0.0612453328205\n", - "\t Correct pass: 0.863423239404\n" - ] - } - ], - "source": [ - "clf = svm.SVC(C=.125, gamma=2, kernel='rbf')\n", - "TT, TF, FT, FF = runClassifier(clf, trainingSize)\n", - "printSummary('SVM with grid-searched RBF kernel', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So we see the RBF kernel rising to the level of the default performance of the linear kernel. We attempt the same procedure with a linear kernel:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.9162, 2)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cGrid = [2**-5, 2**-3, 2**-1, 2, 2**3, 2**5, 2**7, 2**9, 2**11, 2**13, 2**15]\n", - "results = []\n", - "\n", - "for c in cGrid:\n", - " clf = svm.SVC(C=c, kernel='linear')\n", - " results.append((crossvalidate(clf, data[0:trainingSize], truth[0:trainingSize], 5), c))\n", - "\n", - "from operator import itemgetter\n", - "max(results,key=itemgetter(0))" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SVM with grid-searched linear kernel\n", - "\t Correct flags: 0.0544741920723\n", - "\t False positive: 0.0184100751391\n", - "\t False negative: 0.0620875804943\n", - "\t Correct pass: 0.865028152294\n" - ] - } - ], - "source": [ - "clf = svm.SVC(C=2, kernel='linear')\n", - "TT, TF, FT, FF = runClassifier(clf, trainingSize)\n", - "printSummary('SVM with grid-searched linear kernel', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/learningAnalysis/01-basic-machine-learning/baseline-performance.ipynb b/learningAnalysis/01-basic-machine-learning/baseline-performance.ipynb deleted file mode 100644 index 4194cb2..0000000 --- a/learningAnalysis/01-basic-machine-learning/baseline-performance.ipynb +++ /dev/null @@ -1,1319 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Preliminary Learning Investigation\n", - "\n", - "Here we explore some off-the-shelf learning strategies for identifying datasets to be flagged based on the results of the AutoQC suite of tests.\n", - "\n", - " - **AutoQC Version:** `learning-0.0.1`\n", - " - **Dataset:** full quota dataset (unreleased)\n", - " - **OS:** osx 10.10.3\n", - " - **python:** Python 2.7.10 :: Anaconda 2.3.0 (x86_64); see `pip_freeze.dat` for package versions.\n", - " \n", - "## 0.1: Data Reduction\n", - "\n", - "The full dataset was processed by AutoQC, and the results logged as JSON serializations.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import json\n", - "\n", - "def reloadData(): \n", - " ## read raw data\n", - " with open('../../../AutoQC_raw/true.dat') as true_data: \n", - " truth = json.load(true_data)\n", - "\n", - " with open('../../../AutoQC_raw/results.dat') as results_data: \n", - " rawResults = json.load(results_data)\n", - " \n", - " return truth, rawResults\n", - "\n", - "truth, rawResults = reloadData()\n", - "datasetSize = len(truth)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 0.2: Helpers\n", - "\n", - "A few helpers and parameters are defined here for subsequent use. " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import random\n", - "import numpy as np\n", - "\n", - "def shuffleLists(a, b):\n", - " '''\n", - " given two lists a, b, shuffle them maintaining pairwise correspondence.\n", - " thanks http://stackoverflow.com/questions/13343347/randomizing-two-lists-and-maintaining-order-in-python\n", - " '''\n", - "\n", - " combined = zip(a, b)\n", - " random.seed(2154)\n", - " random.shuffle(combined)\n", - "\n", - " a[:], b[:] = zip(*combined)\n", - "\n", - "def transpose(lists):\n", - " '''\n", - " return the transpose of lists, a list of lists.\n", - " all the inner lists had better be the same length!\n", - " '''\n", - "\n", - " T = []\n", - " for i in range(len(lists[0])):\n", - " T.append([None]*len(lists))\n", - "\n", - " for i in range(len(lists)):\n", - " for j in range(len(lists[0])):\n", - " T[j][i] = lists[i][j]\n", - "\n", - " return T\n", - "\n", - "def runClassifier(classifier, trainingSize):\n", - " '''\n", - " given a scikit-learn classifier, train it on the first trainingSize points of data and truth,\n", - " and return the prediction classes on the remainder of data\n", - " '''\n", - " #load and arrange data\n", - " truth, rawResults = reloadData()\n", - " data = transpose(rawResults) #arrange data into rows by profile for consumption by scikit-learn\n", - " shuffleLists(data, truth) #randomize order of profiles\n", - " \n", - " #train classifier\n", - " classifier.fit(data[0:trainingSize], truth[0:trainingSize])\n", - "\n", - " #predict values for remainder of profiles\n", - " TT = 0.\n", - " TF = 0.\n", - " FT = 0.\n", - " FF = 0.\n", - "\n", - " for i in range(trainingSize, len(truth)):\n", - " assessment = classifier.predict(data[i])\n", - " if assessment and truth[i]:\n", - " TT += 1\n", - " elif assessment and not truth[i]:\n", - " TF += 1\n", - " elif not assessment and truth[i]:\n", - " FT += 1\n", - " elif not assessment and not truth[i]:\n", - " FF += 1 \n", - " \n", - " return TT, TF, FT, FF\n", - "\n", - "def printSummary(title, TT, TF, FT, FF):\n", - " print title \n", - " print '\\t Correct flags:', TT\n", - " print '\\t False positive:', TF\n", - " print '\\t False negative:', FT\n", - " print '\\t Correct pass:', FF\n", - "\n", - "trainingSize = 5000" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 0.3: Perfomance to Beat\n", - "\n", - "To start, we consider the performance of each of the 13 tests implemented in `learning-0.0.1` independently; that is, how would they perform in the absense of all other information?" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "\t Correct flags: 0.0158228863769\n", - "\t False positive: 0.000609806980043\n", - "\t False negative: 0.100836398416\n", - "\t Correct pass: 0.882730908227\n", - "1\n", - "\t Correct flags: 0.0269021163512\n", - "\t False positive: 0.000898662917958\n", - "\t False negative: 0.0897571684415\n", - "\t Correct pass: 0.882442052289\n", - "2\n", - "\t Correct flags: 3.20951042128e-05\n", - "\t False positive: 0.000629064042571\n", - "\t False negative: 0.116627189688\n", - "\t Correct pass: 0.882711651165\n", - "3\n", - "\t Correct flags: 0.0\n", - "\t False positive: 0.0\n", - "\t False negative: 0.116659284793\n", - "\t Correct pass: 0.883340715207\n", - "4\n", - "\t Correct flags: 0.00683625719733\n", - "\t False positive: 0.0413962654137\n", - "\t False negative: 0.109823027595\n", - "\t Correct pass: 0.841944449794\n", - "5\n", - "\t Correct flags: 0.00100136725144\n", - "\t False positive: 0.00478858954855\n", - "\t False negative: 0.115657917541\n", - "\t Correct pass: 0.878552125659\n", - "6\n", - "\t Correct flags: 0.00654740125941\n", - "\t False positive: 7.06092292682e-05\n", - "\t False negative: 0.110111883533\n", - "\t Correct pass: 0.883270105978\n", - "7\n", - "\t Correct flags: 0.0571806376655\n", - "\t False positive: 0.0430202776868\n", - "\t False negative: 0.0594786471272\n", - "\t Correct pass: 0.84032043752\n", - "8\n", - "\t Correct flags: 0.000609806980043\n", - "\t False positive: 0.000378722229711\n", - "\t False negative: 0.116049477813\n", - "\t Correct pass: 0.882961992978\n", - "9\n", - "\t Correct flags: 0.0144813110208\n", - "\t False positive: 0.000609806980043\n", - "\t False negative: 0.102177973772\n", - "\t Correct pass: 0.882730908227\n", - "10\n", - "\t Correct flags: 0.00476291346518\n", - "\t False positive: 0.000192570625277\n", - "\t False negative: 0.111896371328\n", - "\t Correct pass: 0.883148144582\n", - "11\n", - "\t Correct flags: 0.032210646588\n", - "\t False positive: 0.0204317433419\n", - "\t False negative: 0.0844486382047\n", - "\t Correct pass: 0.862908971865\n", - "12\n", - "\t Correct flags: 0.0320373330252\n", - "\t False positive: 0.00124529004346\n", - "\t False negative: 0.0846219517675\n", - "\t Correct pass: 0.882095425164\n" - ] - } - ], - "source": [ - "for i in range(len(rawResults)):\n", - " TT = 0.\n", - " TF = 0.\n", - " FT = 0.\n", - " FF = 0.\n", - " for j in range(len(rawResults[i])):\n", - " if rawResults[i][j] and truth[j]:\n", - " TT += 1\n", - " elif rawResults[i][j] and not truth[j]:\n", - " TF += 1\n", - " elif not rawResults[i][j] and truth[j]:\n", - " FT += 1\n", - " elif not rawResults[i][j] and not truth[j]:\n", - " FF +=1\n", - " printSummary(i, TT/len(truth), TF/len(truth), FT/len(truth), FF/len(truth))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Row 7, corrsponding to the `EN_background_check` test, gives the best standalone performance, with around 5.7% of the entire dataset providing correct flags and and another 5.9% providing false negatives, and about 4.3% identified as false positives.\n", - "\n", - "Next, we consider the performance of raising a flag on a profile if *any* of the underlying tests do so:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "any flag\n", - "\t Correct flags: 0.0638564193418\n", - "\t False positive: 0.084724656101\n", - "\t False negative: 0.0528028654509\n", - "\t Correct pass: 0.798616059106\n" - ] - } - ], - "source": [ - "truth, rawResults = reloadData()\n", - "data = transpose(rawResults)\n", - "\n", - "TT = 0.\n", - "TF = 0.\n", - "FT = 0.\n", - "FF = 0.\n", - "\n", - "for i in range(len(truth)):\n", - " anyFlag = sum(data[i]) > 0\n", - " if anyFlag and truth[i]:\n", - " TT += 1\n", - " elif anyFlag and not truth[i]:\n", - " TF += 1\n", - " elif not anyFlag and truth[i]:\n", - " FT += 1\n", - " elif not anyFlag and not truth[i]:\n", - " FF +=1\n", - "printSummary('any flag', TT/len(truth), TF/len(truth), FT/len(truth), FF/len(truth))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "giving us an improved flag rate at the expense of seeing about twice as many false positives." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 1: Individual Classifiers\n", - "\n", - "In this section, we explore several of the individual classifiers presented by scikit-learn. We attempt to remain as parameter-agnostic as possible at this stage, using defaults wherever possible.\n", - "\n", - "### Discussion\n", - "\n", - "None of the classifiers investigated outperform flagging a profile flagged by any of the underlying tests. The classifiers that perform comparably are:\n", - "\n", - " - quadratic disciminant analysis\n", - " - kernel ridge\n", - " \n", - "These classifiers will form the basis of further inquiry in the next section, on ensemble methods." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1.1: Support Vector Machines\n", - "\n", - "First we examine the performance of [scikit-learn's SVM](http://scikit-learn.org/stable/modules/svm.html), with default kernels. Notably, randomization of data order was necessary before SVM training, to ensure no systematics from sorting. Substantially worse performance of this classifier was observed when trained on non-randomized data." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SVM with linear kernel\n", - "\t Correct flags: 0.054825681259\n", - "\t False positive: 0.0187814599402\n", - "\t False negative: 0.0617360913076\n", - "\t Correct pass: 0.864656767493\n" - ] - } - ], - "source": [ - "from sklearn import svm\n", - "\n", - "#linear kernel\n", - "\n", - "TT, TF, FT, FF = runClassifier(svm.SVC(kernel='linear'), trainingSize)\n", - "printSummary('SVM with linear kernel', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SVM with polynomial kernel\n", - "\t Correct flags: 0.0262555790619\n", - "\t False positive: 0.000258642986464\n", - "\t False negative: 0.0903061935047\n", - "\t Correct pass: 0.883179584447\n" - ] - } - ], - "source": [ - "#polynomial kernel\n", - "\n", - "TT, TF, FT, FF = runClassifier(svm.SVC(kernel='poly'), trainingSize)\n", - "printSummary('SVM with polynomial kernel', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SVM with rbf kernel\n", - "\t Correct flags: 0.0329471373527\n", - "\t False positive: 0.00179723716235\n", - "\t False negative: 0.0836146352139\n", - "\t Correct pass: 0.881640990271\n" - ] - } - ], - "source": [ - "#rbf kernel\n", - "\n", - "TT, TF, FT, FF = runClassifier(svm.SVC(kernel='rbf'), trainingSize)\n", - "printSummary('SVM with rbf kernel', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SVM with sigmoid kernel\n", - "\t Correct flags: 0.0\n", - "\t False positive: 0.0\n", - "\t False negative: 0.116561772567\n", - "\t Correct pass: 0.883438227433\n" - ] - } - ], - "source": [ - "#sigmoid kernel\n", - "\n", - "TT, TF, FT, FF = runClassifier(svm.SVC(kernel='sigmoid'), trainingSize)\n", - "printSummary('SVM with sigmoid kernel', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So the out-of-the box linear SVM performs comparably to `EN_background`, but with a lower false positive rate. Naively, the SVM is learning that `EN_background` is the best predictor, and uses other tests to veto some false positives.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1.2: Linear & Quadratic Discriminant Analysis\n", - "\n", - "Next we explore the [discriminant analysis techniques](http://scikit-learn.org/stable/auto_examples/classification/plot_lda_qda.html#example-classification-plot-lda-qda-py) presented by scikit-learn." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Linear discriminant\n", - "\t Correct flags: 0.0549848461737\n", - "\t False positive: 0.0198226637575\n", - "\t False negative: 0.0615769263929\n", - "\t Correct pass: 0.863615563676\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/billmills/anaconda/lib/python2.7/site-packages/sklearn/lda.py:371: UserWarning: Variables are collinear.\n", - " warnings.warn(\"Variables are collinear.\")\n" - ] - } - ], - "source": [ - "from sklearn.lda import LDA\n", - "\n", - "TT, TF, FT, FF = runClassifier(LDA(solver=\"svd\"), trainingSize)\n", - "printSummary('Linear discriminant', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Quadratic discriminant\n", - "\t Correct flags: 0.0637588120992\n", - "\t False positive: 0.0839130694291\n", - "\t False negative: 0.0528029604674\n", - "\t Correct pass: 0.799525158004\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/billmills/anaconda/lib/python2.7/site-packages/sklearn/qda.py:133: UserWarning: Variables are collinear\n", - " warnings.warn(\"Variables are collinear\")\n" - ] - } - ], - "source": [ - "from sklearn.qda import QDA\n", - "\n", - "TT, TF, FT, FF = runClassifier(QDA(), trainingSize)\n", - "printSummary('Quadratic discriminant', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So we see the linear discriminant behaves very comparably to the linear SVM, while the quadratic disciminant gives the best flagging performance so far, albeit at the cost of a substantially higher false positive rate." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1.3: Kernel Ridge\n", - "\n", - "Given the efficacy of the SVM, other kernel-trick based algorithms are worth exploring; here we try the [kernel ridge algorithm](http://scikit-learn.org/stable/modules/kernel_ridge.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Kernel Ridge with linear kernel\n", - "\t Correct flags: 0.0637919714564\n", - "\t False positive: 0.0845563609595\n", - "\t False negative: 0.0527698011102\n", - "\t Correct pass: 0.798881866474\n" - ] - } - ], - "source": [ - "from sklearn.kernel_ridge import KernelRidge\n", - "\n", - "TT, TF, FT, FF = runClassifier(KernelRidge(kernel='linear'), trainingSize)\n", - "printSummary('Kernel Ridge with linear kernel', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1.4: Stochastic Gradient Decent\n", - "\n", - "Next we consider the [SGD algorithm](http://scikit-learn.org/stable/modules/sgd.html) for learning classification, exploring a few possible configurations." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SGD with hinge loss & L2 penalty\n", - "\t Correct flags: 0.0333118902823\n", - "\t False positive: 0.00192987459131\n", - "\t False negative: 0.0832498822843\n", - "\t Correct pass: 0.881508352842\n" - ] - } - ], - "source": [ - "from sklearn.linear_model import SGDClassifier\n", - "\n", - "TT, TF, FT, FF = runClassifier(SGDClassifier(loss=\"hinge\", penalty=\"l2\"), trainingSize)\n", - "printSummary('SGD with hinge loss & L2 penalty', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SGD with hinge loss & elasticnet penalty\n", - "\t Correct flags: 0.0552368572888\n", - "\t False positive: 0.0202205760444\n", - "\t False negative: 0.0613249152778\n", - "\t Correct pass: 0.863217651389\n" - ] - } - ], - "source": [ - "from sklearn.linear_model import SGDClassifier\n", - "\n", - "TT, TF, FT, FF = runClassifier(SGDClassifier(loss=\"hinge\", penalty=\"elasticnet\"), trainingSize)\n", - "printSummary('SGD with hinge loss & elasticnet penalty', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SGD with modified huber loss & L2 penalty\n", - "\t Correct flags: 0.0538507961562\n", - "\t False positive: 0.0187748280687\n", - "\t False negative: 0.0627109764104\n", - "\t Correct pass: 0.864663399365\n" - ] - } - ], - "source": [ - "from sklearn.linear_model import SGDClassifier\n", - "\n", - "TT, TF, FT, FF = runClassifier(SGDClassifier(loss=\"modified_huber\", penalty=\"l2\"), trainingSize)\n", - "printSummary('SGD with modified huber loss & L2 penalty', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SGD with modified huber loss & elasticnet penalty\n", - "\t Correct flags: 0.0335705332688\n", - "\t False positive: 0.00229462752094\n", - "\t False negative: 0.0829912392978\n", - "\t Correct pass: 0.881143599912\n" - ] - } - ], - "source": [ - "from sklearn.linear_model import SGDClassifier\n", - "\n", - "TT, TF, FT, FF = runClassifier(SGDClassifier(loss=\"modified_huber\", penalty=\"elasticnet\"), trainingSize)\n", - "printSummary('SGD with modified huber loss & elasticnet penalty', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SGD with logistic loss & L2 penalty\n", - "\t Correct flags: 0.0550644286311\n", - "\t False positive: 0.0198425593718\n", - "\t False negative: 0.0614973439355\n", - "\t Correct pass: 0.863595668062\n" - ] - } - ], - "source": [ - "from sklearn.linear_model import SGDClassifier\n", - "\n", - "TT, TF, FT, FF = runClassifier(SGDClassifier(loss=\"log\", penalty=\"l2\"), trainingSize)\n", - "printSummary('SGD with logistic loss & L2 penalty', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SGD with logistic loss & elasticnet penalty\n", - "\t Correct flags: 0.0548389450019\n", - "\t False positive: 0.0187880918116\n", - "\t False negative: 0.0617228275647\n", - "\t Correct pass: 0.864650135622\n" - ] - } - ], - "source": [ - "from sklearn.linear_model import SGDClassifier\n", - "\n", - "TT, TF, FT, FF = runClassifier(SGDClassifier(loss=\"log\", penalty=\"elasticnet\"), trainingSize)\n", - "printSummary('SGD with logistic loss & elasticnet penalty', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The best of these are comparable to the linear kernel SVM or the linear discriminant analysis. Note these classifiers produce very different results on re-execution; more investigation required." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1.5: Nearest Neighbor Classification\n", - "\n", - "Next we explore [kNN](http://scikit-learn.org/stable/modules/neighbors.html#nearest-neighbors-classification) classification; we restrict ourselves to k nearest neighbour techniques, as the dimensionality of the inputs space is large (and growing). We explore a logarithmic range of k values, to get a gross sense of the effect of this choice." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "kNN, k=10\n", - "\t Correct flags: 0.0337562256693\n", - "\t False positive: 0.00129321493232\n", - "\t False negative: 0.0828055468973\n", - "\t Correct pass: 0.882145012501\n" - ] - } - ], - "source": [ - "from sklearn import neighbors\n", - "\n", - "TT, TF, FT, FF = runClassifier(neighbors.KNeighborsClassifier(10, weights='uniform'), trainingSize)\n", - "printSummary('kNN, k=10', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "kNN, k=100\n", - "\t Correct flags: 0.0314947575056\n", - "\t False positive: 0.000848879545319\n", - "\t False negative: 0.085067015061\n", - "\t Correct pass: 0.882589347888\n" - ] - } - ], - "source": [ - "from sklearn import neighbors\n", - "\n", - "TT, TF, FT, FF = runClassifier(neighbors.KNeighborsClassifier(100, weights='uniform'), trainingSize)\n", - "printSummary('kNN, k=100', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "kNN, k=1000\n", - "\t Correct flags: 0.0\n", - "\t False positive: 0.0\n", - "\t False negative: 0.116561772567\n", - "\t Correct pass: 0.883438227433\n" - ] - } - ], - "source": [ - "from sklearn import neighbors\n", - "\n", - "TT, TF, FT, FF = runClassifier(neighbors.KNeighborsClassifier(1000, weights='uniform'), trainingSize)\n", - "printSummary('kNN, k=1000', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Perhaps unsurprisingly, increasing k pushes the algorithm to never raise a flag; for large k, NN essentially takes the majortiy result of the dataset, which is mostly no-flag." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "kNN, k=10, distance weighted\n", - "\t Correct flags: 0.034180665442\n", - "\t False positive: 0.00171765470498\n", - "\t False negative: 0.0823811071246\n", - "\t Correct pass: 0.881720572728\n" - ] - } - ], - "source": [ - "from sklearn import neighbors\n", - "\n", - "TT, TF, FT, FF = runClassifier(neighbors.KNeighborsClassifier(10, weights='distance'), trainingSize)\n", - "printSummary('kNN, k=10, distance weighted', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "kNN, k=100, distance weighted\n", - "\t Correct flags: 0.0335639013973\n", - "\t False positive: 0.00169112721919\n", - "\t False negative: 0.0829978711693\n", - "\t Correct pass: 0.881747100214\n" - ] - } - ], - "source": [ - "from sklearn import neighbors\n", - "\n", - "TT, TF, FT, FF = runClassifier(neighbors.KNeighborsClassifier(100, weights='distance'), trainingSize)\n", - "printSummary('kNN, k=100, distance weighted', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "kNN, k=1000, distance weighted\n", - "\t Correct flags: 0.052351993209\n", - "\t False positive: 0.0181050090525\n", - "\t False negative: 0.0642097793576\n", - "\t Correct pass: 0.865333218381\n" - ] - } - ], - "source": [ - "from sklearn import neighbors\n", - "\n", - "TT, TF, FT, FF = runClassifier(neighbors.KNeighborsClassifier(1000, weights='distance'), trainingSize)\n", - "printSummary('kNN, k=1000, distance weighted', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Distance weighting improves performance, suggesting some clustering of flagged data in the input space." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.5.1: Nearest Centroid\n", - "\n", - "[Nearest centroid](http://scikit-learn.org/stable/modules/neighbors.html#nearest-centroid-classifier) is a subset of NN algorithms. Scikit-learn advertises it as a good baseline classifier, for its lack of parameterization." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Nearest Centroid\n", - "\t Correct flags: 0.0600250684741\n", - "\t False positive: 0.0624457015525\n", - "\t False negative: 0.0565367040925\n", - "\t Correct pass: 0.820992525881\n" - ] - } - ], - "source": [ - "from sklearn.neighbors.nearest_centroid import NearestCentroid\n", - "\n", - "TT, TF, FT, FF = runClassifier(NearestCentroid(), trainingSize)\n", - "printSummary('Nearest Centroid', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Comparable to kernel ridge and QDA, but with a slightly lower false positive rate. Shrunken threshold approaches do not yield substantially different results." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1.6: Decision Trees\n", - "\n", - "A major class of classifiers are [decision trees](http://scikit-learn.org/stable/modules/tree.html#classification), which we examine here." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Decision Tree\n", - "\t Correct flags: 0.0545604064011\n", - "\t False positive: 0.0183304926817\n", - "\t False negative: 0.0620013661655\n", - "\t Correct pass: 0.865107734752\n" - ] - } - ], - "source": [ - "from sklearn import tree\n", - "\n", - "TT, TF, FT, FF = runClassifier(tree.DecisionTreeClassifier(), trainingSize)\n", - "printSummary('Decision Tree', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In line with some of the best classifiers examined so far." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## 1.7: Naive Bayes Models\n", - "\n", - "Next we explore the collection of [naive Baysian models](http://scikit-learn.org/stable/modules/naive_bayes.html) provided by scikit-learn.\n", - "\n", - "### 1.7.1: Gaussian" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SVM with linear kernel\n", - "\t Correct flags: 0.0339684455557\n", - "\t False positive: 0.00353478748168\n", - "\t False negative: 0.0825933270109\n", - "\t Correct pass: 0.879903439952\n" - ] - } - ], - "source": [ - "from sklearn.naive_bayes import GaussianNB\n", - "\n", - "TT, TF, FT, FF = runClassifier(GaussianNB(), trainingSize) \n", - "printSummary('SVM with linear kernel', TT/(len(truth)-trainingSize), TF/(len(truth)-trainingSize), FT/(len(truth)-trainingSize), FF/(len(truth)-trainingSize))\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.7.2: Multinomial" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SVM with linear kernel\n", - "\t Correct flags: 0.0327813405665\n", - "\t False positive: 0.00144574797562\n", - "\t False negative: 0.0837804320001\n", - "\t Correct pass: 0.881992479458\n" - ] - } - ], - "source": [ - "from sklearn.naive_bayes import MultinomialNB\n", - "\n", - "TT, TF, FT, FF = runClassifier(MultinomialNB(), trainingSize) \n", - "printSummary('SVM with linear kernel', TT/(len(truth)-trainingSize), TF/(len(truth)-trainingSize), FT/(len(truth)-trainingSize), FF/(len(truth)-trainingSize))\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.7.3: Bernoulli" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SVM with linear kernel\n", - "\t Correct flags: 0.0349234350441\n", - "\t False positive: 0.00250684740727\n", - "\t False negative: 0.0816383375225\n", - "\t Correct pass: 0.880931380026\n" - ] - } - ], - "source": [ - "from sklearn.naive_bayes import BernoulliNB\n", - "\n", - "TT, TF, FT, FF = runClassifier(BernoulliNB(), trainingSize) \n", - "printSummary('SVM with linear kernel', TT/(len(truth)-trainingSize), TF/(len(truth)-trainingSize), FT/(len(truth)-trainingSize), FF/(len(truth)-trainingSize))\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "All the Bayes models produce comparable results, all poorer than the SVM. The fundamental assumption of independent features made in these models is probably a poor one for this data." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 2: Ensemble Methods\n", - "\n", - "In Part 1, we examined individual scikit-learn classifiers, and found that many of them provide similar performance, flagging about half of datasets that ought to be flagged. In this section, we explore ideas for combining the results of several of these classifiers into a final decision." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.1: Naive Polling\n", - "\n", - "First, we consider the simplest possible techniques: given decisions from our favorite classifiers, what is the majority opinion, and what is the performance of flagging a profile if any of the underlying classifiers have flagged it?" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Majority Poll\n", - "\t Correct flags: 0.0603566620465\n", - "\t False positive: 0.0630690974686\n", - "\t False negative: 0.0562051105201\n", - "\t Correct pass: 0.820369129965\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEACAYAAABYq7oeAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFl1JREFUeJzt3X/sXfV93/HnK7imkGIcJ5L5YQNeZaa4yrZAFWeNslwN\nQtyoBf5A4EghXmflH7dN9isbZFKwFakLmjaCNIG0lh+GJR4utEBWROyRfKdUGzFJSOLGUEw0b/YX\n20QmfFlatcHivT/u5ws3Pl9s3/s1vr74+ZCuvp/zPudz/D5g39c959x7v6kqJEka9I5xNyBJOvUY\nDpKkDsNBktRhOEiSOgwHSVKH4SBJ6jhqOCS5O8nBJDvnWPcvk7yWZMlA7eYku5M8m+SqgfrlSXa2\ndbcP1M9M8kCrP5nk4oF165I81x6fmv+hSpKO17HOHO4B1hxZTLIc+CjwfwZqq4AbgFVtzh1J0lbf\nCayvqpXAyiSz+1wPHGr124Bb276WAF8APtAetyRZPNIRSpKGdtRwqKpvAT+dY9V/BP71EbVrgC1V\n9WpV7QGeB1YnOR84p6p2tO3uA65t46uBzW38EHBFG38M2FZVL1fVy8B25ggpSdJbY+h7DkmuAfZV\n1Q+PWHUBsG9geR9w4Rz16Van/dwLUFWHgZkk7z7KviRJJ8GCYTZOcjbwefqXlF4vn9COJEljN1Q4\nAL8KXAL8oN1OWAZ8N8lq+mcEywe2XUb/Ff90Gx9Zp627CHghyQLg3Ko6lGQa6A3MWQ58Y66Gkvjl\nUJI0pKo66gv7oS4rVdXOqlpaVSuqagX9J/nLquog8CiwNsnCJCuAlcCOqjoAvJJkdbtBfSPwSNvl\no8C6Nr4OeKKNtwFXJVmc5F30z1S+fpS+JvJxyy23jL0H+x9/H/Y/mY9J7v94HPXMIckW4CPAu5Ps\nBb5QVfcMPi8PPEHvSrIV2AUcBjbUG11sAO4FzgIeq6rHW/0u4P4ku4FDwNq2r5eSfBF4qm23qfo3\npiVJJ8FRw6GqPnGM9X/niOU/AP5gju2+C7xvjvrfAte/yb7vof9WWknSSeYnpMeo1+uNu4V5sf/x\nsv/xmvT+jyXHe/3pVJWkJv0YJOlkSkKdyBvSkqTTg+EgSeowHCRJHYaDJKnDcJAkdRgOkqQOw0GS\n1GE4SJI6DAdJUofhIEnqMBwkSR3D/rKfU9Ltt98+7hZGcvbZZ/PpT3963G1IUsfb4ov3Fi78zLjb\nGMFfcdZZf8bLL+8fdyOSTjPH88V7b4twGPidQxNkP4sWXcbMjOEg6eTyW1klSSMxHCRJHYaDJKnD\ncJAkdRgOkqQOw0GS1GE4SJI6jhoOSe5OcjDJzoHav0/yTJIfJPmTJOcOrLs5ye4kzya5aqB+eZKd\nbd3tA/UzkzzQ6k8muXhg3bokz7XHp07cIUuSjuVYZw73AGuOqG0Dfq2q/j7wHHAzQJJVwA3Aqjbn\njiSzH7K4E1hfVSuBlUlm97keONTqtwG3tn0tAb4AfKA9bkmyeOSjlCQN5ajhUFXfAn56RG17Vb3W\nFr8NLGvja4AtVfVqVe0BngdWJzkfOKeqdrTt7gOubeOrgc1t/BBwRRt/DNhWVS9X1cvAdrohJUl6\ni8z3nsM/BR5r4wuAfQPr9gEXzlGfbnXaz70AVXUYmEny7qPsS5J0Eoz8raxJ/i3w86r66gnsZ0Qb\nB8a99pAkAUxNTTE1NTXUnJHCIck/AT7OG5eBoH9GsHxgeRn9V/zTvHHpabA+O+ci4IUkC4Bzq+pQ\nkml+8Rl+OfCNN+9o4/AHIUmniV6vR6/Xe31506ZNx5wz9GWldjP5c8A1VfU3A6seBdYmWZhkBbAS\n2FFVB4BXkqxuN6hvBB4ZmLOuja8DnmjjbcBVSRYneRfwUeDrw/YqSRrNUc8ckmwBPgK8J8le4Bb6\n705aCGxvb0b6X1W1oap2JdkK7AIOAxvqje8D3wDcC5wFPFZVj7f6XcD9SXYDh4C1AFX1UpIvAk+1\n7Ta1G9OSpJPA3+cwNv4+B0nj4e9zkCSNxHCQJHUYDpKkDsNBktRhOEiSOgwHSVKH4SBJ6jAcJEkd\nhoMkqcNwkCR1GA6SpA7DQZLUYThIkjoMB0lSh+EgSeowHCRJHYaDJKnDcJAkdRgOkqQOw0GS1GE4\nSJI6DAdJUofhIEnqOGo4JLk7ycEkOwdqS5JsT/Jckm1JFg+suznJ7iTPJrlqoH55kp1t3e0D9TOT\nPNDqTya5eGDduvZnPJfkUyfukCVJx3KsM4d7gDVH1G4CtlfVpcATbZkkq4AbgFVtzh1J0ubcCayv\nqpXAyiSz+1wPHGr124Bb276WAF8APtAetwyGkCTprXXUcKiqbwE/PaJ8NbC5jTcD17bxNcCWqnq1\nqvYAzwOrk5wPnFNVO9p29w3MGdzXQ8AVbfwxYFtVvVxVLwPb6YaUJOktMso9h6VVdbCNDwJL2/gC\nYN/AdvuAC+eoT7c67edegKo6DMwkefdR9iVJOgkWzGdyVVWSOlHNjG7jwLjXHpIkgKmpKaampoaa\nM0o4HExyXlUdaJeMXmz1aWD5wHbL6L/in27jI+uzcy4CXkiyADi3qg4lmeYXn+GXA99485Y2jnAY\nknR66PV69Hq915c3bdp0zDmjXFZ6FFjXxuuAhwfqa5MsTLICWAnsqKoDwCtJVrcb1DcCj8yxr+vo\n3+AG2AZclWRxkncBHwW+PkKvkqQRHPXMIckW4CPAe5Lspf8Ooi8BW5OsB/YA1wNU1a4kW4FdwGFg\nQ1XNXnLaANwLnAU8VlWPt/pdwP1JdgOHgLVtXy8l+SLwVNtuU7sxLUk6CfLG8/dk6t/zmMRj2M+i\nRZcxM7N/3I1IOs0koapytG38hLQkqcNwkCR1GA6SpA7DQZLUYThIkjoMB0lSh+EgSeowHCRJHYaD\nJKnDcJAkdRgOkqQOw0GS1GE4SJI6DAdJUofhIEnqMBwkSR2GgySpw3CQJHUYDpKkDsNBktRhOEiS\nOgwHSVKH4SBJ6hg5HJLcnORHSXYm+WqSM5MsSbI9yXNJtiVZfMT2u5M8m+SqgfrlbR+7k9w+UD8z\nyQOt/mSSi0c/TEnSMEYKhySXAJ8GLquq9wFnAGuBm4DtVXUp8ERbJskq4AZgFbAGuCNJ2u7uBNZX\n1UpgZZI1rb4eONTqtwG3jtKrJGl4o545vAK8CpydZAFwNvACcDWwuW2zGbi2ja8BtlTVq1W1B3ge\nWJ3kfOCcqtrRtrtvYM7gvh4CrhixV0nSkEYKh6p6CfgPwP+lHwovV9V2YGlVHWybHQSWtvEFwL6B\nXewDLpyjPt3qtJ972593GJhJsmSUfiVJw1kwyqQkvwr8M+ASYAb44ySfHNymqipJzbvD47JxYNxr\nD0kSwNTUFFNTU0PNGSkcgF8H/mdVHQJI8ifAPwQOJDmvqg60S0Yvtu2ngeUD85fRP2OYbuMj67Nz\nLgJeaJeuzm1nLHPYOOJhSNLbX6/Xo9frvb68adOmY84Z9Z7Ds8AHk5zVbixfCewCvgasa9usAx5u\n40eBtUkWJlkBrAR2VNUB4JUkq9t+bgQeGZgzu6/r6N/gliSdBCOdOVTVD5LcB3wHeA34HvCfgXOA\nrUnWA3uA69v2u5JspR8gh4ENVTV7yWkDcC9wFvBYVT3e6ncB9yfZDRyi/24oSdJJkDeeoydT/77G\nJB7DfhYtuoyZmf3jbkTSaSYJVZWjbeMnpCVJHYaDJKnDcJAkdRgOkqQOw0GS1GE4SJI6DAdJUofh\nIEnqMBwkSR2GgySpw3CQJHUYDpKkDsNBktRhOEiSOgwHSVKH4SBJ6jAcJEkdhoMkqcNwkCR1GA6S\npA7DQZLUYThIkjoMB0lSx8jhkGRxkgeTPJNkV5LVSZYk2Z7kuSTbkiwe2P7mJLuTPJvkqoH65Ul2\ntnW3D9TPTPJAqz+Z5OLRD1OSNIz5nDncDjxWVe8F/h7wLHATsL2qLgWeaMskWQXcAKwC1gB3JEnb\nz53A+qpaCaxMsqbV1wOHWv024NZ59CpJGsJI4ZDkXODDVXU3QFUdrqoZ4Gpgc9tsM3BtG18DbKmq\nV6tqD/A8sDrJ+cA5VbWjbXffwJzBfT0EXDFKr5Kk4Y165rAC+EmSe5J8L8kfJnknsLSqDrZtDgJL\n2/gCYN/A/H3AhXPUp1ud9nMv9MMHmEmyZMR+JUlDWDCPeZcBv1dVTyX5Mu0S0qyqqiQ13waPz8aB\nca89JEkAU1NTTE1NDTVn1HDYB+yrqqfa8oPAzcCBJOdV1YF2yejFtn4aWD4wf1nbx3QbH1mfnXMR\n8EKSBcC5VfXS3O1sHPEwJOntr9fr0ev1Xl/etGnTMeeMdFmpqg4Ae5Nc2kpXAj8Cvgasa7V1wMNt\n/CiwNsnCJCuAlcCOtp9X2judAtwIPDIwZ3Zf19G/wS1JOglGPXMA+H3gK0kWAj8Gfgc4A9iaZD2w\nB7geoKp2JdkK7AIOAxuqavaS0wbgXuAs+u9+erzV7wLuT7IbOASsnUevkqQh5I3n6MnUv68xicew\nn0WLLmNmZv+4G5F0mklCVeVo2/gJaUlSh+EgSeowHCRJHYaDJKnDcJAkdRgOkqQOw0GS1GE4SJI6\nDAdJUofhIEnqMBwkSR2GgySpw3CQJHUYDpKkDsNBktRhOEiSOgwHSVKH4SBJ6jAcJEkdhoMkqcNw\nkCR1GA6SpA7DQZLUMa9wSHJGkqeTfK0tL0myPclzSbYlWTyw7c1Jdid5NslVA/XLk+xs624fqJ+Z\n5IFWfzLJxfPpVZJ0/OZ75vBZYBdQbfkmYHtVXQo80ZZJsgq4AVgFrAHuSJI2505gfVWtBFYmWdPq\n64FDrX4bcOs8e5UkHaeRwyHJMuDjwB8Bs0/0VwOb23gzcG0bXwNsqapXq2oP8DywOsn5wDlVtaNt\nd9/AnMF9PQRcMWqvkqThzOfM4Tbgc8BrA7WlVXWwjQ8CS9v4AmDfwHb7gAvnqE+3Ou3nXoCqOgzM\nJFkyj34lScdpwSiTkvwW8GJVPZ2kN9c2VVVJaq51J97GgXGvPSRJAFNTU0xNTQ01Z6RwAH4DuDrJ\nx4FfBhYluR84mOS8qjrQLhm92LafBpYPzF9G/4xhuo2PrM/OuQh4IckC4NyqemnudjaOeBiS9PbX\n6/Xo9XqvL2/atOmYc0a6rFRVn6+q5VW1AlgLfKOqbgQeBda1zdYBD7fxo8DaJAuTrABWAjuq6gDw\nSpLV7Qb1jcAjA3Nm93Ud/RvckqSTYNQzhyPNXj76ErA1yXpgD3A9QFXtSrKV/jubDgMbqmp2zgbg\nXuAs4LGqerzV7wLuT7IbOEQ/hCRJJ0HeeI6eTP37GpN4DPtZtOgyZmb2j7sRSaeZJFRVjraNn5CW\nJHUYDpKkDsNBktRhOEiSOgwHSVKH4SBJ6jAcJEkdhoMkqcNwkCR1GA6SpA7DQZLUYThIkjoMB0lS\nh+EgSeowHCRJHYaDJKnDcJAkdRgOkqQOw0GS1GE4SJI6DAdJUofhIEnqMBwkSR0jhUOS5Um+meRH\nSf4iyWdafUmS7UmeS7ItyeKBOTcn2Z3k2SRXDdQvT7Kzrbt9oH5mkgda/ckkF8/nQCVJx2/UM4dX\ngX9eVb8GfBD43STvBW4CtlfVpcATbZkkq4AbgFXAGuCOJGn7uhNYX1UrgZVJ1rT6euBQq98G3Dpi\nr5KkIY0UDlV1oKq+38Y/A54BLgSuBja3zTYD17bxNcCWqnq1qvYAzwOrk5wPnFNVO9p29w3MGdzX\nQ8AVo/QqSRrevO85JLkEeD/wbWBpVR1sqw4CS9v4AmDfwLR99MPkyPp0q9N+7gWoqsPATJIl8+1X\nknRsC+YzOcmv0H9V/9mq+n9vXCmCqqokNc/+jtPGgXGvPSRJAFNTU0xNTQ01Z+RwSPJL9IPh/qp6\nuJUPJjmvqg60S0Yvtvo0sHxg+jL6ZwzTbXxkfXbORcALSRYA51bVS3N3s3HUw5Ckt71er0ev13t9\nedOmTcecM+q7lQLcBeyqqi8PrHoUWNfG64CHB+prkyxMsgJYCeyoqgPAK0lWt33eCDwyx76uo3+D\nW5J0Eox65vAh4JPAD5M83Wo3A18CtiZZD+wBrgeoql1JtgK7gMPAhqqaveS0AbgXOAt4rKoeb/W7\ngPuT7AYOAWtH7FWSNKS88Rw9mfr3NSbxGPazaNFlzMzsH3cjkk4zSaiqHG0bPyEtSeowHCRJHYaD\nJKnDcJAkdRgOkqQOw0GS1GE4SJI6DAdJUofhIEnqmNe3skrS6WrwW6jfjgwHSRrZJH51D8Cxg83L\nSpKkDsNBktRhOEiSOgwHSVKHN6R12no7vNtk0n8fi05dhoNOc5P85Dr54aZTl5eVJEkdhoMkqcNw\nkCR1GA6SpA5vSGtkb4d3+0ia2yl/5pBkTZJnk+xO8m/G3Y+OVBP8kPRmTulwSHIG8J+ANcAq4BNJ\n3jverk6cw4f/dtwtSGMzNTU17hZ0FKd0OAAfAJ6vqj1V9SrwX4FrxtzTCXP48M/H3YI0NobDqe1U\nD4cLgb0Dy/taTZL0FjrVb0gf14XhRYt++63u44Sr+ht+7omD5mnS3xSwcePGcbegN3Gqh8M0sHxg\neTn9s4df8Mor/+2kNXSiTfo/7sn/CodJ73+y+ff/1JVT+Yu7kiwA/hK4AngB2AF8oqqeGWtjkvQ2\nd0qfOVTV4SS/B3wdOAO4y2CQpLfeKX3mIEkaj1P93UpvapI/HJfk7iQHk+wcdy+jSLI8yTeT/CjJ\nXyT5zLh7GkaSX07y7STfT7Iryb8bd0/DSnJGkqeTfG3cvQwryZ4kP2z97xh3P8NKsjjJg0meaX9/\nPjjuno5Xkr/b/rvPPmbe7N/vRJ45tA/H/SVwJf2b1k8xQfciknwY+BlwX1W9b9z9DCvJecB5VfX9\nJL8CfBe4dlL++wMkObuq/rrd1/pz4F9V1Z+Pu6/jleRfAJcD51TV1ePuZxhJ/jdweVW9NO5eRpFk\nM/A/quru9vfnnVU1M+6+hpXkHfSfPz9QVXuPXD+pZw4T/eG4qvoW8NNx9zGqqjpQVd9v458BzwAX\njLer4VTVX7fhQvr3sybmiSrJMuDjwB8xuW+Xmci+k5wLfLiq7ob+fdFJDIbmSuDHcwUDTG44+OG4\nU0SSS4D3A98ebyfDSfKOJN8HDgLfrKpd4+5pCLcBnwNeG3cjIyrgvyf5TpJPj7uZIa0AfpLkniTf\nS/KHSc4ed1MjWgt89c1WTmo4TN61sLehdknpQeCz7QxiYlTVa1X1D4BlwD9K0htzS8clyW8BL1bV\n00zoq2/gQ1X1fuA3gd9tl1knxQLgMuCOqroM+CvgpvG2NLwkC4HfBv74zbaZ1HA4rg/H6a2T5JeA\nh4D/UlUPj7ufUbVLAn8G/Pq4ezlOvwFc3a7bbwH+cZL7xtzTUKpqf/v5E+BP6V8mnhT7gH1V9VRb\nfpB+WEya3wS+2/4fzGlSw+E7wMokl7QEvAF4dMw9nTbS/1jrXcCuqvryuPsZVpL3JFncxmcBHwWe\nHm9Xx6eqPl9Vy6tqBf3LAt+oqk+Nu6/jleTsJOe08TuBq4CJeddeVR0A9ia5tJWuBH40xpZG9Qn6\nLy7e1Cn9Ibg3M+kfjkuyBfgI8O4ke4EvVNU9Y25rGB8CPgn8MMnsk+rNVfX4GHsaxvnA5vZujXcA\n91fVE2PuaVSTdol1KfCn7WszFgBfqapt421paL8PfKW9MP0x8Dtj7mcoLZSvBI56v2ci38oqSXpr\nTeplJUnSW8hwkCR1GA6SpA7DQZLUYThIkjoMB0lSh+EgSeowHCRJHf8fYTVy4FXobR4AAAAASUVO\nRK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from sklearn import svm\n", - "from sklearn.qda import QDA\n", - "from sklearn.kernel_ridge import KernelRidge\n", - "from sklearn.linear_model import SGDClassifier\n", - "from sklearn.neighbors.nearest_centroid import NearestCentroid\n", - "from sklearn import tree\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "\n", - "#load and arrange data\n", - "truth, rawResults = reloadData()\n", - "data = transpose(rawResults) #arrange data into rows by profile for consumption by scikit-learn\n", - "shuffleLists(data, truth) #randomize order of profiles\n", - " \n", - "clf_SVM = svm.SVC(kernel='linear')\n", - "clf_QDA = QDA()\n", - "clf_KernelRidge = KernelRidge(kernel='linear')\n", - "clf_SGD = SGDClassifier(loss=\"hinge\", penalty=\"l2\")\n", - "clf_NearestCentroid = NearestCentroid()\n", - "clf_DecisionTree = tree.DecisionTreeClassifier()\n", - "\n", - "clfs = [clf_SVM, clf_QDA, clf_KernelRidge, clf_SGD, clf_NearestCentroid, clf_DecisionTree]\n", - "histEntries = []\n", - "\n", - "# train the classifiers\n", - "for clf in clfs:\n", - " clf.fit(data[0:trainingSize], truth[0:trainingSize])\n", - " \n", - "# poll classifiers and report\n", - "TT = 0.\n", - "TF = 0.\n", - "FT = 0.\n", - "FF = 0.\n", - "\n", - "for i in range(trainingSize, len(truth)):\n", - " flagsRaised = 0\n", - " for clf in clfs:\n", - " if clf.predict(data[i]):\n", - " flagsRaised += 1\n", - " \n", - " histEntries.append(flagsRaised)\n", - " \n", - " assessment = flagsRaised >= len(clfs)/2\n", - " \n", - " if assessment and truth[i]:\n", - " TT += 1\n", - " elif assessment and not truth[i]:\n", - " TF += 1\n", - " elif not assessment and truth[i]:\n", - " FT += 1\n", - " elif not assessment and not truth[i]:\n", - " FF += 1 \n", - " \n", - "printSummary('Majority Poll', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))\n", - "\n", - "plt.hist(histEntries, bins=[0,1,2,3,4,5,6,7])\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The plot shows the number of times n classifiers flagged a given dataset. Another simple approach is to flag a dataset if *any* of the classifiers flag it:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Any Flag\n", - "\t Correct flags: 0.0637919714564\n", - "\t False positive: 0.0845563609595\n", - "\t False negative: 0.0527698011102\n", - "\t Correct pass: 0.798881866474\n" - ] - } - ], - "source": [ - "from sklearn import svm\n", - "from sklearn.qda import QDA\n", - "from sklearn.kernel_ridge import KernelRidge\n", - "from sklearn.linear_model import SGDClassifier\n", - "from sklearn.neighbors.nearest_centroid import NearestCentroid\n", - "from sklearn import tree\n", - "\n", - "#load and arrange data\n", - "truth, rawResults = reloadData()\n", - "data = transpose(rawResults) #arrange data into rows by profile for consumption by scikit-learn\n", - "shuffleLists(data, truth) #randomize order of profiles\n", - " \n", - "clf_SVM = svm.SVC(kernel='linear')\n", - "clf_QDA = QDA()\n", - "clf_KernelRidge = KernelRidge(kernel='linear')\n", - "clf_SGD = SGDClassifier(loss=\"hinge\", penalty=\"l2\")\n", - "clf_NearestCentroid = NearestCentroid()\n", - "clf_DecisionTree = tree.DecisionTreeClassifier()\n", - "\n", - "clfs = [clf_SVM, clf_QDA, clf_KernelRidge, clf_SGD, clf_NearestCentroid, clf_DecisionTree]\n", - "\n", - "# train the classifiers\n", - "for clf in clfs:\n", - " clf.fit(data[0:trainingSize], truth[0:trainingSize])\n", - " \n", - "# poll classifiers and report\n", - "TT = 0.\n", - "TF = 0.\n", - "FT = 0.\n", - "FF = 0.\n", - "\n", - "for i in range(trainingSize, len(truth)):\n", - " assessment = False\n", - " for clf in clfs:\n", - " assessment = assessment or clf.predict(data[i])\n", - " \n", - " if assessment and truth[i]:\n", - " TT += 1\n", - " elif assessment and not truth[i]:\n", - " TF += 1\n", - " elif not assessment and truth[i]:\n", - " FT += 1\n", - " elif not assessment and not truth[i]:\n", - " FF += 1 \n", - " \n", - "printSummary('Any Flag', TT/(datasetSize-trainingSize), TF/(datasetSize-trainingSize), FT/(datasetSize-trainingSize), FF/(datasetSize-trainingSize))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So, flagging any profile that is flagged by an individual classifier performs better than the majority poll, but this performance is no better than simply flagging any profile flagged by a base test." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/learningAnalysis/01-basic-machine-learning/pip_freeze.dat b/learningAnalysis/01-basic-machine-learning/pip_freeze.dat deleted file mode 100644 index 21dba69..0000000 --- a/learningAnalysis/01-basic-machine-learning/pip_freeze.dat +++ /dev/null @@ -1,118 +0,0 @@ -abstract-rendering==0.5.1 -alabaster==0.7.3 -appscript==1.0.1 -argcomplete==0.8.9 -astropy==1.0.3 -Babel==1.3 -backports.ssl-match-hostname==3.4.0.2 -bcolz==0.9.0 -beautifulsoup4==4.3.2 -binstar==0.11.0 -bitarray==0.8.1 -blaze==0.8.0 -blz==0.6.2 -bokeh==0.9.0 -boto==2.38.0 -Bottleneck==1.0.0 -cdecimal==2.3 -certifi==14.5.14 -cffi==1.1.0 -clyent==0.3.4 -colorama==0.3.3 -conda==3.18.1 -conda-build==1.14.1 -conda-env==2.4.2 -configobj==5.0.6 -cryptography==0.9.1 -Cython==0.22.1 -cytoolz==0.7.3 -datashape==0.4.5 -decorator==3.4.2 -docutils==0.12 -enum34==1.0.4 -fastcache==1.0.2 -Flask==0.10.1 -funcsigs==0.4 -gevent==1.0.1 -gevent-websocket==0.9.3 -greenlet==0.4.7 -grin==1.2.1 -h5py==2.5.0 -idna==2.0 -ipaddress==1.0.7 -ipython==3.2.0 -itsdangerous==0.24 -jdcal==1.0 -jedi==0.8.1 -Jinja2==2.7.3 -jsonschema==2.4.0 -llvmlite==0.5.0 -lxml==3.4.4 -MarkupSafe==0.23 -matplotlib==1.4.3 -mistune==0.5.1 -mock==1.0.1 -multipledispatch==0.4.7 -netCDF4==1.1.9 -networkx==1.9.1 -nltk==3.0.3 -nose==1.3.7 -numba==0.19.1 -numexpr==2.4.3 -numpy==1.9.3 -odo==0.3.2 -openpyxl==1.8.5 -pandas==0.16.2 -patsy==0.3.0 -pep8==1.6.2 -Pillow==2.8.2 -ply==3.6 -psutil==2.2.1 -ptyprocess==0.4 -py==1.4.27 -pyasn1==0.1.7 -PyAudio==0.2.7 -pycosat==0.6.1 -pycparser==2.14 -pycrypto==2.6.1 -pycurl==7.19.5.1 -pyflakes==0.9.2 -Pygments==2.0.2 -pyOpenSSL==0.15.1 -pyparsing==2.0.3 -pyproj==1.9.4 -pytest==2.7.1 -python-dateutil==2.4.2 -pytz==2015.4 -PyYAML==3.11 -pyzmq==14.7.0 -redis==2.10.3 -requests==2.7.0 -rope==0.9.4 -runipy==0.1.3 -scikit-image==0.11.3 -scikit-learn==0.16.1 -scipy==0.15.1 -Shapely==1.5.12 -six==1.9.0 -snowballstemmer==1.2.0 -sockjs-tornado==1.0.1 -Sphinx==1.3.1 -sphinx-rtd-theme==0.1.7 -spyder==2.3.5.2 -SQLAlchemy==1.0.5 -statsmodels==0.6.1 -sympy==0.7.6 -tables==3.2.0 -terminado==0.5 -toolz==0.7.2 -tornado==4.2 -ujson==1.33 -unicodecsv==0.9.4 -Werkzeug==0.10.4 -wheel==0.26.0 -wodpy==1.0 -xlrd==0.9.3 -XlsxWriter==0.7.3 -xlwings==0.3.5 -xlwt==1.0.0 diff --git a/learningAnalysis/03-production/production-combination.ipynb b/learningAnalysis/03-production/production-combination.ipynb deleted file mode 100644 index 4fc7df5..0000000 --- a/learningAnalysis/03-production/production-combination.ipynb +++ /dev/null @@ -1,306 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import pandas, numpy\n", - "from sklearn import svm\n", - "from sklearn.qda import QDA\n", - "from sklearn.kernel_ridge import KernelRidge\n", - "from sklearn.neighbors.nearest_centroid import NearestCentroid" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "results = pandas.read_csv('results-most.csv')\n", - "\n", - "# shuffle the dataframe\n", - "results.iloc[numpy.random.permutation(len(results))]\n", - "\n", - "# slice up for svm\n", - "truth = results.ix[:,1].tolist()\n", - "qctests = results.ix[:,2:].values.tolist()\n", - "\n", - "trainingSize = 1000" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def performance(truth, qcresult):\n", - " # check the performance of a single column qcresult\n", - "\n", - " TT = 0.\n", - " FF = 0.\n", - " TF = 0.\n", - " FT = 0.\n", - " T = 0.\n", - " F = 0.\n", - " \n", - " for i in range(len(qcresult)):\n", - " if truth[i]:\n", - " T += 1.\n", - " else:\n", - " F += 1.\n", - " \n", - " if qcresult[i] and truth[i]:\n", - " TT += 1.\n", - " elif qcresult[i] and not truth[i]:\n", - " TF += 1.\n", - " elif not qcresult[i] and truth[i]:\n", - " FT += 1.\n", - " elif not qcresult[i] and not truth[i]:\n", - " FF += 1.\n", - " \n", - " return (TT/T, FT/T, FF/F, TF/F)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Argo_global_range_check (0.1596244131455399, 0.8403755868544601, 1.0, 0.0)\n", - "Argo_gradient_test (0.27386541471048514, 0.7261345852895149, 0.9990945011524531, 0.0009054988475469213)\n", - "Argo_impossible_date_test (0.0, 1.0, 1.0, 0.0)\n", - "Argo_impossible_location_test (0.0, 1.0, 1.0, 0.0)\n", - "Argo_pressure_increasing_test (0.11580594679186229, 0.8841940532081377, 0.866480079025354, 0.13351992097464604)\n", - "Argo_regional_range_test (0.006259780907668232, 0.9937402190923318, 0.9999176819229503, 8.231807704972011e-05)\n", - "Argo_spike_test (0.0297339593114241, 0.9702660406885759, 1.0, 0.0)\n", - "CSIRO_depth (0.837245696400626, 0.162754303599374, 0.2642410273296016, 0.7357589726703985)\n", - "CSIRO_gradient (0.4381846635367762, 0.5618153364632238, 0.8554494567006915, 0.14455054329930853)\n", - "CSIRO_wire_break (0.2519561815336463, 0.7480438184663537, 1.0, 0.0)\n", - "CoTeDe_Argo_density_inversion (0.3489827856025039, 0.651017214397496, 0.5221435627263747, 0.4778564372736253)\n", - "CoTeDe_GTSPP_WOA_normbias (0.8497652582159625, 0.15023474178403756, 0.8016134343101745, 0.1983865656898255)\n", - "CoTeDe_GTSPP_global_range (0.16118935837245696, 0.838810641627543, 1.0, 0.0)\n", - "CoTeDe_GTSPP_gradient (0.1752738654147105, 0.8247261345852895, 0.9990945011524531, 0.0009054988475469213)\n", - "CoTeDe_GTSPP_spike_check (0.03286384976525822, 0.9671361502347418, 0.9997530457688508, 0.0002469542311491604)\n", - "CoTeDe_RoC (0.24882629107981222, 0.7511737089201878, 0.9987652288442542, 0.0012347711557458018)\n", - "CoTeDe_WOA_normbias (0.6118935837245696, 0.38810641627543035, 0.9228679618044122, 0.07713203819558775)\n", - "CoTeDe_anomaly_detection (0.513302034428795, 0.486697965571205, 0.8475469213039183, 0.15245307869608166)\n", - "CoTeDe_digit_roll_over (0.2863849765258216, 0.7136150234741784, 0.990862693447481, 0.009137306552518933)\n", - "CoTeDe_fuzzy_logic (0.7449139280125195, 0.25508607198748046, 0.8888705959828779, 0.11112940401712217)\n", - "CoTeDe_gradient (0.18779342723004694, 0.812206572769953, 0.9990945011524531, 0.0009054988475469213)\n", - "CoTeDe_location_at_sea_test (0.004694835680751174, 0.9953051643192489, 0.9997530457688508, 0.0002469542311491604)\n", - "CoTeDe_profile_envelop (0.2895148669796557, 0.7104851330203443, 1.0, 0.0)\n", - "CoTeDe_spike (0.02190923317683881, 0.9780907668231612, 1.0, 0.0)\n", - "CoTeDe_tukey53H_norm (0.06572769953051644, 0.9342723004694836, 0.9978597299967072, 0.002140270003292723)\n", - "EN_background_available_check (0.018779342723004695, 0.9812206572769953, 0.9997530457688508, 0.0002469542311491604)\n", - "EN_background_check (0.4381846635367762, 0.5618153364632238, 0.9464109318406322, 0.0535890681593678)\n", - "EN_constant_value_check (0.001564945226917058, 0.9984350547730829, 1.0, 0.0)\n", - "EN_range_check (0.1596244131455399, 0.8403755868544601, 1.0, 0.0)\n", - "EN_spike_and_step_check (0.025039123630672927, 0.974960876369327, 0.9999176819229503, 8.231807704972011e-05)\n", - "EN_spike_and_step_suspect (0.29107981220657275, 0.7089201877934272, 0.9980243661508067, 0.001975633849193283)\n", - "EN_stability_check (0.012519561815336464, 0.9874804381846636, 0.9983536384590056, 0.0016463615409944023)\n", - "ICDC_aqc_01_level_order (0.0, 1.0, 1.0, 0.0)\n", - "ICDC_aqc_02_crude_range (0.297339593114241, 0.702660406885759, 0.9995884096147514, 0.0004115903852486006)\n", - "ICDC_aqc_04_max_obs_depth (0.0, 1.0, 1.0, 0.0)\n", - "ICDC_aqc_05_stuck_value (0.006259780907668232, 0.9937402190923318, 1.0, 0.0)\n", - "ICDC_aqc_06_n_temperature_extrema (0.017214397496087636, 0.9827856025039123, 1.0, 0.0)\n", - "ICDC_aqc_07_spike_check (0.026604068857589983, 0.97339593114241, 1.0, 0.0)\n", - "ICDC_aqc_08_gradient_check (0.28012519561815336, 0.7198748043818466, 0.9970365492262101, 0.0029634507737899243)\n", - "ICDC_aqc_09_local_climatology_check (0.7762128325508607, 0.2237871674491393, 0.7737076061903194, 0.2262923938096806)\n", - "WOD_gradient_check (0.3004694835680751, 0.6995305164319249, 0.9939084622983207, 0.006091537701679289)\n" - ] - } - ], - "source": [ - "for i in range(2,len(qctests[0])):\n", - " print results.columns[i], performance(truth, results.ix[:,i].tolist())" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "SVC(C=1.0, cache_size=200, class_weight={0: 1, 1: 100}, coef0=0.0, degree=3,\n", - " gamma=0.0, kernel='linear', max_iter=-1, probability=False,\n", - " random_state=None, shrinking=True, tol=0.001, verbose=False)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# create and train an svm\n", - "\n", - "svm_classifier = svm.SVC(kernel='linear', class_weight = {0: 1, 1: 100})\n", - "svm_classifier.fit(qctests[0:trainingSize], truth[0:trainingSize])" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/billmills/anaconda/lib/python2.7/site-packages/sklearn/qda.py:133: UserWarning: Variables are collinear\n", - " warnings.warn(\"Variables are collinear\")\n" - ] - }, - { - "data": { - "text/plain": [ - "QDA(priors=None, reg_param=0.0)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# create and train a qda\n", - "\n", - "qda_classifier = QDA()\n", - "qda_classifier.fit(qctests[0:trainingSize], truth[0:trainingSize])" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "KernelRidge(alpha=1, coef0=1, degree=3, gamma=None, kernel='linear',\n", - " kernel_params=None)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# create and train a kernel ridge\n", - "\n", - "kr_classifier = KernelRidge(kernel='linear')\n", - "kr_classifier.fit(qctests[0:trainingSize], truth[0:trainingSize])" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "NearestCentroid(metric='euclidean', shrink_threshold=None)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# create and train a nearest centroid\n", - "\n", - "nc_classifier = NearestCentroid()\n", - "nc_classifier.fit(qctests[0:trainingSize], truth[0:trainingSize])" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.9069767441860465,\n", - " 0.09302325581395349,\n", - " 0.6792132320071524,\n", - " 0.32078676799284755)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "svm_prediction = svm_classifier.predict(qctests[trainingSize:])\n", - "qda_prediction = qda_classifier.predict(qctests[trainingSize:])\n", - "kr_prediction = kr_classifier.predict(qctests[trainingSize:])\n", - "nc_prediction = nc_classifier.predict(qctests[trainingSize:])\n", - "final_prediction = [ svm_prediction[i] or qda_prediction[i] for i in range(0,len(svm_prediction))]\n", - "performance(truth[trainingSize:], final_prediction)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/learningAnalysis/03-production/results-most.csv b/learningAnalysis/03-production/results-most.csv deleted file mode 100644 index d1b788c..0000000 --- a/learningAnalysis/03-production/results-most.csv +++ /dev/null @@ -1,12788 +0,0 @@ -,True Flags,Argo_global_range_check,Argo_gradient_test,Argo_impossible_date_test,Argo_impossible_location_test,Argo_pressure_increasing_test,Argo_regional_range_test,Argo_spike_test,CSIRO_depth,CSIRO_gradient,CSIRO_wire_break,CoTeDe_Argo_density_inversion,CoTeDe_GTSPP_WOA_normbias,CoTeDe_GTSPP_global_range,CoTeDe_GTSPP_gradient,CoTeDe_GTSPP_spike_check,CoTeDe_RoC,CoTeDe_WOA_normbias,CoTeDe_anomaly_detection,CoTeDe_digit_roll_over,CoTeDe_fuzzy_logic,CoTeDe_gradient,CoTeDe_location_at_sea_test,CoTeDe_profile_envelop,CoTeDe_spike,CoTeDe_tukey53H_norm,EN_background_available_check,EN_background_check,EN_constant_value_check,EN_range_check,EN_spike_and_step_check,EN_spike_and_step_suspect,EN_stability_check,ICDC_aqc_01_level_order,ICDC_aqc_02_crude_range,ICDC_aqc_04_max_obs_depth,ICDC_aqc_05_stuck_value,ICDC_aqc_06_n_temperature_extrema,ICDC_aqc_07_spike_check,ICDC_aqc_08_gradient_check,ICDC_aqc_09_local_climatology_check,WOD_gradient_check,WOD_range_check,loose_location_at_sea -66425687,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425700,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425702,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425706,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425711,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425716,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425719,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425722,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425729,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425734,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425735,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66425825,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425827,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425831,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425834,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66425845,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426636,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426637,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426664,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426675,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66426682,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66426681,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426688,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426690,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66426698,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426701,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426703,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426705,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426708,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66426707,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426709,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426712,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426715,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66426731,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426738,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426745,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426751,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426752,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426779,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426796,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426806,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426818,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426826,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426833,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426834,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426846,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66426848,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426856,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426861,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426867,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426866,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426876,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426881,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426880,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426883,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426889,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426888,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426892,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426895,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426902,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426907,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426910,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426916,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426920,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426926,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426925,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426932,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426939,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426938,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426941,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426944,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426947,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426950,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426954,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426956,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426961,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426969,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426974,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66426977,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426978,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66426979,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426980,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66426981,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429655,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429656,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429657,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429661,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429662,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429663,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429666,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429668,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66429667,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429671,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429672,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66429676,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429677,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429678,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429679,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429681,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429682,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429683,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429692,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429693,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66429691,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429703,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429715,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429716,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429717,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66429729,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429730,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429746,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429747,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429766,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429767,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66429782,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429795,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429809,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429808,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429822,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429823,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429852,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429840,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429841,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429859,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429868,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429869,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429882,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429888,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429889,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429905,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429908,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429910,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429924,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429926,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429927,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429946,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66429958,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429963,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429974,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429976,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429979,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429989,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429992,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66429997,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430002,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430006,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430011,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430015,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430013,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430027,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430034,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430025,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430036,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430039,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430044,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430047,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430049,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430052,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430053,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430056,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430059,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66430061,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430063,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430066,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66430067,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430072,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430074,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430079,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430081,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430084,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430092,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430093,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430098,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430104,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430113,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430108,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430119,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430128,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430125,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430136,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430129,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430133,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430137,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430145,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430146,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430152,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430153,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430163,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430161,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430164,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430165,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430166,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430173,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430174,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430175,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430176,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430177,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430178,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430184,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430183,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430185,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430187,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430191,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430192,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430189,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430193,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430196,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66430204,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430202,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430199,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430203,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430210,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430212,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430211,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430205,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430207,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430217,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430219,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430213,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66430215,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430218,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430223,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430226,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430222,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430224,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430220,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66430230,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430228,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430229,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430231,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430234,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430236,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430233,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430237,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430241,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430242,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430240,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430238,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430246,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430244,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430247,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430249,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430253,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430254,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430255,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430260,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430262,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430258,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430271,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430273,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430265,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430272,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430280,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430281,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430289,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430291,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430296,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430302,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430306,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430304,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430312,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430310,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430314,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430313,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430324,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430331,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430332,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430337,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430348,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430365,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430384,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430385,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430389,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430386,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430387,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66430399,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66430400,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430405,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430407,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430417,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430437,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430454,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430466,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430469,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430490,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430507,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66430514,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433794,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433801,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66433803,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433802,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66433820,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66433824,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433839,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66433834,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433841,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433851,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66433852,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66433849,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433868,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433865,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433875,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66433873,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433877,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66433884,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433892,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433928,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433909,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433910,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433930,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433951,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433931,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66433970,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433952,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433974,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433953,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66433997,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434018,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434032,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434035,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434043,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434054,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434066,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434072,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434071,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434088,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434101,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434103,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434093,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434113,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434122,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434135,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434129,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434136,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434140,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434148,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434153,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434149,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434166,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434162,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434175,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434176,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434179,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434200,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434199,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434192,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434188,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434203,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434216,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434204,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434208,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434220,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434226,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434228,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434241,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434245,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434249,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434263,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434259,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434279,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434270,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434267,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434284,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434297,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434293,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434289,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434303,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434316,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434307,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434321,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434334,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434329,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434325,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434336,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434349,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434339,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434343,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434351,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434359,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434354,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434356,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434358,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434362,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434360,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434370,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434369,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434364,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434367,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434373,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434371,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434379,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434378,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434375,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434380,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434392,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434391,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434387,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434383,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434395,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434393,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434400,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434401,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434402,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434412,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434413,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434414,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434415,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434422,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434423,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434424,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434425,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434430,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434431,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434432,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434438,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434439,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434436,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434440,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434441,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434446,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434447,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434448,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434444,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434449,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434457,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434458,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434455,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434452,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434468,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434469,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434470,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434460,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434479,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434480,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434476,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434474,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434472,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434492,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434493,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434494,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434489,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434484,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434482,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434500,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434501,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434497,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434496,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434509,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434511,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434510,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434506,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434505,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434503,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434519,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434520,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434517,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434516,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434514,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434522,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434523,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434526,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434527,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434524,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434529,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434530,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434534,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434532,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434536,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434537,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434538,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434540,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434542,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434543,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434544,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434546,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434548,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434549,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434553,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434557,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434562,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434566,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434569,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434578,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434572,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434580,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434583,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434579,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434585,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434592,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434595,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434591,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434598,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434604,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434609,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434615,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434618,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434623,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434639,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434629,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434627,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434637,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434628,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434640,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434643,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434641,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434642,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434651,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434654,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434652,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434653,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434664,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434674,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434665,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434666,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434675,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434676,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434677,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434678,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434688,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434689,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434698,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434699,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434700,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434707,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434708,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434715,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434729,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434730,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434731,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434740,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434741,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434742,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434751,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434752,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434753,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434762,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434763,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434773,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434774,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434776,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434777,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434781,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434782,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434783,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434786,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434787,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434790,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434791,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434792,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434794,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434795,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434798,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434799,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434802,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434803,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434806,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434809,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434808,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434811,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66434812,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66434810,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435436,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435451,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435483,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435502,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435524,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435540,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435588,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435607,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435621,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435636,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435637,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435650,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435663,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435675,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435687,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435698,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435711,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435724,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66435742,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438500,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438501,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438505,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438504,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438503,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438508,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438509,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438513,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438512,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438510,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438517,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438520,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438523,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438519,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438524,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438531,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438525,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438528,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438527,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438529,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438532,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438538,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438533,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438541,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438536,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438535,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438539,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438547,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438542,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438543,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438550,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438545,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438548,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438551,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438556,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438552,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438558,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438554,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438553,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438559,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438565,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438560,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438568,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438563,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438566,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438562,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438571,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438579,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438578,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438572,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438575,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438574,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438576,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438589,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438584,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438585,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438592,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438588,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438587,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438590,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438602,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438607,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438603,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438610,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438618,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438606,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438605,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438608,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438604,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438628,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438629,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438625,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438639,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438632,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438627,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438630,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438656,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438661,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438662,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438667,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438657,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438660,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438658,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438684,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438675,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438680,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438677,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438679,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438690,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438700,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438695,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438701,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438686,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438691,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438723,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438712,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438717,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438724,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438710,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438713,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438722,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438733,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438744,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438743,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438745,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438731,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438734,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438756,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438764,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438763,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438765,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438754,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438766,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438781,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438783,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438788,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438782,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438806,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438801,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438808,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438791,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438803,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438805,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438807,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438789,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438809,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438810,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438834,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438827,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438812,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438833,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438837,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438828,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438838,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438835,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438857,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438861,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438841,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438862,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438863,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438877,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438885,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438880,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438864,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438887,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438878,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438886,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438901,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438895,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438904,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438909,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438888,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438908,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438889,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438902,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438910,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438922,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438931,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438911,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438918,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66438932,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438912,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438923,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438933,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438945,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438934,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438948,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438939,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438954,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438940,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438956,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438946,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438957,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438958,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438961,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438962,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438970,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438980,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438981,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438995,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438999,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438985,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439001,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66438984,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439002,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439003,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439006,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439014,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439018,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439021,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439004,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439028,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439029,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439037,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439022,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439033,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439025,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439026,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439030,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439038,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439031,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439039,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439045,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439046,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439040,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439047,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439051,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439042,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439043,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439053,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439056,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439057,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439068,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439066,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439061,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439059,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439062,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439070,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439064,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439072,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439078,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439081,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439084,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439075,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439076,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439079,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439073,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439099,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439098,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439088,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439101,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439106,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439094,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439095,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439096,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439107,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439090,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439100,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439119,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439127,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439126,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439120,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439128,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439124,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439145,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439154,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439153,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439149,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439155,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439146,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439150,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439151,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439148,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439164,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439165,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439168,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439172,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439169,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439170,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439167,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439163,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439191,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439192,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439198,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439194,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439196,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439195,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439212,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439213,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439216,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439215,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439217,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439234,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439226,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439230,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439235,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439227,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439231,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439229,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439256,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439248,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439252,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439246,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439253,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439251,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439249,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439257,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439270,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439274,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439279,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439281,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439275,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439268,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439271,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439273,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439276,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439280,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439295,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439293,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439296,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439299,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439303,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439300,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439298,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439301,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439316,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439321,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439325,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439317,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439322,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439314,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439318,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439323,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439345,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439337,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439347,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439348,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439336,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439338,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439342,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439339,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439343,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439341,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439346,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439358,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439363,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439366,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439360,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439357,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439364,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439362,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439359,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439365,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439380,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439367,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439384,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439387,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439379,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439385,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439383,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439381,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439403,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439388,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439400,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439397,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439396,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439399,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439420,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439421,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439417,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439414,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439412,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439413,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439416,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439418,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439439,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439422,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439436,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439440,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439433,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439435,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439437,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439453,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439441,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439452,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439449,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439447,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439451,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439476,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439463,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439469,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439473,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439477,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439458,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439468,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439470,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439466,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439496,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439484,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439493,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439497,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439488,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439490,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439481,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439492,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439494,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439499,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439512,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439500,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439504,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439511,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439513,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439508,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439501,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439510,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439502,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439533,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439515,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439530,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439522,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439534,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439520,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439526,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439531,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439516,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439528,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439517,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439553,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439536,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439551,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439554,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439537,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439539,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439547,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439549,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439552,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439538,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439576,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439556,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439563,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439574,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439577,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439562,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439567,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439557,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439569,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439575,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439558,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439559,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439560,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439606,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439585,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439586,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439593,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439604,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439598,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439587,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439592,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439605,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439600,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439588,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439589,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439625,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439623,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439614,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439611,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439617,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439613,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439619,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439624,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439643,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439641,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439634,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439630,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439633,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439632,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439639,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439642,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439652,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439662,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439647,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439651,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439650,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439657,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439659,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439682,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439670,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439680,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439667,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439669,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439675,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439681,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439668,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439677,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439699,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439697,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439688,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439689,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439685,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439700,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439687,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439694,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439698,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439716,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439715,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439714,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439705,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439706,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439702,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439704,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439710,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439712,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439733,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439723,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439732,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439722,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439728,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439730,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439719,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439746,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439739,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439745,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439736,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439738,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439756,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439757,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439749,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439771,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439758,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439765,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439762,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439770,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439781,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439772,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439775,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439774,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439793,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439783,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439788,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439786,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439804,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439805,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439795,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439798,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439807,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439809,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439814,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439816,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439820,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439825,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439827,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439832,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439834,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439836,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439843,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439840,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439847,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439853,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439855,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439863,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439872,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439870,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439880,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439882,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439889,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439891,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439896,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439898,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439902,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439904,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439909,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439910,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439916,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439917,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66439922,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66439923,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440609,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440610,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440627,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440644,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440643,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440658,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440671,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440701,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440715,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440733,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440767,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440768,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440788,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440811,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440839,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440863,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440913,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440953,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66440986,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66441016,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66441014,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66441028,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66441082,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66441101,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66441117,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66441123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66441131,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443851,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443852,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443855,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443856,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443857,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443863,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443864,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443865,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443876,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443878,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443881,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66443891,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443879,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443895,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443908,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443909,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443911,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443912,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443915,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443929,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443930,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443932,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443933,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443936,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443953,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443951,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443955,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443956,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443960,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443954,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443975,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443957,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443987,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443983,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443978,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443981,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443997,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444002,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443999,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66443995,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444012,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444018,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444015,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444011,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444010,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444033,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444037,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444035,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444030,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444031,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444050,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444051,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444054,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444049,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444053,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444069,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444073,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444072,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444067,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444068,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444089,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444101,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444098,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444088,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444087,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444125,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444120,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444109,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444110,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444148,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444163,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444161,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444147,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444146,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444184,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444186,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444173,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444174,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444206,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444204,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444194,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444195,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444229,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444219,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444218,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444232,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444228,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444255,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444245,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444256,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444285,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444283,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444271,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444270,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444293,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444304,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444305,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444318,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444306,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444320,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444341,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444342,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444328,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444329,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444372,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444373,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444379,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444361,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444354,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444385,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444402,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444403,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444391,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444380,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444411,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444429,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444430,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444418,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444408,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444447,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444438,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444452,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444453,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444439,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444446,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444437,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444466,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444467,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444476,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444477,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444475,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444482,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444497,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444489,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444490,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444499,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444496,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444507,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444505,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444506,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444524,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444525,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444511,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444515,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444516,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444517,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444512,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444526,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444527,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444547,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444548,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444534,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444539,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444541,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444529,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444542,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444540,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444530,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444538,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444535,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444549,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444550,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444569,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444568,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444567,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444556,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444559,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444560,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444558,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444561,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444571,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444581,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444575,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444580,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444587,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444576,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444579,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444596,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444609,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444588,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444591,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444597,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444604,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444600,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444602,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444610,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444627,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444615,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444617,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444618,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444628,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444616,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444619,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444635,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444647,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444629,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444639,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444640,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444638,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444648,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444632,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444641,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444649,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444656,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444669,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444650,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444658,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444661,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444659,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444670,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444657,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444660,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444651,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444683,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444674,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444676,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444684,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444688,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444682,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444689,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444680,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444677,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444700,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444706,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444692,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444694,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444698,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444701,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444699,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444695,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444719,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444709,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444710,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444714,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444721,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444718,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444717,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444722,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444715,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444732,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444739,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444726,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444730,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444738,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444729,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444737,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444731,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444740,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444742,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444753,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444755,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444760,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444745,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444752,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444759,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444754,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444746,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444761,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444762,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444778,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444771,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444772,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444779,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444793,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444780,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444785,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444786,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444794,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444792,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444787,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444810,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444799,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444805,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444802,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444808,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444815,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444800,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444804,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444811,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444806,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444803,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444816,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444827,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444828,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444818,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444822,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444832,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444821,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444825,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444838,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444833,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444835,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444839,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444842,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444841,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444843,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444849,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444844,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444840,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444869,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444851,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444860,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444853,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444856,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444858,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444855,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444861,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444859,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444868,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444857,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444878,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444870,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444886,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444888,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444872,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444876,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444875,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444879,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444877,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444887,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444895,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444889,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444907,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444891,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444896,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444898,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444894,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444900,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444899,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444908,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444909,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444920,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444921,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444911,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444915,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444914,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444922,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444916,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444924,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444930,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444923,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444926,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444929,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444932,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444934,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444931,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444935,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444936,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444938,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444942,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444941,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444943,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444964,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444948,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444954,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444958,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444950,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444953,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444955,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444975,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444980,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444973,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444966,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444971,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444972,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66444976,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444982,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444993,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444990,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445004,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444989,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444991,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66444994,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445006,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445014,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445018,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445016,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445022,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445015,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66445024,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445034,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445036,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445031,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445030,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445033,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66445032,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445052,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445045,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66445050,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445047,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445048,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445038,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445046,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445065,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445073,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445074,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445056,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445064,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445070,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445066,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445083,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66445092,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445085,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445090,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445075,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445089,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445084,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66445110,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445109,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445100,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66445101,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66445093,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445102,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445111,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445122,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445124,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445112,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445129,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445139,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445130,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445142,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445143,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66445156,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445148,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445157,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445158,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66445165,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445160,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445166,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445172,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66445173,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445183,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445193,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445195,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445194,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66445207,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446181,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446202,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446221,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446239,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446254,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446257,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446270,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446273,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446295,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446312,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446308,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446327,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446324,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446346,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446340,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446367,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446381,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446400,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446393,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446413,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446432,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446429,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446454,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446459,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446476,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446500,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446496,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446510,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446514,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446528,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446525,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446544,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446562,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446558,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446575,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446574,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446572,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446588,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446586,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446584,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446602,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446600,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446598,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446615,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446612,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446628,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446625,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446639,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446636,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446648,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446662,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66446659,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450035,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450037,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450039,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450041,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450043,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450046,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450047,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450049,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450052,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450051,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450055,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450057,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450059,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450062,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450063,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450065,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450067,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450068,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450072,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450074,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450076,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450080,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450083,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450084,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450088,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450082,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450089,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450093,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450094,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450098,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,True,False -66450099,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450096,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450103,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450104,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450105,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450106,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450107,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450115,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450117,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450108,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450112,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450109,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450110,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450120,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450129,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450130,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450125,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450121,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450126,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450122,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450134,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450136,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450138,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450149,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450147,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450145,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450152,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450159,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450161,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450157,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450158,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450175,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450169,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450171,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450186,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450187,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450182,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450193,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450184,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450209,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450214,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450207,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450232,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450237,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450238,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450240,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450235,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450261,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450263,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450259,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450285,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450287,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450279,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450282,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450334,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450318,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450319,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450311,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450362,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450341,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450353,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450361,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450376,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450394,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450395,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450382,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450393,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450402,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450432,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450438,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450439,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450442,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450425,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450476,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450471,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450479,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450482,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450465,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450478,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450512,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450506,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450515,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450518,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450499,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450507,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False -66450514,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450538,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450532,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450543,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450529,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450540,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450560,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450555,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450556,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450565,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450548,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450552,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450557,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450562,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450585,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450582,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450583,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450571,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450579,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450584,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450587,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450576,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450604,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450601,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450606,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450600,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450597,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450602,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450592,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450621,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450623,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450614,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450620,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450617,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450618,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450640,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450641,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450632,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450636,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450639,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450629,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450655,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450656,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450649,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450652,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450650,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450672,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450673,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450680,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450683,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450662,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450663,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450665,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450670,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450681,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450689,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450674,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450693,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450697,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450702,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450705,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450707,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450710,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450703,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450708,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450696,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450700,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450704,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450694,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450728,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450730,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450732,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450735,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450720,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450727,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450718,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450721,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450725,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450729,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450733,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450746,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450756,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450757,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450759,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450752,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450754,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450747,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450755,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450749,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450789,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450783,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450776,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450781,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450775,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450782,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450802,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450777,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450779,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450807,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450809,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450820,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450824,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450819,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450806,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450812,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450816,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450818,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450821,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450817,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450837,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450835,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450844,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450850,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450834,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450848,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450851,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450839,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450846,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450862,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450877,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450860,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450868,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450872,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450873,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450859,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450864,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450871,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450874,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450869,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450875,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450887,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450886,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450893,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450896,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450901,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450897,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450885,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450889,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450894,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450898,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450925,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450911,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450917,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450922,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450921,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450923,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450910,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450913,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450920,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450924,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450918,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450938,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450945,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450947,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450955,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450940,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450950,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450936,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450942,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450946,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450948,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450949,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450960,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450956,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450965,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450969,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450967,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450968,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450958,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450966,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450974,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450978,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450984,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450986,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450980,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450987,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450976,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450985,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450996,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450993,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451006,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451001,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451002,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451005,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451004,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451003,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66450995,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66450998,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451015,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451011,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451020,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451024,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451023,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451025,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451021,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451029,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451036,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451037,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451031,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451033,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451048,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451049,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451051,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451053,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451054,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451055,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451046,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451052,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451069,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451073,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451076,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451077,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451078,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451070,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451067,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451074,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451092,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451098,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451099,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451095,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451093,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451090,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451096,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451101,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451116,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451124,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451120,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451123,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451125,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451114,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451117,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451121,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451131,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451139,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451142,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451143,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451144,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451138,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451136,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451140,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451149,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451155,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451158,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451161,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451162,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451163,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451164,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451153,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451159,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451169,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451176,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451178,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451182,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451181,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451183,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451184,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451174,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451179,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451187,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451193,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451195,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451199,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451198,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451203,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451196,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451206,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451212,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451214,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451210,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451217,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451220,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451229,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451234,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451218,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451232,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451241,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451238,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451243,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451245,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451251,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451235,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451250,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451244,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451254,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451261,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451259,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451271,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451256,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451263,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451266,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451272,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451274,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451280,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451278,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451285,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451290,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451282,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451283,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451293,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451296,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451298,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451307,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451300,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451306,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451302,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451310,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451313,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451320,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451318,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451323,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451327,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451330,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451337,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451332,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451334,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451341,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451338,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451342,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451346,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451339,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451344,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451348,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451353,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451359,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451356,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451351,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451355,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451357,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451362,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451367,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451360,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451369,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451368,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66451370,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451375,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451382,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451373,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451381,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451383,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451386,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451393,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451394,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451397,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451398,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451405,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451408,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451415,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451419,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451418,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451425,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451429,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451428,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451435,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451439,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451438,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451441,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451444,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451445,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451449,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451454,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451458,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451463,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451469,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451474,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66451479,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452382,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452395,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452417,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452402,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452419,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452442,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452429,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452444,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452443,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452464,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66452466,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452472,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452465,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452489,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452473,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452491,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452490,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452515,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452501,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452517,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452516,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452535,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452526,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452536,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452552,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452542,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452553,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452569,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452562,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452570,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452585,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452577,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452586,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452603,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452595,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452605,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452604,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452621,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452613,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452625,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452624,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452622,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452623,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452642,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452643,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452640,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452632,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452645,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452644,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452662,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452650,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452659,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452661,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452682,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452678,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452668,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452705,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452689,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452699,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452706,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452728,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452729,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452712,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452722,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452754,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452755,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452737,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452748,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452773,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452772,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452767,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452794,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452795,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452792,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452796,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452797,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66452818,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452819,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452822,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452810,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452801,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452820,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452821,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452831,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452836,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452823,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452837,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452852,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452869,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452860,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452853,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452875,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452870,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452871,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452889,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452895,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452883,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452885,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452903,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452910,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452899,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452920,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452915,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66452916,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452946,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452934,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66452936,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452961,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66452950,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66452951,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456124,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456125,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456121,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456122,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456129,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456130,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456126,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456136,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456138,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456139,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456132,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456133,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456137,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456145,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66456141,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456143,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456144,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456140,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456152,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456150,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456151,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456146,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456147,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456161,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456160,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456159,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456155,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456156,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456157,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456165,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456174,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456175,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456177,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456176,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456171,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456172,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66456166,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456192,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456183,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456189,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456190,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456191,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456187,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456188,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456197,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456206,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456207,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456205,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456203,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456204,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456208,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456217,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456210,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456211,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456214,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456216,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456212,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456213,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456215,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456226,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456218,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66456219,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456224,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456225,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456222,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456220,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456221,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456233,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456227,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456228,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456231,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456232,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456229,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456230,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456244,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456235,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456242,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456234,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456241,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456243,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456237,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456236,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456246,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456253,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456254,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456245,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456247,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456252,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456255,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456266,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456267,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456257,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456258,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456264,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456265,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456259,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456260,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456276,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456277,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456269,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456273,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456274,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456275,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456270,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456268,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456289,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456278,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456279,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456286,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456287,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456288,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456280,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456301,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456306,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456291,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456303,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456307,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456290,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456302,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456292,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456300,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456323,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456329,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456308,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456310,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456311,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456309,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456312,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456328,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456347,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456349,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456354,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456330,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66456331,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456332,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456348,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456333,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456378,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456387,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456362,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456363,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456364,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456379,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456386,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456417,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456392,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456393,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456394,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456407,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456412,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456413,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456395,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456430,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456440,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456422,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456431,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456439,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456423,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456464,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456471,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66456448,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456450,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456459,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456455,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456449,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456482,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456490,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456475,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456476,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456477,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456487,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456489,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456478,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456509,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456494,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456496,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456503,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456504,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456515,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456498,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456529,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456535,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456518,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456536,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456519,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456523,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456557,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456548,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456550,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456560,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456566,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456562,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456582,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456586,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456573,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456574,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456584,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456585,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456570,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456609,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456615,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456604,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456606,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456607,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456612,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456616,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456597,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456603,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456636,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456649,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456634,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456635,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456645,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456648,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456630,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456631,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456637,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456638,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66456665,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456678,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456667,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456669,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456666,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456656,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456675,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456663,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456668,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456701,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456691,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456698,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456699,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456697,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456679,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456689,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456700,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456688,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456708,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456729,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456721,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456722,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456724,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456730,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66456732,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456715,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456711,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456714,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456723,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66456734,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456755,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456753,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456763,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456751,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456742,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456745,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456754,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66456735,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456740,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456752,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456792,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456784,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456786,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456770,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456794,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456778,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456765,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456785,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456764,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456777,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456797,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456830,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456812,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456819,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456820,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456821,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456825,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456818,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456809,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456822,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66456798,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456833,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456857,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456859,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456860,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456839,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456852,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456843,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456838,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456851,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456858,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456870,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456867,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456879,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456884,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456883,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456875,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456877,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456882,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456869,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456888,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456905,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456907,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456908,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456898,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456902,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456906,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456901,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456892,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456893,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456911,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456914,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456921,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456925,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456926,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456917,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456924,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456919,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456913,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456941,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456931,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456944,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456945,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456930,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456935,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456942,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456932,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456938,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456956,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456951,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456965,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456969,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456970,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456971,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456950,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456959,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456960,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456962,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456955,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456975,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456985,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456989,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456990,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456980,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456986,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456979,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456983,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456988,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456976,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456996,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457014,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457015,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456993,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456998,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457009,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66456997,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457019,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457022,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457035,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457033,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457034,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457016,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457026,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457036,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457032,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457023,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457037,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457046,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457048,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457059,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457060,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457042,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457052,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457040,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457047,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457053,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457058,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457064,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457066,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457069,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457065,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457082,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457075,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457070,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457078,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457083,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457061,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457074,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457081,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457084,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457095,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457104,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457106,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457087,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457086,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457098,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457105,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457092,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457093,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457096,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457103,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457109,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457110,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457124,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457117,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457116,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457125,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457112,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457113,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457120,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457122,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457126,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457131,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457139,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457141,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457129,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457136,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457140,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457145,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457134,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457154,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457156,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457165,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457166,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457150,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457151,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457148,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457159,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457162,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457164,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457175,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457178,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457183,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457169,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457173,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457177,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457179,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457184,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457199,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457197,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457203,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457205,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457194,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457195,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457204,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457200,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457202,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457220,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457223,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457217,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457226,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457227,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457213,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457218,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457209,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457228,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457222,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457236,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457248,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457250,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457235,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457240,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457242,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457249,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457229,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457243,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457262,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457266,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457270,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457251,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457257,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457252,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457265,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457260,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457282,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457272,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457278,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457283,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457271,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457280,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457284,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457298,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457288,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457292,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457297,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457301,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457289,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457294,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457315,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457305,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457308,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457309,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457312,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457316,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457326,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457319,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457327,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457322,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457323,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457320,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457336,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457334,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457341,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457331,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457339,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457355,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457356,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457347,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457352,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457367,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457359,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457363,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457384,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457374,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457373,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457377,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457387,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457396,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457388,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457392,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457401,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457402,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457407,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457410,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457412,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457415,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457416,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457423,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457420,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457425,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457427,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457426,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457432,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457430,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457435,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457438,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457441,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457445,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457444,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457449,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457453,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457454,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457460,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457461,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66457462,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457466,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457471,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66457478,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458444,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458445,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458436,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458472,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458478,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458468,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458500,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458502,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458493,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458525,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458527,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458522,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458548,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458545,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458570,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458567,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458587,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458608,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458611,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458636,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458633,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458654,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458657,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458676,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458705,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458702,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458707,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458724,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458726,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458728,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458749,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458746,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458767,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458768,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458780,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458795,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458800,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458813,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458815,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458802,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458819,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458829,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458830,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458836,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458847,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458845,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458860,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458865,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458876,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458881,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458891,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458896,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458905,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458909,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66458920,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458926,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458942,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458952,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458959,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458972,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458981,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66458999,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462069,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462068,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462059,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462061,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462063,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462071,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462085,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462073,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462078,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462079,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462080,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462086,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462074,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462094,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462089,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462095,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462097,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462098,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462099,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462103,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462108,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462110,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462111,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462115,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462112,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462116,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462121,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462120,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462124,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462125,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462122,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462126,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462128,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462131,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462133,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462134,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462135,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462139,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462138,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462144,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462143,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462147,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462145,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462150,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462152,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462155,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462159,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462162,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462157,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462158,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462163,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462153,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462154,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462171,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462170,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462172,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462174,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462175,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462176,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462179,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462180,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462185,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462191,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462192,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462184,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462186,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462187,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462188,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462195,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462182,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462193,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462194,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462198,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462209,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462202,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462210,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462203,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462204,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462205,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462206,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462207,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462211,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462215,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462213,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462226,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462220,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462221,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462222,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462223,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462224,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462231,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462230,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462242,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462234,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462236,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462237,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462238,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462239,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462240,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462246,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462244,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462258,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462250,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462253,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462257,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462249,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462251,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462252,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462261,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462264,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462271,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462266,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462268,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462269,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462267,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462278,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462276,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462282,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462285,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462289,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462281,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462283,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462284,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462288,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462293,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462296,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462312,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462298,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462300,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462301,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462314,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462304,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462299,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462317,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462325,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462335,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462318,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462319,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462320,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462321,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462334,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462339,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462348,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462342,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462343,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462354,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462363,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462364,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462365,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462376,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462377,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462367,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462371,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462386,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462389,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462398,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462394,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462405,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462409,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462415,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462399,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462410,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462416,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462430,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462432,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462466,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462441,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462447,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462453,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462440,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462454,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462464,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462462,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462506,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462494,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462495,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462484,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462488,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462503,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462505,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462489,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462547,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462530,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462531,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462532,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462543,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462545,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462524,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462564,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462582,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462556,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462559,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462566,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462565,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462581,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462558,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462579,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462600,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462616,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462592,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462593,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462601,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462602,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462613,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462614,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462594,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462640,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462619,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462629,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462631,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462632,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462630,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462641,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462650,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462652,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462659,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462642,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462649,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462660,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462674,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462661,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462672,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462677,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462679,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462671,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462681,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462697,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462683,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462690,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462698,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462699,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462700,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462703,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462704,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462705,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462715,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462721,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462722,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462725,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462714,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462724,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462727,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462740,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462730,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462737,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462749,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462745,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462748,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462752,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462767,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462768,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462750,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462761,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462770,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462773,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462762,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462779,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462780,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462788,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462793,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462791,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462775,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462795,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462792,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462800,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462801,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462806,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462812,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462809,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462798,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462816,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462810,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462822,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462823,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462831,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462819,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462833,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462839,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462832,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462843,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462857,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462845,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462846,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462853,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462856,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462859,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462854,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462842,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462858,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462861,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462855,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462866,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462867,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462868,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462875,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462885,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462887,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462879,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462886,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462863,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462888,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462890,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462880,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462895,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462917,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462898,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462907,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462916,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462919,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462914,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462893,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462918,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462899,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462915,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462926,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462927,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462928,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462942,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462947,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462923,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462939,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462945,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462935,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462940,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462951,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462953,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462948,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462955,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462968,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462969,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462965,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462950,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462971,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462966,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462986,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462978,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462984,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462985,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462990,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462996,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66462994,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462997,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462976,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462979,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462980,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462981,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66462995,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463013,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463026,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463009,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463015,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463027,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463020,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463006,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463022,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463008,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463011,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463012,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463016,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463023,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463053,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463054,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463038,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463047,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463057,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463060,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463036,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463049,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463044,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463048,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463050,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463037,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463080,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463061,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463065,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463075,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463079,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463087,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463085,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463072,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463074,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463077,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463078,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463062,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463088,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463105,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463093,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463100,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463106,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463107,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463090,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463103,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463101,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463110,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463113,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463129,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463131,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463122,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463127,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463111,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463119,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463125,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463126,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463112,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463134,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463152,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463138,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463146,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463135,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463153,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463154,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463144,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463147,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463148,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463136,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463160,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463179,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463162,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463170,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463178,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463182,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463158,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463166,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463174,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463171,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463173,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463159,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463185,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463188,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463203,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463195,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463205,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463186,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463194,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463204,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463196,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463187,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463213,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463223,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463225,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463219,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463228,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463209,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463218,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463221,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463220,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463222,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463210,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463231,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463243,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463240,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463232,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463244,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463236,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463239,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463241,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463233,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463250,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463259,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463261,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463247,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463256,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463253,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463254,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463255,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463248,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463263,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463271,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463267,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463270,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463264,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463275,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463286,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463281,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463274,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463279,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463282,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463283,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463280,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463289,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463302,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463294,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463287,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463297,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463291,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463295,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463288,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463304,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463309,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463315,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463308,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463317,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463321,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463329,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463319,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463325,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463327,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463331,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463326,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463320,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463338,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463336,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463335,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463340,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463337,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463346,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463347,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463345,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463355,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463353,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463354,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463362,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463360,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463368,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463367,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463376,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463374,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463382,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463380,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66463389,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66463396,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464340,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464364,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464388,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464426,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464452,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464469,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464485,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464505,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464525,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464547,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464565,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464589,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464604,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464618,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464649,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464660,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464681,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464729,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464750,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464770,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464785,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464798,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66464811,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66467994,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66467995,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66467996,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66467997,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66467998,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66467999,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468008,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468003,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468004,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468005,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468006,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468002,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468012,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468014,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468016,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468019,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468015,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468017,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468021,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468024,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468022,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468023,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468027,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468025,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468029,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468030,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468031,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468034,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468028,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468032,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468035,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468036,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468038,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468040,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468037,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468039,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468048,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468049,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468041,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468042,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468045,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468055,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468044,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468053,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468050,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468051,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468046,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468056,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468057,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468064,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468066,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468062,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468063,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468065,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468069,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468070,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468077,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468078,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468076,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468081,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468075,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468079,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468085,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468090,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468089,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468088,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468093,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468099,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468100,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468101,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468104,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468102,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468105,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468110,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468111,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468114,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468117,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468120,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468118,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468106,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468122,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468130,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468123,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468125,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468132,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468141,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468142,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468149,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468143,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468148,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468140,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468156,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468157,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468159,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468169,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468158,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468167,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468182,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468189,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468190,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468186,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468192,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468188,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468191,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468185,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468208,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468212,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468200,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468205,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468209,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468210,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468211,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468204,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468207,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468230,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468218,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468231,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468223,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468232,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468233,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468234,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468222,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468225,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468227,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468245,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468247,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468250,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468251,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468254,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468241,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468252,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468240,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468248,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468253,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468243,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468244,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468249,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468263,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468264,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468265,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468266,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468268,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468259,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468261,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468267,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468270,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468262,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468271,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468272,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468280,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468282,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468284,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468274,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468277,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468279,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468278,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468286,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468287,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468292,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468285,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468303,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468297,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468293,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468302,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468300,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468301,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468307,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468308,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468314,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468321,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468328,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468315,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468326,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468327,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468336,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468337,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468344,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468338,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468361,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468362,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468347,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468345,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468352,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468359,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468360,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468386,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468399,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468400,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468371,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468372,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468377,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468370,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468396,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468388,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468395,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468393,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468394,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468378,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468389,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468402,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468428,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468413,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468427,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468412,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468419,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468433,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468430,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468436,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468420,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468432,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468431,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468448,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468447,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468453,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468457,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468477,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468470,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468454,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468455,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468491,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468479,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468478,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468490,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468492,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468493,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468498,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468500,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468494,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468495,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468497,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468484,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468519,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468520,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468521,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468522,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468527,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468514,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468508,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468526,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468530,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468541,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468523,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468524,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468544,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468551,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468543,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468553,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468559,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468542,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468563,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468554,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468558,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468557,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468590,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468591,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468575,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468589,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468592,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468597,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468583,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468573,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468600,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468574,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468593,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468594,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468622,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468623,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468624,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468609,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468625,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468630,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468617,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468636,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468608,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468626,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468629,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468634,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468628,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468648,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468650,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468655,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468646,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468644,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468654,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468659,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468645,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468651,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468652,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468680,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468667,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468674,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468669,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468675,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468676,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468673,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468686,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468668,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468684,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468679,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468677,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468697,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468690,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468695,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468698,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468705,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468708,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468692,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468707,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468700,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468703,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468704,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468711,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468716,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468717,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468718,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468725,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468731,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468712,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468729,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468719,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468721,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468724,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468720,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468733,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468738,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468736,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468739,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468740,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468747,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468735,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468752,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468737,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468741,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468755,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468745,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468746,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468754,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468742,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468765,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468766,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468767,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468771,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468760,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468764,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468775,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468756,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468768,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468769,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468770,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468787,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468788,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468799,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468778,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468785,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468795,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468777,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468783,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468786,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468789,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468791,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468794,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468790,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468808,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468810,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468811,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468812,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468819,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468825,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468809,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468817,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468813,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468814,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468818,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468828,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468800,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468826,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468830,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468837,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468856,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468840,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468842,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468848,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468834,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468853,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468854,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468829,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468839,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468843,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468844,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468845,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468867,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468859,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468868,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468869,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468875,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468862,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468865,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468879,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468858,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468866,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468874,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468870,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468881,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468871,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468873,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468888,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468898,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468883,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468890,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468891,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468902,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468904,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468885,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468901,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468882,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468889,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468892,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468894,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468897,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468893,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468914,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468916,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468908,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468917,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468918,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468923,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468911,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468926,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468907,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468915,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468919,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468928,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468922,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468932,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468942,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468944,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468951,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468943,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468954,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468931,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468937,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468941,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468945,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468955,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468947,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468950,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468957,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468946,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468965,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468974,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468975,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468976,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468977,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468983,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468961,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468982,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468960,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468964,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468978,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468979,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469003,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66468989,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468999,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469001,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469002,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469006,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468995,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468985,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468986,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66468988,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469004,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469023,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469021,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469022,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469028,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469018,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469010,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469011,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469012,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469027,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469024,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469038,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469045,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469046,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469050,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469033,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469043,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469044,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469032,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469037,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469034,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469048,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469049,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469064,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469061,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469062,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469065,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False -66469066,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469067,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469073,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469056,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469063,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469072,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469068,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469069,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469060,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469088,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469078,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469080,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469084,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469086,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False -66469087,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469074,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469096,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469079,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469083,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469089,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469112,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469106,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469107,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469108,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469125,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469100,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469113,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False -66469114,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469116,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469124,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469115,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469144,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469134,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469136,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469142,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469143,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469149,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469128,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469135,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469140,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469139,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469148,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469145,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469146,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469160,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469165,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469158,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469152,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469159,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469170,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469163,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469169,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469166,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469167,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469184,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469185,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469186,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469171,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469180,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469174,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469179,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469182,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469190,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469187,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469188,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469193,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469201,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469203,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469204,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469205,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469199,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469200,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469202,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469206,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469207,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469209,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469196,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469211,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469212,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469218,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469222,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469216,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469217,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469221,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469223,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469225,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469234,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469238,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469228,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469233,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469237,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469239,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469241,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469251,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469254,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469244,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469250,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469255,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469249,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469257,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469265,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469266,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469260,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469264,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469267,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469263,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469269,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469277,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469281,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469284,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469275,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469276,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469283,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469294,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469297,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469285,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469293,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469292,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469305,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469307,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469299,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469304,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469318,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469309,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469316,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66469326,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469328,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66469336,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66470070,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470063,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470069,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470089,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470088,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470080,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470100,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470106,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470134,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470133,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470131,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470162,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470161,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470158,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470192,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470191,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470189,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470214,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470213,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470212,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470229,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470243,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470241,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470258,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470257,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470272,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470292,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470290,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470312,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470310,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470334,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470332,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66470356,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66470377,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470401,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66470422,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470420,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470443,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470441,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470458,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470460,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470456,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470475,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470477,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470473,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470489,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470491,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470487,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470507,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470509,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470505,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470524,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470526,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470522,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470542,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470544,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470540,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470559,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470561,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470557,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470576,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470578,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470575,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470587,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470594,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470597,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470608,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470611,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470603,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470626,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470619,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66470629,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473852,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473853,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473857,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473863,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473856,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473858,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473864,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473860,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473876,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473872,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473875,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473869,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473877,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473883,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473886,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473881,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473879,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473889,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473884,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473890,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473896,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473894,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473893,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473900,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473898,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473904,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473909,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473903,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473913,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473912,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473914,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473920,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473925,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473930,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473926,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66473927,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473924,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473929,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473934,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473936,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473939,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473935,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473933,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473938,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473942,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473945,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66473941,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473944,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473949,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473951,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473948,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473947,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473950,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66473956,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473953,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473954,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473955,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66473952,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473957,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473958,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473962,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66473961,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473963,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473959,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473960,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473964,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473973,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473965,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473967,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473980,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473981,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473988,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66473997,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66473977,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474005,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474006,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474017,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474002,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474034,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474035,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474046,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474051,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474029,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474077,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474059,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474056,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474060,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474076,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474079,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474111,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474089,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474090,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474106,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474088,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474105,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474107,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474122,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474121,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474138,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474134,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474143,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474152,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474142,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474136,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474153,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474154,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474156,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474155,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474157,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474165,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474166,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474167,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474169,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474170,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474177,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474178,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474180,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474183,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474181,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474182,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474184,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474193,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474194,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474195,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474196,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474198,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474199,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474206,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474207,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474197,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474228,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474214,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474229,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474222,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474209,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474210,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474215,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474227,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474232,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474230,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474212,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474231,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474211,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474234,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474235,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474246,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474240,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474233,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474239,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474242,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474247,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474261,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474262,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474241,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474236,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474245,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474244,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474255,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474264,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474280,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474263,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474267,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474269,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474283,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474284,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474288,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474289,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474268,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474265,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474271,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474305,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474291,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474298,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474294,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474295,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474297,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474299,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474310,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474311,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474290,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474320,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474296,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474292,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474308,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474325,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474321,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474322,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474324,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474328,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474329,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474335,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474336,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474327,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474326,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474349,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474356,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474352,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474355,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474359,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474360,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474366,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474367,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474379,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474353,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474358,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474357,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474350,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474351,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474384,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474381,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474382,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474383,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474387,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474392,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474393,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474380,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474385,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474404,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474436,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474407,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474408,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474411,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474416,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474418,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474425,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474426,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474405,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474412,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474406,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474409,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474415,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474448,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474449,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474464,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474442,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474444,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474446,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474454,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474460,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474443,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474450,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474452,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474447,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474453,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474489,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474482,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474495,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474478,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474485,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474487,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474502,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474483,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474490,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474488,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474484,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474509,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474512,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474515,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474522,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474507,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474514,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474530,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474510,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474511,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474517,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474523,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474516,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474540,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474551,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474538,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474544,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474552,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474541,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474543,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474548,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474542,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474546,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474547,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474563,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474567,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474568,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474569,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474574,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474570,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474576,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474564,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474566,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474571,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474565,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474584,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474589,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474592,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474593,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474583,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474599,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474603,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474585,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474588,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474595,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474600,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474586,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474594,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474587,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474608,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474611,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474614,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474607,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474615,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474620,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474625,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474610,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474617,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474621,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474609,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474616,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474624,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474628,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474634,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474635,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474627,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474645,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474649,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474629,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474631,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474639,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474646,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474630,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474632,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474636,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474661,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474655,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474662,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474673,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474674,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474678,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474656,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474658,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474659,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474666,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474657,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474677,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474663,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474688,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474694,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474687,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False -66474691,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474695,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474703,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474690,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474697,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474706,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474689,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474696,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474712,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474717,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474718,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474726,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474727,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474714,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474720,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474729,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474713,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474715,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474719,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474742,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474748,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474752,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474743,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474749,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474745,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474746,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474753,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474756,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474744,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474750,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474757,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474765,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474772,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474782,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474773,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474779,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474766,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474768,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474769,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474767,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474778,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474780,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474777,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474794,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474798,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474786,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474792,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474793,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474797,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474802,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474787,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474789,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474790,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474796,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474801,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474788,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474795,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474806,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474810,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474811,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474809,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474812,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474807,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474808,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474819,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474824,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474820,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474822,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474826,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474821,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474825,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474838,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474841,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474843,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474839,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474840,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474833,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474835,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474834,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474854,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474849,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474848,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474853,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474855,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474859,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474852,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474863,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474869,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474873,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474870,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474874,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474865,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474866,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474872,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474876,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474864,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474871,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474879,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474887,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474880,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474882,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474883,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474886,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474889,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474890,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474881,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474902,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474896,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474899,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474905,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474898,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474906,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474910,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474891,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474897,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474903,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474916,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474921,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474924,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474911,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474919,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474925,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474917,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474926,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474918,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474922,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474923,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474932,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474937,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474933,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474940,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474941,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474935,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474939,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474934,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474942,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474927,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474938,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474948,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474953,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474954,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474956,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474957,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474949,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474951,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474955,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474950,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474958,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474943,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474968,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474969,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474964,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474965,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474967,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474972,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474959,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474978,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474979,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474983,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474984,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474980,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474981,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474986,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474973,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474992,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474997,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474993,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474998,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474999,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474995,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475000,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66474987,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66474994,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475006,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475010,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66475012,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475008,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475014,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66475001,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475011,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475017,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475021,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475022,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475023,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475019,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475025,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66475018,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475028,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475033,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66475031,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475034,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66475037,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475038,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475039,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66475029,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66475030,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66475044,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475045,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475043,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475050,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66475048,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475051,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475056,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479445,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475046,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475057,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475047,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475061,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475067,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475072,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475073,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66475078,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475076,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475082,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475087,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475079,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475088,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475093,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475101,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475096,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475094,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475104,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475107,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66479551,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479552,False,False,False,False,False,False,False,False,False,True,False,True,True,False,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -66479553,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479554,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479555,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476008,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475995,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66475997,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476005,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476027,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476014,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476028,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476016,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476017,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476019,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476044,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476037,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476039,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476050,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476054,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476063,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476056,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476052,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66476069,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476071,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476089,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476087,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476113,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476121,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476139,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476149,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476142,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476144,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476146,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476157,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476166,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476161,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476163,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476175,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476178,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66476185,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476180,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476194,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476197,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66476204,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476200,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476211,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476219,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476215,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476228,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476231,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476238,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476233,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476234,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476248,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476250,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476254,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476259,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476262,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476269,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476280,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476282,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476276,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476296,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476298,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476291,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476300,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66476308,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476316,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476319,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476321,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476332,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476334,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476328,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476344,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476340,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476354,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476366,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476362,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476367,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476378,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66476374,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476379,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476386,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476391,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476392,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476403,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476404,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476419,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476430,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476420,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66476431,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479833,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479842,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479835,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66479852,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479855,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479872,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479856,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479871,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66479869,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66479870,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479885,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479886,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479905,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66479915,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479911,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479929,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479931,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479926,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479941,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479939,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479949,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479948,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479953,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479954,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66479958,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479963,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479967,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479968,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66479960,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479980,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479986,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66479982,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479985,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479993,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479988,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479987,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66479999,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480001,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480002,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480011,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480010,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480028,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480018,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480029,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480046,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480045,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480060,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480061,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480066,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480075,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480119,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480105,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480108,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480134,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480148,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480137,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480133,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480189,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480174,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480175,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480190,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480224,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480225,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480229,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480210,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480222,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480221,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480205,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480226,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480228,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480238,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480261,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480256,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480257,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480233,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480295,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480294,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480273,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480322,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480304,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480331,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480332,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480333,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480358,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480361,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480356,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480340,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480359,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480384,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480381,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480382,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480411,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480390,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480409,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480395,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480419,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480432,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480415,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480427,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480434,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480433,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480438,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480440,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480453,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480454,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480456,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480446,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480461,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480462,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480463,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480468,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480466,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480474,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480473,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480478,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480483,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480485,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480488,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480487,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480489,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480490,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480494,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480501,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480505,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480511,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480507,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480515,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480509,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480519,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480520,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480523,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480527,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480532,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480536,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480540,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480560,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480545,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480549,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66480537,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480558,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480559,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480566,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480585,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480569,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480571,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480580,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480581,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480570,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480600,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480596,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480602,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480598,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480613,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480618,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480617,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480645,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480621,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480634,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480635,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480622,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480633,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480642,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480657,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480650,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480655,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480674,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480675,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480688,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480689,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480701,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480697,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480696,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480698,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480702,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480703,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480708,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480713,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480729,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480732,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480727,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480731,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480751,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480734,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480737,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480760,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480752,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480753,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480764,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480774,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480765,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480780,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480781,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480782,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480783,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480800,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480786,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480788,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480789,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480816,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480811,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480809,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480813,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480838,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480833,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480835,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480829,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480832,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480865,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480866,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480867,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480857,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480858,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480887,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480874,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480884,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480877,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480882,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480899,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480908,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480910,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480902,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480919,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480927,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480923,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480947,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480938,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480948,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480941,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480945,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480955,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480958,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480983,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480973,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480979,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480980,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480985,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66480999,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481008,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False -66481014,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481034,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481023,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481030,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481028,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66481051,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481047,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481052,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481043,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481045,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66481063,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481066,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481070,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481061,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481064,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481068,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481083,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481076,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481077,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481090,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481094,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481097,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66481106,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481100,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481110,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481122,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481119,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481115,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66481127,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66481126,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481137,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485258,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True -66481131,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481142,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481153,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481154,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481146,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481157,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481160,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481167,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481162,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66481166,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481170,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66481176,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481177,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481179,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481185,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481201,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481212,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481214,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481220,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481223,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481226,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481227,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481228,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66481230,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482078,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482098,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482093,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482114,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482115,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482143,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482160,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482175,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482192,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482180,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482222,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482229,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482237,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482259,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66482249,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482275,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482286,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482297,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482278,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482306,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482318,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482314,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66482313,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482335,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482343,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482328,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482359,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66482373,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66482380,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482419,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482405,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482409,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482425,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482455,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482482,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482486,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482493,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482516,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482536,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482561,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482598,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482595,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482614,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482629,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482628,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482643,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482671,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482669,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482683,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66482703,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485798,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485800,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485803,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485806,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485813,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66485815,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485808,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485811,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485820,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485816,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485819,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485817,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485829,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485823,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485828,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485831,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66485824,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485845,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485841,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485847,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66485860,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485851,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485871,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485869,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485863,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485870,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485873,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485885,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485876,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485883,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485884,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485877,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485900,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485898,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485905,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485921,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485948,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485943,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485961,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485970,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485971,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485962,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485990,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66485996,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486019,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486017,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486020,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486054,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486044,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486074,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486062,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486069,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486063,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486070,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486081,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486089,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486098,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486109,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486138,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486127,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486139,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486115,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486143,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486145,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486171,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486163,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486164,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486172,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486144,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486177,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486194,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486201,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486206,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486205,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486232,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486235,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486237,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486263,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486270,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486264,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486266,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486273,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486291,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486275,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486285,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486287,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486290,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491250,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486297,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486294,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486302,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486305,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486306,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491251,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486314,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486318,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486332,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486335,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486337,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491252,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486338,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486342,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486356,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486357,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486363,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486360,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66491253,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486366,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491254,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486374,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486382,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486385,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486395,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486383,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66491255,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486380,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486389,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486408,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486413,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486403,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486396,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486410,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486411,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486414,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486419,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486428,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486434,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486438,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486450,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486439,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486444,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486447,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486451,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486454,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486463,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486479,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486471,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486466,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486474,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486475,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486493,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486499,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486485,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486488,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486498,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486497,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486502,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486508,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486518,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486513,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486516,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486522,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486543,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486537,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486542,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486550,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486535,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False -66486540,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486564,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486572,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486571,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486565,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486573,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486595,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486594,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486589,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486587,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486592,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486596,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486620,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486613,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486607,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486618,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486610,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486614,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486625,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486639,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486632,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486640,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486637,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486652,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486665,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486667,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486659,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486663,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486676,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486683,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486686,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486688,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486694,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486677,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486684,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486690,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486703,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486705,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486708,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486701,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486704,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486709,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486726,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486716,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486724,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486727,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486730,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486736,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486748,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486743,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486758,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486753,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486759,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486773,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486780,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486774,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486785,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486781,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486794,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486805,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486797,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486801,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486798,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486811,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486820,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486810,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486837,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486828,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486846,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486847,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486850,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486865,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486861,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486870,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486863,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486857,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486877,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486874,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486875,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486881,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486894,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486897,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486915,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486918,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486911,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486917,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486932,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486933,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486934,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486945,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486949,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486951,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486958,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486959,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486962,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486969,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486972,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66486976,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486970,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486977,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486986,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486988,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66486990,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487008,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487002,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487004,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487007,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487009,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487021,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487025,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487022,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487024,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487036,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487040,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487034,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487039,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487051,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487054,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487055,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487058,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487052,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66487066,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487070,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487067,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66487072,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487081,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487082,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487084,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487090,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487092,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66487093,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66487099,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487098,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487104,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487103,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487954,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487963,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66487984,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488004,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488038,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488029,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488051,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488062,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488072,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488075,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488097,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488108,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488119,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488122,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66488132,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488154,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488178,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488189,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488211,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488234,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488238,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488257,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488267,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488283,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488306,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488334,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488377,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488393,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488412,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66488465,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491545,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491546,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491547,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491551,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491550,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491552,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491555,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491560,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491562,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491559,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491564,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491568,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491588,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66491579,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491586,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491590,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66491603,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491593,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491595,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491601,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491606,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491619,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491615,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491622,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491629,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491631,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491645,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491649,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491658,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491662,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491661,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491671,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491679,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491677,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491691,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491699,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491707,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491709,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491710,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491711,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491713,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491722,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491725,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491732,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491723,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491754,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491755,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491762,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491784,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491791,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491816,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491815,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66491825,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491836,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491859,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491860,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491861,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491897,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491889,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491942,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491920,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491944,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491928,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491971,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491975,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491948,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491946,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66491958,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491978,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492015,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492014,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66491998,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492009,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492003,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492023,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492022,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492016,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492039,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492021,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492032,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492040,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492061,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492045,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492055,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492062,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492088,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492067,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492087,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492065,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492064,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492083,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492097,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492114,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492113,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492093,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492122,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492120,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492140,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492143,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492182,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492185,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492187,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492188,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492204,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492208,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492207,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492209,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492238,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492231,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492241,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492237,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492240,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492254,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492257,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492258,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492262,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492279,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492284,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492282,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492304,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492298,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492303,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492299,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492312,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492319,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492311,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492318,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492322,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492332,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492335,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492331,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492333,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492342,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492358,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492361,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492354,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492360,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492365,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492368,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492376,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492375,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492384,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492401,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492398,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492397,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492400,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492421,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492412,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492420,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492432,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492443,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492440,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492446,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492460,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492465,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492470,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492484,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492476,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492496,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492502,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492505,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492509,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492514,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492522,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492540,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492545,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492556,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492558,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492560,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492557,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492569,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492575,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492577,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492582,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492592,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492584,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492594,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492591,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492603,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492600,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492625,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492622,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492639,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492633,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492641,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492638,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492653,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492660,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492657,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492678,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492680,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492692,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492697,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492689,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492699,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492713,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492728,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492720,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492736,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492740,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492733,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492747,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492745,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492777,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492782,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66492788,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492796,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66492803,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493700,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493702,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493754,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493739,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493761,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493794,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493887,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493909,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493931,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66493921,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493952,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493963,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66493957,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66493982,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66494001,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66494023,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66494017,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66494036,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66494076,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66494091,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66494107,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66494124,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66494191,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66494216,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66494223,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66494234,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496881,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502036,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496885,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496882,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502039,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502040,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502041,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496889,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502042,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496887,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502043,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66502044,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496894,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502046,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496896,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496902,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496900,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496906,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496909,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496905,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496908,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496904,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496907,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496913,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496916,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496912,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496918,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66496917,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496929,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496925,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496928,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496927,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496934,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496936,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496933,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496931,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496937,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496944,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496945,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496940,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496950,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496966,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496962,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496976,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496968,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502047,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502048,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502049,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496979,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502052,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502053,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66496988,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502055,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497005,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502060,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502061,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497043,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497033,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497056,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497055,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502063,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502064,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502065,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497069,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497079,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497074,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502066,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502068,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502069,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66502070,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502072,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502073,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497107,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66502074,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502077,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497124,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497130,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497129,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497126,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497141,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497140,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497148,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497143,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497161,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497171,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497165,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497185,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497194,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497214,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497232,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497216,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497217,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497254,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497246,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497248,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497296,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497289,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497295,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497288,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497274,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497304,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497302,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497323,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497310,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497322,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497330,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497324,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497331,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497344,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497354,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502078,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66502079,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502080,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502081,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497368,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497384,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497370,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497375,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502083,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497365,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497372,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497383,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502084,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502085,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497394,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497393,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497388,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497390,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502087,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497414,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497416,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497434,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497413,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497424,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497425,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497433,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497415,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497435,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502090,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497417,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497441,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497443,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497439,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497449,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497450,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497455,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497466,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497465,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497473,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497472,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497477,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502092,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497487,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497482,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497486,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497480,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497492,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497494,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66502094,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497523,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502096,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497511,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497516,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497517,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497522,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502097,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502099,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497533,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497532,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497546,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497526,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497534,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497540,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497545,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497537,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497556,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497551,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497555,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497569,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497568,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497579,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497574,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497572,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497580,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497585,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497584,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497599,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497610,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497600,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497606,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497609,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497621,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497615,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497626,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497639,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497638,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497640,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497645,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497658,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497661,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497663,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497666,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497683,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497679,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497680,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497690,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497688,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497693,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497700,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497698,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497708,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497711,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502101,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502102,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502103,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497729,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497722,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502105,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497724,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502106,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502107,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66502109,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False -66502110,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66502111,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502112,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497750,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497730,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497738,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502113,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497746,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497745,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497749,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502114,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502115,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502117,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497751,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497770,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502118,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497757,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497760,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497764,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497763,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502119,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502120,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502121,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497780,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497781,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497778,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497785,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497784,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502124,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502125,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502126,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497797,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497806,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502127,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502129,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497817,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497826,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497818,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502130,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497815,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497814,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497813,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502131,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502132,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502133,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497844,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497835,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497836,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497842,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497845,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497829,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497832,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502135,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502137,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497852,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497860,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502138,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497853,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497858,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497850,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502139,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502140,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502141,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497869,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497873,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497876,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497865,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497866,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497863,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502145,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497884,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497885,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502146,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497881,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497892,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497879,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497880,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502147,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502148,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502149,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497901,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66502150,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497907,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497909,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502151,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497902,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502153,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497920,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497928,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502154,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497922,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497925,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497927,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497915,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497914,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502155,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66502156,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502157,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497937,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497941,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497942,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502159,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497951,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497954,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497945,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497961,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497963,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497968,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497971,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497973,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497974,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497965,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497978,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497981,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497976,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497987,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497990,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66497991,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497984,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497998,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66497999,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66498003,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66498009,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66498013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66574424,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574425,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574426,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574427,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574428,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574429,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574430,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574431,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574432,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574433,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574434,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574435,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574436,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574437,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574438,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574461,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66498945,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66574462,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574463,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574464,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66498977,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66498998,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66574465,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66499004,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66499015,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66574466,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574467,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574468,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66499044,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66574469,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574470,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66499058,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66499064,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66499078,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66499108,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66499158,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66499199,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66499215,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66499278,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66499351,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66499367,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66574471,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574472,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66499380,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66574473,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66499395,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66574474,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66499409,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66574475,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574554,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574555,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574556,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574557,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574558,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574559,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574560,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574561,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574562,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574563,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574564,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574565,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574566,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574567,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574568,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574569,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574570,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574571,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574572,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574573,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574574,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574575,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574576,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574577,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574578,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574579,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574580,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574581,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574582,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574583,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574584,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574585,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574586,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574587,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574588,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574589,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574590,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574591,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574592,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574593,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574594,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574595,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574596,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574597,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574598,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574599,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574600,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574601,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574602,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574603,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574604,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574605,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574606,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574607,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574608,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66574609,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66502916,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502917,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502918,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502926,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502937,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502936,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502929,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502943,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502949,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502963,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502975,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502982,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502993,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66502987,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503001,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503009,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503010,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503011,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66503005,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503027,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503033,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503046,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503045,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503054,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503062,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66503065,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503064,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66503078,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66503086,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66503096,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503106,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66503109,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66503102,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503127,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503126,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503154,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503151,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False -66503152,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503153,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503169,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503170,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503171,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503189,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503194,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503206,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503195,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503222,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503225,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503224,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66503238,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503239,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503227,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503254,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503255,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503256,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503271,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503273,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503259,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503294,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503291,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503293,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503278,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503325,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503324,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503343,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503328,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503360,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503361,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503362,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503375,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503393,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503414,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66503405,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505446,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505454,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505462,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505468,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505479,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505482,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505494,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505489,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505504,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505503,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505513,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505525,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505528,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505540,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505545,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505541,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505554,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66505560,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505561,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505582,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66505593,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66505617,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505642,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505661,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505660,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505672,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505698,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505697,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505705,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505752,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505753,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66505779,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505767,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505799,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505816,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505817,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505828,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505829,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505832,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505837,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505864,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505870,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505885,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505897,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505902,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505903,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505911,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505920,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505924,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505933,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505941,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66505946,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505948,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505957,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505955,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505971,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505968,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505981,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505985,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66505989,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66505991,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506005,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506011,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506006,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506023,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506037,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506031,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506032,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506038,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506051,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506048,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506055,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506058,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506053,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506057,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506059,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506070,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506073,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506062,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506080,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506090,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506102,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506083,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506101,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506081,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506113,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506117,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506119,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506120,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506118,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506104,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506136,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506141,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506151,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506150,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506155,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506158,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506191,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506171,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506176,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506190,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506174,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506184,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506195,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506231,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506212,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506216,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506230,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506219,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506238,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506273,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506259,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506258,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506295,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506280,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506287,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506316,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506298,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506305,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506302,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506303,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506339,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506319,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506338,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506322,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506323,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506358,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506341,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506357,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506361,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506367,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506402,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388661,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388662,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207213,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388663,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388664,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388665,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206432,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388666,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207662,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388667,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207621,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207491,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205360,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207556,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205664,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205213,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205590,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205774,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205476,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207394,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207446,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206546,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208732,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -604289,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -604288,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -604287,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214223,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213533,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207058,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388668,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213584,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214263,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388669,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388670,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388671,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388672,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388673,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214123,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388674,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388675,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213734,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213748,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212246,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213707,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213629,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212261,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214155,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213997,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212402,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388676,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213881,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213971,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213762,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212424,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211986,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214177,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214401,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212046,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214201,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206659,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214300,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212173,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207279,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212384,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207225,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213483,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388780,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207136,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209443,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388677,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388781,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207214,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206433,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207663,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209596,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208660,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389101,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211414,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389102,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389103,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389104,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389276,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205988,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207629,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208567,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207499,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206093,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209958,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205368,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207564,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206179,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209867,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208479,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205672,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205221,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209944,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207402,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205782,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213370,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389278,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205598,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206221,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208258,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205484,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389270,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213272,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207453,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208205,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213023,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206314,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206554,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213097,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207908,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207710,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208740,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212843,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207806,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214231,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389281,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206342,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212931,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209451,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207066,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207965,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213541,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212648,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208068,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214271,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209742,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214131,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209807,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212736,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213756,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208351,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212253,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213715,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213742,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213637,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212269,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213175,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208398,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214163,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208058,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214005,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206980,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389286,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208766,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208147,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213770,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213979,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209959,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212432,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213889,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209868,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214185,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211994,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214409,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389287,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209945,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212054,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214209,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214308,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206664,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208853,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205903,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208647,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212181,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207287,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206881,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207233,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207909,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207711,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205964,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207144,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213491,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213430,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207807,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207221,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208152,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206441,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88207671,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207966,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205989,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207630,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207500,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208568,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209743,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209808,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206094,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205369,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207565,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206180,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205673,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208480,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208929,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205222,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207403,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213371,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205783,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208259,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205599,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206222,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205485,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213273,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208963,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209869,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207454,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208206,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213024,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206315,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206555,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213098,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208741,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389105,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389106,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389107,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389108,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212844,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389109,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214232,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206343,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389291,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212932,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209452,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207067,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213542,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212649,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208069,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214272,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389110,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389111,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207910,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389112,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207712,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389292,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389113,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389114,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209144,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214132,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207808,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212737,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -694171,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213716,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208352,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212254,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209240,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207967,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213638,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213176,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212270,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208399,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214164,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208059,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214006,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209242,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206981,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209809,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208767,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213771,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213980,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212433,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213890,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211995,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214186,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214410,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209269,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214210,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212055,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -695371,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214309,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206665,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88208854,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205904,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208648,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209870,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212182,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207288,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -695372,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209575,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206882,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207234,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389116,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389298,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207145,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205965,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213492,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213431,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212459,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208153,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206442,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207672,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389117,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389118,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389119,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -695212,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389120,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205990,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389121,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389122,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207631,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389123,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207911,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207713,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207501,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208569,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206095,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207809,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205370,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207566,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206181,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207968,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208930,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205674,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208481,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205223,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -696010,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207404,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209810,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213372,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205784,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208260,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206223,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205600,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205486,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213274,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208964,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207455,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208207,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213025,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206316,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389300,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213099,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206556,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208742,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212845,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209059,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214233,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389124,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209871,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206344,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212933,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209453,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209576,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207068,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213543,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212650,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208070,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214273,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209145,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214133,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209961,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212738,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209992,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210104,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209241,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210524,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213717,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208353,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212255,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209994,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389125,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389126,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213639,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389127,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210441,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389128,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389129,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389305,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212271,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213177,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210588,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214165,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208400,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207912,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207714,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208060,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210641,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209243,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214007,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210316,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212407,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207810,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213772,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213981,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208768,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210408,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389307,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389130,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389131,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210204,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212434,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389132,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213891,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389133,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207969,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389134,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389135,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210242,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214187,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211996,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389136,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214411,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209270,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214211,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389137,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212056,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389309,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209811,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214310,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208855,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206666,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205905,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208649,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207289,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212183,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206883,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389311,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207235,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207146,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205966,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213493,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213432,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209872,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212460,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389313,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208154,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206443,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209577,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207673,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205991,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207632,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207502,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208570,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206096,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205371,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207567,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206182,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208931,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205675,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208482,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389317,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205224,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210657,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207913,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207715,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207405,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213373,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207811,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208261,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205785,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206224,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205601,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205487,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213275,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208965,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207970,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208208,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207456,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213026,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206317,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213100,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206557,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209812,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -715781,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208743,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389322,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212846,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214234,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209060,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206345,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212934,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214414,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209273,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211560,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214214,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212059,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214313,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206669,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208858,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209877,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205908,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208652,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212186,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207292,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209582,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211238,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206885,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207238,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389146,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389147,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211349,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205969,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207149,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389148,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211395,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213496,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213435,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212463,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208157,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211468,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206446,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212626,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207918,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207720,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205994,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211139,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212596,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207816,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211625,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211677,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207505,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208573,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206099,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207975,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211792,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205374,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211839,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207570,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205678,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206185,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208934,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209747,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210743,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208485,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210660,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389149,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209817,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389150,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389151,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389152,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389153,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207408,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213376,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389154,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389155,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206227,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208264,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205788,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210784,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205604,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213278,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205490,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208968,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207459,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208211,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211239,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213029,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206320,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211350,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213103,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,True,True,False,False,False -88206560,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -762271,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208746,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211396,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209878,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212849,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214237,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -762267,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209063,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211469,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206348,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209583,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213588,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212937,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207072,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211140,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212654,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213547,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208074,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214277,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214137,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209149,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -757932,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213721,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210528,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206769,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208357,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209998,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213643,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207919,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88210445,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207721,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214169,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210592,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212275,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213181,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208404,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207817,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210645,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214011,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209247,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210320,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212411,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207976,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213776,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213985,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208772,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210412,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212438,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210208,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211240,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209748,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214191,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210246,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213895,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212000,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214415,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209818,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211351,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209274,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211561,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212060,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214215,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211397,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214314,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206670,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208859,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205909,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211470,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208653,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207293,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212187,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211141,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389448,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207300,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211487,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212194,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389549,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212394,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211025,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207246,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88211156,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389550,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207157,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205977,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88207932,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207734,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210874,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207830,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212471,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208165,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213504,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213443,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389551,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206454,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88207681,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88210955,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207989,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206002,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209760,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212604,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211633,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211685,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207513,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208581,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206107,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211732,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205382,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209831,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211800,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211847,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205686,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207578,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208942,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210749,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205234,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206193,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208493,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210699,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210668,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211258,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213384,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207416,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208272,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211369,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389555,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206235,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211446,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210792,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211415,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205796,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389556,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213286,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389654,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205612,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211488,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208219,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208976,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389656,False,False,False,False,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207467,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389658,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205498,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209892,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389557,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206328,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213037,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211157,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213111,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88206568,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208754,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389664,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389665,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214245,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389666,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212857,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209071,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389668,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209597,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389670,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209458,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389672,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206356,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389674,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212945,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389675,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389676,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207080,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389678,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212662,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214285,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208082,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213555,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214145,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207933,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389449,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389450,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209157,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207735,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389451,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212749,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207831,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210536,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206777,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208365,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210006,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213651,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210453,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389682,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389452,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207990,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389454,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88211259,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88213189,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389455,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88209761,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210600,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212283,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208412,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389683,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214019,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389685,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210653,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211370,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209255,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389563,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389686,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389687,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210328,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211447,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212419,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213783,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389688,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211416,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389692,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209832,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208780,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210420,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389564,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211489,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389696,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210216,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212446,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212008,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214423,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210254,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211158,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389565,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209282,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210996,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213903,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212068,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214322,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389566,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206678,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208867,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205917,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389701,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208661,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212195,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207301,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209893,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389568,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389703,False,False,False,False,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389705,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212395,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207247,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211026,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207158,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88205978,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210875,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389711,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False -88209598,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389712,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False -88212472,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213505,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208166,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213444,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206455,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210956,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212628,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211260,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389570,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206003,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389456,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212605,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211371,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389718,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211634,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211448,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207934,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211686,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211417,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207514,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207736,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208582,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205383,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206108,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88211733,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211490,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207832,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211801,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389457,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389458,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389459,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389460,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205687,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389461,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389725,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211848,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389727,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207579,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205235,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389732,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389733,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206194,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208943,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210750,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389462,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208494,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207991,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210700,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211159,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210669,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209762,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213385,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206236,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207417,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208273,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209833,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210793,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389574,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205797,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213287,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205613,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208220,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208977,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207468,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205499,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213038,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206329,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88213112,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88206569,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208755,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214246,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212858,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209072,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389576,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209459,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389463,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389464,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389465,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389466,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206357,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209894,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389467,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389468,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211261,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88212946,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389736,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207081,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211372,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212663,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214286,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211449,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208083,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211418,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213556,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214146,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209158,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211491,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212750,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209599,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210111,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389577,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210537,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206778,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210007,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213652,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210454,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211160,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210601,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213190,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212284,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208413,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214020,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207935,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389739,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False -88210654,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209256,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207737,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389741,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False -88210329,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206982,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213784,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389742,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389743,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208781,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88210421,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389744,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False -88207833,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389746,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212447,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210217,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389749,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389469,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212009,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214424,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207992,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389751,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210255,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209763,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210997,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389754,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209283,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213904,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212069,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214323,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389757,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209834,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206679,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208868,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205918,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208662,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211262,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389578,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207302,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212196,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211373,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211450,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211027,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212396,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207248,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211419,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211492,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207159,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205979,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389764,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210876,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212473,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209895,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211161,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208167,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213445,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213506,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389581,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206456,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210957,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212629,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389470,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389471,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389472,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206004,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389473,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389474,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389582,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212606,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389476,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211635,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211687,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207515,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208583,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205384,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206109,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211734,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209600,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211802,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -929705,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205688,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211849,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205236,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207580,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208944,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -929703,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206195,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210751,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208495,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210701,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210670,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207936,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -929702,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389477,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207738,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389478,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213386,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207418,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208274,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -929688,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206237,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210794,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207834,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205798,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211263,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88213288,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205614,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208221,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208978,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -929685,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207469,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207993,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211374,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209764,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211451,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205500,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206330,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88213039,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211420,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211493,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206570,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213113,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -929704,True,False,False,False,False,True,True,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208756,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209835,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214247,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212859,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209073,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209460,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211162,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206358,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212947,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207082,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212664,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214287,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208084,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214147,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213557,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209159,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212751,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210112,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210538,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213653,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206779,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208366,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209896,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210008,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210455,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210602,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213191,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389584,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212285,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208414,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214021,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210655,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209257,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213785,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210330,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208782,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210422,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209601,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211264,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212448,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210218,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211375,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211452,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212010,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214425,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210256,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211421,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211494,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210998,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213905,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209284,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207937,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212070,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214324,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207739,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206680,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207835,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208869,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205919,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -931673,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208663,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211163,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389589,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207303,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212197,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -931676,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207994,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209765,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -931679,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207249,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212397,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -931681,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211028,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -931683,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209836,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207160,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205980,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -931684,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210877,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -931686,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -931687,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212474,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208168,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -931689,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213446,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206457,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213507,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -931690,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212630,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206005,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212607,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211636,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211688,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207516,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208584,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205385,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211735,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206110,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211265,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211803,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209897,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205689,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211376,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211453,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211850,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205237,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207581,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208945,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210752,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206196,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208496,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211422,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -1141202,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88210702,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210671,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211495,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389596,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209606,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212754,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210115,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66389643,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213656,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210541,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206782,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208369,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210011,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211271,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210458,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213194,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207744,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207942,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210605,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212288,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208417,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211382,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211459,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214024,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207840,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209260,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210333,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211428,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213788,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211501,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210425,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208785,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209770,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207999,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212451,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210221,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214428,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211170,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212013,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210259,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209841,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211001,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209287,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214327,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212073,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213908,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206683,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208872,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205922,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208666,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207306,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212200,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206889,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211031,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207252,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207163,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209902,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210880,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212477,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208171,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211272,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False -66389648,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207684,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210960,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213449,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213510,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211460,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211383,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206008,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207637,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211429,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211639,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211502,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211691,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205388,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207519,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208587,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206113,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209607,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211738,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211806,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205692,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211853,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205240,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211171,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206199,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207584,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208948,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88210755,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208499,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207943,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210705,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207745,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210674,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207841,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207422,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206241,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208278,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66389652,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209771,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210798,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208000,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213292,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205802,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207473,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208225,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205618,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213043,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206334,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88205504,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209842,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213117,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206574,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210838,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208760,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214251,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212863,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209077,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209464,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211273,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206362,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211461,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212951,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211384,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207086,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212668,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214291,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211430,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208088,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211503,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209492,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209163,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213561,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209903,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212755,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210116,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213657,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206783,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208370,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210542,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211172,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210012,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210459,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210606,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213195,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212289,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208418,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214025,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209261,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210334,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213789,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209264,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210340,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210432,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208793,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209855,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212452,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210228,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214436,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212021,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210267,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209295,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211009,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214335,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211568,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212081,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206691,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208880,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213916,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208674,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205930,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212208,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207314,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214494,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211291,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207260,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211039,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211521,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207171,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210888,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212485,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208179,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206465,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207692,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211190,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207644,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210967,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213518,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211647,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206016,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209621,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213457,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207957,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211699,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207527,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208595,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211746,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207759,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205396,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211814,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206121,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207855,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211859,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205700,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207592,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205248,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208956,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208507,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210763,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210713,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210682,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208014,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206207,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207430,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208286,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210806,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209856,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206249,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213300,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208989,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207481,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208233,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211292,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213051,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205810,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205626,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206582,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213125,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210846,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211522,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209472,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212871,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205512,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209085,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206370,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212959,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211104,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211191,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214495,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207094,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212676,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208096,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209171,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209971,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212762,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213569,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213665,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210124,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206791,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210545,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210020,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208378,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210467,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213203,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208426,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210614,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212297,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214033,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213797,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209622,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209265,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210341,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207760,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208794,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210433,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210229,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212453,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -1046095,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207856,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214437,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -1046096,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211293,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210268,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212022,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208015,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209296,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211010,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211523,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214336,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211569,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212082,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206692,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208881,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209857,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213917,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208675,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205931,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211192,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212209,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207315,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207261,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211040,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207172,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210889,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -1050654,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212486,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208180,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209913,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207693,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207645,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210968,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213519,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211648,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206017,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211700,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213458,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207528,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208596,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206122,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211747,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205397,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205701,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211815,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205249,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211860,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211294,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207593,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208957,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206208,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208508,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210764,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210714,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210683,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211524,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209623,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207431,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208287,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206250,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210807,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213301,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207857,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211193,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208990,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207482,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208234,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205811,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213052,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208016,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205627,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213126,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206583,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210847,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205513,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213593,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209858,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212872,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209086,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206371,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211105,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212960,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207095,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212677,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208097,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209499,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209172,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209972,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212763,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213570,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213666,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210125,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211295,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206792,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210546,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210021,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209914,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210468,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211525,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213204,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210615,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208427,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214034,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212298,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213798,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209266,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210342,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210434,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208795,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211194,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212454,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210230,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214438,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210269,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212023,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214337,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209297,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211011,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211570,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209624,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212083,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206693,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208882,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205932,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213918,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208676,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207858,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207316,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212210,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208017,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207262,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211041,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207173,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209859,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210890,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211296,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212487,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208181,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207694,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211526,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206018,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207646,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210969,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205398,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211649,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213520,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211701,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213459,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207529,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208597,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211748,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206123,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211195,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88205702,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211816,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205250,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211861,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209915,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207594,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208958,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206209,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210765,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208509,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210715,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210684,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207432,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208288,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206251,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210808,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213302,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208235,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208991,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207483,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213053,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205812,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205628,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213127,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206584,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209625,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210848,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205514,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211297,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213594,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212873,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207859,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209087,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211527,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206372,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211106,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212961,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208018,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207096,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212678,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208098,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209860,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211196,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209173,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209973,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212764,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213667,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213571,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210126,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210547,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206793,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210022,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210469,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210616,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213205,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208428,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214035,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212299,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213799,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209267,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210343,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208796,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210435,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210231,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212455,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214496,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214439,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210270,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212024,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214338,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209298,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211012,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211571,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212084,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211298,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206694,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208883,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205933,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208677,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211528,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213919,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207317,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212211,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207263,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211042,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209626,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211197,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210891,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207860,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212488,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207695,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88208182,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206466,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208019,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213130,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88206587,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210851,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213597,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205517,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212876,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209090,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211203,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206375,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212964,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207099,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88212681,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208101,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209176,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213670,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209976,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212767,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214499,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210129,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213574,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206796,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210550,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210025,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210472,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210619,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213208,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214038,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208431,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212302,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213802,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210346,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208799,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210438,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -1066723,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206992,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211305,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214442,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210234,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210273,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211535,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212027,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207763,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214341,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211015,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209301,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209631,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211574,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212087,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207865,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206697,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208886,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205936,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208680,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211204,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208024,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213922,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207320,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212214,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207266,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,True,False -88211045,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206897,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207176,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88210894,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212491,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208185,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207697,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,True,False -88206469,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88206022,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207650,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210973,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205402,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211653,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211705,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213524,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206127,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207533,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208601,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213463,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211752,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205706,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214500,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205254,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211306,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211820,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211865,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211536,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207598,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208962,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206213,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208513,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210769,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210719,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210688,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207436,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208292,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206255,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210812,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211205,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213306,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208995,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207487,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208239,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213057,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205816,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207764,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88205632,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209632,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213131,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206588,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210852,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207866,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213598,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205518,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212877,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209091,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208025,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206376,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212965,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207100,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206383,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211107,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207107,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212972,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214513,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209507,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208109,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212689,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213678,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209184,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209984,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212775,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210137,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206804,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210033,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210558,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208384,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210480,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211324,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211554,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214046,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210627,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213216,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208439,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213810,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212310,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210354,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214638,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207777,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208807,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214450,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207000,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214553,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211214,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207879,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212035,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210281,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209645,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214349,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208038,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211582,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212095,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211615,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205944,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208894,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208688,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207328,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212222,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213930,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206905,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211053,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207271,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88207184,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210902,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212499,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211325,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208193,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212638,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211555,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206477,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214514,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206030,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205410,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210981,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212609,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211661,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211713,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205714,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207541,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211760,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205262,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206135,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208609,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213471,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211828,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211215,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211873,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207605,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208521,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210777,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210727,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214687,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208300,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206263,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210820,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207778,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213314,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208247,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209003,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207880,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213065,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209646,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208039,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205824,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206596,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213139,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,True,True,False,False,False -88213606,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205640,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210860,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212885,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209099,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205526,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88211326,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214948,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206384,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211108,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212973,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207108,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209508,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208110,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212690,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213679,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209185,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209985,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212776,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210138,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211216,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206805,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210034,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210559,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208385,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210481,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214515,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214047,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210628,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213217,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213811,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208440,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212311,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210355,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208808,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214639,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207001,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214451,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214554,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210282,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212036,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214350,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211583,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212096,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211616,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208895,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205945,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207779,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208689,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211327,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211556,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211392,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207329,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212223,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207881,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209647,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213931,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206906,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208040,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211054,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207272,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207185,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210903,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211217,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212500,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208194,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212639,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206478,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205411,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206031,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210982,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212610,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88211662,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205715,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211714,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207542,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205263,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206136,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208610,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211761,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213472,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211829,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211874,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207606,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214516,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208522,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210778,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210728,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214688,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206264,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208301,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210821,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211328,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211557,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213315,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211393,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208248,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209004,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213066,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205825,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213140,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206597,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213607,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205641,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210861,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207780,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211218,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212886,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209100,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205527,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207882,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206385,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211109,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207109,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212974,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208041,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209648,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209509,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208111,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212691,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213680,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209186,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209986,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212777,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210139,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206806,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210035,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210560,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208386,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210482,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214048,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210629,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213218,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213812,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208441,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212312,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210356,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211329,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211558,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214640,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214891,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208809,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207002,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214452,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214555,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214517,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212037,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210283,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214351,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211584,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212097,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88211219,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211617,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208896,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205946,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208690,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207330,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212224,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206907,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213932,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211055,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207273,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88207186,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88207781,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210904,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207883,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212501,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208195,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212640,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206479,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208042,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209649,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205412,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206032,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210983,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207657,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88211663,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205716,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211330,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211715,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207543,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211559,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211762,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214892,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205264,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88206137,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208611,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211830,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213473,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211875,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207607,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208523,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210779,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210729,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214689,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211220,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208302,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206265,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210822,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213316,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208249,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214518,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209005,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213067,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213141,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False -88205826,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206598,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210862,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213608,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205642,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212887,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209101,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205528,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206386,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211110,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207110,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212975,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209510,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208112,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212692,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211331,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214893,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207782,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213681,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209187,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209987,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212778,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210140,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207884,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206807,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210036,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210561,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208387,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208043,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210483,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209650,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213219,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214049,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210630,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213813,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208442,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212313,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211221,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210357,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214641,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208810,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214453,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207003,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214556,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210284,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212038,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214352,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211585,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212098,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88211618,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208897,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205947,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213476,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211878,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207610,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208526,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214742,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214692,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210732,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206268,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208305,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210825,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213319,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208252,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209008,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213070,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207787,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206601,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213144,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213611,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205829,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210865,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205645,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207889,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212890,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209104,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211338,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214900,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208048,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205531,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206389,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209655,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211113,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212978,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207113,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209513,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208115,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212695,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213684,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209190,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211228,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209990,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212781,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210143,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206810,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210039,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210564,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208390,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210486,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213816,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214052,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210633,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213222,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208445,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88212316,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210360,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208813,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214644,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214524,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214456,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207006,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214559,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210287,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212041,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214355,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209303,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211588,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212101,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211621,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208900,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205950,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211339,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214901,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208694,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212228,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207334,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206911,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211059,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212550,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88207788,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213936,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207190,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211229,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207890,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210908,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88208049,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212505,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208199,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207702,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88209656,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206483,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205416,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206036,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210987,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212614,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205720,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211667,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207547,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211719,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205268,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206141,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211766,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208615,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211834,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213477,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211879,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207611,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208527,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214743,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210733,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214693,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206269,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208306,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211340,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210826,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214902,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214525,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208313,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206276,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210833,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213327,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209016,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214919,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88213078,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213619,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206609,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213152,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214787,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205837,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212898,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205653,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209112,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209669,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206397,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211121,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207120,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88212986,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209521,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205539,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208123,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212703,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213692,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209198,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214533,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212789,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210151,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206818,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210047,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210572,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210494,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213824,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209929,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213230,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208453,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212324,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210368,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208821,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214652,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214461,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207014,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214920,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88214567,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210295,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214363,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209311,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211596,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212109,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213392,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208702,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207342,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212236,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212558,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88206919,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211067,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207198,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213944,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210916,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209670,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212513,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205424,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206491,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88206044,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212620,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214809,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205728,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205276,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211675,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215000,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206149,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88211774,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208623,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88215056,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214921,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88211886,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208535,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209930,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214751,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210741,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214701,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208314,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206277,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210834,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213328,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209017,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213079,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213620,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206610,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213153,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214788,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205838,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212899,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205654,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209113,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211122,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206398,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207121,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209522,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212987,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205540,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208124,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212704,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213693,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209199,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212790,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214534,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214922,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88210152,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209671,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206819,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210048,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210573,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213825,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210495,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208454,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213231,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212325,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210369,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208822,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214653,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207015,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214568,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209931,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210296,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214364,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209312,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88211597,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212110,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213393,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208703,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207343,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212237,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212559,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206920,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211068,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207199,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213945,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210917,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214923,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88212514,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205425,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206492,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88206045,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212621,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205729,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214810,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205277,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211676,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215001,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206150,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211775,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208624,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209672,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215057,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211887,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208536,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214752,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214702,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210742,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208315,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210835,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213329,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209018,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213621,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213154,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206611,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214789,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214924,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205839,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212900,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205655,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209114,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206399,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211123,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212988,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207122,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209523,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205541,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208125,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212705,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213694,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209200,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214535,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212791,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210153,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206820,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210049,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210574,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210496,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213826,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213232,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208455,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88212326,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210370,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208823,True,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214654,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214462,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209673,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207016,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214569,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209547,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210297,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209313,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211598,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214925,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88212111,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213394,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208704,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207344,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212238,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206921,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212560,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88211069,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207200,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213946,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210918,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212515,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205426,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206493,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206046,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212622,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88214811,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205730,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205278,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214965,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215002,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206151,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211776,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208625,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88215058,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211888,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208537,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214753,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214703,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214926,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88208316,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210836,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213330,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209674,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213080,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209019,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213622,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213155,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206612,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214790,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205840,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212901,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209115,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206400,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211124,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207123,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212989,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209524,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208126,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212706,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205542,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213695,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209201,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212792,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214536,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210154,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206821,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210050,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210575,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213827,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210497,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213233,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208456,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88214927,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88212327,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210921,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213949,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212518,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205429,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206496,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206049,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205733,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214814,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205281,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214968,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215005,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206154,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88211779,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208628,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214933,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209679,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215061,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211891,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208540,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214756,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214706,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208319,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214763,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213333,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213083,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209022,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209475,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213158,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206615,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214793,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212904,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205843,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209118,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206403,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211127,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207126,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88209527,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212992,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213698,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212709,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208129,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205545,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214934,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88209204,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212795,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214539,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210157,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206824,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210053,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210578,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213830,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210500,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213236,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208459,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212330,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210374,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208827,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214465,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214658,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209680,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207020,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214573,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209551,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210301,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209317,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211602,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213398,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208708,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206700,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207348,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206925,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211073,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212563,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214935,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -88207204,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88210922,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213950,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212519,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205430,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206497,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206050,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205734,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214815,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205282,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205741,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206057,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205289,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214822,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214976,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206162,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209693,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211787,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208636,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88215069,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208548,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214714,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206284,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208327,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214771,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213341,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213091,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209030,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209482,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206623,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213166,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214801,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212912,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209126,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205851,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209535,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211135,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206411,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213000,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208137,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212717,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209212,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212803,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214547,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205553,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210165,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206832,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213838,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210061,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210586,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210508,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213244,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208467,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212338,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210382,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209694,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214473,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214666,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208835,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207028,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209559,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214581,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210309,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209325,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212120,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214954,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213406,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208716,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206708,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207356,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206933,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211081,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212571,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210930,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205436,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212527,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213958,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206505,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205742,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205290,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206058,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214823,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214977,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206163,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208637,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211788,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215070,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208549,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214715,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206285,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208328,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209695,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214772,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213342,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213092,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209031,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209483,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206624,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213167,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,True,True,False,False,False -88214802,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212913,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209127,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205852,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209536,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211136,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206412,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213001,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208138,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212718,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209213,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212804,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214548,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205554,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210166,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206833,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210587,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213839,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210062,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210509,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213245,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208468,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88212339,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214474,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208836,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214667,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207029,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209560,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214582,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210310,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209326,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214955,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212121,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209696,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208906,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208717,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206709,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207357,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206934,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211082,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212572,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210931,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205437,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212528,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213959,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206506,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205743,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206059,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205291,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214824,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214978,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206164,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88211789,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208638,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215071,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208550,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214716,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208329,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206286,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214773,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213343,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213093,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209032,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209484,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206625,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213168,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209697,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214803,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209128,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212914,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205853,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209537,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206413,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214854,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213002,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208139,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212719,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209214,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214549,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205555,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212805,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210167,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206834,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210063,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210510,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213246,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208469,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88212340,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210383,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214475,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208837,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214668,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207030,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209561,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214583,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210311,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209327,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214956,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212122,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208907,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208718,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206710,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207358,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206935,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211083,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212573,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209698,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210932,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205438,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212529,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213960,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205744,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206507,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205292,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206060,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214825,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214979,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206165,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88211790,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208639,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215072,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208551,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214717,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208330,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206287,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214774,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213344,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213094,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209485,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209033,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213169,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88206626,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214804,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212915,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209129,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210314,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209330,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88209703,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214959,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212125,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208910,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208721,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206713,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207361,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206938,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211086,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212576,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210935,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212532,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205747,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213963,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206510,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205295,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206063,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88214828,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215012,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214982,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206168,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88215040,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208642,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88215075,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208554,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214720,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208333,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206290,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214777,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213347,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209488,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209036,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88206629,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213172,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209704,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214807,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212918,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209132,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209541,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205855,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214858,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206417,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213006,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212723,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209218,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88212809,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210171,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213843,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205559,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206838,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210067,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210514,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213250,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212344,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210387,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214479,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208841,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214672,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207034,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214366,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214587,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210315,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209331,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214960,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212126,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213407,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208722,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206714,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207362,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206721,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207369,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88206946,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211094,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212584,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210943,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205445,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212540,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205303,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206518,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206071,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88215020,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214990,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215048,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215083,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208562,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214728,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208341,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206298,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213355,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209044,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209718,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206637,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212926,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209140,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214866,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206425,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213014,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205859,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212731,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212817,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209226,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213851,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210179,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206846,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210075,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214064,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210522,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205567,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213258,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212352,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210395,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214487,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208849,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214680,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207042,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214374,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214595,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214609,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209339,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212134,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208917,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207370,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206722,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206947,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211095,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212585,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209719,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210944,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205446,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205754,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212541,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205304,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206519,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206072,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88215021,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214991,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88215049,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215084,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208563,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214729,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208342,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206299,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213356,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209045,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206638,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212927,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209141,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214867,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206426,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213015,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209720,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212732,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212818,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209227,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213852,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210180,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206847,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210076,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214065,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210523,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205568,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213259,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212353,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210396,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214488,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208850,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214681,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207043,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214375,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214596,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214610,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209340,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212135,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208918,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206723,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207371,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206948,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211096,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212586,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210945,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205447,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205755,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212542,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205305,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206520,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206073,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209721,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215022,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214992,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88215050,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215085,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214730,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208343,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206300,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213357,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209046,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206639,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212928,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209142,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214868,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206427,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213016,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205860,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212733,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212819,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209228,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213853,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210181,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206848,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210077,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214066,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205569,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209722,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213260,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212354,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214489,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210397,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214682,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208851,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207044,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214376,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214597,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214611,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209341,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213409,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206724,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207372,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206949,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211097,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212587,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -88210946,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205448,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205756,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212543,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205306,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206521,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206074,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88215023,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214993,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215051,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215086,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214731,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209723,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212822,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213856,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209231,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210184,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206851,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214069,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210080,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213263,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205572,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212357,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210400,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207047,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214379,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214600,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214614,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209344,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212138,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213412,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206727,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88207375,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206952,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88211100,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212590,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205309,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206524,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209728,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206077,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214996,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215089,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214734,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208347,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206303,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88213361,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209050,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206643,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214872,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205862,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213857,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209232,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212823,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210185,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206852,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88210081,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214070,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213264,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205573,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212358,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206853,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214387,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214622,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212146,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88208925,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206735,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207383,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206960,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214842,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205456,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205764,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205317,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206532,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206085,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206651,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214880,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213021,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205866,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213865,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212831,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210193,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214078,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210089,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212365,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214388,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214623,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208926,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206736,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207384,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206961,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214843,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212594,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205457,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205765,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205318,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206533,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206086,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206652,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214881,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205867,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213866,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212832,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210194,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214079,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210090,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88212366,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214389,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214624,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208927,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206737,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207385,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88206962,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214844,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205458,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205766,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205319,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206534,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206653,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214882,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205868,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213867,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212833,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210195,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214080,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210091,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212367,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205580,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214390,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214625,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88208928,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206738,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207386,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206963,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214845,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205459,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205767,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205320,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214885,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213870,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205871,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212836,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210198,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214083,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210094,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212370,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214393,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214628,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212148,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213416,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206741,True,True,True,False,False,False,False,False,False,False,False,False,True,True,True,False,False,True,False,True,True,True,False,False,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,False,False -88207389,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206966,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214848,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205461,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205770,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205323,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206538,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215033,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206654,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205879,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209239,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214091,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210102,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206857,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209569,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212156,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206749,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206974,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205331,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206087,True,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205880,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214092,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88210103,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206858,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209570,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212157,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206750,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206975,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205332,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205881,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214093,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206859,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209571,True,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212158,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206751,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205333,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214094,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205882,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -88206860,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212159,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214097,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205885,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206863,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212162,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206755,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205466,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205337,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88215036,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214105,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205893,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212380,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206762,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205345,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214106,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205894,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212381,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206763,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -88205346,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214107,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205895,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212382,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206764,True,True,True,False,False,False,False,False,False,True,False,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -88205347,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214108,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205896,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205350,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214111,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206868,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205351,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506389,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506384,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506385,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506386,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506424,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506405,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506419,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506406,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506433,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506427,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506453,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506456,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506489,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506472,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506507,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506502,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506492,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506491,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506526,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506513,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506524,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506512,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506535,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506530,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506543,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506551,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506555,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506550,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506570,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506576,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506580,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506590,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506608,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506625,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506610,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506623,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66506611,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506636,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66506627,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507408,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507421,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507428,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507424,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507443,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507457,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507464,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507474,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507479,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507481,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507493,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507504,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507509,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507515,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507517,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507518,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507529,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507530,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507532,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507547,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507557,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507579,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66507580,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507596,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507618,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507616,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507633,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507650,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507651,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507662,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507685,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507686,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507700,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507707,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507718,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507717,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507725,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507726,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507740,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507741,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507756,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507757,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507764,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507773,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507783,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507782,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507805,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507813,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507827,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507842,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507854,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507868,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507867,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507883,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507896,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66507895,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510104,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510105,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510111,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510113,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510109,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510112,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510118,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510117,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510123,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510119,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510124,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510125,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510128,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510130,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510133,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510134,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510145,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510139,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510146,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510144,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510143,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510154,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510148,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510151,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510161,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510155,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510159,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510162,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510169,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510175,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510173,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510176,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510171,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510174,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510183,False,False,False,False,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510182,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510178,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510191,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510186,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510192,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510187,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510195,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510230,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510255,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510260,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510304,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510294,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510319,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510387,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510356,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510394,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510424,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510470,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510468,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510497,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510507,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510511,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510555,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510572,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510558,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510573,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510570,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510589,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510601,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510603,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510605,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510628,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510622,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510623,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510627,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510621,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510614,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510617,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510637,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510634,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510644,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510630,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510656,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510646,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510662,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510672,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510663,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510667,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510682,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510685,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510703,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510705,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510700,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510725,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510719,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510730,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510727,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510729,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510721,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510748,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510749,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510745,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510772,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510764,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510787,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510782,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510792,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510789,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510784,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510793,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510807,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510803,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510821,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510839,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510844,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510842,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510857,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510854,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510858,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510872,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510886,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510884,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510904,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66510902,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510919,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510936,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510939,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510933,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510938,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510949,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510958,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510976,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510977,False,False,False,False,False,False,False,False,True,True,False,True,True,False,False,False,True,True,False,False,True,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,True,False,False -66510975,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510984,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510990,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510986,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511005,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66510999,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66511003,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511020,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511022,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511017,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511038,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511032,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511039,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511051,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511061,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511052,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511075,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511069,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511072,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511091,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511088,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511095,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511096,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511111,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511107,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511108,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511125,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511130,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511131,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511134,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511126,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511154,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511147,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511165,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66511173,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66511175,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511187,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511190,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511199,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511204,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66511203,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511213,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511218,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511226,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511227,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511235,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511237,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66511246,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512129,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512132,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66512152,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512159,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512184,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66512203,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512207,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66512236,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512225,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512255,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512240,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512241,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512244,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512278,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512260,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512264,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512293,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66512283,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512286,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512320,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512303,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512334,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512325,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512328,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512330,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66512343,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512349,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66512347,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66512362,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512364,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512366,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512367,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66512379,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512381,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66512395,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512400,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512420,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512422,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512424,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66512425,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512437,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512440,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512442,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512459,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512461,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512464,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512470,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512475,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512478,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512488,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512492,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512495,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512538,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512529,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512532,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512548,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512556,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512573,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512590,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512605,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512631,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512649,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512657,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66512660,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514660,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514658,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514683,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514684,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514691,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514702,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514700,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514706,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514712,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514720,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514718,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514726,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514725,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514753,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514752,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514751,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514764,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514780,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514803,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514825,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514850,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514849,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514871,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514870,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514896,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514927,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514926,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514925,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514920,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514950,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514973,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514974,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66514975,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515014,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66514996,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515020,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515024,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515033,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515067,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515068,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515093,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515113,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515116,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515114,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515125,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515135,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515137,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515136,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515157,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515172,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515181,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515186,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515189,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515201,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515204,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515209,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515215,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515218,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515229,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515228,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515230,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515242,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515265,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515273,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515261,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515263,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515282,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515285,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515279,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515294,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515303,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515311,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515306,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515316,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515327,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515326,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515331,False,False,False,False,False,False,False,False,True,True,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515340,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515342,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515338,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515362,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515359,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515355,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515357,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515380,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515374,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515385,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515389,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515410,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515409,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515426,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515424,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515431,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515428,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515441,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515451,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515465,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515469,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515483,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515481,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515487,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515496,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515497,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515494,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515505,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515510,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515514,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515512,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515518,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515525,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515523,True,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515526,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515538,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515544,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515552,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515555,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515553,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515573,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515575,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515588,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515591,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515599,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515601,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515602,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515616,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515614,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515615,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515617,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515631,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515627,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66515630,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515638,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515642,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515650,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515651,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515656,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515660,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515661,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515664,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66515670,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516457,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516456,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516464,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516453,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516484,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516477,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516486,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516509,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516502,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516507,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516514,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516515,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516510,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516521,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516527,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516535,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516536,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516559,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516578,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516577,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516571,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516587,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516590,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516595,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516602,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516622,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516637,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516642,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516651,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516656,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516660,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516669,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516664,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516665,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516680,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516688,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516684,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516686,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516699,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516706,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516707,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516712,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516704,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516722,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516720,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516728,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516732,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516737,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516754,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516753,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516771,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516766,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516779,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516784,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516782,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516796,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516792,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516801,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516806,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516811,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516821,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516829,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516835,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516842,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516849,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516841,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516859,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516876,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516891,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66516899,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516906,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516908,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516930,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516922,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516936,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516957,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516955,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66516950,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518758,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66575335,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66518763,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518762,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575336,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66575337,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518765,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518764,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575338,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575339,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66575340,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575341,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575342,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518770,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518769,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575343,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518771,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575344,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575345,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66518789,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518788,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518806,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518861,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575346,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518897,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575347,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66518937,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575348,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519016,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575349,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519076,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575350,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519102,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519127,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519145,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575351,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519148,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519176,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519178,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575352,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519180,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519195,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519192,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519194,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575353,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519212,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66519213,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575354,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519211,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575355,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575356,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519241,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66519239,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519256,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575357,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519285,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66575358,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519286,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519293,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519295,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519297,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519287,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519302,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519301,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519313,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519311,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66575359,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519321,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519328,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519330,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519346,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519359,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519361,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519363,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519377,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575360,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519379,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66519391,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519395,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519393,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519407,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66575361,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519409,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575362,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575363,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519455,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519457,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519468,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519483,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519487,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519500,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519536,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519537,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519579,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519610,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519625,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519626,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575364,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519639,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519640,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575365,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575366,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519652,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519653,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575367,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575368,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519677,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575369,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575370,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519691,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575371,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519705,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519704,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519717,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66519718,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575372,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519742,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575373,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575374,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66575375,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66575376,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575377,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519753,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519761,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66519769,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575378,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575379,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575380,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66575381,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575382,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520646,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520648,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520665,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520664,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520682,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520703,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520699,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520743,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520772,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520788,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520830,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520845,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520869,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520879,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520923,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520938,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520947,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520969,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520979,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66520975,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66521000,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66521011,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66521003,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66521018,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66521012,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66521050,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66521058,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66521051,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66521096,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66521099,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66521110,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576171,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576172,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576173,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576174,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576175,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523004,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576176,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523000,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576177,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576178,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576179,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576180,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576181,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576182,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523026,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523033,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523036,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523042,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523044,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523051,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523064,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523066,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523077,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523079,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523081,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523092,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523110,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523170,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523191,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523221,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523243,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523247,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523264,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523263,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523293,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523291,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523290,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523317,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523312,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523314,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523348,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523353,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523404,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523408,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523432,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523431,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523430,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523424,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523433,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523450,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523449,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523451,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523478,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523467,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523480,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523497,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523498,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523496,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523483,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523485,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523516,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523514,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523504,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523533,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523520,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523531,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523538,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523549,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523535,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523550,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523536,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523601,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523610,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523621,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523604,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523623,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523633,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523641,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523665,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523652,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523685,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523671,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523702,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523720,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523711,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523732,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523779,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523807,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523835,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523852,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523844,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66523853,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523870,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523885,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523886,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66523934,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524929,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66524930,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575825,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524953,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524946,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524947,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575826,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524969,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524961,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524962,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524963,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524978,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524979,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524994,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66524996,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575827,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525009,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66525018,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525027,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525037,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575828,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575829,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525052,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525053,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66525054,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575830,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525085,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525086,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66525105,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525107,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525125,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575831,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66525137,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66525141,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525152,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525157,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525165,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525166,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525169,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575832,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525182,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525183,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525191,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525192,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525197,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525198,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525209,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575833,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525222,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525229,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525234,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575834,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66525259,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525260,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525264,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525277,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66575835,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66525283,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525284,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525291,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66575836,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525298,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525299,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525314,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575837,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525331,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66525337,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525338,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66575838,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525344,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66525351,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66525357,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66525362,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527252,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527250,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527251,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576352,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576619,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527257,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527256,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66527254,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527255,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527261,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527259,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527264,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527265,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576620,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527266,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576621,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527272,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527269,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576622,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527277,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527274,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66527273,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576623,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527284,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527278,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576624,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527293,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66527288,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527301,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527302,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527308,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527309,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527318,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527319,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576625,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527346,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576626,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527368,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576353,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527398,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576354,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576627,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576628,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527439,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576355,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576629,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527464,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576630,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527496,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576356,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576631,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527517,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576357,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527532,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576632,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527550,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527551,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576633,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527577,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66527575,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576358,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576634,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576635,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576359,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576636,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527643,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576637,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527666,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527661,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527664,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576360,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527686,True,False,False,False,False,False,False,False,True,True,False,True,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66527685,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527683,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576638,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527707,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527703,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527705,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576361,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527724,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527748,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66527747,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527743,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527771,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66527770,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527766,False,False,False,False,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527768,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576362,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527791,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66527788,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576639,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527807,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527809,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576363,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527826,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527831,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576640,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527852,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576641,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527846,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527851,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576642,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527848,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576643,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576644,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527871,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576645,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527865,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527867,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576646,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576647,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527894,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576364,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527913,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527917,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66527915,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576648,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527935,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576365,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576649,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527961,False,False,False,False,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527958,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66527981,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576366,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528002,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528019,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528020,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576367,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528041,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576368,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528064,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528063,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528058,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528060,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528085,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66528084,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576369,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528102,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528106,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528104,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576370,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528122,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528126,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528142,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576371,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528158,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66528153,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528157,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576372,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528166,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528169,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66576373,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528185,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528182,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66528202,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528200,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576374,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528217,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528219,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576375,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528254,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66576376,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66528304,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528321,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66528332,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528334,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66528343,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528345,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66528353,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66528361,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66528363,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66529660,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66529684,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66529686,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529707,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66529710,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529733,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66529738,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529758,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529752,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529765,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529790,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529784,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529797,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529821,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66529815,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529828,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529859,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529853,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529885,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529893,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529916,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66529910,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529938,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66529933,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529966,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66529989,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530015,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530011,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530043,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530037,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530066,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530090,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530084,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530094,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530116,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530120,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530147,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530165,False,False,False,False,False,False,False,False,True,True,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530160,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530168,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530180,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530185,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530193,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530199,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530207,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530214,True,False,True,False,False,False,False,False,True,False,False,True,True,False,False,False,True,True,True,True,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66530228,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530264,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530270,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530280,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66530287,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66535992,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535993,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533976,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533534,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533535,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536172,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533536,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533977,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535994,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533538,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533539,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536173,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533978,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535995,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536174,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535996,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536175,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535997,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533540,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535998,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533541,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535999,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536000,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536178,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533542,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536001,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536002,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536180,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533543,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536003,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536004,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536182,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536005,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536006,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536184,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536185,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536008,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536186,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536009,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533546,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536010,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536187,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533547,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536011,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536012,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66533548,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536014,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536189,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536015,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536016,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536191,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536017,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536192,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536018,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535193,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533549,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66536193,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535196,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536194,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536020,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66536021,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536022,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536195,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66536023,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536196,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66536024,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536197,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536025,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536198,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535200,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536199,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536026,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535201,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536027,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536200,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66533554,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536201,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536202,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536028,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536203,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536029,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535204,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535205,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535206,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536030,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535207,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536031,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536032,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536033,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535210,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535211,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535213,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535214,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535215,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535216,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535217,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535218,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535219,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535220,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535221,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535222,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535223,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535224,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535225,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66535226,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536587,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536589,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536592,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536595,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66537031,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536597,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66537034,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66537035,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66537036,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66537037,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536601,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536604,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66536605,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542861,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541832,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541834,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66542862,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541511,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541650,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541835,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541651,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541836,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542864,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541652,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542865,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541653,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541837,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541654,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541838,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541513,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541655,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541656,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541514,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541840,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66544006,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66544007,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541657,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541658,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66544009,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541659,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541660,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66544011,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541520,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541661,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542870,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541662,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541521,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66544013,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541522,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541843,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66544014,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541523,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541844,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541663,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541524,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541664,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542874,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66544017,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541665,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541846,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541526,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541666,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541847,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541527,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66544019,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541667,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541528,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542877,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66544020,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541668,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542878,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541669,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541850,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66542879,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541670,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541531,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542880,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541671,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542881,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541672,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541852,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541533,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542882,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541673,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541853,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541534,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541674,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541854,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541535,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541675,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541855,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541536,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541856,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541676,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542885,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542886,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541858,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541677,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541678,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541859,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542888,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541679,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541860,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541539,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541680,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541861,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66541681,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541682,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66541684,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66542214,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66390997,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542215,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542216,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66390998,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542217,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66390999,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542218,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66391000,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542220,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66391001,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66543473,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66391003,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66391004,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66543476,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66391007,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66391008,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542230,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542231,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66542234,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66578098,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66578102,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66578103,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66578105,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66578108,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66578109,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66578110,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66578111,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66391321,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66393464,False,False,True,False,False,False,False,False,False,True,False,True,True,False,True,False,True,True,False,True,True,True,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -66393465,False,False,True,False,False,False,False,False,False,True,False,True,True,False,True,False,True,True,False,True,True,True,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -66393468,False,False,True,False,False,False,False,False,False,True,False,True,True,False,True,False,True,True,False,True,True,True,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -66393469,False,False,True,False,False,False,False,False,False,True,False,True,True,False,True,False,True,True,False,True,True,True,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -66393470,False,False,True,False,False,False,False,False,False,True,False,True,True,False,True,False,True,True,False,True,True,True,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -66393471,False,False,True,False,False,False,False,False,False,True,False,True,True,False,True,False,True,True,False,True,True,True,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -66393472,False,False,True,False,False,False,False,False,False,True,False,True,True,False,True,False,True,True,False,True,True,True,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -66393473,False,False,True,False,False,False,False,False,False,True,False,True,True,False,True,False,True,True,False,True,True,True,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -66393474,False,False,True,False,False,False,False,False,False,True,False,True,True,False,True,False,True,True,False,True,True,True,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -66393476,False,False,True,False,False,False,False,False,False,True,False,True,True,False,True,False,True,True,False,True,True,True,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -66393477,False,False,True,False,False,False,False,False,False,True,False,True,True,False,True,False,True,True,False,True,True,True,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -66392253,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66397109,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66397118,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66397119,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66397120,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66397121,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386969,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386970,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386971,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386972,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386973,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386974,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66386975,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386976,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66386977,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386978,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386979,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386980,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386981,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386982,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66386983,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386984,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386985,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386986,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386987,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386988,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386989,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386990,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386991,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386992,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66386993,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386994,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386995,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386996,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386998,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66386999,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387000,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387001,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387002,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387003,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66397127,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66397128,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387005,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387006,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387007,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66399881,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66401182,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66399888,False,False,False,False,False,True,False,False,False,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66398752,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66400624,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400625,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66400626,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400627,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400628,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400629,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400630,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400631,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400632,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400633,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400634,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400636,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400637,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400638,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400639,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400640,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66400641,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66400642,True,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66400643,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387211,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387350,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387212,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387133,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387213,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387134,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387214,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387215,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387356,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387216,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387217,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387360,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387219,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387141,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387220,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387221,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387144,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387222,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387223,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387145,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387224,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387146,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387225,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387148,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387226,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387227,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387228,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387229,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405542,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387230,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387155,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387231,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405543,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66406276,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66405544,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387232,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66406278,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66405546,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66406279,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387158,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405547,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387233,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387234,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405549,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387235,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405142,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387236,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405552,False,False,False,False,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66406284,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66406285,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387237,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387164,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -3151,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387238,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66406287,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387239,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66406288,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66406289,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387240,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387241,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387242,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387243,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387454,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387455,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387170,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387459,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387460,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387461,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387462,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387463,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387464,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387466,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387468,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387469,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387472,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387473,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387474,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387475,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387172,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387477,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387244,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387174,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387245,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387176,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405162,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387179,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387246,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387247,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387248,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387080,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387249,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387081,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387082,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387083,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387250,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387084,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387085,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387086,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387252,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387087,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387088,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387089,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387253,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387090,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387254,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387255,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387091,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387256,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387092,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387093,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387094,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387095,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387257,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387096,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387258,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387097,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387259,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387098,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387260,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387099,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387100,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -7586,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387101,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387102,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387261,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387262,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387104,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387263,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387105,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387106,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387107,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387264,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387108,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387109,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387265,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387191,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405742,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405743,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405744,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405745,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405746,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -14538,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405747,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405748,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405749,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405750,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405751,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405752,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405753,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405754,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -15576,True,False,True,False,False,False,False,True,True,False,False,False,True,False,False,True,True,True,True,True,True,True,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,True,False,True,False,False,False -66405755,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405756,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405758,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405759,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66405760,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387479,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387480,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387481,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387483,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387484,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387486,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387487,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387488,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387490,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387491,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387492,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387493,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387494,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387495,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387496,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387497,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387498,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387499,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387500,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387502,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387503,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387504,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387505,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387506,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387755,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387756,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387757,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387758,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387681,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387759,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387682,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387761,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -37296,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567620,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567621,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567622,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567623,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567625,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567630,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567633,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66567634,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66567635,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66411449,True,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -39226,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387686,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66411450,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66411451,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387687,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66411452,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567636,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66411453,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567654,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567655,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567656,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567660,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567664,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -43295,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66567547,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387507,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387508,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387509,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387510,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387511,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387512,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387513,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -51191,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387658,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387792,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387793,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387794,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387795,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387796,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -166146,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387797,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387798,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387799,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387800,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387801,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387802,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387803,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387804,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387805,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387806,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -169157,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387807,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387808,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387809,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387810,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387811,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387812,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66416408,True,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387813,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387814,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66416412,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387815,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -172976,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387816,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -172564,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387817,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387818,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -173468,True,False,False,False,False,False,False,False,True,True,False,False,True,True,False,True,False,True,True,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -175689,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387819,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387820,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387821,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387822,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387823,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387824,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387825,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387826,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387827,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387828,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387829,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387830,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387831,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387832,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387833,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387834,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387835,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66569343,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66569344,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66387836,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387837,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387838,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387839,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387840,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387841,False,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,True,True,False,True,True,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,True,False,False -66387842,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387843,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387844,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -293904,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387845,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387846,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387847,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387848,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387849,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387850,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387851,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -241091,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387852,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387853,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387854,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387855,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387856,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387857,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387858,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387859,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387860,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387861,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66387862,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -315675,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -315676,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -317337,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -317919,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -318280,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -320682,False,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -66388321,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388323,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388324,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388107,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,True,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388325,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388108,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388109,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388326,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388110,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388111,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388112,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388113,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388114,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388115,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388116,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388117,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388118,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388329,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388330,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388331,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388334,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66421248,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388119,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388335,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66421249,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66421250,True,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388120,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388336,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66421253,False,False,False,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388121,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388339,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388122,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388123,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388124,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388125,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66421258,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66421259,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388126,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388127,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -384784,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388128,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -384783,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -384782,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388129,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -384781,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388130,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -384780,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388340,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -384779,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388131,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -384778,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388132,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66421261,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -384777,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388133,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -384776,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -384775,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388134,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66421262,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388135,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66421263,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -386573,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -386571,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386566,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386570,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388343,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386572,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386574,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386581,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388136,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386576,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386577,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386578,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386579,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386583,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386585,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388344,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386586,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386587,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388345,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388137,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388138,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388347,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388139,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388140,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388141,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388349,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388142,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388350,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388143,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386588,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,True,True,True,False,True,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,True,False,False -386584,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388351,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386582,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388144,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388145,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386580,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388146,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390495,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390493,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388147,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388148,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388149,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388150,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390496,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390497,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388151,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388152,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388153,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388154,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390511,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390513,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388155,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390517,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,True,False,False -390515,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390518,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388156,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388157,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390519,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388158,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390514,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390512,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388352,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388159,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390498,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388160,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390499,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390500,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388353,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390501,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388161,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390510,True,False,True,False,False,False,False,True,True,True,False,False,True,False,True,True,True,True,True,True,True,True,False,False,True,False,False,True,False,False,False,True,False,False,False,False,False,False,True,True,True,True,False,False -390502,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388354,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -390503,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388162,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390504,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390505,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390506,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388355,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390507,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388163,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388164,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390508,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388165,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -390509,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -386048,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395001,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388166,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -387022,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388167,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388357,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395002,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395702,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -66388359,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388168,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395700,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395699,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395698,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395694,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395695,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -395696,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395692,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395693,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395704,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395705,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,True,True,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,True,False -395706,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395707,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388362,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395708,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395709,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395710,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395711,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395712,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -395713,True,False,False,False,False,False,True,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,True,False -66388169,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388170,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388171,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388365,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388172,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388173,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388366,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66569463,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -458160,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False -458154,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -458155,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -458159,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -463454,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -66388314,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207670,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388739,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388740,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213527,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388741,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213578,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388742,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388512,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388743,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214117,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388513,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388514,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388515,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388516,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388517,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388518,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388519,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388520,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388521,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388522,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388523,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388524,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388525,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214149,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213991,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213965,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -562459,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214171,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209545,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -562970,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209444,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209438,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388749,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388526,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388527,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388528,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388529,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388530,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388531,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388532,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388533,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388534,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388535,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388536,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388537,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388538,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388539,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388540,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388541,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388542,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205355,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388543,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205471,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205585,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205659,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205208,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388544,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -564848,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388755,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388545,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388757,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388546,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388547,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214218,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388548,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213528,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388549,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388550,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388551,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388552,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388553,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388554,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388555,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213579,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388556,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388557,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214258,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388558,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213729,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214118,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213743,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213702,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213624,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214150,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388763,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213876,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213992,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213966,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213757,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214172,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214396,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88209546,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214295,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388559,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388560,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388561,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388562,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388563,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388564,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213478,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209439,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205356,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205472,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205660,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205586,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205209,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -571119,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -571546,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214219,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -571124,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -574869,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,True,False -88213529,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -580351,True,False,False,False,False,False,True,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213580,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214259,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580356,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213730,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214119,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213744,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212242,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213703,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212257,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213625,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214151,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212398,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213993,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213877,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213967,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212420,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213758,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388565,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388566,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88211982,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388567,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214173,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388568,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388569,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388570,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214397,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388571,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -580354,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388572,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88212042,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388573,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580353,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,True,False,False -580352,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214197,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580350,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212165,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214296,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -580349,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388899,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388900,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580347,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388901,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580346,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580345,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212169,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388905,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388906,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388907,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580344,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213479,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88206873,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580343,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388911,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -574378,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580342,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88209440,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580341,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580340,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580337,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580335,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580707,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True -580334,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580336,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206429,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -580338,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205357,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205473,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88205661,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205587,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88205210,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388574,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388575,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388576,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388577,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388578,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88206543,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388579,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388580,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388581,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88214220,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213530,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388582,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388583,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388584,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207055,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388585,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388586,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213581,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388587,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388588,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214260,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388589,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388590,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88214120,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213731,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388591,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388592,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -66388593,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88213745,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212243,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213704,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388594,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388595,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -580710,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88212258,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213626,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388596,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388658,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -88207135,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -88213422,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388659,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -66388660,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913212,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913213,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913214,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913215,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913216,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913217,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913218,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913219,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913220,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913221,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913222,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913223,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913224,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913225,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913226,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913227,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913228,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913229,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913230,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913231,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913232,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913233,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913234,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913235,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913236,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913237,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913238,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913239,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913240,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913241,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913242,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913243,True,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913244,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913245,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913246,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913247,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913248,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913249,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913250,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913251,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913252,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913253,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913254,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913255,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913256,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913257,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913258,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913259,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913260,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913261,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913262,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913263,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913264,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913265,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913266,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913267,True,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913268,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913269,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913270,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913271,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913272,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913273,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913274,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913275,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913276,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913277,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913278,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913279,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913280,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913281,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913282,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913283,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913284,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913285,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913286,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913287,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913288,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913289,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913290,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913291,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913292,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913293,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913294,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913295,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False -913296,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913297,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913298,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913299,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913300,True,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913301,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False -913302,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False -913303,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913304,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913305,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913306,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False -913307,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913308,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913309,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913310,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913311,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913312,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -913313,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913314,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913315,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913316,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913317,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913318,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913319,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913320,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913321,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913322,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913323,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913324,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913325,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913326,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913327,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913328,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913329,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913330,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913331,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913332,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913333,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913334,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913335,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913336,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -913337,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913338,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913339,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913340,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913341,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913342,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913343,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913344,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913345,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913346,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913347,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913348,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913349,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913350,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913351,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913352,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913353,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913354,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913355,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -913356,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -784017,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131150,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000223,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131744,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000557,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000735,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149264,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000358,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145938,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000360,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000361,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145941,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145942,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145943,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145944,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145945,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000367,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000368,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145948,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -61000370,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145950,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000372,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000373,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000374,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145954,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000376,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145956,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000378,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000379,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000380,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000381,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145961,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000383,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145963,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000385,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -146295,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145965,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145966,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000392,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145967,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145968,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000565,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145969,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000663,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000567,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145971,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145972,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -61000666,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145974,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000668,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000669,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000477,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -61000670,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000671,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000696,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -145979,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -146299,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000673,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145981,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -146301,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145982,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -146302,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145983,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000701,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145984,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -145985,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000703,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False -146306,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000705,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -146309,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000679,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -146310,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145987,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -146311,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000681,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -146312,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000682,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -146313,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000683,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000684,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000685,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000551,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000552,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -131741,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131742,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131746,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -149262,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000686,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000559,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149263,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145994,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000560,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149265,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000688,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -145996,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000740,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131749,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000690,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149267,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -149268,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000743,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -149270,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -145998,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000692,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -146000,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -146001,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000695,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131478,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False -148228,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000732,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000721,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000733,True,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000734,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000724,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -148994,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -149119,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131479,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -149120,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001017,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131481,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131482,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131483,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131484,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001022,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001023,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001024,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131488,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131489,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001227,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001251,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001228,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131490,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -146005,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001028,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -146006,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131492,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131493,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131494,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -149001,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131495,True,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001255,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001033,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149003,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -146007,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001257,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -61001232,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001233,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149005,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001234,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001224,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001288,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001290,True,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131922,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -149038,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001292,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001035,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -131924,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001037,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001038,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001261,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149009,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001264,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -146011,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001236,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001237,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001238,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001244,False,False,False,False,False,True,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -146015,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -146016,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001295,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001241,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001225,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -146018,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001243,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001245,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -148732,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149122,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -149012,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001297,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001266,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -148733,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001267,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001268,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149017,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001271,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149019,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001273,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001274,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001275,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -149024,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001278,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -149026,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001280,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149028,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,False,False,False -61001282,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001283,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149033,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -149034,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -127939,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002615,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131583,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131584,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -130263,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -130264,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -130265,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131585,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131586,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131587,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131588,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -131589,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -132034,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -148406,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002726,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -132035,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -140920,True,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,True,False,False -140922,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,False,False,False -61002712,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -140923,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,False,False,False -61002715,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,False,False,False -140925,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,True,False,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,False,False,False -61002717,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,True,False,False,True,False,True,False,False,False,False,False,False,True,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False -140927,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -140928,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -140929,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002635,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302264,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000253,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000254,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302267,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000256,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302269,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000327,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000258,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000304,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -307142,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302271,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -61000260,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000289,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -307144,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307145,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302273,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302274,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000328,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -307441,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302275,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,False,False,False -307442,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307443,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302276,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False -61000332,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000265,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -307445,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000290,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000266,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302279,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302280,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -307447,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302282,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307448,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000271,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -307449,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302284,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000235,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -301332,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000311,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000312,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000338,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304524,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -301333,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -301334,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000300,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -306290,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000340,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000341,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000342,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -307150,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304295,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000343,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304296,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307151,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304297,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -306291,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000281,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -301335,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304299,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000283,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000284,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000345,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000285,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -307458,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000286,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000347,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000316,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304304,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000288,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000317,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304840,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -301336,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000241,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304842,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000242,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304843,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -301339,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302219,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000349,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000246,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000350,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302221,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302285,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307156,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307157,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000298,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304845,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000321,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000274,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302287,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302223,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000323,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302288,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307161,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000250,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -307162,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000251,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000635,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302226,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307465,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000582,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304536,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000637,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000583,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000574,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -304537,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000584,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000609,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000639,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000585,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000575,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -304539,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000640,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -301342,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307470,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000625,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000586,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304540,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000587,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000579,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000580,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302295,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304541,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -61000581,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302296,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304542,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -61000590,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302298,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000614,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000615,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000592,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304545,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302300,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302301,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304547,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000595,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000619,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302303,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307471,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000643,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302306,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307473,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -61000620,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000621,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000645,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302307,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304551,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61000623,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61000624,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302308,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001101,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001154,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001155,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001045,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -61001046,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -301767,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304409,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001048,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304410,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001049,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304411,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001050,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -301771,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304412,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -301772,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -301773,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -301774,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001055,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -61001056,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001057,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -304414,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001058,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -304415,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304416,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001059,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -301780,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001147,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -301781,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001062,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304417,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304418,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001064,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001166,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304420,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001065,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -301786,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304371,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001149,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304373,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001138,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001152,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -304376,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001108,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001110,True,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001112,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -303740,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -303693,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302033,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61001069,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61001070,False,False,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302015,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61002660,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61002661,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -302018,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002643,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61002636,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61002637,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61002696,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307418,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002698,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002663,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002664,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61002665,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002666,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307421,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307422,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002645,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304938,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61002692,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -307123,False,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61002667,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002668,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002669,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61002670,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -302027,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002704,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307426,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307427,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002647,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002648,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304431,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304432,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -304433,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61002649,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002650,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002651,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002652,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -61002653,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002655,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002656,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002657,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002658,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002672,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002673,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307429,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002674,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002675,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -307430,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -301301,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002639,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002641,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -61002677,False,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -304107,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -754413,True,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754424,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754428,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754462,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -754471,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754472,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -754473,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754475,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754476,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754477,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754478,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754480,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754481,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754482,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754483,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754484,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754486,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754487,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754488,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754489,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754490,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754491,True,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754507,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754508,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754509,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754510,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754511,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754512,True,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754513,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754514,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754537,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754538,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754539,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754540,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754541,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754542,True,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754543,True,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754544,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754561,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754564,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754565,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754566,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754567,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754568,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754569,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754570,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754571,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -754572,True,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False -754573,False,False,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -62,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -72,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -92,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -64066163,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -471,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -497,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -558,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -582,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -778,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -824,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -982,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -999,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -1052,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -1077,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -106,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -117,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,False,False,False -219,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -230,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -238,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -286,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -296,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -316,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -348,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -354,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -370,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -448,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -457,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -474,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -501,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -559,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -563,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -976,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -1209,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -1384,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -1401,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -1441,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -1392,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,True,True,False,True,False -1393,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1394,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1395,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1396,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1397,True,False,False,False,False,False,False,False,True,True,True,False,True,False,False,True,True,True,True,True,True,False,False,True,False,False,False,True,False,False,True,True,False,False,True,False,True,True,True,True,True,True,True,False -1398,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1399,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1400,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -88256242,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1402,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1403,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1404,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1405,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1406,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1407,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1408,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1409,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1410,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1411,True,True,False,False,False,False,False,False,True,True,True,False,True,True,False,False,False,True,False,False,True,False,False,True,False,False,False,True,True,True,False,False,False,False,True,False,False,False,False,False,True,False,True,False -1412,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1413,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,True,False,False,True,True,True,True,False -1414,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1415,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False -1416,True,False,True,False,False,False,False,True,True,True,False,False,True,False,False,True,True,True,True,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,True,True,False,True,False,False -1417,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,True,False,False,True,True,False,False,False,False,False,False,True,False,True,False,False,True,True,True,True,False -1418,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,True,False,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1419,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,True,True,False,False -1420,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1421,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1422,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -1423,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1424,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -1425,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,True,True,False,False,True,False,False,False,False,False,True,True,True,False -1426,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,False,True,False -174,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -175,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -176,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -177,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -178,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -179,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,True,True,True,True,False -180,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -181,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -182,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -183,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -184,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,True,True,True,True,False -185,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -186,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -187,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -188,True,False,False,False,False,False,False,True,True,True,False,False,True,False,False,True,False,False,True,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,True,False,True,False,False -189,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -190,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -191,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -192,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -193,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,True,False -194,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,True,False -408619,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -408620,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -408621,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -408622,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -408623,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -408624,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -408625,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -408626,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -1848,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,True,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,False,False,False -408627,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -408628,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -408629,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -408630,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -408631,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2300,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2350,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2410,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2470,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2536,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2574,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2625,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2666,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -2704,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2738,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2794,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2842,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2908,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2945,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2986,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -3039,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -3098,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -3207,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -3260,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -6438,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -6614,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -6692,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -6749,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -6790,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -6829,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -6919,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -6970,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -7018,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -7076,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -7170,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -7258,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,True,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,True,False,False,False -7308,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -7355,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -7403,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -7441,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -7534,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -7643,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -7701,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -64066205,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -64066206,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -64066207,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -64066208,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -64066209,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -64066210,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -64066211,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -64066212,False,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -64066213,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -64066214,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -64066215,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -246,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -247,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -248,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -249,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -250,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -251,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -252,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -253,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -254,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -255,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -256,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2557,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2583,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2883,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -5756,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440225,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440226,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440227,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440228,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440229,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -440230,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440231,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440232,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440233,False,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440234,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -440235,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440236,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -440237,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -440238,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False -440239,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -440240,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440241,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440242,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -440243,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -2977,True,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -7957,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,True,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,False,True,False -15160,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -3761,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3762,True,False,True,False,False,False,False,False,True,True,False,False,True,False,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,True,False,True,True,True,True,False -3763,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,True,False,True,False,True,True,True,False,False,True,False,False,True,True,True,True,True,True,False -3764,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,True,True,False,False,True,False,False,False,False,True,True,True,True,False -3765,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3766,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3767,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3768,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3769,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3770,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3771,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3772,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3773,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3774,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,True,False,True,False,True,True,True,False,False,True,False,False,True,True,True,True,True,True,False -3775,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,True,True,False,False,True,False,False,False,True,True,True,True,True,False -3776,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3777,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3778,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3779,True,True,False,False,False,False,False,False,True,True,True,False,True,True,False,False,False,True,False,False,True,False,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,False,True,False -3780,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3781,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3782,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3783,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,True,True,True,True,True,False -3784,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3785,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3786,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3787,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3788,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3789,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,True,True,True,True,True,False -3790,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,True,False,True,False,True,True,True,False,False,True,False,False,True,True,True,True,True,True,False -3791,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,False,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3792,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -3793,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,False,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3794,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,True,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -3795,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3796,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3797,True,False,False,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,False,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,True,False,False,True,True,True,True,False -3798,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,True,False,True,False,True,True,True,False,False,True,False,False,False,False,True,True,True,True,False -3799,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,True,False,True,False,True,True,True,False,False,True,False,False,True,True,True,True,True,True,False -3800,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3801,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,True,True,True,True,True,False -3802,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,True,True,True,True,True,False -3803,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3804,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3805,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3806,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3807,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3808,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3809,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3810,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,True,True,True,True,True,False -3811,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3812,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,True,True,True,True,True,False -3813,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,False,False,True,False,True,False,True,False,False,True,False,False,True,False,True,True,True,True,False -3814,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,False,True,True,True,False -3815,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3972,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,True,True,True,False,False -3973,True,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -3974,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -3975,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -3976,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -3977,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -3978,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -3979,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -3980,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -3981,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -3982,False,False,False,False,False,False,False,False,True,False,False,False,True,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -3983,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False -3984,True,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,True,True,False,False -3988,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,False,True,False,True,True,True,False,True,False,False,True,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3989,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,False,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3990,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3991,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,True,True,True,True,True,False -3992,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3993,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3994,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3995,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,False,False,False -3996,True,False,False,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,False,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3997,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3998,True,True,True,False,False,False,False,False,True,True,True,False,True,True,False,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -3999,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4000,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4001,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,True,True,False,True,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,True,True,True,False,False -4002,True,False,False,False,False,False,False,False,True,True,False,False,True,False,False,False,False,True,False,False,True,False,False,False,False,False,True,True,False,False,False,False,False,False,True,False,False,False,False,True,True,False,False,False -4010,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4011,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,True,False,True,False,True,False,True,False,False,True,False,False,False,True,True,True,True,True,False -4012,True,False,False,False,False,False,False,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False -4013,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4014,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4015,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4016,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4017,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4018,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4019,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4020,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4021,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,False,False,True,False,True,True,True,False,False,True,False,False,False,False,True,True,True,True,False -4022,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4023,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4024,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4025,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,True,True,False,False,True,False,False,False,False,True,True,True,True,False -4026,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4027,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4028,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4029,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4030,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4031,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,False,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4032,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,False,True,True,True,False -4033,True,False,False,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,False,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4034,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4035,True,False,False,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,False,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4036,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4037,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4038,True,False,False,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,False,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4039,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4040,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4041,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4042,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4043,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4044,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4045,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4046,True,True,True,False,False,False,False,True,True,True,True,False,True,True,True,True,True,True,True,True,True,True,False,True,True,False,False,True,False,True,True,True,False,False,True,False,False,False,False,False,True,True,True,False -4047,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4048,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4049,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4050,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4051,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4052,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4053,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,True,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4054,True,False,True,False,False,False,False,True,True,True,True,False,True,False,True,True,True,True,True,True,True,True,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4055,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4056,True,False,True,False,False,False,False,False,True,True,True,False,True,False,False,False,True,True,False,True,True,False,False,True,False,False,False,True,False,False,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4057,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,True,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False -4058,True,True,True,False,False,False,False,False,True,True,True,False,True,True,True,False,True,True,True,True,True,True,False,True,False,False,False,True,False,True,False,True,False,False,True,False,False,False,False,True,True,True,True,False From 9ff0e98b9b0fb2d37145798f2fb570af5d2f4643 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Wed, 24 Aug 2016 15:22:16 +0000 Subject: [PATCH 78/79] update recommended docker run command to not delete container on exit, in case of connection loss --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 701d3aa..53eb26c 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ docker pull iquod/autoqc Start the image via ``` -docker run --sysctl "kernel.shmmax=18446744073692774399" -v $PWD:/rawdata --rm -i -t iquod/autoqc /bin/bash +docker run --sysctl "kernel.shmmax=18446744073692774399" -v $PWD:/rawdata -i -t iquod/autoqc /bin/bash ``` And you'll find AutoQC all set up and ready to use in the directory `/AutoQC`. Note that the version of AutoQC that ships with the docker image may be behind master on GitHub; you can always do `git pull origin master` from the `/AutoQC` directory inside the container, if you need an update. Also, whatever directory you launched this command from will be mounted on `/rawdata` inside your Docker container; use this to bring data into the container, or copy logs and files from within the container to this location to access them after Docker exits. @@ -65,7 +65,7 @@ cd data Finally, launch your docker image with the `data` directory mounted inside it at `/rawdata`: ``` -sudo docker run --sysctl "kernel.shmmax=18446744073692774399" -v $PWD:/rawdata --rm -i -t iquod/autoqc /bin/bash +sudo docker run --sysctl "kernel.shmmax=18446744073692774399" -v $PWD:/rawdata -i -t iquod/autoqc /bin/bash ``` And once again, AutoQC will be all set up in `/AutoQC`. Remember to `git pull` if necessary, and add any external data or parameter files to the correct places. From 30d47e1b405369c5097a5bfd8c529a386dfff6eb Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Wed, 24 Aug 2016 15:47:39 +0000 Subject: [PATCH 79/79] docs update --- README.md | 66 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 53eb26c..e4d211f 100644 --- a/README.md +++ b/README.md @@ -71,20 +71,58 @@ sudo docker run --sysctl "kernel.shmmax=18446744073692774399" -v $PWD:/rawdata - And once again, AutoQC will be all set up in `/AutoQC`. Remember to `git pull` if necessary, and add any external data or parameter files to the correct places. ##Usage -To execute the quality control checks, -`python AutoQC.py name nProcessors` -where `name` names the output csv naming as `result-name.csv`, and `nProcessors` is the number of cores to parallelize over. +AutoQC runs in three steps: database construction, qc running, and result summarization. -##Structure -`AutoQC.py` performs the following: - - automatically detects all quality control tests found in `/qctests` - - takes the list of raw data files from `datafiles.json`, and decodes their contents into an array of profile objects - - runs all the automatically detected tests over each of these profiles - - return an array for each test indicating which profiles exceptions were raised for, and an array indicating the expected result for each profile +### Database Construction + +``` +python build-db.py filename tablename +``` + +Where `filename` is the name of a WOD-ascii file to read profiles from, and `tablename` is the name of a postgres table to write the results to; `tablename` will be created if it doesn't +exist, or appended to if it does. `tablename` will have the following columns: + +column name | description +------------|----------- +`raw` | the raw WOD-ASCII text originally found in the input file +`truth` | whether any temperature qc levels were flagged at 3 or greater +`uid` | unique profile serial number +`year` | timestamp year +`month` | timestamp month, integers [1,12] +`day` | timestamp day, integers [1,31] +`time` | timestamp walltime, real [0,24) +`lat` | profile latitude +`long` | profile longitude +`cruise` | cruise id +`probe` | probe index, per WOD specifications + +Additionally, there is a column in the table for the qc results of every test found in the `/qctests` directory; these columns are filled in in the next step. + +### QC Execution + +``` +python AutoQC.py tablename nProcessors +``` + +where `tablename` is the postgres table to pull profiles from (probably the same as `tablename` in the last step), and `nProcessors` is how many processors you'd like to parallelize over + +### Result Summary + +``` +python summarize-results.py tablename +``` + +where `tablename` is the postgres table used in the previous steps. A summary of true flags, true passes, false positives and false negatives is generated for each test. + + +##Testing ###Testing Data -Each quality control test must be written as its own file in `/qctests`, of the form `def test(p)`, where `p` is a profile object; each test returns a bool, where `True` indicates the test has *failed*. +Each quality control test must be written as its own file in `/qctests`, of the form `def test(p, parameters)`, where `p` is a profile object; each test returns a bool, where `True` indicates the test has *failed*. +`parameters` is a dictionary for conveniently persisting *static* parameters and sharing them between threads; if your test has a great deal of parameters to load before it runs, include alongside its definition a `loadParmaeters(dict)` method, which writes those +parameters to keys of your choosing on the dictionary passed in as an argument to `loadParameters`. That dictionary will subsequently be passed into every qc test as the `parameters` argument. Calling this `loadParameters` function is done automatically by the qc framework; +it is enough for you to just write it, and the parameters you want will be available in your qc test on the keys you defined on the `parameters` object. ###Testing Code To run the code tests: @@ -94,11 +132,9 @@ pip install nose nosetests tests/*.py ``` -###Data -Each data file listed in `datafiles.json` is in the World Ocean Database (WOD; http://www.nodc.noaa.gov/OC5/WOD/pr_wod.html) ASCII format. - -###Profile Objects Specification -See [the docs](https://github.com/IQuOD/AutoQC/blob/master/dataio/README.md) for the WodProfile class, a decoding helper for the WOD ASCII format. +##Profile Objects Specification +See [wodpy package](https://github.com/IQuOD/wodpy) for more information on the WodProfile class, a decoding helper for the WOD ASCII format. ##Contributing Quality control checks waiting to be implemented are listed in the Issues. If you would like to work on coding up a check, please assign yourself to the issue to avoid others duplicating the effort. +If you have an idea for a new QC check, please open an issue and let us know, so we can help get you started on the right track.