# Path: opentaxforms/ut.py
# NL = '\n'
# TAB = '\t'
# def merge(bb1, bb2):
# def numerify(s):
# def compactify(multilineRegex):
#     def crunch(seg):
# def pickle(data, pickleFilePrefix):
# def unpickle(pickleFilePrefix, default=None):
# def flattened(l):
# def hasdups(l, key=None):
# def uniqify(l):
# def uniqify2(l):
# def setupLogging(loggerId, args=None):
# def unsetupLogging():
# def logg(msg, outputs=None):
# def jj(*args, **kw):
# def jdb(*args, **kw):
# def run0(cmd):
# def run(cmd, logprefix='run', loglevel='INFO'):
#     def __init__(self, pkgname, fpath=None):
#     def path(self):
#     def content(self):
#     def keys(cls):
#     def vals(cls):
#     def items(cls):
#     def __init__(self):
#     def __call__(self, **kw):
#     def __init__(self, *maps, **kw):
#     def _getGetitems(self, mapp):
#     def __getitem__(self, key):
#     def __setitem__(self, key, val):
#     def __len__(self):
#     def __call__(self, *keys):
#     def clear(self):
#     def update(self, *maps):
#     def __add__(self, *maps):
#     def __iadd__(self, *maps):
#     def __iter__(self):
#     def iterkeys(self):
#     def keys(self):
#     def values(self):
#     def items(self):
#     def iteritems(self):
#     def get(self, key, dflt=None):
#     def __str__(self):
#     def __repr__(self):
# def notequalpatch(self, o):
#     def fromstring(cls, s):
#     def __hash__(self):
# def playQnty():
# def nth(n):
# def skip(s, substr):
# def until(s, substr):
# def ensure_dir(folder):
# def now(format=None):
# def readImgSize(fname, dirName):
# def asciiOnly(s):
# class NoSuchPickle(Exception):
# class PickleException(Exception):
# class Resource(object):
# class CharEnum(object):
# class ChainablyUpdatableOrderedDict(odict):
# class Bag(object):
# class Qnty(qq):
# 
# Path: opentaxforms/config.py
# def parseCmdline():
# def getFileList(dirName):
# def setLogname(rootForms,cfg):
# def copyStaticDir(appname):
# def setupStaticDir(dirName):
# def setup(**overrideArgs):
# def unsetup():


import re
import six
from . import ut, irs
from .ut import log, jj, pathjoin, asciiOnly
from .config import cfg
                            #    because we are in Schedule B already,
                            #    and we assume that 1040A uses 1040's sched B.
                            txt = txt.replace(match, '')
                            continue
                        elif inSameFamily(*formvalues):
                            # in 'schedX(form1 or form2) assume both forms use the same schedX
                            #   if both forms are in the same form family [eg 1040 and 1040A]
                            #   and separate schedX's dont occur in allpdfnames.
                            formvaluesToRemove=[f.lower() for f in formvalues
                                if ('f%ss%s'%(f,sched)).lower() not in cfg.allpdfnames]
                            formfields=[k for k,v in d.items() if k.startswith('form') and v.lower() not in formvaluesToRemove]
                            if len(formfields)==1:
                                scheduleContext[sched]=d[formfields[0]].lower()
                for formfield in formfields:
                    form = d[formfield].upper()
                    if fieldIsOptional(formfield) and not form:
                        continue
                    for schedfield in schedfields:
                        sched = d[schedfield].upper()
                        if fieldIsOptional(schedfield) and not sched:
                            continue
                        # context highlights the match we found [for logging]
                        context = txt.replace(match, '[[' + match + ']]')
                        if formrefs.add(
                           *checkForm(
                               form, sched,
                               **dict(
                                 iFormInLine=iFormInLine, draw=el, match=match,
                                 form=formName, context=context))):
                            formsinline.append(

# Path: opentaxforms/ut.py
# NL = '\n'
# TAB = '\t'
# def merge(bb1, bb2):
# def numerify(s):
# def compactify(multilineRegex):
#     def crunch(seg):
# def pickle(data, pickleFilePrefix):
# def unpickle(pickleFilePrefix, default=None):
# def flattened(l):
# def hasdups(l, key=None):
# def uniqify(l):
# def uniqify2(l):
# def setupLogging(loggerId, args=None):
# def unsetupLogging():
# def logg(msg, outputs=None):
# def jj(*args, **kw):
# def jdb(*args, **kw):
# def run0(cmd):
# def run(cmd, logprefix='run', loglevel='INFO'):
#     def __init__(self, pkgname, fpath=None):
#     def path(self):
#     def content(self):
#     def keys(cls):
#     def vals(cls):
#     def items(cls):
#     def __init__(self):
#     def __call__(self, **kw):
#     def __init__(self, *maps, **kw):
#     def _getGetitems(self, mapp):
#     def __getitem__(self, key):
#     def __setitem__(self, key, val):
#     def __len__(self):
#     def __call__(self, *keys):
#     def clear(self):
#     def update(self, *maps):
#     def __add__(self, *maps):
#     def __iadd__(self, *maps):
#     def __iter__(self):
#     def iterkeys(self):
#     def keys(self):
#     def values(self):
#     def items(self):
#     def iteritems(self):
#     def get(self, key, dflt=None):
#     def __str__(self):
#     def __repr__(self):
# def notequalpatch(self, o):
#     def fromstring(cls, s):
#     def __hash__(self):
# def playQnty():
# def nth(n):
# def skip(s, substr):
# def until(s, substr):
# def ensure_dir(folder):
# def now(format=None):
# def readImgSize(fname, dirName):
# def asciiOnly(s):
# class NoSuchPickle(Exception):
# class PickleException(Exception):
# class Resource(object):
# class CharEnum(object):
# class ChainablyUpdatableOrderedDict(odict):
# class Bag(object):
# class Qnty(qq):
# 
# Path: opentaxforms/config.py
# def parseCmdline():
# def getFileList(dirName):
# def setLogname(rootForms,cfg):
# def copyStaticDir(appname):
# def setupStaticDir(dirName):
# def setup(**overrideArgs):
# def unsetup():


# Path: opentaxforms/refs.py
import re
import six
from . import ut, irs
from .ut import log, jj, pathjoin, asciiOnly
from .config import cfg

                            #    because we are in Schedule B already,
                            #    and we assume that 1040A uses 1040's sched B.
                            txt = txt.replace(match, '')
                            continue
                        elif inSameFamily(*formvalues):
                            # in 'schedX(form1 or form2) assume both forms use the same schedX
                            #   if both forms are in the same form family [eg 1040 and 1040A]
                            #   and separate schedX's dont occur in allpdfnames.
                            formvaluesToRemove=[f.lower() for f in formvalues
                                if ('f%ss%s'%(f,sched)).lower() not in cfg.allpdfnames]
                            formfields=[k for k,v in d.items() if k.startswith('form') and v.lower() not in formvaluesToRemove]
                            if len(formfields)==1:
                                scheduleContext[sched]=d[formfields[0]].lower()
                for formfield in formfields:
                    form = d[formfield].upper()
                    if fieldIsOptional(formfield) and not form:
                        continue
                    for schedfield in schedfields:
                        sched = d[schedfield].upper()
                        if fieldIsOptional(schedfield) and not sched:
                            continue
                        # context highlights the match we found [for logging]
                        context = txt.replace(match, '[[' + match + ']]')
                        if formrefs.add(
                           *checkForm(
                               form, sched,
                               **dict(
                                 iFormInLine=iFormInLine, draw=el, match=match,
                                 form=formName, context=context))):
                            formsinline.append(

                                jj(