Test framework
This page describes the organizational forces that limit change.  It explains how to overcome them when necessary. 

Power& tradition holding back progress
This page uses an example to illustrate how:
  • A business can gain focus from targeting key customers,
  • Business planning activities performed by the whole organization can build awareness, empowerment and coherence. 
  • A program approach can ensure strategic alignment. 
Be responsive to market dynamics
This page uses the example of HP's printer organization freeing itself from its organizational constraints to sell a printer targeted at the IBM pc user. 
The constraints are described. 
The techniques to overcome them are implied. 
Overcome reactionaries
Primary Navigation

Test framework using Copycat

Summary
This page describes the Adaptive Web framework (AWF) test system and the agent programming framework (Smiley) that supports its operation. 
Example test system statements are included.  To begin a test a test statement is loaded into Smiley while Smiley executes on the Perl is Larry Wall's programming language.  It is designed to make easy tasks easy and hard tasks possible.  It has powerful text processing features and can interpret a string of text as code.   interpreter. 
Part of Smiley's Perl code focused on setting up the infrastructure is included bellow
The setup includes:
The Coderack, which is the focus of a
This page describes the Copycat Coderack. 
The details of the codelet architecture are described. 
The specialized use of the Coderack by the adaptive web framework's (AWF) Smiley is discussed. 
The codelet scheduling mechanism is discussed. 
A variety of Smiley extensions to the Coderack are reviewed. 
The Coderack infrastructure functions are included. 
separate page
of the Perl frame then schedules and runs the codelets that are invoked by the test statement structures. 
Introduction
Testing provides a mechanism for
Plans change in complex adaptive systems (CAS) due to the action of genetic operations such as mutation, splitting and recombination.  The nature of the operations is described. 
genetic feedback
on the development process. 

If linked to the specification process testing can evaluate assertions is a hypothesis which can be tested and found to be true or false.  In the adaptive web framework's (AWF) Smiley assertion statements are used to define the test that will be applied by the application's codelets.  The statements must include schematic strings which can group complete and become associated with codelets.  Smileys own codelets: Coderack generated part and statement enforces the syntax of the assertion.  The specific form of the statements is defined in the application's Meta file.  Statement codelets also support the operation of the application's Shewhart cycle. 
relating the specification to the
This page discusses how a Smiley based application the event processor test program's operational phase is structured. 
The goals of the event processor test application are described. 
The implementation strategy is outlined. 
Synchronization of Smiley setup completion and operation phase initiation is discussed. 
The association of structural Workspaces for state representation is discussed. 
An application specific codelet merge streams assert responds to the nature of the assertion.  It does not have an emergent structure.  Instead it reflects software engineering practice.  It includes:
  • Merge stream case specific
    • Modeling with sub-programs
    • Resolving of case
  • Non case assertion
The operation is setup, inhibited, initiated, and managed by iterative phase check-pointing provided by Smiley codelets. 
Schematic synchronization of parallel codelet cascades is performed structurally. 
The assert merge operon cascade is included. 
The Slipnet concept network for merge streams is included. 
The codelets and supporting functions are included. 
execution
of the operational program.  The adaptive web framework test infrastructure Smiley (functions,
This presentation applies complex adaptive system (CAS) agents to computer programming. 
presentation
) is architected to do this. 

It is an
This page discusses the mechanisms and effects of emergence underpinning any complex adaptive system (CAS).  Key research is reviewed. 
emergent
Plans are interpreted and implemented by agents.  This page discusses the properties of agents in a complex adaptive system (CAS). 
It then presents examples of agents in different CAS.  The examples include a computer program where modeling and actions are performed by software agents.  These software agents are aggregates. 
The participation of agents in flows is introduced and some implications of this are outlined. 
agent-based
programming system.  It includes an implementation of Douglas Hofstadter and Melanie Mitchell's Copycat architecture.  Overall Smiley supports (+), implements and extends (*) the Copycat architecture with:
The ability to describe the execution of a program in terms of,
Plans emerge in complex adaptive systems (CAS) to provide the instructions that agents use to perform actions.  The component architecture and structure of the plans is reviewed. 
schematically
This page describes the Smiley infrastructure that supports the associative binding of schematic strings to codelets defined in the Meta file and Slipnet. 
The infrastructure supporting the associations is introduced. 
The role of Jeff Hawkins neocortical attributes is discussed. 
Relevant Slipnet configurations are included. 
The codelets and supporting functions are included. 
associated
, weighted
The agents in complex adaptive systems (CAS) must model their environment to respond effectively to it.  Samuel modeling is described as an approach. 
models
of its specification can be obtained via
This page discusses the interdependence of perception and representation in a complex adaptive system (CAS).  Hofstadter and Mitchell's research with Copycat is reviewed. 
perception and representation
.  If the program under test is similarly architected the testing can also leverage the operation's descriptions to evaluate 'white box' execution. 

Typical test schemata include awfart04 (which tests a simple verb replace), 05 (which tests a multi-part verb mreplace), 07 (which is badly structured and should fail) and 08 (which tests case, in a high level computing language a case, or switch, statement allows the specification of a series of alternative labeled items.  Any of these labels can be assigned to the case selector.  On entry to the case statement the compiler will allocate a jump to the item that is associated with a label that has the same value as is currently assigned to the case selector. 
selection assignment). 
 
 

AWF test art4
The art4 test statement shown following this description includes multiple parts:
The test framework should respond to this statement, decoding it's
This page introduces the many ways a complex modeling and coordination activity can be implemented using agent-based programming (see presentation). 

It describes how salient schematic alternative strings can be used to model a situation and make a decision under evolved control. 

It also introduces bottom up model codelets and complex techniques that are covered more fully on other pages. 

Constraints on the modeling process including requirements for timeliness, parallelism, synchronization and emergence of new models are discussed. 

Once a schematic sequence is selected by a group codelet or any additional type of modeling codelet the codelet will initiate an iterative cycle of detect, signal, match, deploy.  This allows the actions of a schematically selected sequence of model codelets to aggregate into a focused agent. 

A series of example signals sent by complex modeling codelets along with their associated operons and subgroup schematic sequences are included.  The signals are sent by the:
  • merge streams spdca builder - The initiator of merge streams's pdca cycle (see schematic pdca).
  • merge streams dcycip builder - The initiator of the planning phase of the merge streams's pdca cycle. 
  • merge streams cassert builder - The initiator of the mergestreams's case resolved assert true conditional cascade.  It is a structurally enhanced codelet which activates at the end of the 'do' phase and signals the nucleus. 
  • merge streams indsloc builder - The start locator codelet finds the application schemata's start operon
  • merge streams shsloc builder - A start locator codelet that finds an alternative start operon in the application schematic operon
  • merge streams rchpair builder - A receptor that detects and relays an application signal
  • pdca ecycdop builder - A cyclin simulation codelet which signals entry to the 'do' phase of the pdca. 
  • pdca acycchp builder - A cyclin simulation codelet which signals entry to the 'check' phase of the pdca. 
  • pdca bcycacp builder - A cyclin simulation codelet which signals entry to the 'act' phase of the pdca. 
And the Slipnet configuration which activates the schematic subgroup sequence <mergestreams> <for> <case> <resolved> <assert> <true> is included. 
parts
and then if it conforms to the
This page looks at how Smiley processes the statement, such as a test request, to ensure that the statement contains all required parts. 
Smiley does this through the operation of a statement codelet which indirectly sponsors the modeling of the whole statement. 
The modeling itself is performed by model codelets. 
The group models' Slipnet associations are included. 
The codelets and supporting functions are included. 
expected statement structure
,
This page looks at Smiley's statement codelet. 
What the codelet's goals are. 
The three aspects of its operations are described. 
The indirect nature of its support for the applications programs and Shewhart cycles are illustrated. 
It describes how the application codelets are inhibited from action until the Statement codelet concludes the application's assertion or implementation statement is viable.  An application assertion statement is described and the schematic string included. 
The statement codelet Perl and its support infrastructure are included. 
operating the statement
and thus initiating the test application executing first a
This page discusses how Smiley can support the start of the development phase of an agent-based application. 
Startup is an artificial operation not found in living systems.  But Smiley must do it and so we discuss an example of starting the development phase. 
With the Smiley infrastructure and the application integrated the application's development phase is reviewed.
The association of structural Workspaces for state representation is discussed. 
The aggregation of schematic associations of codelets defines a development agent.  At the application level it processes the application's schematic strings. 
The schematic nature of the data processed by the test application suggests the use of an indirect integration framework.  This supports the binding of codelets to the schematic data and detecting and responding to the control operons. 
An application polymerase complex emerges. 
The codelets and supporting functions are included. 
development codelet cascade
and then a
Walter Shewhart's iterative development process is found in many complex adaptive systems (CAS).  The mechanism is reviewed and its value in coping with random events is explained. 
Shewhart cycle
This page describes the specialized codelets that provide life-cycle and checkpoint capabilities for Smiley applications. 
The codelets implement a Shewhart cycle. 
The structural schematic nature of the cycle is described. 
Transcription factor codelets operate the phase change controls. 
How inhibitory agents are integrated into the cycle is described. 
An application agent with management and operational roles emerges. 
The codelets and supporting functions are included. 
managed
analysis of the direct and indirect details of the
This page discusses how a Smiley based application the event processor test program's operational phase is structured. 
The goals of the event processor test application are described. 
The implementation strategy is outlined. 
Synchronization of Smiley setup completion and operation phase initiation is discussed. 
The association of structural Workspaces for state representation is discussed. 
An application specific codelet merge streams assert responds to the nature of the assertion.  It does not have an emergent structure.  Instead it reflects software engineering practice.  It includes:
  • Merge stream case specific
    • Modeling with sub-programs
    • Resolving of case
  • Non case assertion
The operation is setup, inhibited, initiated, and managed by iterative phase check-pointing provided by Smiley codelets. 
Schematic synchronization of parallel codelet cascades is performed structurally. 
The assert merge operon cascade is included. 
The Slipnet concept network for merge streams is included. 
The codelets and supporting functions are included. 
assertion


 


<assert> <process> <rhlmsge> <merge> <streams> <file> </rhlmsge> <subject>
<rhlmsge> <merge> <file> <name> <equals> istrings/awfprogi[16].html</rhlmsge>
<rhlmsge> <ivariable> <name> <equals> <rhlwpbanner> "images/hill.gif"</rhlwpbanner> </rhlmsge> </subject> <verb>
<rhlmsge> <replaces> <subject> <resolved> <resource> <in> <target> <file> <stream> </rhlmsge> </verb> <object>
<rhlmsge> <source> <file> <stream> </rhlmsge>
<rhlmsge> <ivariable> <name> <equals> <rhlwpbannertp> </rhlmsge> </object>
<equals> <truthassertion> true</truthassertion> <development>
<rhlmsge> <develop> <lists> </rhlmsge> </development> <assume>
<rhlmsge> <referenced> <streams> <specified> <in> <merge> <stream> </rhlmsge> <and> <rhlmsge> <case> <selector> <is> li</rhlmsge> </assume> </assert> <comment> <br>





AWF test art5
The art5 test statement shown following this description includes multiple parts:
The test framework should respond to this statement, decoding it's
This page introduces the many ways a complex modeling and coordination activity can be implemented using agent-based programming (see presentation). 

It describes how salient schematic alternative strings can be used to model a situation and make a decision under evolved control. 

It also introduces bottom up model codelets and complex techniques that are covered more fully on other pages. 

Constraints on the modeling process including requirements for timeliness, parallelism, synchronization and emergence of new models are discussed. 

Once a schematic sequence is selected by a group codelet or any additional type of modeling codelet the codelet will initiate an iterative cycle of detect, signal, match, deploy.  This allows the actions of a schematically selected sequence of model codelets to aggregate into a focused agent. 

A series of example signals sent by complex modeling codelets along with their associated operons and subgroup schematic sequences are included.  The signals are sent by the:
  • merge streams spdca builder - The initiator of merge streams's pdca cycle (see schematic pdca).
  • merge streams dcycip builder - The initiator of the planning phase of the merge streams's pdca cycle. 
  • merge streams cassert builder - The initiator of the mergestreams's case resolved assert true conditional cascade.  It is a structurally enhanced codelet which activates at the end of the 'do' phase and signals the nucleus. 
  • merge streams indsloc builder - The start locator codelet finds the application schemata's start operon
  • merge streams shsloc builder - A start locator codelet that finds an alternative start operon in the application schematic operon
  • merge streams rchpair builder - A receptor that detects and relays an application signal
  • pdca ecycdop builder - A cyclin simulation codelet which signals entry to the 'do' phase of the pdca. 
  • pdca acycchp builder - A cyclin simulation codelet which signals entry to the 'check' phase of the pdca. 
  • pdca bcycacp builder - A cyclin simulation codelet which signals entry to the 'act' phase of the pdca. 
And the Slipnet configuration which activates the schematic subgroup sequence <mergestreams> <for> <case> <resolved> <assert> <true> is included. 
parts
and then if it conforms to the
This page looks at how Smiley processes the statement, such as a test request, to ensure that the statement contains all required parts. 
Smiley does this through the operation of a statement codelet which indirectly sponsors the modeling of the whole statement. 
The modeling itself is performed by model codelets. 
The group models' Slipnet associations are included. 
The codelets and supporting functions are included. 
expected statement structure
,
This page looks at Smiley's statement codelet. 
What the codelet's goals are. 
The three aspects of its operations are described. 
The indirect nature of its support for the applications programs and Shewhart cycles are illustrated. 
It describes how the application codelets are inhibited from action until the Statement codelet concludes the application's assertion or implementation statement is viable.  An application assertion statement is described and the schematic string included. 
The statement codelet Perl and its support infrastructure are included. 
operating the statement
and thus initiating the test application executing first a
This page discusses how Smiley can support the start of the development phase of an agent-based application. 
Startup is an artificial operation not found in living systems.  But Smiley must do it and so we discuss an example of starting the development phase. 
With the Smiley infrastructure and the application integrated the application's development phase is reviewed.
The association of structural Workspaces for state representation is discussed. 
The aggregation of schematic associations of codelets defines a development agent.  At the application level it processes the application's schematic strings. 
The schematic nature of the data processed by the test application suggests the use of an indirect integration framework.  This supports the binding of codelets to the schematic data and detecting and responding to the control operons. 
An application polymerase complex emerges. 
The codelets and supporting functions are included. 
development codelet cascade
and then a
Walter Shewhart's iterative development process is found in many complex adaptive systems (CAS).  The mechanism is reviewed and its value in coping with random events is explained. 
Shewhart cycle
This page describes the specialized codelets that provide life-cycle and checkpoint capabilities for Smiley applications. 
The codelets implement a Shewhart cycle. 
The structural schematic nature of the cycle is described. 
Transcription factor codelets operate the phase change controls. 
How inhibitory agents are integrated into the cycle is described. 
An application agent with management and operational roles emerges. 
The codelets and supporting functions are included. 
managed
analysis of the direct and indirect details of the
This page discusses how a Smiley based application the event processor test program's operational phase is structured. 
The goals of the event processor test application are described. 
The implementation strategy is outlined. 
Synchronization of Smiley setup completion and operation phase initiation is discussed. 
The association of structural Workspaces for state representation is discussed. 
An application specific codelet merge streams assert responds to the nature of the assertion.  It does not have an emergent structure.  Instead it reflects software engineering practice.  It includes:
  • Merge stream case specific
    • Modeling with sub-programs
    • Resolving of case
  • Non case assertion
The operation is setup, inhibited, initiated, and managed by iterative phase check-pointing provided by Smiley codelets. 
Schematic synchronization of parallel codelet cascades is performed structurally. 
The assert merge operon cascade is included. 
The Slipnet concept network for merge streams is included. 
The codelets and supporting functions are included. 
assertion


 



(<assert> <process> <merge>
<subject>
<rhlmsge> <merge> <file> <name> <equals> istrings/awfprogi[16].html</rhlmsge>
<rhlmsge> <ivariable> <name> <equals> <rhlwpsbel2> <rhllbname2spo> "lbheading"</rhllbname2spo> </rhlwpsbel2> </rhlmsge> </subject>
<verb>
<rhlmsge> <mreplaces> <subject> <resolved> <resource> <in> <target> <file> <stream> </rhlmsge> <rhlmsge> <for> <each> <typedinstance> #rhltlb2ls</rhlmsge> </verb>
<object>
<rhlmsge> <source> <file> <stream> </rhlmsge>
<rhlmsge> <ivariable> <name> <equals> <rhllbtartype> "lblist"</rhllbtartype> </rhlmsge> </object>
<equals> <truthassertion> true</truthassertion> <comment> test<ivariable> </comment> <development>
<rhlmsge> <develop> <lists> </rhlmsge> </development> <assume>
<rhlmsge> <referenced> <streams> <specified> <in> <merge> <stream> </rhlmsge> <and> <rhlmsge> <case> <selector> <is> li</rhlmsge> </assume> </assert> <br> )<comment>





AWF test art7
The art7 test statement shown following this description does not conform to the required statement structure:
The test framework should respond to this statement, decoding it's
This page introduces the many ways a complex modeling and coordination activity can be implemented using agent-based programming (see presentation). 

It describes how salient schematic alternative strings can be used to model a situation and make a decision under evolved control. 

It also introduces bottom up model codelets and complex techniques that are covered more fully on other pages. 

Constraints on the modeling process including requirements for timeliness, parallelism, synchronization and emergence of new models are discussed. 

Once a schematic sequence is selected by a group codelet or any additional type of modeling codelet the codelet will initiate an iterative cycle of detect, signal, match, deploy.  This allows the actions of a schematically selected sequence of model codelets to aggregate into a focused agent. 

A series of example signals sent by complex modeling codelets along with their associated operons and subgroup schematic sequences are included.  The signals are sent by the:
  • merge streams spdca builder - The initiator of merge streams's pdca cycle (see schematic pdca).
  • merge streams dcycip builder - The initiator of the planning phase of the merge streams's pdca cycle. 
  • merge streams cassert builder - The initiator of the mergestreams's case resolved assert true conditional cascade.  It is a structurally enhanced codelet which activates at the end of the 'do' phase and signals the nucleus. 
  • merge streams indsloc builder - The start locator codelet finds the application schemata's start operon
  • merge streams shsloc builder - A start locator codelet that finds an alternative start operon in the application schematic operon
  • merge streams rchpair builder - A receptor that detects and relays an application signal
  • pdca ecycdop builder - A cyclin simulation codelet which signals entry to the 'do' phase of the pdca. 
  • pdca acycchp builder - A cyclin simulation codelet which signals entry to the 'check' phase of the pdca. 
  • pdca bcycacp builder - A cyclin simulation codelet which signals entry to the 'act' phase of the pdca. 
And the Slipnet configuration which activates the schematic subgroup sequence <mergestreams> <for> <case> <resolved> <assert> <true> is included. 
parts
and then rejecting it

 


<assert>
<equals> <truthassertion> true</truthassertion> </assert> <comment>





AWF test art8
The art8 test statement shown following this description includes multiple parts:
The test framework should respond to this statement, decoding it's
This page introduces the many ways a complex modeling and coordination activity can be implemented using agent-based programming (see presentation). 

It describes how salient schematic alternative strings can be used to model a situation and make a decision under evolved control. 

It also introduces bottom up model codelets and complex techniques that are covered more fully on other pages. 

Constraints on the modeling process including requirements for timeliness, parallelism, synchronization and emergence of new models are discussed. 

Once a schematic sequence is selected by a group codelet or any additional type of modeling codelet the codelet will initiate an iterative cycle of detect, signal, match, deploy.  This allows the actions of a schematically selected sequence of model codelets to aggregate into a focused agent. 

A series of example signals sent by complex modeling codelets along with their associated operons and subgroup schematic sequences are included.  The signals are sent by the:
  • merge streams spdca builder - The initiator of merge streams's pdca cycle (see schematic pdca).
  • merge streams dcycip builder - The initiator of the planning phase of the merge streams's pdca cycle. 
  • merge streams cassert builder - The initiator of the mergestreams's case resolved assert true conditional cascade.  It is a structurally enhanced codelet which activates at the end of the 'do' phase and signals the nucleus. 
  • merge streams indsloc builder - The start locator codelet finds the application schemata's start operon
  • merge streams shsloc builder - A start locator codelet that finds an alternative start operon in the application schematic operon
  • merge streams rchpair builder - A receptor that detects and relays an application signal
  • pdca ecycdop builder - A cyclin simulation codelet which signals entry to the 'do' phase of the pdca. 
  • pdca acycchp builder - A cyclin simulation codelet which signals entry to the 'check' phase of the pdca. 
  • pdca bcycacp builder - A cyclin simulation codelet which signals entry to the 'act' phase of the pdca. 
And the Slipnet configuration which activates the schematic subgroup sequence <mergestreams> <for> <case> <resolved> <assert> <true> is included. 
parts
and then if it conforms to the
This page looks at how Smiley processes the statement, such as a test request, to ensure that the statement contains all required parts. 
Smiley does this through the operation of a statement codelet which indirectly sponsors the modeling of the whole statement. 
The modeling itself is performed by model codelets. 
The group models' Slipnet associations are included. 
The codelets and supporting functions are included. 
expected statement structure
,
This page looks at Smiley's statement codelet. 
What the codelet's goals are. 
The three aspects of its operations are described. 
The indirect nature of its support for the applications programs and Shewhart cycles are illustrated. 
It describes how the application codelets are inhibited from action until the Statement codelet concludes the application's assertion or implementation statement is viable.  An application assertion statement is described and the schematic string included. 
The statement codelet Perl and its support infrastructure are included. 
operating the statement
and thus initiating the test application executing first a
This page discusses how Smiley can support the start of the development phase of an agent-based application. 
Startup is an artificial operation not found in living systems.  But Smiley must do it and so we discuss an example of starting the development phase. 
With the Smiley infrastructure and the application integrated the application's development phase is reviewed.
The association of structural Workspaces for state representation is discussed. 
The aggregation of schematic associations of codelets defines a development agent.  At the application level it processes the application's schematic strings. 
The schematic nature of the data processed by the test application suggests the use of an indirect integration framework.  This supports the binding of codelets to the schematic data and detecting and responding to the control operons. 
An application polymerase complex emerges. 
The codelets and supporting functions are included. 
development codelet cascade
and then a
Walter Shewhart's iterative development process is found in many complex adaptive systems (CAS).  The mechanism is reviewed and its value in coping with random events is explained. 
Shewhart cycle
This page describes the specialized codelets that provide life-cycle and checkpoint capabilities for Smiley applications. 
The codelets implement a Shewhart cycle. 
The structural schematic nature of the cycle is described. 
Transcription factor codelets operate the phase change controls. 
How inhibitory agents are integrated into the cycle is described. 
An application agent with management and operational roles emerges. 
The codelets and supporting functions are included. 
managed
analysis of the direct and indirect details of the
This page discusses how a Smiley based application the event processor test program's operational phase is structured. 
The goals of the event processor test application are described. 
The implementation strategy is outlined. 
Synchronization of Smiley setup completion and operation phase initiation is discussed. 
The association of structural Workspaces for state representation is discussed. 
An application specific codelet merge streams assert responds to the nature of the assertion.  It does not have an emergent structure.  Instead it reflects software engineering practice.  It includes:
  • Merge stream case specific
    • Modeling with sub-programs
    • Resolving of case
  • Non case assertion
The operation is setup, inhibited, initiated, and managed by iterative phase check-pointing provided by Smiley codelets. 
Schematic synchronization of parallel codelet cascades is performed structurally. 
The assert merge operon cascade is included. 
The Slipnet concept network for merge streams is included. 
The codelets and supporting functions are included. 
assertion


 



<assert> <process> <deploy> <case> <subject>
<rhlmsge> <case> <selector> <equals> <rhltcasenamelspo> "li"</rhltcasenamelspo> </rhlmsge> </subject> <verb>
<rhlmsge> <deploy> <subject> <in> <case> <type> <list> lbcase1</rhlmsge> </verb> <object>
<rhlmsge> <merge> <file> <name> <equals> istrings/awfprogi[16].html</rhlmsge> </object>
<equals> <truthassertion> true</truthassertion> <development>
<rhlmsge> <develop> <lists> </rhlmsge> </development> <assume>
<rhlmsge> <referenced> <streams> <specified> <in> <merge> <stream> </rhlmsge> </rhlmsge> </assume> </assert> <comment> <br>


Functions

my (@wspace, @file, $j, $restoring, $frecs, $sgmrecs, $inmfdt, $kwl, $kwai, $kwar, $kwp, $kwpr, $setwsclinv, $metaname);

use Awfif;
#use lib "scripts/Awfif.pm";

# --------------------------------------------------------
#<!-- start tag sl -->

sub initchemistry {
    my ($kwp, $kwpr, $sactset, $csset, $strset, $restoring) = @_;
# cssetlist

    @$csset = qw (
    zero destructionscout destructionevaluator destructionbuilder tmodelscout modelevaluator modelbuilder tgoalscout goalevaluator goalbuilder tdescscout descscout descevaluator descbuilder relevaluator relbuilder tbondscout bondscout bondevaluator
    bondbuilder tgroupscout groupscout groupevaluator groupbuilder tnuclabgscout nuclabgevaluator nuclabgbuilder tnuclabmscout nuclabmevaluator nuclabmbuilder tnsdepscout nsdepevaluator nsdepbuilder
    lbevaluator lbbuilder lbinhibitor libevaluator libbuilder drevaluator drbuilder dcnevaluator dcnbuilder misevaluator misbuilder mkwevaluator mkwbuilder mkwinspector miforallevaluator miforallbuilder miforallinspector mittarevaluator mittarbuilder
    miterevaluator miterbuilder dassgevaluator dassgbuilder dassginspector dascgevaluator dascgbuilder dascginspector casesaevaluator casesabuilder casesainspector partscout partevaluator partbuilder
    msalthrevaluator msalthrbuilder mgpartevaluator mgpartbuilder msormevaluator msormbuilder tpmmanscout pmmanevaluator pmmanbuilder pmmaninspector mresddrevaluator mresddrbuilder mresadrevaluator mresadrbuilder mcssubevaluator mcssubbuilder
    mcsobevaluator mcsobbuilder mactsverbevaluator mactsverbbuilder mactcverbevaluator mactcverbbuilder
    mmcrevaluator mmcrbuilder mmctevaluator mmctbuilder mmcvevaluator mmcvbuilder
    mcspevaluator mcspbuilder mcvpevaluator mcvpbuilder mcopevaluator mcopbuilder mviintevaluator mviintbuilder tcasescout tstreamscout mwstaevaluator mwstabuilder mwstdevaluator mwstdbuilder
    statementscout statementevaluator statementbuilder devevaluator devbuilder devinhibitor devinspector schbindevaluator schbindbuilder
    slocevaluator slocbuilder slistkwevaluator slistkwbuilder namestevaluator namestbuilder skipwsoevaluator skipwsobuilder srcdkwevaluator srcdkwbuilder seltstevaluator seltstbuilder endrcdkwevaluator endrcdkwbuilder
    endlistkwevaluator endlistkwbuilder unbindevaluator unbindbuilder
    msiopevaluator msiopbuilder msiopinhibitor msaoevaluator msaobuilder
    initpdcaevaluator initpdcabuilder initpdcascevaluator initpdcascbuilder dcycipevaluator dcycipbuilder dcyctpevaluator dcyctpbuilder spdcaevaluator spdcabuilder spdcascevaluator spdcascbuilder ecycdopevaluator ecycdopbuilder acycchpevaluator acycchpbuilder bcycacpevaluator bcycacpbuilder e2ftfevaluator e2ftfbuilder prbevaluator prbbuilder
    invsupevaluator invsupbuilder invmodevaluator invmodbuilder
    icompdevaluator icompdbuilder
    ivalwevaluator ivalwbuilder
    bcsubpcevaluator bcsubpcbuilder bcsubpsevaluator bcsubpsbuilder itargevaluator itargbuilder acsaoevaluator acsaobuilder
    cbodyevaluator cbodybuilder crsmevaluator crsmbuilder crsmoxevaluator crsmoxbuilder crsmofevaluator crsmofbuilder crsmoievaluator crsmoibuilder crsmoeievaluator crsmoeibuilder crsmoeevaluator crsmoebuilder crsmomevaluator crsmombuilder crsmomeevaluator crsmomebuilder
    uwarsevaluator uwarsbuilder
    msadobevaluator msadobbuilder dcrdoinitevaluator dcrdoinitbuilder dcrdoslistevaluator dcrdoslistbuilder
    dcrdononrecevaluator dcrdononrecbuilder dcrdoncasedescevaluator dcrdoncasedescbuilder dcrdocasedescevaluator dcrdocasedescbuilder dcrdogowithinevaluator dcrdogowithinbuilder dcrdosrecordevaluator dcrdosrecordbuilder dcrdowarsevaluator dcrdowarsbuilder csresevaluator csresbuilder
    desrasstevaluator desrasstbuilder lbstreamevaluator lbstreambuilder lbstreamcompevaluator lbstreamcompbuilder cassertevaluator cassertbuilder stbindevaluator stbindbuilder indslocevaluator indslocbuilder shslocevaluator shslocbuilder
    rchpairevaluator rchpairbuilder rchpintevaluator rchpintbuilder ripkwmevaluator ripkwmbuilder rpkwmintevaluator rpkwmintbuilder mdvevaluator mdvbuilder mdvinspector
    rttrans01evaluator rttrans01builder rttrans01revaluator rttrans01rbuilder
    devpcellevaluator devpcellbuilder devscellevaluator devscellbuilder devscwldevaluator devscwldbuilder devsccnsevaluator devsccnsbuilder
    vbtmressevaluator vbtmressbuilder vbtmresoevaluator vbtmresobuilder vbtmsormevaluator vbtmsormbuilder vbtmactsverbevaluator vbtmactsverbbuilder vbtmcspevaluator vbtmcspbuilder vbtmcopevaluator vbtmcopbuilder vbtmcvpevaluator vbtmcvpbuilder
    vbtdevevaluator vbtdevbuilder vbtdevinhibitor vbtdevinspector devbtwldevaluator devbtwldbuilder devbtcnsevaluator devbtcnsbuilder vbtiopevaluator vbtiopbuilder vbtiopinhibitor vbttmevaluator vbttmbuilder vbttmorevbevaluator vbttmorevbbuilder vbttmoretsevaluator vbttmoretsbuilder vbttmoregsevaluator vbttmoregsbuilder
    vbttom00ncevaluator vbttom00ncbuilder vbttom0recevaluator vbttom0recbuilder vbttom00c00evaluator vbttom00c00builder vbttom00c01evaluator vbttom00c01builder vbttom00c10evaluator vbttom00c10builder vbttom00c10c00evaluator vbttom00c10c00builder vbttom00c00c01evaluator vbttom00c00c01builder vbttom00c10c01evaluator vbttom00c10c01builder vbttom00c10c01c00evaluator vbttom00c10c01c00builder
    vbttom01ncevaluator vbttom01ncbuilder vbttom01c00evaluator vbttom01c00builder vbttom01c00c01evaluator vbttom01c00c01builder vbttom01c00c01c11evaluator vbttom01c00c01c11builder vbttom01c00c11evaluator vbttom01c00c11builder vbttom01c00c01c02evaluator vbttom01c00c01c02builder vbttom01c01evaluator vbttom01c01builder vbttom01c11evaluator vbttom01c11builder vbttom01c01c11evaluator vbttom01c01c11builder vbttom01c00c11c02evaluator vbttom01c00c11c02builder vbttom01c01c11c02evaluator vbttom01c01c11c02builder vbttom01c00c01c11c02evaluator vbttom01c00c01c11c02builder vbttom01c02evaluator vbttom01c02builder vbttom01c00c02evaluator vbttom01c00c02builder vbttom01c01c02evaluator vbttom01c01c02builder vbttom01c11c02evaluator vbttom01c11c02builder
    vbttom09ncevaluator vbttom09ncbuilder vbttom09c09evaluator vbttom09c09builder vbttom09c08evaluator vbttom09c08builder vbttom09c19evaluator vbttom09c19builder vbttom09c19c09evaluator vbttom09c19c09builder vbttom09c09c08evaluator vbttom09c09c08builder vbttom09c19c08evaluator vbttom09c19c08builder vbttom09c19c08c09evaluator vbttom09c19c08c09builder
    vbttom19ncevaluator vbttom19ncbuilder vbttom19c09evaluator vbttom19c09builder vbttom19c09c19evaluator vbttom19c09c19builder vbttom19c09c19c18evaluator vbttom19c09c19c18builder vbttom19c09c18evaluator vbttom19c09c18builder vbttom19c09c19c29evaluator vbttom19c09c19c29builder vbttom19c19evaluator vbttom19c19builder vbttom19c18evaluator vbttom19c18builder vbttom19c19c18evaluator vbttom19c19c18builder vbttom19c09c18c29evaluator vbttom19c09c18c29builder vbttom19c19c18c29evaluator vbttom19c19c18c29builder vbttom19c09c19c18c29evaluator vbttom19c09c19c18c29builder vbttom19c29evaluator vbttom19c29builder vbttom19c09c29evaluator vbttom19c09c29builder vbttom19c19c29evaluator vbttom19c19c29builder vbttom19c18c29evaluator vbttom19c18c29builder
    vbttom99ncevaluator vbttom99ncbuilder vbttom99c99evaluator vbttom99c99builder vbttom99c98evaluator vbttom99c98builder vbttom99c89evaluator vbttom99c89builder vbttom99c89c99evaluator vbttom99c89c99builder vbttom99c99c98evaluator vbttom99c99c98builder vbttom99c89c98evaluator vbttom99c89c98builder vbttom99c89c98c99evaluator vbttom99c89c98c99builder
    vbttom98ncevaluator vbttom98ncbuilder vbttom98c99evaluator vbttom98c99builder vbttom98c99c98evaluator vbttom98c99c98builder vbttom98c99c98c88evaluator vbttom98c99c98c88builder vbttom98c99c88evaluator vbttom98c99c88builder vbttom98c99c98c97evaluator vbttom98c99c98c97builder vbttom98c98evaluator vbttom98c98builder vbttom98c88evaluator vbttom98c88builder vbttom98c98c88evaluator vbttom98c98c88builder vbttom98c99c88c97evaluator vbttom98c99c88c97builder vbttom98c98c88c97evaluator vbttom98c98c88c97builder vbttom98c99c98c88c97evaluator vbttom98c99c98c88c97builder vbttom98c97evaluator vbttom98c97builder vbttom98c99c97evaluator vbttom98c99c97builder vbttom98c98c97evaluator vbttom98c98c97builder vbttom98c88c97evaluator vbttom98c88c97builder
    vbttom90ncevaluator vbttom90ncbuilder vbttom90c90evaluator vbttom90c90builder vbttom90c91evaluator vbttom90c91builder vbttom90c80evaluator vbttom90c80builder vbttom90c80c90evaluator vbttom90c80c90builder vbttom90c90c91evaluator vbttom90c90c91builder vbttom90c80c91evaluator vbttom90c80c91builder vbttom90c80c91c90evaluator vbttom90c80c91c90builder
    vbttom10ncevaluator vbttom10ncbuilder vbttom10c20evaluator vbttom10c20builder vbttom10c20c10evaluator vbttom10c20c10builder vbttom10c20c10c11evaluator vbttom10c20c10c11builder vbttom10c20c11evaluator vbttom10c20c11builder vbttom10c20c10c00evaluator vbttom10c20c10c00builder vbttom10c10evaluator vbttom10c10builder vbttom10c11evaluator vbttom10c11builder vbttom10c10c11evaluator vbttom10c10c11builder vbttom10c20c11c00evaluator vbttom10c20c11c00builder vbttom10c10c11c00evaluator vbttom10c10c11c00builder vbttom10c20c10c11c00evaluator vbttom10c20c10c11c00builder vbttom10c00evaluator vbttom10c00builder vbttom10c20c00evaluator vbttom10c20c00builder vbttom10c10c00evaluator vbttom10c10c00builder vbttom10c11c00evaluator vbttom10c11c00builder
    vbttom11ncevaluator vbttom11ncbuilder vbttom11c21evaluator vbttom11c21builder vbttom11c21c11evaluator vbttom11c21c11builder vbttom11c21c11c12evaluator vbttom11c21c11c12builder vbttom11c21c12evaluator vbttom11c21c12builder vbttom11c21c11c01evaluator vbttom11c21c11c01builder vbttom11c11evaluator vbttom11c11builder vbttom11c12evaluator vbttom11c12builder vbttom11c11c12evaluator vbttom11c11c12builder vbttom11c21c12c01evaluator vbttom11c21c12c01builder vbttom11c11c12c01evaluator vbttom11c11c12c01builder vbttom11c21c11c12c01evaluator vbttom11c21c11c12c01builder vbttom11c01evaluator vbttom11c01builder vbttom11c21c01evaluator vbttom11c21c01builder vbttom11c11c01evaluator vbttom11c11c01builder vbttom11c12c01evaluator vbttom11c12c01builder
    vbttom11c10evaluator vbttom11c10builder vbttom11c21c10evaluator vbttom11c21c10builder vbttom11c21c11c10evaluator vbttom11c21c11c10builder vbttom11c21c11c12c10evaluator vbttom11c21c11c12c10builder vbttom11c21c12c10evaluator vbttom11c21c12c10builder vbttom11c21c11c01c10evaluator vbttom11c21c11c01c10builder vbttom11c11c10evaluator vbttom11c11c10builder vbttom11c12c10evaluator vbttom11c12c10builder vbttom11c11c12c10evaluator vbttom11c11c12c10builder vbttom11c21c12c01c10evaluator vbttom11c21c12c01c10builder vbttom11c11c12c01c10evaluator vbttom11c11c12c01c10builder vbttom11c21c11c12c01c10evaluator vbttom11c21c11c12c01c10builder vbttom11c01c10evaluator vbttom11c01c10builder vbttom11c21c01c10evaluator vbttom11c21c01c10builder vbttom11c11c01c10evaluator vbttom11c11c01c10builder vbttom11c12c01c10evaluator vbttom11c12c01c10builder
    vbttoamnevaluator vbttoamnbuilder vbttoamsevaluator vbttoamsbuilder vbttoameevaluator vbttoamebuilder vbttoamwevaluator vbttoamwbuilder vbttoamrevaluator vbttoamrbuilder vbttoapcevaluator vbttoapcbuilder
    );
# replace the initial description strings in the workspace objects with links
# again with kwp being an absolute index into wso and an index into keywordl this
# exposes the initial absolute addressing scheme of the wsos

    &Awfif::isfcache ();
    &energizechem (2, '', $kwp, $kwpr,\@{$Awfif::memes-> {sactset}});
    &Awfif::genmsnnsl (2 , $Awfif::memes-> {snnh} {groupedcategory});
    &Awfif::genmsnnsl (2 , $Awfif::memes-> {snnh} {bondededcategory});
    } # initchemistry
#
#<!-- start tag ca -->
#
sub energizechem {
    my ($ws, $newform, $kwp, $kwpr, $sactset) = @_;
    my ($i, $i2, $fromarrayp);

    for ($i=$kwpr;$i<$kwp;$i++) {
# all objects should have at least one descriptor - but ....
      if ($Awfif::wsol-> {l}[$i][3]>0) {# at least one descriptor for this object

        $fromarrayp = $Awfif::wsol-> {l}[$i][2];
        $Awfif::wsol-> {l}[$i][2] =
          Awfif::newsnlink ($Awfif::memes-> {snnh} {wsil},#type
            $Awfif::memes-> {snnh} {$Awfif::symbolsets-> {imeta}{$Awfif::memes-> {keywordl}[$fromarrayp]}},#too
# more direct is ... $Awfif::memes-> {snnh} {$Awfif::wsol-> {l}[$i][4],
            $Awfif::memes-> {snnh} {wsi},#from
            0,#froml
            \$Awfif::workspace);
        };#original form
# provide some activation of the linked to items

      if (($newform) or ($Awfif::wsol-> {l}[$i][3]>0)) {# at least one descriptor for this object
        if ((Awfif::wsbasetype( Awfif::grwsoadr ($i)) > 0) && (Awfif::wsbasetype( Awfif::grwsoadr ($i)) == $Awfif::workspace-> {l}[$Awfif::wsol-> {l}[$i][2]][2]) && ($Awfif::memes-> {snw} [$Awfif::memes-> {currentwsbi}]-> {snnl}[Awfif::wsbasetype( Awfif::grwsoadr ($i))] > 0) ){#activate the base type

          &Awfif::setinhib ($Awfif::workspace-> {l}[$Awfif::wsol-> {l}[$i] [2]] [2], 0);#these base nodes wont become fatigued in the initial phase
          $Awfif::memes->{snw} [$Awfif::memes-> {currentwsbi}]-> {snnaf} {$Awfif::memes-> {snnih} {$Awfif::workspace-> {l}[$Awfif::wsol-> {l} [$i] [2]] [2]}} = 0;#remove any fatigue
          &Awfif::actnodes ($Awfif::workspace-> {l}[$Awfif::wsol-> {l}[$i] [2]] [2],$Awfif::memes-> {descato});
          };#found basetype
        };#if

      if ($Awfif::wsol-> {l} [$i] [3] > 0) {# at least one descriptor for this object
        for ($i2 = 1;$i2 < $Awfif::wsol-> {l} [$i] [3]; $i2++) {
          $Awfif::wsol-> {l}[$i][2] =
            Awfif::newsnlink ($Awfif::memes-> {snnh} {wsil},
              $Awfif::memes-> {snnh} {$Awfif::symbolsets-> {imeta}{$Awfif::memes-> {keywordl}[$fromarrayp+$i2]}},
              $Awfif::memes-> {snnh} {wsi},
              $Awfif::wsol-> {l} [$i] [2],
              \$Awfif::workspace);
# provide some activation of the linked to items
          if ((Awfif::wsbasetype( Awfif::grwsoadr ($i)) == $Awfif::workspace-> {l} [$Awfif::wsol-> {l}[$i] [2]] [2]) && ($Awfif::memes-> {snw} [$Awfif::memes-> {currentwsbi}]-> {snnl}[Awfif::wsbasetype( Awfif::grwsoadr ($i))] > 0)) {#activate the base type
            &Awfif::setinhib ($Awfif::workspace-> {l}[$Awfif::wsol-> {l}[$i] [2]][2],0);#these base nodes wont become fatigued in the initial phase
            $Awfif::memes->{snw} [$Awfif::memes-> {currentwsbi}]-> {snnaf} {$Awfif::memes-> {snnih}{$Awfif::workspace-> {l}[$Awfif::wsol-> {l}[$i][2]][2]}} = 0;#remove any fatigue
            &Awfif::actnodes ($Awfif::workspace-> {l} [$Awfif::wsol-> {l}[$i][2]] [2],$Awfif::memes-> {descato});
            };#activated basetype
#
          }# replace the descriptor string with link
        }# there are descriptors to transform
# if the keyword has a verb half relation turn it into a set of workspace descriptor links

      if ( (Awfif::checkwsmd (Awfif::awsoadr ($i), $Awfif::memes-> {wsopkpos}) != 0)
      ){

        $Awfif::wsol-> {l}[$i][2] =
          Awfif::newsnlink ($Awfif::memes-> {snnh} {verb},
            Awfif::checkwsmd (Awfif::awsoadr ($i), $Awfif::memes-> {wsopkpos}),
            $Awfif::memes-> {snnh} {associative},
            $Awfif::wsol-> {l} [$i] [2],
            \$Awfif::workspace);

        $Awfif::wsol-> {l}[$i][2] =
          Awfif::newsnlink ($Awfif::memes-> {snnh} {partnerswsi},
            ($Awfif::memes-> {snnh} {Awfif::checkwsmd ($i, $Awfif::memes-> {wsopkwsi})} + $Awfif::memes-> {snnh} {wsi}),
            $Awfif::memes-> {snnh} {verb},
            $Awfif::wsol-> {l} [$i] [2],
            \$Awfif::workspace);

        $Awfif::wsol-> {l}[$i][2] =
          Awfif::newsnlink ($Awfif::memes-> {snnh} {workspacebi},
            ($Awfif::memes-> {snnh} {Awfif::checkwsmd ($i, $Awfif::memes-> {wsocbegins})} + $Awfif::memes-> {snnh} {wsi}),
            $Awfif::memes-> {snnh} {verb},
            $Awfif::wsol-> {l} [$i] [2],
            \$Awfif::workspace);
        }# there is a verb half relation to transform
      }#walk each object in the initial workspace
#
# submit initial bottom up codelets to the coderack

    for ($i = 1;$i <= 20; $i++) {
      my ($dummy);
      $dummy = $i;
      $Awfif::clp = ();
      $Awfif::clp-> {urgency} = 2;
      $Awfif::clp-> {wsi} = $ws;#initial workspace
      $Awfif::clp-> {strategy} = "descscout";
      &Awfif::submitcodelet ($dummy,\$Awfif::clp);
      };# for
#
    for my $act (@$sactset) {
# now can initialise the salience cache
      my($link);
      $link = $Awfif::memes->{snw} [$Awfif::memes-> {currentwsbi}]-> {snnl}[$Awfif::memes-> {snnh} {$act}];
      while ($link != 0) {

        &Awfif::setcache ('budescl', $Awfif::memes->{snnh} {$act}, $link, undef(), $Awfif::memes-> {snlcvalid}, 0);
        &Awfif::setcache ('tddescl', $Awfif::memes->{snnh} {$act}, $link, undef(), $Awfif::memes-> {snlcvalid}, 0);
# and the matchtree cache

        $link = $Awfif::slipnet-> {l} [$link][0];
        }#while
      };# for each concept
    } # energizechem
#
#<!-- end tag ca -->
#<!-- end tag sl -->
#
sub setupkw {
#<!-- start tag ws -->
# Keywords are chained together by their list heads; The end of the list is a sentinel
# The head of an active list entry will be the list index of the next entry in the list
# With the hash the list can be entered at one sentinel.
# The head is setup for an easy add of a new element
# memes->{wsobjectl} => wsol->{l}
# wsol-> {l} [$i][0] is backward link
# wsol-> {l} [$i][1] is forward link
# wsol-> {l} [$i][2] is index of first perception descriptor
# wsol-> {l} [$i][3] is number of descriptors
# wsol-> {l} [$i][4] is the keyword in first element
# wsol-> {l} [$i][5] is the instantaneous mean activation (5+6 = salience)
# wsol-> {l} [$i][6] is the instantaneous unhappiness
# wsol-> {l} [$i][7] is the instantaneous strength
# wsol-> {l} [$i][8] is the head log items index or 0 if none
# wsol-> {l} [$i][9] is the access count element items index or 0 if none
# wsol-> {l} [$i][10] is the log usage count: log will write if value is > 0
# wsol-> {l} [$i][11] is the wsbasetype if setup
# wsol-> {l} [$i][12] is the wsbaseind if setup
# gccache
# wsol-> {l} [$i][13] is the completed wsgroups sponsor if setup
# wsol-> {l} [$i][14] is previous logical workspace object
# wsol-> {l} [$i][15] points to the base and offset of the workspace in wsbl
# wsol-> {l} [$i][16] is the next logical workspace object
# wsol-> {l} [$i][17] is [0] the keyword backward links wsi
# wsol-> {l} [$i][18] is [1] the keyword forward links wsi
# wsol-> {l} [$i][19] is primary keyword position in metafile
# wsol-> {l} [$i][20] is primary keyword wsi
# wsol-> {l} [$i][21] is count of begins that wso is within scope
# wsol-> {l} [$i][22] is count of starts that wso is within scope
# wsolfbv
# wsol-> {l} [$i][23] is itstrengths value
# wsol-> {l} [$i][26] is link address of 'single' group descriptor (fgrpd)
# tdgroupdcache
# wsol-> {l} [$i][25] is cache value for tdgroup1
# wsol-> {l} [$i][27] is cache value for tdbond1
# wsol-> {l} [$i][28] is cache value for bugroup1
# wsol-> {l} [$i][29] is isterminated cache if present
# wsol-> {l} [$i][30] is bindtoinspector cache if present
# wsol-> {l} [$i][31] is bustatement cache if present
# wsol-> {l} [$i][32] is namespace (operon|stbinding) relative jhlsoi set in deploymd & groupbuilder when deploys completed group and matches jhlabels
# wsol-> {l} [$i][33] is histone binding ptr if present and non-zero
# wsol-> {l} [$i][34] is jhlsi for groupcomplete sponsor wso
#
# wsol-> {fbs} [$i][23 - 23] 't==2' is record of descriptor update (strength)
# wsol-> {fbs} [$i][24 - 23] 't==2' is record of descriptor update (unhappiness)
# wsol-> {fbs} [$i][25 - 23] 't==2' is record of descriptor update (tdgroup1)
# wsol-> {fbs} [$i][27 - 23] 't==2' is record of descriptor update (tdbond1:strocc)
# wsol-> {fbs} [$i][28 - 23] 't==2' is record of descriptor update (bugroup1)
#
#
#
#<!-- end tag ws -->
    $Awfif::memes-> {maxwsoitems} = 8;
#

    my ($keyword, $at1, $at2, $at3, $at4, $at5, $at6, $at7, $at8, $at9, $kwai, $kwl, $kwp, $wsbao) = @_;# note at1-9 are used directly in caller but indirectly here
    my ($akwp, $rkwp, $link, $cwsi, $i, $name);
    if ($Awfif::memes-> {trace} > $Awfif::memes-> {traceentry}) {
      print ("setupkw keyword($keyword) at1($at1) at2($at2) at3($at3) at4($at4) at5($at5) at6($at6) at7($at7) at8($at8) at9($at9) kwai($kwai) kwl($kwl) kwp($kwp) wsbao($wsbao) ");
      };
# should have $$kwp as a relative quantity but it is also used to address keyword array absolutely
    $cwsi = $Awfif::memes-> {currentwsbi};# to later restore current state
    $rkwp = $$kwp
      - $Awfif::wsbl-> {l}[$Awfif::memes-> {currentwsbi}][2] #base
      - $Awfif::wsbl-> {l}[$Awfif::memes-> {currentwsbi}][3]; #offset
    if (($keyword ne '')) {
      if ($keyword =~ /^#/) {#reference to a keyword
# record the keyword since it will be the hash for the hname

        $keyword =~/^#(\w+)?/;
        $name = $1;
        }#if #keyword
      else {
        $name = $keyword;
        };#else
      if ($Awfif::memes-> {hname}{$name} eq '') {#
        $Awfif::memes-> {hrefwsl}{$name} = Awfif::addhnref ($name, 0);
        $Awfif::memes-> {hname}{$name} = $rkwp;
        }
      else {
        $Awfif::memes-> {hrefwsl}{$name} = Awfif::addhnref ($name, $Awfif::memes-> {hrefwsl}{$name});
        };
      $Awfif::hnamel-> {l} [$Awfif::memes-> {hrefwsl}{$name}] [5] = $rkwp;
      $Awfif::hnamel-> {l} [$Awfif::memes-> {hrefwsl}{$name}] [6] = $Awfif::memes->{currentwsbi};

      $link = Awfif::addwsoli (\$Awfif::wsol);#keep data structures alligned
      $akwp = Awfif::awsoadr ($rkwp);
# $link should be the same as $rkwp
      if ($$kwl == 0) {
        &recordkw ($name, $$kwai, $akwp, $rkwp);#
        $Awfif::wsol-> {l} [$akwp] [3] = $$kwai;# count will be inc value - this
        }
      else {# keyword list already started

        &recordkw ($name, $$kwl, $akwp, $rkwp);#
        $Awfif::wsol-> {l} [$akwp] [3] = $$kwai;# count will be inc value - this
        };

      $$kwl = 0;
# in the initialization it seems safe to assume that the wso are linear
      if (Awfif::checkwsmd ($akwp-1, $Awfif::memes-> {wsowsi}) != $wsbao) {
        &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsoprev}, 0);#sentinal
        }
      else {#normal case
        &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsoprev}, $rkwp - 1);#sentinal
        &Awfif::setwsmd ($akwp - 1, $Awfif::memes-> {wsonext}, $rkwp);#sentinal
        };
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsonext}, 0);#sentinal
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsowsi}, $wsbao);
      }
    else {# waiting for keyword so remember the starting kwai

      if ($$kwl == 0) {#new keyword instance so record the starting at index

        $$kwl = $$kwai;
        };
      };
    for ($i = 1; $i <= 9; $i++) {#assumes the tokens are in params 1 to 9
      if ($_[$i] ne "") {

        $Awfif::memes-> {keywordl} [$$kwai] = $_[$i];
        &kwbracketd ($_[$i], $akwp);
        &assocmeta ($_[$i], $akwp);
        $$kwai++;
        } # if specified
      else {
        $i = 10;# terminate the loop
        };# if not specified
      };#for

    if (($keyword ne '')) {
      my ($hlink);
      $Awfif::wsol-> {l} [$akwp] [3] = $$kwai - $Awfif::wsol-> {l} [$akwp] [3];
      $Awfif::wsol-> {l} [$akwp] [8] = 0;#no logging items at this point
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsologaei}, 0);
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsologucount}, 0);
      &kwbracketd ('kwavailable', $akwp);
# create a record for the history of this wso use
      $hlink = $Awfif::wsbl-> {wsohih} [$Awfif::memes-> {currentwsbi}];
      $hlink = Awfif::newlink ($hlink, \$Awfif::wsohist);
      $Awfif::wsohist-> {l} [$hlink] [2] = $rkwp;
      $Awfif::wsohist-> {l} [$hlink] [3] = 0; #count of usage
      $Awfif::wsbl-> {wsohih} [$Awfif::memes-> {currentwsbi}] = $hlink;
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsologaei}, $hlink);
      if ($Awfif::memes-> {hnavailable}) {#keyword is an hname
        my ($refid, $hrefid);
# resolve any hrefs in the list that hashes from this name
        $refid = $Awfif::memes-> {hrefwsl} {$keyword};
        $Awfif::hnamel-> {l} [$refid] [4] = +1; # this is the name -ve indicates a ref
        while ($refid != 0) {

# if href has wsid set then update the verb source and target
          if ($Awfif::hnamel-> {l} [$refid] [4] < 0) {#this refid is a href
            $hrefid = $refid;
            if ($Awfif::hnamel-> {l} [$refid] [3] < 0) {#verb and previous half relation are both available
              my ($success);

              $success = '';
              };#if verb set for this href
# remove this href

            $refid = $Awfif::hnamel-> {l} [$refid] [0];
            &Awfif::freehnref ($hrefid);# name is head so no risk of getting it out of sync
            }#if hrefws set
          else {
            $refid = $Awfif::hnamel-> {l} [$refid] [0];
            }; #else
          };# while
# finished processing the hname

        $Awfif::memes-> {hnavailable} = '';
        }#hname available
      else {
        if ($Awfif::memes-> {hrefws} == 0) {

          $Awfif::memes-> {hrefwsl} {$name} = Awfif::freehnref ($Awfif::memes-> {hrefwsl} {$name});
          if ($Awfif::memes-> {hrefwsl} {$name} == 0 ) {

            $Awfif::memes-> {hname}{$name} = 0;
            } # if no head left
          else {

            $Awfif::memes-> {hname}{$name} = $Awfif::hnamel-> {l} [$Awfif::memes-> {hrefwsl} {$name}] [5];
            };# else reasign to head
          };# if no href either
        };# hname not available
      if ($Awfif::memes-> {hrefws} < 0) {

        my ($refid, $found);
        $found = '';
# now hash name is available can just move this across to the hnamel
        $refid = $Awfif::memes-> {hrefwsl} {$name};
        $Awfif::hnamel-> {l} [$refid] [4] = -1;
        $Awfif::memes-> {hrefws} = 0;

        while (($refid != 0) && !($found)) {
          if ($Awfif::hnamel-> {l} [$refid] [4] > 0) {#name already present
# resolve the reference to the name and clear down the head hnamel item

# and terminate the search
            $found = 't';
            };#if matches this ws address

          $refid = $Awfif::hnamel-> {l} [$refid] [0];
          };#while
        };# if
      $$kwp++;
      }#if keyword specified
    } #setupkw
#
sub recordkw {

    my ($keyword, $two, $akwp, $rkwp) = @_;#
    my ($plink, $cwsi);

    $cwsi = $Awfif::memes-> {currentwsbi};# to later restore current state
    if ($Awfif::memes-> {keywordh}-> {$keyword} != 0) {
# already have this keyword so link this new instance
      $plink = $Awfif::memes-> {keywordh}-> {$keyword};
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsobkwl}, 0);
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsofkwl}, 0);
      $Awfif::wsol-> {l} [$akwp] [2] = $two;
# link the previous head to this new entry
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsobws}, $Awfif::memes-> {currentwsbi});
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsofws}, $Awfif::memes-> {currentwsbi});
      if (($Awfif::memes-> {keywordwsih}-> {$keyword} != $Awfif::memes-> {currentwsbi})) {#need to change the ws to follow the chain
        $Awfif::memes-> {currentwsbi} = $Awfif::memes-> {keywordwsih}-> {$keyword};
        };
      &Awfif::setwsmd (Awfif::awsoadr ($plink), $Awfif::memes-> {wsofkwl}, $rkwp);
      &Awfif::setwsmd (Awfif::awsoadr ($plink), $Awfif::memes-> {wsofws}, $cwsi);
      $Awfif::memes-> {currentwsbi} = $cwsi;
# move the head
      $Awfif::memes-> {keywordh}-> {$keyword} = $rkwp;
      $Awfif::memes-> {keywordwsih}-> {$keyword} = $Awfif::memes-> {currentwsbi};
      }
    else {
# This is the first instance

      my (@labst, $i, $imax);
      $Awfif::wsol-> {l} [$akwp] [4] = $keyword;
# setup the first list element
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsobkwl}, 0);
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsofkwl}, 0);
      $Awfif::wsol-> {l} [$akwp] [2] = $two;
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsobws}, $Awfif::memes-> {currentwsbi});
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsofws}, $Awfif::memes-> {currentwsbi});
# note the head
      $Awfif::memes-> {keywordh}-> {$keyword}=$rkwp;
      $Awfif::memes-> {keywordwsih}-> {$keyword} = $Awfif::memes-> {currentwsbi};
# & the position of the primary declared keyword
      $Awfif::memes-> {keywordprih}-> {$keyword}=$rkwp;
      $Awfif::memes-> {keywordpriwsih}-> {$keyword} = $Awfif::memes-> {currentwsbi};
# and setup the keyword label space
# loadkwjhl

      $imax = Awfif::splitkwlabel (\$keyword, \@labst);
      for ($i = $imax; $i >= 0; $i--) {
        if ($labst[$i] ne '') {
          &Awfif::jhlkeyword1 ($labst[$i], $rkwp);
          };#if
        };#for

      &Awfif::jhlkeyword1 ($keyword, $rkwp);
      };
# & note the position of the primary declared keyword
    &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsopkpos}, $Awfif::memes-> {keywordprih}-> {$keyword});
    &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsopkwsi}, $Awfif::memes-> {keywordpriwsih}-> {$keyword});
    } #recordkw
#
sub decodels {
    my ($istring, $rkwp, $akwp) = @_;
    my ($paction );
# decodels processes the logical structure of the data in the meta file for setupkw
#
# The idea is to interpret and encode both the physical proximity and the logical structure
#
# A state machine is implemented with the assistance of srfsm, trfsm, smls:
#
#
    $paction = srfsm ($istring);
# action to be performed is a function of the input and the current state:

    if ($paction < 0) {
      my ($machine);
      $machine = 'source';
      print ("decodels error ");
      if ($paction == -1) {

        print ("$machine previous but $machine connected subsequent");
        } # if
      elsif ($paction == -2) {

        print ("conflicting $machine connects to verbs");
        }# elsif
      elsif ($paction == -3) {

        print ("extra conflicting $machine connect to verb specified");
        };# elsif
      print ("\n");
      }#process error actions
    elsif ($paction == 1) {# update source wso with info about named wso

      }#2
    elsif ($paction == 2) {# create hnamel element for source wso

      }#3
    elsif ($paction == 3) {# respond source resolved

      }#3
    elsif ($paction == 4) {# do action 2 and action 7

      }#4
    elsif ($paction == 8) {# record wso position in memes

      $Awfif::memes-> {verbsrcws} = $rkwp;
      $Awfif::memes-> {verbsrcbi} = $Awfif::memes-> {currentwsbi};
      }#8
    elsif ($paction == 9) {# clear wso position in memes

      $Awfif::memes-> {verbsrcws} = 0;
      $Awfif::memes-> {verbsrcbi} = 0;
      }#9
    elsif ($paction == 10) {# transfer memes info on source to wso

      &setwsmd ($akwp, $Awfif::memes-> {wsocstarts}, $Awfif::memes-> {verbsrcws});
      &setwsmd ($akwp, $Awfif::memes-> {wsoitstr}, $Awfif::memes-> {verbsrcbi});
      &setwsmd (Awfif::awsoadr ($Awfif::memes-> {verbsrcws} ), $Awfif::memes-> {wsocstarts}, $rkwp);
      &setwsmd (Awfif::awsoadr ($Awfif::memes-> {verbsrcws} ), $Awfif::memes-> {wsoitstr}, $Awfif::memes-> {currentwsbi});
      }#10
    elsif ($paction == 11) {# transfer memes info on source to wso

      $Awfif::memes-> {verbtaws} = $rkwp;
      $Awfif::memes-> {verbtabi} = $Awfif::memes-> {currentwsbi};
      }#11
    elsif ($paction == 12) {# clear wso position in memes

      $Awfif::memes-> {verbtaws} = 0;
      $Awfif::memes-> {verbtabi} = 0;
      }#12
    elsif ($paction == 13) {# transfer memes info on source to wso

      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsocstarts}, $Awfif::memes-> {verbtaws});
      &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsoitstr}, $Awfif::memes-> {verbtabi});
      &Awfif::setwsmd (Awfif::awsoadr ($Awfif::memes-> {verbtaws} ), $Awfif::memes-> {wsocstarts}, $rkwp);
      &Awfif::setwsmd (Awfif::awsoadr ($Awfif::memes-> {verbtaws} ), $Awfif::memes-> {wsoitstr}, $Awfif::memes-> {currentwsbi});
      }#13
    elsif ($paction == 0) {# do nothing

      };#0
    }#of decodels
#
#
sub kwbracketd {

    my ($istring, $akwp) = @_;

# record if the tokens include begin start incstart or end stop incstop
# and remember no symbols or token hash to depend on yet
    if ($istring eq 'ptbegint') {

      $Awfif::kwbracketd->{bmec}++;
      $Awfif::kwbracketd->{incb} = 't';
      } # if
    elsif ($istring eq 'ptendt') {

      $Awfif::kwbracketd->{bmec}--;
      }
    elsif (($istring eq 'ptstartt')
    ) {

      $Awfif::kwbracketd->{smsc}++;
      $Awfif::kwbracketd->{incs} = 't';
      }
    elsif ($istring eq 'ptstopt') {

      $Awfif::kwbracketd->{smsc}--;
      }
    elsif ($istring eq 'ptincbegint') {

      $Awfif::kwbracketd->{ibmec}++;
      }
    elsif ($istring eq 'ptincendt') {

      $Awfif::kwbracketd->{ibmec}--;
      }
    elsif ($istring eq 'tthreft') {

      $Awfif::memes-> {hrefws} = -1;#note that can update this when find keyword
      }
    elsif ($istring eq 'tthnamet') {

      $Awfif::memes-> {hnavailable} = 't';
      }
    elsif ($istring eq 'kwavailable') {

      if ($Awfif::kwbracketd->{incb}) {

        &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsocbegins}, $Awfif::kwbracketd->{bmec} - 1);
        }
      else {

        &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsocbegins}, $Awfif::kwbracketd->{bmec});
        };
      if ($Awfif::kwbracketd->{incs}) {

        &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsocstarts}, $Awfif::kwbracketd->{smsc} - 1);
        }
      else {

        &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsocstarts}, $Awfif::kwbracketd->{smsc});
        };
      if ($Awfif::kwbracketd->{ibmec} > 0) {

        &Awfif::setwsmd ($akwp, $Awfif::memes-> {wsocbegins}, &Awfif::checkwsmd ($akwp, $Awfif::memes-> {wsocbegins}));
        };# if include
      $Awfif::kwbracketd->{incb} = '';
      $Awfif::kwbracketd->{incs} = '';
      };#else
    }# kwbracketd
#
sub assocmeta {#associate metatokens with appropriate keywords

    my ($istring, $akwp) = @_;
    my ($i, $found);

    if ($istring eq 'ttmwithint') {

      $found = '';
      $i = $akwp - 1;
      while (($i > 0) && (!$found)) {

        if (($Awfif::wsol-> {l} [$i] [2] > 0) && ($Awfif::wsol-> {l} [$i] [3] > 0)) {

          my ($i2);
          for ($i2 = $Awfif::wsol-> {l} [$i] [2]; (($i2 < ($Awfif::wsol-> {l} [$i] [2] + $Awfif::wsol-> {l} [$i] [3])) && (!$found)); $i2++) {

            if ($Awfif::memes-> {keywordl} [$i2] eq 'ptstartt') {

              $found = 't';
              };#if
            };#for
          if ($found) {#can replace the ptphysicst if it is present

            my ($phyfound);
            $phyfound = '';
            for ($i2 = $Awfif::wsol-> {l} [$i] [2]; (($i2 < ($Awfif::wsol-> {l} [$i] [2] + $Awfif::wsol-> {l} [$i] [3])) && (!$phyfound)); $i2++) {

              if ($Awfif::memes-> {keywordl} [$i2] eq 'ptphysicst') {

                $phyfound = 't';
                $Awfif::memes-> {keywordl} [$i2] = 'ptgowithint';
                };#if
              };#for
            };#if
          };#if
        $i--;
        };#while

      };#else
    }# assocmeta
#

sub loadfile {

    my ($file, $inmfdt, $kwai, $kwl, $kwp, $wsbao) = @_;
    my ($link, $j);

    foreach $j (@$file) {
      my($jcr, $jcr2, $jcr3, $jcr4, $jcr5, $jcr6, $usesame, $r2, $r5, $r8, $r11, $r14, $r17, $r20, $r30, $r23, $r26, $a, $b);
# loadfflip
      while ( $j =~/<(\/)*(rhl)+(t)*(case)*([^>]+)?>+?/i) {

        $a = $1.$2.$3.$4.$5;
        $b = $1.$5.$2.$3.$4;
        $j =~ s/\Q<$a/<$b/;
        } # flip complete
      while ( $j =~/"" *>(\/|#)*(rhl)+(t)*(case)*([^<]+)?(<\/mfdt>)+?/i) {

        $a = $1.$2.$3.$4.$5.$6;
        $b = $1.$5.$2.$3.$4.$6;
        $j =~ s/"" *>$a/"">$b/;
        } # flip complete
      while ( $j =~/>(\/)*(rhl)+(t)*(case)*([^<]+)?(<\/span>)+?/i) {

        $a = $1.$2.$3.$4.$5.$6;
        $b = $1.$5.$2.$3.$4.$6;
        $j =~ s/\Q>$a/>$b/;
        } # flip complete
      while ( $j =~/="(\/)*(rhl)+(t)*(case)*([^"]+)?(">)+?/i) {

        $a = $1.$2.$3.$4.$5.$6;
        $b = $1.$5.$2.$3.$4.$6;
        $j =~ s/\Q="$a/="$b/;
        } # flip complete
      while ( $j =~/<(\/)*(rhl)+(t)*(case)*([^&]+)?(>)+?/i) {

        $a = $1.$2.$3.$4.$5;
        $b = $1.$5.$2.$3.$4;
        $j =~ s/\Q<$a/<$b/;
        } # flip complete
      $jcr = '';
      $jcr2 = '';
      $jcr3 = '';
      $jcr4 = '';
      $jcr5 = '';
      $jcr6 = '';
      $usesame = 'T';
      $Awfif::memes-> {j} = $j;
#
      while ($usesame) {

        $usesame = '';
        if ($$inmfdt==0) {
# first check case with arguments, terminal keyword and mfdt completion on one line.
          $jcr = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*([^ >=\s]+)?( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*>( |%20)*([^ <]+)?( |%20)*<\/mfdt>/i);
          if ($jcr) {
            $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30 = $30;
            }
          else {
# next the terminal of mfdt may be on a future line alone

            $jcr2 = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*([^ >=\s]+)?( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*>( |%20)*([^ <]+)*/i);
            if ($jcr2) {
              $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30 = $30;
              };#jcr2
            };#else not jcr
# if fails then check case with out argument
          if ((!($jcr)) && (!($jcr2))) {

            $jcr3 = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*([^ >=\s]+)?( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*>/i);
            if ($jcr3) {
              $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30='';
              };#jcr3
            };#not jcr and jcr2
          if ((!($jcr)) && (!($jcr2)) && (!($jcr3))) {

            $jcr4 = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*([^ >=\s]+)?( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*/i);
            if ($jcr4) {
              $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30 = '';
              };#jcr4
            };
          if ((!($jcr)) && (!($jcr2)) && (!($jcr3))&& (!($jcr4))) {

            $jcr5 = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*>( |%20)*([^ <]+)?/i);
            if ($jcr5) {
              $r2 = ''; $r5 = ''; $r8 = ''; $r11 = ''; $r30 = $3;
              };#jcr5
            };
          if ((!($jcr)) && (!($jcr2)) && (!($jcr3))&& (!($jcr4))&& (!($jcr5))) {

            $jcr6 = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*/i);
            if ($jcr6) {
              $r2 = ''; $r5 = ''; $r8 = ''; $r11 = ''; $r30 = '';
              };#jcr6
            };

          while ($jcr or $jcr2 or $jcr3 or $jcr4 or $jcr5 or $jcr6) {
# line breaks make this complex
# if jcr is true then found the complete mfdt with arguments
# if jcr2 is true then have to get the terminal </mfdt> to reset inmfdt

            if ($jcr2) {

              $$inmfdt = 2;
              }
# if jcr3 is true then waiting for the keyword
            if ($jcr3) {

              $$inmfdt = 3;
              }
# if jcr4 is true then there may be more parameters to get on the next lines and will be > etc
            if ($jcr4) {

              $$inmfdt = 4;
              }
# if jcr5 is true then have got the complete mfdt but it has no slipnet links!

# if $jcr6 is true then we have just got the <mfdt at the end of the line
            if ($jcr6) {

              $$inmfdt = 6;
              }
            print ("found mfdt $r2 $r5 $r8 $r11 $r14 $r17 $r20 $r23 $r26\n");if ($jcr) {print("completed mfdt $r30\n");};
            &setupkw ($r30, $r2, $r5, $r8, $r11, $r14, $r17, $r20, $r23, $r26, \$$kwai, \$$kwl, \$$kwp, $wsbao);
            $Awfif::memes-> {j} =~ s/\Q<mfdt/cmfdt/i;#ensure don't loop
            }# process all keywords in this record

          continue {# if now inmfdt then should be at end of this line so while will terminate
            $jcr = '';
            $jcr2 = '';
            $jcr3 = '';
            $jcr4 = '';
            $jcr5 = '';
            $jcr6 = '';
            $jcr = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*([^ >=\s]+)?( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*>( |%20)*([^ <]+)?( |%20)*<\/mfdt>/i);
            if ($jcr) {
              $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30 = $30;
              };#jcr
            if (!($jcr) ) {
# next the terminal of mfdt may be on a future line alone

              $jcr2 = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*([^ >=\s]+)?( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*>( |%20)*([^ <]+)*/i);
              if ($jcr2) {
                $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30 = $30;
                };#jcr2
              };
# if fails then check case with out argument
            if ((!($jcr)) && (!($jcr2))) {

              $jcr3 = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*([^ >=\s]+)?( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*>/i);
              if ($jcr3) {
                $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30 = '';
                };#jcr3
              };
            if ((!($jcr)) && (!($jcr2)) && (!($jcr3))) {

              $jcr4 = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*([^ >=\s]+)?( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*/i);
              if ($jcr4) {
                $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30 = '';
                };#jcr4
              };
            if ((!($jcr)) && (!($jcr2)) && (!($jcr3))&& (!($jcr4))) {

              $jcr5 = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*>( |%20)*([^ <]+)?/i);
              if ($jcr5) {
                $r2 = ''; $r5 = ''; $r8 = ''; $r11 = ''; $r30 = $3;
                };#jcr5
              };
            if ((!($jcr)) && (!($jcr2)) && (!($jcr3))&& (!($jcr4))&& (!($jcr5))) {

              $jcr6 = ($Awfif::memes-> {j} =~ /<mfdt( |%20)*/i);
              if ($jcr6) {
                $r2 = ''; $r5 = ''; $r8 = ''; $r11 = ''; $r30 = '';
                };#jcr6
              };
            }# reload the conditionals
          }# new mfdt
        else {# inmfdt

          if (($$inmfdt==4) or ($$inmfdt==6)) {# args ="" and > expected, then keyword and terminal </mfdt>

            if ($Awfif::memes-> {j} =~ /( |%20)*([^ >=\s]+)*( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*>( |%20)*([^ <]+)?( |%20)*<\/mfdt>/i) {

              $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30 = $30;
              print ("completed mfdt $r2 $r5 $r8 $r11 $r14 $r17 $r20 $r23 $r26 $r30\n");
              $$inmfdt=0;
              &setupkw ($r30, $r2, $r5, $r8, $r11, $r14, $r17, $r20, $r23, $r26, \$$kwai, \$$kwl, \$$kwp, $wsbao);
              $usesame = "T";
              }
            elsif ($Awfif::memes-> {j} =~ /( |%20)*([^ >=\s]+)*( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*>( |%20)*([^ <]+)?/i) {

              $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30 = $30;
              print ("$r2 $r5 $r8 $r11 $r14 $r17 $r20 $r23 $r26 $r30\n");
              $$inmfdt=2;
              &setupkw ($r30, $r2, $r5, $r8, $r11, $r14, $r17, $r20, $r23, $r26, \$$kwai, \$$kwl, \$$kwp, $wsbao);
              }
            elsif ($Awfif::memes-> {j} =~ /( |%20)*([^ >=\s]+)*( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*>/i) {

              $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30 = '';
              print ("$r2 $r5 $r8 $r11 $r14 $r17 $r20 $r23 $r26\n");
              $$inmfdt=3;
              &setupkw ($r30, $r2, $r5, $r8, $r11, $r14, $r17, $r20, $r23, $r26, \$$kwai, \$$kwl, \$$kwp, $wsbao);
              }
            elsif ($Awfif::memes-> {j} =~ /( |%20)*([^ >=\s]+)*( |%20)*=""( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*( |%20)*([^ >=\s]+)*(="")*/i) {

              $r2 = $2; $r5 = $5; $r8 = $8; $r11 = $11; $r14 = $14; $r17 = $17; $r20 = $20; $r23 = $23; $r26 = $26; $r30 = '';
              print ("$r2 $r5 $r8 $r11 $r14 $r17 $r20 $r23 $r26\n");
              &setupkw ($r30, $r2, $r5, $r8, $r11, $r14, $r17, $r20, $r23, $r26, \$$kwai, \$$kwl, \$$kwp, $wsbao);
              };
            }#4

          elsif ($$inmfdt==3) {# keyword expected
            if($Awfif::memes-> {j} =~ /( |%20)*([^ <]+)?( |%20)*<\/mfdt>/i) {
              $r30 = $2;
              print ("completed mfdt $r30 \n");
              $$inmfdt = 0;
              $usesame = "T";
              &setupkw ($r30, '', '', '', '', '', '', '', '', '', \$$kwai, \$$kwl, \$$kwp, $wsbao);
              }
            elsif($Awfif::memes-> {j} =~ /( |%20)*([^ <]+)?/i) {
              $r30 = $2;
              print ("$r30 \n");
              $$inmfdt = 2;
              &setupkw ($r30, '', '', '', '', '', '', '', '', '', \$$kwai, \$$kwl, \$$kwp, $wsbao);
              };
            }#3
          elsif ($$inmfdt==2) {# </mfdt> expected
            if($Awfif::memes-> {j} =~ /( |%20)*<\/mfdt>/i) {
              $$inmfdt = 0;#retry while
              $usesame = "T";
              };
            };#2
          }# inmfdt
        }# reuse
#

      $j = $Awfif::memes-> {j};
      } # for each line j
# add a sentinal wso
    $link = Awfif::addwsoli (\$Awfif::wsol);#This sentinal allows backwards refs from $kwp
    &Awfif::setwsmd (Awfif::awsoadr ($link), $Awfif::memes-> {wsobkwl}, 0);
    &Awfif::setwsmd (Awfif::awsoadr ($link), $Awfif::memes-> {wsofkwl}, 0);
    $Awfif::wsol-> {l}[ Awfif::awsoadr ($link)] [2] = 0;
    &Awfif::setwsmd (Awfif::awsoadr ($link), $Awfif::memes-> {wsowsi}, $Awfif::memes-> {currentwsbi});
# this is a false object that should not be included in the count of this workspace
    $Awfif::wsbl-> {wsoh}[$Awfif::memes-> {currentwsbi}]--;
    &Awfif::setwsmd ( Awfif::awsoadr ( $Awfif::wsbl-> {wsoh}[$Awfif::memes-> {currentwsbi}]) , $Awfif::memes-> {wsonext}, $link);
    }#loadfile
#
sub loadffind {

    my ($type, $file, $frecs) = @_;
    my ($i, $found, $filename);
# load first file in directory matching type
# if find file return contents, number of records

    $found = '';
    $filename = '';
    foreach $i (<*>) {

      if (($i =~ /$type/) && (!$found)){

        $found = 't';
        $filename = $i;
        };#if
      };#for

    if ($found) {

      @$file = ();
      $$frecs = 0;
      &Awfif::includesource (
        $filename,
        \@$file,
        \$$frecs
        );
      };#if

    return $filename
    }#loadffind
#
sub copyfiles {

    my ($spath, $type, $num) = @_;
    my ($i, $count, $filename, $path, $suffix, $ret);
# copy files from source directory with names containing 'name-part' to current directory

    use File::Copy;
    use File::Basename 'fileparse', 'fileparse_set_fstype';
    $count = 0;
    $filename = '';
    foreach $i (glob("$spath/*")) {

      if (($i =~ /$type/) && ((!defined ($num)) or ($i =~ /$num/))
      ){

        $count++;
        fileparse_set_fstype ('MSWin32');
        ($filename, $path, $suffix) = fileparse ($i);
        $ret = copy ($i, $filename.$suffix);
        };#if
      };#for


    return $count
    }#copyfiles
#
# awfctsumeta1
#
sub setupmeta {

    my ($restoring, $metaname, $kwl, $kwai, $kwar, $kwp, $kwpr, $inmfdt, $file, $frecs) = @_;
    my ($test, $userprofiledis);
# setup meta environment defined in files

    $userprofiledis = $ENV {'USERPROFILE'};
    while ($userprofiledis =~ /\\/) {
      $userprofiledis =~ s/\\/\//;
      };
    $userprofiledis .= '/My Documents/meta';
    $test = chdir("$userprofiledis");
# $test = chdir("c:/Users/Rob Lingley/My Documents/meta");

    if ($test)
      {print ("chdir meta worked\n")}
    else
      {print ("chdir meta caused error $!\n");};
#
    if ((!defined ($restoring)) or (!$restoring)){
# the results will go in test

      $$metaname = loadffind ('.html',
        \@$file,
        \$$frecs
        );
#
# place the metafile keywords defined in the content area of each xml "mfdt"
# in the dynamic keyword array.
#

      $$kwl = 0;# key word lock
      $$kwai = 1;# key word attribute index of 0 is a lock
      $$kwp = 1;# key word logical position in input stream
      $$inmfdt = 0;# not in mftd yet
#
      $Awfif::memes-> {currentwsbi} = Awfif::addws(0,0);
      $Awfif::memes-> {kwwsbi} = $Awfif::memes-> {currentwsbi};
#

      &loadfile (\@$file,\$$inmfdt,\$$kwai,\$$kwl,\$$kwp, $Awfif::memes-> {currentwsbi});
      @$file = undef();#finished with the file form
#
      $$kwar = $$kwai;#real start of ws symbols
      $$kwpr = $$kwp+1;# accounts for presence of sentinal
# Record the meta file keywords but these should match $Awfif::wsbl-> {wsoh} and {wsot}

      $Awfif::memes -> {kwmi} = $$kwp;
      $Awfif::memes-> {kwmir} = 1;
      $kwp++;#move past the sentinal
      $Awfif::kwbracketd->{incb} = '';
      $Awfif::kwbracketd->{incs} = '';
      $Awfif::kwbracketd->{bmec} = 0;
      $Awfif::kwbracketd->{ibmec} = 0;
      $Awfif::kwbracketd->{smsc} = 0;
      };#if
#

    }#setupmeta
#
sub setupmemes {

    my ($restoring, $metaname, $sgmrecs) = @_;
    my ($test);
# now with the correct meta files streamed can load the memes

    $test = chdir("../memes");

    if ($test)
    {

      print ("chdir memes worked\n");
# delete any memetic files left over from previous runs of Awfcts
# import the memetic subgroup definitions
# ctsmemecf01

      if ($metaname =~ /vbt/){

        &copyfiles ('lib/vmemes', '.html', '001');
        }#if
      elsif ($metaname =~ /scl/){

        &copyfiles ('lib/scmemes', '.html', '001');
        }#if
      else {

        &copyfiles ('lib/tmemes', '.html');
        };#else
      if ((!defined ($restoring)) or (!$restoring)){

        $Awfif::wsbl->{sgmfile} = ();
        $$sgmrecs = 0;
# awfctslmem01
        &loadffind ('.html',
          \@{$Awfif::wsbl->{sgmfile}},
          \$$sgmrecs
          );
        };#if
      }
    else
      {print ("chdir memes caused error $!\n");};
#

    }#setupmemes
#
sub setupcoderack {

    my ($restoring, $metaname, $setwsclinv, $kwl, $kwai, $kwar, $kwp, $kwpr, $inmfdt, $wspace, $frecs, $sgmrecs) = @_;
    my ($test, $runcoderack, $i);
# now with the correct memetic files in position can load sentence, setup chemistry and launch coderack

    $test = chdir("../test");

    if ($test)
      {print ("chdir worked\n")}
    else
      {print ("chdir caused error $!\n");};
#
# the test scripts will be in test
# Process each file in the source directory by looping through each in turn
#

    $runcoderack = '';
    foreach $i (<*>) {
      if ((!defined ($$restoring)) or (!$$restoring)){

        $Awfif::cstruct-> {istringf} = $i;
        };#if

      print("Working on control file $i\n");
# awfctsnu03
#
# Now setup the expected parameters to tailor the template items
#

      if (($i =~ /\.htm/)
      && (($metaname =~ /vbt/) && ($i =~ /vbt/))#ensure that vbot metafile is matched with vbot tests
      or (($metaname =~ /scl/) && ($i =~ /scl/))#ensure that scell metafile is matched with scell tests
      or (($metaname !~ /vbt/) && ($i !~ /vbt/) && ($metaname !~ /scl/) && ($i !~ /scl/))
      ){
# and reading the contents into the list "file"

        if ((!defined ($$restoring)) or (!$$restoring)){

          @wspace = ();
          $$frecs = 0;
          $$kwl = 0;# key word lock
          $$kwp = $$kwpr;# key word logical position in input stream
          $$inmfdt = 0;# not in mftd yet
          $$kwai = $$kwar;#reload real start of ws symbols for next test

          &Awfif::includesource (
            $i,
            \@$wspace,
            \$$frecs
          );
# ------------------------------ do assert string setup ---------------------------------------------
#

          if ($i =~ /\.html/) {#original format .html

            $Awfif::memes-> {currentwsbi} = Awfif::addws($$kwpr-1,0);
            &loadfile (\@$wspace,\$$inmfdt,\$$kwai,\$$kwl,\$$kwp, $Awfif::memes-> {currentwsbi});
            $Awfif::kwbracketd->{incb} = '';
            $Awfif::kwbracketd->{incs} = '';
            $Awfif::kwbracketd->{bmec} = 0;
            $Awfif::kwbracketd->{ibmec} = 0;
            $Awfif::kwbracketd->{smsc} = 0;
#
#
# initialize chemistry for all - still uses absolute wso addressing

            &initchemistry($$kwp, $$kwpr, \@{$Awfif::memes-> {sactset}}, \@{$Awfif::memes-> {csset}}, \@{$Awfif::memes-> {strset}});
            }
          else {#new format .htm

            my ($buffer, $sponsor, $insymbol, @inmsymbol, @started, $end, $depstag, $depttag, $dephtag, $wsi, $nwsi, $grkwp, $grkwpr);
            &initchemistry($$kwp, $$kwpr, \@{$Awfif::memes-> {sactset}}, \@{$Awfif::memes-> {csset}}, \@{$Awfif::memes-> {strset}});
            $insymbol = '';
            @inmsymbol = ();
            $started[0] = 0;
            $started[1] = 't';
            $end = '';
            $depstag = '';
            $depttag = 0;
            $dephtag = 0;
            $$setwsclinv = '';
            $wsi = Awfif::setupws ();
            $Awfif::memes->{currentwsbi} = $wsi;
# should invalidate all the workspace caches

            &Awfif::wstcinv (\@{$Awfif::memes-> {sactset}});

            foreach $buffer (@$wspace) {

              &Awfif::convbws (0, \$buffer, \$grkwp, $grkwpr, $Awfif::memes-> {kwmi}, $Awfif::memes-> {kwmir}, $sponsor, \$insymbol, \@inmsymbol, \@started, \$end, \$depstag, \$depttag, \$dephtag, $wsi, $Awfif::memes-> {snnh} {operon}, $Awfif::memes-> {allwsstr},
                't', #energize the base types
                \$$setwsclinv
                );
              };#transform the file into work space objects

            @$wspace = undef();

            $Awfif::wsbl-> {wsft} [$wsi] = Awfif::setfwst ($Awfif::wsbl->{wsoh}[$wsi], $Awfif::wsbl->{wsot}[$wsi],$wsi);
            &Awfif::stripichar ($Awfif::wsbl->{wsoh}[$wsi], $wsi);
# simulate initial absolute $kwp & $kwpr
            $$kwpr = $Awfif::wsbl->{l}[$wsi][2];#base
            $$kwp = $Awfif::wsbl->{wsoh}[$wsi] + $$kwpr -1;# + relative head
# setupcstwsabsu1

            $Awfif::wsbl-> {relorabs} [$wsi] = $Awfif::memes-> {snnh} {absolute};
            &energizechem (2, ,'t', $$kwp, $$kwpr,\@{$Awfif::memes-> {sactset}});

            if ($$sgmrecs != 0) {#deploy the memetic subgroup specification setting up a nuclear zone above the cytosol
# tfwnws
              $grkwp = $Awfif::wsbl-> {wsbloh} [ $Awfif::memes-> {currentwsbi}];
              $grkwpr = $Awfif::wsbl-> {wsblot} [ $Awfif::memes-> {currentwsbi}];
              $insymbol = '';
              @inmsymbol = ();
              $started[0] = 0;
              $started[1] = 't';
              $end = '';
              $depstag = '';
              $$setwsclinv = '';
              $nwsi = Awfif::setupws ();
              $Awfif::memes->{currentwsbi} = $nwsi;
              $Awfif::memes->{nwsi} = $nwsi;

              foreach $buffer (@{$Awfif::wsbl->{sgmfile}}) {#this destroys the contents of the buffer so it will need to be reloaded - BUG on reloop

                &Awfif::convbws (0, \$buffer, \$grkwp, $grkwpr, $Awfif::memes-> {kwmi}, $Awfif::memes-> {kwmir}, $sponsor, \$insymbol, \@inmsymbol, \@started, \$end, \$depstag, \$depttag, \$dephtag, $nwsi, $Awfif::memes-> {snnh} {operon}, $Awfif::memes-> {allwsstr},
                  '',#don't energize base types
                  \$$setwsclinv
                  );
                };#transform the file into work space objects
# include the memetic updates
# awfctsnu01

              if (($metaname !~ /vbt/) && ($metaname !~ /scl/) ){

                $test = chdir("../memes");
                if ($test)
                  {print ("chdir worked\n")}
                else
                  {print ("chdir caused error $!\n");};
                $Awfif::wsbl->{sgmfile} = ();
                $$sgmrecs = 0;

                &loadffind ('meu01.html',
                  \@{$Awfif::wsbl->{sgmfile}},
                  \$$sgmrecs
                  );
                $insymbol = '';
                @inmsymbol = ();
# seems like convbws should start afresh on this buffer
                $started[0] = 0;
                $started[1] = 't';
                $end = '';
                $depstag = '';
                $depttag = 0;
                $dephtag = 0;
                $$setwsclinv = '';
# record the ws index
                foreach $buffer (@{$Awfif::wsbl->{sgmfile}}) {

                  &Awfif::convbws (0, \$buffer, \$grkwp, $grkwpr, $Awfif::memes-> {kwmi}, $Awfif::memes-> {kwmir}, $sponsor, \$insymbol, \@inmsymbol, \@started, \$end, \$depstag, \$depttag, \$dephtag, $nwsi, $Awfif::memes-> {snnh} {operon}, $Awfif::memes-> {allwsstr},
                    '', #don't energize the base types
                    \$$setwsclinv
                    );
                  };#transform the file into work space objects

                $Awfif::wsbl->{sgmfile} = undef();
                $Awfif::wsbl-> {wsft} [$nwsi] = Awfif::setfwst ($Awfif::wsbl->{wsoh}[$nwsi], $Awfif::wsbl->{wsot}[$nwsi], $nwsi);
                &Awfif::stripichar ($Awfif::wsbl->{wsoh}[$nwsi], $nwsi);
# should invalidate all the workspace caches
                if ($runcoderack) {
                  &Awfif::wstcinv (\@{$Awfif::memes-> {sactset}});
                  };#if
                };#if
              };
            $Awfif::memes->{currentwsbi} = $wsi;
            };#else

# ------------------------------ run coderack until test complete ------------------------------------

          $test = chdir("..");

          if ($test)
            {print ("chdir worked\n")}
          else
            {print ("chdir caused error $!\n");};
#
# switch to relative addressing
          $$kwp = $$kwp - $$kwpr + 1;
          $$kwpr = 1;
# prepare logging if required
          $Awfif::memes->{log}=1;
# run the coderack assuming path is at umbrella above working directories
          $runcoderack = 't';
          &Awfif::coderack (\$$kwp, $$kwpr,\@{$Awfif::memes-> {sactset}}, undef (), $metaname);
#
# set path for processing next test in list
          $test = chdir("test");

          if ($test)
            {print ("chdir worked\n")}
          else
            {print ("chdir caused error $!\n");};
          }#if not restoring
# codercalrest1
        elsif (($$restoring) && ($i eq $Awfif::cstruct-> {istringf} )){#restoring

          my ($buffer, $sponsor, $insymbol, @inmsymbol, @started, $end, $depstag, $depttag, $dephtag, $nwsi, $grkwp, $grkwpr);
          my ($ws, $ipconc);
          &initchemistry($$kwp, $$kwpr, \@{$Awfif::memes-> {sactset}}, \@{$Awfif::memes-> {csset}}, \@{$Awfif::memes-> {strset}}, $$restoring);
# awfctsuws2

          $ipconc = Awfif::updateslipnet (0, 1, $ipconc);
# awfctsuws3

          for ($ws = $Awfif::wsbl-> {h}; $ws != $Awfif::wsbl-> {t}; $ws = $Awfif::wsbl-> {l} [$ws] [0]) {

            &Awfif::initwssnmembers ($ws);
            };#for
# include the memetic updates
# awfctsnu02

          if (($metaname !~ /vbt/) && ($metaname !~ /scl/) ){

            $nwsi = $Awfif::memes-> {nwsi};
            $test = chdir("../memes");
            if ($test)
              {print ("chdir worked\n")}
            else
              {print ("chdir caused error $!\n");};

            $Awfif::wsbl->{sgmfile} = ();
            $$sgmrecs = 0;

            &loadffind ('meu01.html',
              \@{$Awfif::wsbl->{sgmfile}},
              \$$sgmrecs
              );

            $insymbol = '';
            @inmsymbol = ();
# seems like convbws should start afresh on this buffer
            $started[0] = 0;
            $started[1] = 't';
            $end = '';
            $depstag = '';
            $depttag = 0;
            $dephtag = 0;
            $$setwsclinv = '';
# record the ws index
            foreach $buffer (@{$Awfif::wsbl->{sgmfile}}) {

              &Awfif::convbws (0, \$buffer, \$grkwp, $grkwpr, $Awfif::memes-> {kwmi}, $Awfif::memes-> {kwmir}, $sponsor, \$insymbol, \@inmsymbol, \@started, \$end, \$depstag, \$depttag, \$dephtag, $nwsi, $Awfif::memes-> {snnh} {operon}, $Awfif::memes-> {allwsstr},
                '', #don't energize the base types
                \$$setwsclinv
                );
              };#transform the file into work space objects

            $Awfif::wsbl->{sgmfile} = undef();
            $Awfif::wsbl-> {wsft} [$nwsi] = Awfif::setfwst ($Awfif::wsbl->{wsoh}[$nwsi], $Awfif::wsbl->{wsot}[$nwsi], $nwsi);
            &Awfif::stripichar ($Awfif::wsbl->{wsoh}[$nwsi], $nwsi);
            };#if

          &Awfif::coderack (\$$kwp, $$kwpr,\@{$Awfif::memes-> {sactset}}, $$restoring);
          $$restoring = '';
          };#else restoring



        } # html test script
      }

    }#setupcoderack
#
sub unlinkfiles {

    my ($type) = @_;
    my ($i, $count);
# unlink files from current directory

    $count = 0;
    foreach $i (<*>) {

      if (($i =~ /$type/)
      ){

        $count++;
        unlink $i;
        };#if
      };#for

    return $count
    }#unlinkfiles
#
#<!-- start tag ca -->
# ctsmain
# ------------------------------ start ---------------------------------------------------
# wsomapinit
$Awfif::memes-> {isgcstatenegbreak} = 't'; #isgcache will break on neg state at exit if 't'
$restoring = Awfif::retrievefromfiles (1);
if ((!defined ($restoring)) or (!$restoring)){
    $Awfif::memes-> {usewsodirect} = 't';# use $Awfif::wsol-> {l} directly for wso data
    $Awfif::memes-> {usewsobfdirect} = 't';# use @Awfif::wsolfbs[$awso][$index] directly for wso 2 bit data
    };#if not restoring
$Awfif::memes-> {flagsoffset} = 23;#
#perform the mapping for wso vector addressing
#

$Awfif::memes-> {wsobkwl} = 0;
$Awfif::memes-> {wsofkwl} = 1;
$Awfif::memes-> {wsologaei} = 9;
$Awfif::memes-> {wsologucount} = 10;
$Awfif::memes-> {wsobastype} = 11;
$Awfif::memes-> {wsobasind} = 12;
$Awfif::memes-> {wsogcsponsor} = 13;
$Awfif::memes-> {wsoprev} = 14;
$Awfif::memes-> {wsowsi} = 15;
$Awfif::memes-> {wsonext} = 16;
$Awfif::memes-> {wsobws} = 17;
$Awfif::memes-> {wsofws} = 18;
$Awfif::memes-> {wsopkpos} = 19;
$Awfif::memes-> {wsopkwsi} = 20;
$Awfif::memes-> {wsocbegins} = 21;
$Awfif::memes-> {wsocstarts} = 22;
$Awfif::memes-> {wsoitstr} = 23;
$Awfif::memes-> {wsotdg} = 25;
$Awfif::memes-> {wsofgrp} = 26;
$Awfif::memes-> {wsotdb} = 27;
$Awfif::memes-> {wsobug} = 28;
$Awfif::memes-> {wsoisterm} = 29;
$Awfif::memes-> {wsobti} = 30;
$Awfif::memes-> {wsobus} = 31;
$Awfif::memes-> {wsogcjhlsi} = 32;
$Awfif::memes-> {wsohistbp} = 33;
$Awfif::memes-> {wsogcspjhlsi} = 34;
$Awfif::memes-> {wsosyncl} = 35;
$Awfif::memes-> {wsosubpid} = 36;
$Awfif::memes-> {wsosponsorgs} = 37;
$Awfif::memes-> {wsogstart} = 38;
$Awfif::memes-> {wsogend} = 39;
$Awfif::memes-> {wsogcsponsored} = 40;
$Awfif::memes-> {wsosponsort} = 41;
$Awfif::memes-> {wsosynclt} = 42;
#****************** ********************** *****************************
$Awfif::memes-> {wsomapmax} = 42; #equate to the max slot index
#mappings
$Awfif::m32[$Awfif::memes-> {wsobkwl}] = 0;
$Awfif::m32[$Awfif::memes-> {wsofkwl}] = 1;
$Awfif::m32[$Awfif::memes-> {wsobasind}] = 2;
$Awfif::m32[$Awfif::memes-> {wsogcsponsor}] = 3;
$Awfif::m32[$Awfif::memes-> {wsoprev}] = 4;
$Awfif::m32[$Awfif::memes-> {wsonext}] = 5;
$Awfif::m32[$Awfif::memes-> {wsotdb}] = 6;
$Awfif::m32[$Awfif::memes-> {wsobug}] = 7;
$Awfif::m32[$Awfif::memes-> {wsoisterm}] = 8;
$Awfif::m32[$Awfif::memes-> {wsobti}] = 9;
$Awfif::m32[$Awfif::memes-> {wsobus}] = 10;
$Awfif::m32[$Awfif::memes-> {wsoitstr}] = 11;
$Awfif::m32[$Awfif::memes-> {wsotdg}] = 12;
$Awfif::m32[$Awfif::memes-> {wsoitstr}] = 13;
$Awfif::m32[$Awfif::memes-> {wsogstart}] = 14;
$Awfif::m32[$Awfif::memes-> {wsogend}] = 15;
$Awfif::m32[$Awfif::memes-> {wsogcsponsored}] = 16;
$Awfif::memes-> {maxm32} = 17;
#
$Awfif::mu32[$Awfif::memes-> {wsofgrp}] = 0;
$Awfif::mu32[$Awfif::memes-> {wsologaei}] = 1;
$Awfif::memes-> {maxmu32} = 2;
#
$Awfif::m16[$Awfif::memes-> {wsobws}] = 0;
$Awfif::m16[$Awfif::memes-> {wsofws}] = 1;
$Awfif::m16[$Awfif::memes-> {wsowsi}] = 2;
$Awfif::m16[$Awfif::memes-> {wsohistbp}] = 3;
$Awfif::m16[$Awfif::memes-> {wsogcspjhlsi}] = 4;
$Awfif::m16[$Awfif::memes-> {wsogcjhlsi}] = 5;
$Awfif::m16[$Awfif::memes-> {wsopkwsi}] = 6;
$Awfif::m16[$Awfif::memes-> {wsocbegins}] = 7;
$Awfif::m16[$Awfif::memes-> {wsocstarts}] = 8;
$Awfif::m16[$Awfif::memes-> {wsobastype}] = 9;
$Awfif::m16[$Awfif::memes-> {wsologucount}] = 10;
$Awfif::m16[$Awfif::memes-> {wsopkpos}] = 11;
$Awfif::m16[$Awfif::memes-> {wsosubpid}] = 12;
$Awfif::m16[$Awfif::memes-> {wsosponsorgs}] = 13;
$Awfif::m16[$Awfif::memes-> {wsosponsort}] = 14;
$Awfif::memes-> {maxm16} = 15;
#
#23 = 0;
#24 = 1;
#25 = 2;
#26 = 3;
#27 = 4;
#28 = 5;
$Awfif::memes-> {maxfbs} = 5;
# wsscachemapinit
#perform the mapping for workspace & slipnet salience cache vector addressing
#

# wsscachecvalid
$Awfif::memes-> {cvalid} = 0;#originally selsalwsitem line 0:
# wsscachecchange
$Awfif::memes-> {cchange} = 1;#1:
# wsscachesnlcic
$Awfif::memes-> {snlcic} = 2;#originally salsnlnc line 2: the salient item count
# wsscachesnlcpcv
$Awfif::memes-> {snlcpcv} = 3;#originally salsnlnc line 3: per concept+concl valid flag 't' => changed
# wsscachesnlcsnconcl
$Awfif::memes-> {snlcsnconcl} = 4;#originally salsnlnc line 4: per concept+concl snconcl
# wsscachesnlclact
$Awfif::memes-> {snlclact} = 5;#originally salsnlnc line 5: last activation value
# wsscachesnlcactd
$Awfif::memes-> {snlcactd} = 6;#originally salsnlnc line 6: activation diff counter
# wsscachesnlcave
$Awfif::memes-> {snlcave} = 7;#originally salsnlnc line 7: average count
# wsscacheci2
$Awfif::memes-> {ci2} = 8;#8: the i2 index
# wsscachectinst
$Awfif::memes-> {ctinst} = 9;#9: the tinstance value
# wsscachecvpci
$Awfif::memes-> {cvpci} = 10;#10: wso*concept cache loaded for $i {swsiclfi}
# wsscachecvpcwso
$Awfif::memes-> {cvpcwso} = 11;#11: wso*concept cache loaded for wso {swsiclfwso} This needs to address individual wso per concept
# wsscachesnlcvalid
$Awfif::memes-> {snlcvalid} = 12;#originally salsnlnc line 0: t when cache is valid
# wsscachesnlctinst
$Awfif::memes-> {snlctinst} = 13;#originally salsnlnc line 1: the tinstance value
# wsscachesnlcigch
$Awfif::memes-> {snlcigch} = 14;#originally salsnlnc line 9: the index of the ignore concept cache list head
# wsscachemtcv
$Awfif::memes-> {mtcv} = 15;#originally matchtree line 0: t or f
# wsscachemtcm
$Awfif::memes-> {mtcm} = 16;#originally matchtree line 1: 0 or 1
# wsscacheselcv
$Awfif::memes-> {selcv} = 17;#originally selfacet line 0: t or f
# wsscacheselctinst
$Awfif::memes-> {selctinst} = 18;#originally selfacet line 1: tinst
# wsscacheselcchange
$Awfif::memes-> {selcchange} = 19;#originally selfacet line 2: change
# wsscacheudpcv
$Awfif::memes-> {udpcv} = 20;#originally usedescproperty line 0: t or f
# wsscacheudpcit
$Awfif::memes-> {udpcit} = 21;#originally usedescproperty line 1: iterator
# wsscacheudpcme
$Awfif::memes-> {udpcme} = 22;#originally usedescproperty line 2: matches
# wsscacheudpcmn
$Awfif::memes-> {udpcmn} = 23;#originally usedescproperty line 3: matchns
#mappings
$Awfif::cu2[$Awfif::memes-> {cvpcwso}] = 0;
$Awfif::memes-> {maxcu2} = 1;
#
$Awfif::mtcu2[$Awfif::memes-> {mtcv}] = 0;
$Awfif::mtcu2[$Awfif::memes-> {mtcm}] = 1;
$Awfif::memes-> {maxmtcu2} = 2;
#
$Awfif::udpcu2[$Awfif::memes-> {udpcv}] = 0;
$Awfif::udpcu2[$Awfif::memes-> {udpcme}] = 1;
$Awfif::memes-> {maxudpcu2} = 2;
#
$Awfif::nacu2[$Awfif::memes-> {snlcvalid}] = 0;
$Awfif::nacu2[$Awfif::memes-> {snlcpcv}] = 1;
$Awfif::memes-> {maxnacu2} = 2;
#
$Awfif::selcu2[$Awfif::memes-> {selcv}] = 0;
$Awfif::memes-> {maxselcu2} = 1;
#
$Awfif::cu4[$Awfif::memes-> {cvalid}] = 0;
$Awfif::memes-> {maxcu4} = 1;
#
$Awfif::cu16[$Awfif::memes-> {ci2}] = 0;
$Awfif::cu16[$Awfif::memes-> {snlclact}] = 1;
$Awfif::cu16[$Awfif::memes-> {snlcactd}] = 2;
$Awfif::memes-> {maxcu16} = 3;
#
$Awfif::udpcu16[$Awfif::memes-> {udpcit}] = 0;
$Awfif::udpcu16[$Awfif::memes-> {udpcmn}] = 1;
$Awfif::memes-> {maxudpcu16} = 2;
#
$Awfif::cu32[$Awfif::memes-> {ctinst}] = 0;
$Awfif::cu32[$Awfif::memes-> {cchange}] = 1;
#
$Awfif::memes-> {maxcu32} = 2;
$Awfif::snlcu32[$Awfif::memes-> {snlctinst}] = 0;
$Awfif::snlcu32[$Awfif::memes-> {snlcic}] = 1;
$Awfif::snlcu32[$Awfif::memes-> {snlcsnconcl}] = 2;
$Awfif::snlcu32[$Awfif::memes-> {snlcave}] = 3;
$Awfif::memes-> {maxsnlcu32} = 4;
#
$Awfif::nacu32[$Awfif::memes-> {snlcigch}] = 0;
$Awfif::memes-> {maxnacu32} = 1;
#
$Awfif::selcu32[$Awfif::memes-> {selctinst}] = 0;
$Awfif::selcu32[$Awfif::memes-> {selcchange}] = 1;
$Awfif::memes-> {maxselcu32} = 2;
#
$Awfif::cs32[$Awfif::memes-> {cvpci}] = 0;
$Awfif::memes-> {maxcs32} = 1;
#
# isset
#initialise the vector cache state machines

#%Awfif::isset = (
# tddesc => 0,
# budesc => 1,
# tdbond => 2,
# bubond => 3,
# tdgroup => 4,
# bugroup => 5,
# budescl => 6,
# tddescl => 7,
# selfacetc => 8,
# usedescpc => 9,
# matchtree => 10,
# bustatement => 11,
# budevelopment => 12,
# gotmatch => 13,
# uselhead => 14,
# usedata => 15,
# nonefound => 16,
# parmpresent => 17,
# parmmissing => 18,
# vc => 19,
# initialise => 20,
# get => 21,
# set => 22,
# shouldbevector => 23,
# keepaslist => 24,
# udpcit => 25,
# udpcme => 26,
# udpcmn => 27,
# mtcv => 28,
# mtcm => 29,
# cvpcwso => 30,
# cvpci => 31,
# cchange => 32
# );
#
# workspace operation signals
# istddesc
$Awfif::veccol-> {isset}-> {'tddesc'} = 0;
# isbudesc
$Awfif::veccol-> {isset}-> {'budesc'} = 1;
# istdbond
$Awfif::veccol-> {isset}-> {'tdbond'} = 2;
# isbubond
$Awfif::veccol-> {isset}-> {'bubond'} = 3;
# istdgroup
$Awfif::veccol-> {isset}-> {'tdgroup'} = 4;
# isbugroup
$Awfif::veccol-> {isset}-> {'bugroup'} = 5;
#
# slipnet & matchtree operations
# isbudescl
$Awfif::veccol-> {isset}-> {'budescl'} = 6;
# istddescl
$Awfif::veccol-> {isset}-> {'tddescl'} = 7;
# isselfacetc
$Awfif::veccol-> {isset}-> {'selfacetc'} = 8;
# isusedescpc
$Awfif::veccol-> {isset}-> {'usedescpc'} = 9;
# ismatchtree
$Awfif::veccol-> {isset}-> {'matchtree'} = 10;
# isbustatement
$Awfif::veccol-> {isset}-> {'bustatement'} = 11;
# isbudevelopment
$Awfif::veccol-> {isset}-> {'budevelopment'} = 12;
#
# internal state generated signals
# isgotomatch
$Awfif::veccol-> {isset}-> {'gotmatch'} = 13;
# isuselhead
$Awfif::veccol-> {isset}-> {'uselhead'} = 14;
# isusedata
$Awfif::veccol-> {isset}-> {'usedata'} = 15;
# isnonefound
$Awfif::veccol-> {isset}-> {'nonefound'} = 16;
# isparmpresent
$Awfif::veccol-> {isset}-> {'parmpresent'} = 17;
# isparmmissing
$Awfif::veccol-> {isset}-> {'parmmissing'} = 18;
# isvc
# vc is accessing vector cache
$Awfif::veccol-> {isset}-> {'vc'} = 19;
# isinitialise
# state will be initialised
$Awfif::veccol-> {isset}-> {'initialise'} = 20;
# isget
# mode is now set to get data
$Awfif::veccol-> {isset}-> {'get'} = 21;
# iset
# mode will be set to store data
$Awfif::veccol-> {isset}-> {'set'} = 22;
# isshouldbevector
$Awfif::veccol-> {isset}-> {'shouldbevector'} = 23;
# iskeepaslist
$Awfif::veccol-> {isset}-> {'keepaslist'} = 24;
# isudpcit
$Awfif::veccol-> {isset}-> {'udpcit'} = 25;
# isudpcme
$Awfif::veccol-> {isset}-> {'udpcme'} = 26;
# isudpcmn
$Awfif::veccol-> {isset}-> {'udpcmn'} = 27;
# ismtcv
$Awfif::veccol-> {isset}-> {'mtcv'} = 28;
# ismtcm
$Awfif::veccol-> {isset}-> {'mtcm'} = 29;
# iscvpcwso
$Awfif::veccol-> {isset}-> {'cvpcwso'} = 30;
# iscvpci
$Awfif::veccol-> {isset}-> {'cvpci'} = 31;
# iscchange
$Awfif::veccol-> {isset}-> {'cchange'} = 32;
# veccolsc

# current gscache vector state is in column:
# -1 is an error state - handle and reset to 0
#
# csnotinstate
# 0 is not in logical strategy or structure
#
# csgetmode
# 1 state moded as get
# cssetmode
# 2 state moded as set
#
# use desc property (udp)
#
# csudpget
# 3 strategy defined as udp get
# csudpggetindexparm
# 4 udpg getting index parm
# csudpgcvsearchingindex
# 5 udpg cv searching index
# csudpgcvconcrequested
# 6 udpg cv concept requested
# csudpgcvsearchforconcept
# 7 udpg cv searching for concept
# csudpgcvdescrequested
# 8 udpg cv descriptor requested
# csudpgcvsearchingdesc
# 9 udpg cv searching descriptor
#
# csudpset
# 10 strategy defined as udp set
# csudpsgetindexparm
# 11 udps getting index parm - don't model index its in my control
# csudpssearchingindex
# 12 udps searching index
# csudpscvconcrequested
# 13 udps cv concept requested
#
# csnspttlist
# 14 no strategy pass through to list
# csudpspttlist
# 15 udp strategy pass through to list
# csudpsmodconden
# 16 udps modelling concept density
# csudpscvsearchforconcept
# 17 udps cv searching for concept
# csudpsvscvsearchforconcept
# 18 udpsvs cv searching for concept
# csudpscvdescrequested
# 19 udps cv descriptor requested
# csudpsvscvdescrequested
# 20 udpsvs cv descriptor requested
# csudpsvsmoddescden
# 21 udpsvs modelling descriptor density
# csudpscvsearchingdesc
# 22 udps cv searching for descriptor
# csudpsvscvsearchingdesc
# 23 udpsvs cv searching for descriptor
#
# csudpgmapindex
# 24 udpg mapping index
# 25 udpg cit concept requested
# 26 udpg cit searching for concept
# 27 udpg cit descriptor requested
# 28 udpg cit searching descriptor
#
# 29 udps it searching index
# 30 udps cit concept requested
# 31 udps modelling concept density
# 32 udps cit searching for concept
# 33 udpsvs cit searching for concept
# 34 udps cit descriptor requested
# 35 udpsvs cit descriptor requested
# 36 udpsvs modelling descriptor density
# 37 udps cit searching for descriptor
# 38 udpsvs cit searching for descriptor
#
# 39 udpg me concept requested
# 40 udpg me searching for concept
# 41 udpg me descriptor requested
# 42 udpg me searching descriptor
# 43 udpg me ws requested
# 44 udpg me searching ws
# 45 udpg mn concept requested
# 46 udpg mn searching for concept
# 47 udpg mn descriptor requested
# 48 udpg mn searching descriptor
# 49 udpg mn descriptor requested
# 50 udpg mn searching descriptor
# 51 udpg me searching index
# 52 udpg mn searching index
#
# 53 udpsg me searching index
# 54 udpsg mn searching index
# 55 udps me concept requested
# 56 udps modelling concept density
# 57 udps me searching for concept
# 58 udpsvs me searching for concept
# 59 udps me descriptor requested
# 60 udpsvs me descriptor requested
# 61 udpsvs modelling descriptor density
# 62 udps me searching for descriptor
# 63 udpsvs me searching for descriptor
# 64 udps me ws requested
# 65 udpsvs me ws requested
# 66 udpsvs modelling ws density
# 67 udps me searching for ws
# 68 udpsvs me searching for ws
#
# 69 udps mn concept requested
# 70 udps modelling concept density
# 71 udps mn searching for concept
# 72 udpsvs mn searching for concept
# 73 udps mn descriptor requested
# 74 udpsvs mn descriptor requested
# 75 udpsvs modelling descriptor density
# 76 udps mn searching for descriptor
# 77 udpsvs mn searching for descriptor
# 78 udps mn ws requested
# 79 udpsvs mn ws requested
# 80 udpsvs modelling ws density
# 67 udps mn searching for ws
# 68 udpsvs mn searching for ws
#
# 82 - 128 are matchtree states and actions
#
# 83 <- 39
# 84 <- 40
# 85 <- 41
# 86 <- 51
# 87 <- 52
# 88 <- 53
# 89 <- 54
# 90 <- 55
# 91 <- 56
# 92 <- 57
# 93 <- 58
# 94 <- 59
# 95 <- 60
# 96 <- 61
# 97 <- 62
# 98 <- 63
# 99 <- 64
# 100 <- 65
# 101 <- 66
# 102 <- 67
# 103 <- 68
# 104 <- 69
# 105 <- 70
# 106 <- 71
# 107 <- 72
# 108 <- 73
# 109 <- 74
# 110 <- 75
# 111 <- 76
# 112 <- 77
# 113 <- 78
# 114 <- 79
# 115 <- 80
# 116 <- 81
# 117 <- 82
# 120 <- 42
# 121 <- 43
# 122 <- 44
# 123 <- 45
# 124 <- 46
# 125 <- 47
# 126 <- 48
# 127 <- 49
# 128 <- 50
# 129 strategy defined as matchtree get <- 3
# 130 strategy defined as matchtree set <- 4
# 131 <- 10
# 132 <- 11
# cvpcwso states
# 133 <- 3
# 151 <- 23
# 152 <- 3
# 170 <- 23
# 171 <- 3
# 189 <- 23
# 190 <- 3
# 208 <- 23
# 209 <- 3
# 227 <- 23
# 228 <- 3
# 246 <- 23
# 247 <- 3
# 265 <- 23
# 266 <- 3
# 284 <- 23
#
# cvpci states
# 285 <- 133
# 303 <- 23
# 304 <- 3
# 322 <- 23
# 323 <- 3
# 341 <- 23
# 342 <- 3
# 360 <- 23
# 361 <- 3
# 379 <- 23
# 380 <- 3
# 398 <- 23
# 399 <- 3
# 417 <- 23
# 418 <- 3
# 436 <- 284
#
#
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590
@Awfif::vcnstate = (
    [ -1,209,216, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1,228,235, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1,171,178, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1,190,197, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1,133,140, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1,152,159, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1,129,131, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1,247,254, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1,266,273, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, 4, -1, 6, -1, 8, -1, 0, 11, -1, 13, -1, -1, -1, -1, 19, 20, -1, -1, -1, 0, 0, 25, -1, 27, -1, 0, 30, -1, -1, 34, 35, -1, -1, -1, 0, 0, -1, 41, -1, 43, -1, 0, -1, 47, -1, 49, -1, 0, 39, 45, 55, 69, -1, -1, 59, 60, -1, -1, -1, 64, 65, -1, -1, -1, 0, 0, -1, -1, 73, 74, -1, -1, -1, 78, 79, -1, -1, -1, 0, 0, -1, 85, -1, 83,123, 90,104, -1, -1, 94, 95, -1, -1, -1, 99,100, -1, -1, -1, 0, 0, -1, -1,108,109, -1, -1, -1,113,114, -1, -1, -1, 0, 0, -1, -1,121, -1, 0, -1,125, -1,127, -1, 0,130, -1,132, -1,134, -1,136, -1,138, -1, 0,141, -1,143, -1, -1,148,149, -1, -1, -1, 0, 0,153, -1,155, -1,157, -1, 0,160, -1,162, -1, -1,166,167, -1, -1, -1, 0, 0,172, -1,174, -1,176, -1, 0,179, -1,181, -1, -1,185,186, -1, -1, -1, 0, 0,191, -1,193, -1,195, -1, 0,198, -1,200, -1, -1,204,205, -1, -1, -1, 0, 0,210, -1,212, -1,214, -1, 0,217, -1,219, -1, -1,223,224, -1, -1, -1, 0, 0,229, -1,231, -1,233, -1, 0,236, -1,238, -1, -1,242,243, -1, -1, -1, 0, 0,248, -1,250, -1,252, -1, 0,255, -1,257, -1, -1,261,262, -1, -1, -1, 0, 0,267, -1,269, -1,271, -1, 0,274, -1,276, -1, -1,280,281, -1, -1, -1, 0, 0,286, -1,288, -1,290, -1, 0,293, -1,295, -1, -1,300,301, -1, -1, -1, 0, 0,305, -1,307, -1,309, -1, 0,312, -1,314, -1, -1,318,319, -1, -1, -1, 0, 0,324, -1,326, -1,328, -1, 0,331, -1,333, -1, -1,337,338, -1, -1, -1, 0, 0,343, -1,345, -1,347, -1, 0,350, -1,352, -1, -1,356,357, -1, -1, -1, 0, 0,362, -1,364, -1,366, -1, 0,369, -1,371, -1, -1,375,376, -1, -1, -1, 0, 0,381, -1,383, -1,385, -1, 0,388, -1,390, -1, -1,394,395, -1, -1, -1, 0, 0,400, -1,402, -1,404, -1, 0,407, -1,409, -1, -1,413,414, -1, -1, -1, 0, 0,419, -1,421, -1,423, -1, 0,426, -1,428, -1, -1,432,433, -1, -1, -1, 0, 0,438, -1,440, -1,442, -1, 0,445, -1,447, -1, -1,452,453, -1, -1, -1, 0, 0,457, -1,459, -1,461, -1, 0,463, -1,466, -1, -1,470,471, -1, -1, -1, 0, 0,476, -1,478, -1,480, -1, 0,483, -1,485, -1, -1,489,490, -1, -1, -1, 0, 0,495, -1,497, -1,499, -1, 0,502, -1,504, -1, -1,508,509, -1, -1, -1, 0, 0,514, -1,516, -1,518, -1, 0,521, -1,523, -1, -1,527,528, -1, -1, -1, 0, 0,533, -1,535, -1,537, -1, 0,540, -1,542, -1, -1,546,547, -1, -1, -1, 0, 0,552, -1,554, -1,556, -1, 0,559, -1,561, -1, -1,565,566, -1, -1, -1, 0, 0,571, -1,573, -1,575, -1, 0,578, -1,580, -1, -1,584,585, -1, -1, -1, 0, 0],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, 7, -1, 9, -1, -1, -1, -1, 16, -1, -1, -1, -1, -1, 22, 21, -1, -1, -1, -1, 26, -1, 28, -1, -1, 31, -1, -1, -1, 37, 36, -1, -1, -1, 40, -1, 42, -1, -1, -1, 46, -1, 48, -1, -1, -1, -1, -1, -1, -1, 56, -1, -1, -1, 62, 61, -1, -1, -1, -1, -1, -1, -1, -1, 70, -1, -1, -1, 76, 75, -1, -1, -1, -1, -1, -1, -1, -1, 84, -1,120, -1, -1, -1, -1, 91, -1, -1, -1, 97, 96, -1, -1, -1, -1, -1, -1, -1, -1,105, -1, -1, -1,111,110, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,124, -1,126, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,137, -1,139, -1, -1, -1, -1,144, -1, -1, -1,150,149, -1, -1, -1, -1, -1, -1,156, -1,158, -1, -1, -1, -1,163, -1, -1, -1,169,168, -1, -1, -1, -1, -1, -1,175, -1,177, -1, -1, -1, -1,182, -1, -1, -1,188,187, -1, -1, -1, -1, -1, -1,194, -1,196, -1, -1, -1, -1,201, -1, -1, -1,207,206, -1, -1, -1, -1, -1, -1,213, -1,215, -1, -1, -1, -1,220, -1, -1, -1,226,225, -1, -1, -1, -1, -1, -1,232, -1,234, -1, -1, -1, -1,239, -1, -1, -1,245,244, -1, -1, -1, -1, -1, -1,251, -1,253, -1, -1, -1, -1,258, -1, -1, -1,264,263, -1, -1, -1, -1, -1, -1,270, -1,272, -1, -1, -1, -1,277, -1, -1, -1,283,282, -1, -1, -1, -1, -1, -1,289, -1,291, -1, -1, -1, -1,296, -1, -1, -1,302,301, -1, -1, -1, -1, -1, -1,308, -1,310, -1, -1, -1, -1,315, -1, -1, -1,321,320, -1, -1, -1, -1, -1, -1,327, -1,329, -1, -1, -1, -1,334, -1, -1, -1,340,339, -1, -1, -1, -1, -1, -1,346, -1,348, -1, -1, -1, -1,353, -1, -1, -1,359,358, -1, -1, -1, -1, -1, -1,365, -1,367, -1, -1, -1, -1,372, -1, -1, -1,378,377, -1, -1, -1, -1, -1, -1,384, -1,386, -1, -1, -1, -1,391, -1, -1, -1,397,396, -1, -1, -1, -1, -1, -1,403, -1,405, -1, -1, -1, -1,410, -1, -1, -1,416,415, -1, -1, -1, -1, -1, -1,422, -1,424, -1, -1, -1, -1,429, -1, -1, -1,435,434, -1, -1, -1, -1, -1, -1,441, -1,443, -1, -1, -1, -1,448, -1, -1, -1,454,453, -1, -1, -1, -1, -1, -1,460, -1,462, -1, -1, -1, -1,467, -1, -1, -1,473,472, -1, -1, -1, -1, -1, -1,479, -1,481, -1, -1, -1, -1,486, -1, -1, -1,492,491, -1, -1, -1, -1, -1, -1,498, -1,500, -1, -1, -1, -1,505, -1, -1, -1,511,510, -1, -1, -1, -1, -1, -1,517, -1,519, -1, -1, -1, -1,524, -1, -1, -1,530,529, -1, -1, -1, -1, -1, -1,536, -1,538, -1, -1, -1, -1,543, -1, -1, -1,549,548, -1, -1, -1, -1, -1, -1,555, -1,557, -1, -1, -1, -1,562, -1, -1, -1,568,567, -1, -1, -1, -1, -1, -1,574, -1,576, -1, -1, -1, -1,581, -1, -1, -1,587,586, -1, -1, -1],
    [ -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, 0, 0, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, 0, 0, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1],
    [ -1, -1, -1, -1, 5, -1, -1, -1, -1, -1, -1, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 14, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 14, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, -1, 15, -1, -1, -1, -1, 15, -1, -1, -1, 72, -1, -1, -1, -1, 15, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, 15, -1, -1, -1, -1, 15, -1, -1, -1,107, -1, -1, -1, -1, 15, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,146, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,165, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,184, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,203, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,222, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,241, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,260, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,279, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,298, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,317, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,336, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,355, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,374, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,393, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,412, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,431, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,450, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,469, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,488, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,507, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,526, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,545, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,564, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,583, -1, -1, -1, -1, 15, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, 63, -1, -1, -1, -1, 68, -1, -1, -1, 71, -1, -1, -1, -1, 77, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 92, -1, -1, -1, -1, 98, -1, -1, -1, -1,103, -1, -1, -1,106, -1, -1, -1, -1,112, -1, -1, -1, -1,117, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,145, -1, -1, -1, -1,151, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,164, -1, -1, -1, -1,170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,183, -1, -1, -1, -1,189, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,202, -1, -1, -1, -1,208, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,221, -1, -1, -1, -1,227, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,240, -1, -1, -1, -1,246, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,259, -1, -1, -1, -1,265, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,278, -1, -1, -1, -1,284, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,297, -1, -1, -1, -1,303, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,316, -1, -1, -1, -1,322, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,335, -1, -1, -1, -1,341, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,354, -1, -1, -1, -1,360, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,373, -1, -1, -1, -1,379, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,392, -1, -1, -1, -1,398, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,411, -1, -1, -1, -1,417, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,430, -1, -1, -1, -1,436, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,297, -1, -1, -1, -1,303, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,316, -1, -1, -1, -1,322, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,335, -1, -1, -1, -1,341, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,354, -1, -1, -1, -1,360, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,373, -1, -1, -1, -1,379, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,392, -1, -1, -1, -1,398, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,411, -1, -1, -1, -1,417, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,430, -1, -1, -1, -1,436, -1, -1],
    [ -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, -1, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, 51, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,102,101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,116,115, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,102,101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,122, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,116,115, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,128, -1, -1, 87, -1, 89, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,116,115, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,128, -1, -1, 87, -1, 89, -1,135, -1, -1, -1, -1, -1, -1,142, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,154, -1, -1, -1, -1, -1, -1,161, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,173, -1, -1, -1, -1, -1, -1,180, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,192, -1, -1, -1, -1, -1, -1,199, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,211, -1, -1, -1, -1, -1, -1,218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,230, -1, -1, -1, -1, -1, -1,237, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,249, -1, -1, -1, -1, -1, -1,256, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,268, -1, -1, -1, -1, -1, -1,275, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,287, -1, -1, -1, -1, -1, -1,294, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,306, -1, -1, -1, -1, -1, -1,313, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,325, -1, -1, -1, -1, -1, -1,332, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,344, -1, -1, -1, -1, -1, -1,351, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,363, -1, -1, -1, -1, -1, -1,370, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,382, -1, -1, -1, -1, -1, -1,389, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,401, -1, -1, -1, -1, -1, -1,408, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,420, -1, -1, -1, -1, -1, -1,427, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,306, -1, -1, -1, -1, -1, -1,313, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,325, -1, -1, -1, -1, -1, -1,332, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,344, -1, -1, -1, -1, -1, -1,351, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,363, -1, -1, -1, -1, -1, -1,370, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,382, -1, -1, -1, -1, -1, -1,389, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,401, -1, -1, -1, -1, -1, -1,408, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,420, -1, -1, -1, -1, -1, -1,427, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
    [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, 63, -1, -1, -1, -1, 68, -1, -1, -1, 71, -1, -1, -1, -1, 77, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 92, -1, -1, -1, -1, 98, -1, -1, -1, -1,103, -1, -1, -1,106, -1, -1, -1, -1,112, -1, -1, -1, -1,117, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,439, -1, -1, -1, -1, -1, -1,446, -1, -1,145, -1, -1, -1, -1,151, -1, -1, -1,458, -1, -1, -1, -1, -1, -1,465, -1, -1,164, -1, -1, -1, -1,170, -1, -1, -1,477, -1, -1, -1, -1, -1, -1,484, -1, -1,183, -1, -1, -1, -1,189, -1, -1, -1,496, -1, -1, -1, -1, -1, -1,503, -1, -1,202, -1, -1, -1, -1,208, -1, -1, -1,515, -1, -1, -1, -1, -1, -1,522, -1, -1,221, -1, -1, -1, -1,227, -1, -1, -1,534, -1, -1, -1, -1, -1, -1,541, -1, -1,240, -1, -1, -1, -1,246, -1, -1, -1,553, -1, -1, -1, -1, -1, -1,560, -1, -1,259, -1, -1, -1, -1,265, -1, -1, -1,572, -1, -1, -1, -1, -1, -1,579, -1, -1,278, -1, -1, -1, -1,284, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,297, -1, -1, -1, -1,303, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,316, -1, -1, -1, -1,322, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,335, -1, -1, -1, -1,341, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,354, -1, -1, -1, -1,360, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,373, -1, -1, -1, -1,379, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,392, -1, -1, -1, -1,398, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,411, -1, -1, -1, -1,417, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,430, -1, -1, -1, -1,436, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,449, -1, -1, -1, -1,455, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,468, -1, -1, -1, -1,474, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,487, -1, -1, -1, -1,493, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,506, -1, -1, -1, -1,512, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,525, -1, -1, -1, -1,531, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,544, -1, -1, -1, -1,550, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,563, -1, -1, -1, -1,569, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,582, -1, -1, -1, -1,588, -1, -1],
    );
# action to be performed is a function of the input and the current state:
# -3 error "extra conflicting connect to verb specified"
# -2 error "conflicting connects to verb"
# -1 is an error state - report the error "source previous but source is connected subsequent"
# 0 no action to perform, recall
# 1 hash veccol-> {index} {$strategy} for strategy head $head & recall
# 2 initialise & respond no match
# 3 search top level list for parameter match to type => $head, move into matching element's child link (i.e. load $element (which may be 0) & $head) & recall
# 4 obtain list head & recall
# 5 get param 1 as (concept) & recall
# 6 get param 4 as (descriptor) & recall ?
# 7 obtain data, & return
# 8 get mode (get or set) & recall
# 9 pass through to checkcachev & return
# 10 pass through to setcachev & return
# 11 get list head from veccol-> {get} [$sindex] => $head & recall *** deprecated
# 12 get param 4 (index) & recall
# 13 search list for parameter match to type; if fail create new list element => head; proceed as success - success => move to matching element (load $element (which may be 0) & $head) & recall;
# 14 model concept contribution to density & respond shouldbevector or keepaslist
# 15 model descriptor contribution to density & respond shouldbevector or keepaslist
# 16 write data to list element & return
# 17 migrate cv list elements to vector, pass control to setcache & return
# 18 search sublist for parameter match to type; success => If data element recall (got match) else move to matching element (reset $element & $head) & recall (got match)
# 19 search sublist for parameter match to type; if fail create new list element (at level of searched sub list) => $head & proceed as success - success => if data element recall (got match) else move into matching element's child link (i.e. load $element (which may be 0) & $head) & recall;
# 20 get param 0 as (strategy) & recall
# 21 hash veccol-> {index} {$strategy} for strategy head $head -> gotmatch & recall; if fail create element, link it to index -> gotmatch
# 22 get param 2 (ws) & recall

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

#%Awfif::cvindexmap = (
# $Awfif::memes-> {cvalid} => 'gotmatch',
# $Awfif::memes-> {cchange} => 'cchange',
# $Awfif::memes-> {snlcic} => 'gotmatch',
# $Awfif::memes-> {snlcpcv} => 'gotmatch',
# $Awfif::memes-> {snlcsnconcl} => 'gotmatch',
# $Awfif::memes-> {snlclact} => 'gotmatch',
# $Awfif::memes-> {snlcactd} => 'gotmatch',
# $Awfif::memes-> {snlcave} => 'gotmatch',
# $Awfif::memes-> {ci2} => 'gotmatch',
# $Awfif::memes-> {ctinst} => 'gotmatch',
# $Awfif::memes-> {cvpci} => 'cvpci',
# $Awfif::memes-> {cvpcwso} => 'cvpcwso',
# $Awfif::memes-> {snlcvalid} => 'gotmatch',
# $Awfif::memes-> {snlctinst} => 'gotmatch',
# $Awfif::memes-> {snlcigch} => 'gotmatch',
# $Awfif::memes-> {mtcv} => 'mtcv',
# $Awfif::memes-> {mtcm} => 'mtcm',
# $Awfif::memes-> {selcv} => 'gotmatch',
# $Awfif::memes-> {selctinst} => 'gotmatch',
# $Awfif::memes-> {selcchange} => 'gotmatch',
# $Awfif::memes-> {udpcv} => 'vc',
# $Awfif::memes-> {udpcit} => 'udpcit',
# $Awfif::memes-> {udpcme} => 'udpcme',
# $Awfif::memes-> {udpcmn} => 'udpcmn'
# );
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {cvalid}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {cchange}} = 'cchange';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {snlcic}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {snlcpcv}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {snlcsnconcl}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {snlclact}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {snlcactd}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {snlcave}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {ci2}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {ctinst}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {cvpci}} = 'cvpci';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {cvpcwso}} = 'cvpcwso';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {snlcvalid}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {snlctinst}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {snlcigch}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {mtcv}} = 'mtcv';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {mtcm}} = 'mtcm';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {selcv}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {selctinst}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {selcchange}} = 'gotmatch';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {udpcv}} = 'vc';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {udpcit}} = 'udpcit';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {udpcme}} = 'udpcme';
$Awfif::veccol-> {cvindexmap}-> {$Awfif::memes-> {udpcmn}} = 'udpcmn';
#<!-- end tag ca -->
#
if ((!defined ($restoring)) or (!$restoring)){
# initialise the core physical lists
#

    $Awfif::slipnet-> {p} = 1;
    $Awfif::wsbl-> {f} = 0; #workspace base and offset list to allow adding, merging and deleting
    $Awfif::wsbl-> {h} = 0;
    $Awfif::wsbl-> {t} = 0;
    $Awfif::wsbl-> {flistl} = 0;
    $Awfif::wsbl-> {p} = 1;
    $Awfif::wsol-> {f} = 0; #workspace constrol structures
    $Awfif::wsol-> {h} = 0;
    $Awfif::wsol-> {t} = 0;
    $Awfif::wsol-> {flistl} = 0;
    $Awfif::wsol-> {p} = 1;
    $Awfif::hnamel-> {f} = 0; #workspace constrol structures
    $Awfif::hnamel-> {h} = 0;
    $Awfif::hnamel-> {t} = 0;
    $Awfif::hnamel-> {flistl} = 0;
    $Awfif::hnamel-> {p} = 1;
    $Awfif::memes-> {traceentry} = 10; entry & exit control
    $Awfif::memes-> {smlscstate} = 0; #smls statemachine initial state
    $Awfif::memes-> {srfsmcstate} = 0;
    $Awfif::memes-> {trfsmcstate} = 0;
    $Awfif::memes-> {nfsmcstate} = 0;
    $Awfif::kwbracketd->{incb} = '';
    $Awfif::kwbracketd->{incs} = '';
    $Awfif::kwbracketd->{bmec} = 0;
    $Awfif::kwbracketd->{ibmec} = 0;
    $Awfif::kwbracketd->{smsc} = 0;
    $Awfif::kwjhl-> {jhlabel} = ();
    $Awfif::kwjhl-> {jhlp} = 1;
    };#if not restoring
# ------------------------------ do metafile setup ---------------------------------------------------
#

&setupmeta ($restoring, \$metaname, \$kwl, \$kwai, \$kwar, \$kwp, \$kwpr, \$inmfdt, \@file, \$frecs);
&setupmemes ($restoring, $metaname, \$sgmrecs);
&setupcoderack (\$restoring, $metaname, \$setwsclinv, \$kwl, \$kwai, \$kwar, \$kwp, \$kwpr, \$inmfdt, \@wspace, \$frecs, \$sgmrecs);
Market Centric Workshops
The Physics - Politics, Economics & Evolutionary Psychology
Politics, Economics & Evolutionary Psychology

Business Physics
Nature and nurture drive the business eco-system
Human nature
Emerging structure and dynamic forces of adaptation


integrating quality appropriate for each market
 
This page looks at schematic structures and their uses.  It discusses a number of examples:
  • Schematic ideas are recombined in creativity. 
  • Similarly designers take ideas and rules about materials and components and combine them. 
  • Schematic Recipes help to standardize operations. 
  • Modular components are combined into strategies for use in business plans and business models. 

As a working example it presents part of the contents and schematic details from the Adaptive Web Framework (AWF)'s operational plan. 

Finally it includes a section presenting our formal representation of schematic goals. 
Each goal has a series of associated complex adaptive system (CAS) strategy strings. 
These goals plus strings are detailed for various chess and business examples. 
Strategy
| Design |
This page uses an example to illustrate how:
  • A business can gain focus from targeting key customers,
  • Business planning activities performed by the whole organization can build awareness, empowerment and coherence. 
  • A program approach can ensure strategic alignment. 
Program Management
| Home

Profiles | Papers | Glossary | E-mail us