diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..887f220ea --- /dev/null +++ b/Makefile @@ -0,0 +1,25 @@ +.PHONEY: all parser goyacc + +all: parser.go + +parser.go: parser.y + make parser + +parser: goyacc + bin/goyacc -o /dev/null parser.y + bin/goyacc -o parser.go parser.y 2>&1 | egrep "(shift|reduce)/reduce" | awk '{print} END {if (NR > 0) {print "Find conflict in parser.y. Please check y.output for more information."; exit 1;}}' + rm -f y.output + + @if [ $(ARCH) = $(LINUX) ]; \ + then \ + sed -i -e 's|//line.*||' -e 's/yyEofCode/yyEOFCode/' parser.go; \ + elif [ $(ARCH) = $(MAC) ]; \ + then \ + /usr/bin/sed -i "" 's|//line.*||' parser.go; \ + /usr/bin/sed -i "" 's/yyEofCode/yyEOFCode/' parser.go; \ + fi + + @awk 'BEGIN{print "// Code generated by goyacc"} {print $0}' parser.go > tmp_parser.go && mv tmp_parser.go parser.go; + +goyacc: + go build -o bin/goyacc goyacc/main.go diff --git a/ast/ast.go b/ast/ast.go new file mode 100644 index 000000000..2f3be0b4b --- /dev/null +++ b/ast/ast.go @@ -0,0 +1,156 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package ast is the abstract syntax tree parsed from a SQL statement by parser. +// It can be analysed and transformed by optimizer. +package ast + +import ( + "io" + + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/types" +) + +// Node is the basic element of the AST. +// Interfaces embed Node should have 'Node' name suffix. +type Node interface { + // Accept accepts Visitor to visit itself. + // The returned node should replace original node. + // ok returns false to stop visiting. + // + // Implementation of this method should first call visitor.Enter, + // assign the returned node to its method receiver, if skipChildren returns true, + // children should be skipped. Otherwise, call its children in particular order that + // later elements depends on former elements. Finally, return visitor.Leave. + Accept(v Visitor) (node Node, ok bool) + // Text returns the original text of the element. + Text() string + // SetText sets original text to the Node. + SetText(text string) +} + +// Flags indicates whether an expression contains certain types of expression. +const ( + FlagConstant uint64 = 0 + FlagHasParamMarker uint64 = 1 << iota + FlagHasFunc + FlagHasReference + FlagHasAggregateFunc + FlagHasSubquery + FlagHasVariable + FlagHasDefault + FlagPreEvaluated +) + +// ExprNode is a node that can be evaluated. +// Name of implementations should have 'Expr' suffix. +type ExprNode interface { + // Node is embedded in ExprNode. + Node + // SetType sets evaluation type to the expression. + SetType(tp *types.FieldType) + // GetType gets the evaluation type of the expression. + GetType() *types.FieldType + // SetFlag sets flag to the expression. + // Flag indicates whether the expression contains + // parameter marker, reference, aggregate function... + SetFlag(flag uint64) + // GetFlag returns the flag of the expression. + GetFlag() uint64 + + // Format formats the AST into a writer. + Format(w io.Writer) +} + +// OptBinary is used for parser. +type OptBinary struct { + IsBinary bool + Charset string +} + +// FuncNode represents function call expression node. +type FuncNode interface { + ExprNode + functionExpression() +} + +// StmtNode represents statement node. +// Name of implementations should have 'Stmt' suffix. +type StmtNode interface { + Node + statement() +} + +// DDLNode represents DDL statement node. +type DDLNode interface { + StmtNode + ddlStatement() +} + +// DMLNode represents DML statement node. +type DMLNode interface { + StmtNode + dmlStatement() +} + +// ResultField represents a result field which can be a column from a table, +// or an expression in select field. It is a generated property during +// binding process. ResultField is the key element to evaluate a ColumnNameExpr. +// After resolving process, every ColumnNameExpr will be resolved to a ResultField. +// During execution, every row retrieved from table will set the row value to +// ResultFields of that table, so ColumnNameExpr resolved to that ResultField can be +// easily evaluated. +type ResultField struct { + Column *model.ColumnInfo + ColumnAsName model.CIStr + Table *model.TableInfo + TableAsName model.CIStr + DBName model.CIStr + + // Expr represents the expression for the result field. If it is generated from a select field, it would + // be the expression of that select field, otherwise the type would be ValueExpr and value + // will be set for every retrieved row. + Expr ExprNode + TableName *TableName + // Referenced indicates the result field has been referenced or not. + // If not, we don't need to get the values. + Referenced bool +} + +// ResultSetNode interface has a ResultFields property, represents a Node that returns result set. +// Implementations include SelectStmt, SubqueryExpr, TableSource, TableName and Join. +type ResultSetNode interface { + Node +} + +// SensitiveStmtNode overloads StmtNode and provides a SecureText method. +type SensitiveStmtNode interface { + StmtNode + // SecureText is different from Text that it hide password information. + SecureText() string +} + +// Visitor visits a Node. +type Visitor interface { + // Enter is called before children nodes are visited. + // The returned node must be the same type as the input node n. + // skipChildren returns true means children nodes should be skipped, + // this is useful when work is done in Enter and there is no need to visit children. + Enter(n Node) (node Node, skipChildren bool) + // Leave is called after children nodes have been visited. + // The returned node's type can be different from the input node if it is a ExprNode, + // Non-expression node must be the same type as the input node n. + // ok returns false to stop visiting. + Leave(n Node) (node Node, ok bool) +} diff --git a/ast/base.go b/ast/base.go new file mode 100644 index 000000000..984d8e4d9 --- /dev/null +++ b/ast/base.go @@ -0,0 +1,101 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import "github.com/pingcap/parser/types" + +// node is the struct implements node interface except for Accept method. +// Node implementations should embed it in. +type node struct { + text string +} + +// SetText implements Node interface. +func (n *node) SetText(text string) { + n.text = text +} + +// Text implements Node interface. +func (n *node) Text() string { + return n.text +} + +// stmtNode implements StmtNode interface. +// Statement implementations should embed it in. +type stmtNode struct { + node +} + +// statement implements StmtNode interface. +func (sn *stmtNode) statement() {} + +// ddlNode implements DDLNode interface. +// DDL implementations should embed it in. +type ddlNode struct { + stmtNode +} + +// ddlStatement implements DDLNode interface. +func (dn *ddlNode) ddlStatement() {} + +// dmlNode is the struct implements DMLNode interface. +// DML implementations should embed it in. +type dmlNode struct { + stmtNode +} + +// dmlStatement implements DMLNode interface. +func (dn *dmlNode) dmlStatement() {} + +// exprNode is the struct implements Expression interface. +// Expression implementations should embed it in. +type exprNode struct { + node + Type types.FieldType + flag uint64 +} + +// TexprNode is exported for parser driver. +type TexprNode = exprNode + +// SetType implements ExprNode interface. +func (en *exprNode) SetType(tp *types.FieldType) { + en.Type = *tp +} + +// GetType implements ExprNode interface. +func (en *exprNode) GetType() *types.FieldType { + return &en.Type +} + +// SetFlag implements ExprNode interface. +func (en *exprNode) SetFlag(flag uint64) { + en.flag = flag +} + +// GetFlag implements ExprNode interface. +func (en *exprNode) GetFlag() uint64 { + return en.flag +} + +type funcNode struct { + exprNode +} + +// functionExpression implements FunctionNode interface. +func (fn *funcNode) functionExpression() {} + +type resultSetNode struct { + resultFields []*ResultField +} diff --git a/ast/ddl.go b/ast/ddl.go new file mode 100644 index 000000000..aefa2eed2 --- /dev/null +++ b/ast/ddl.go @@ -0,0 +1,893 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/types" +) + +var ( + _ DDLNode = &AlterTableStmt{} + _ DDLNode = &CreateDatabaseStmt{} + _ DDLNode = &CreateIndexStmt{} + _ DDLNode = &CreateTableStmt{} + _ DDLNode = &CreateViewStmt{} + _ DDLNode = &DropDatabaseStmt{} + _ DDLNode = &DropIndexStmt{} + _ DDLNode = &DropTableStmt{} + _ DDLNode = &RenameTableStmt{} + _ DDLNode = &TruncateTableStmt{} + + _ Node = &AlterTableSpec{} + _ Node = &ColumnDef{} + _ Node = &ColumnOption{} + _ Node = &ColumnPosition{} + _ Node = &Constraint{} + _ Node = &IndexColName{} + _ Node = &ReferenceDef{} +) + +// CharsetOpt is used for parsing charset option from SQL. +type CharsetOpt struct { + Chs string + Col string +} + +// DatabaseOptionType is the type for database options. +type DatabaseOptionType int + +// Database option types. +const ( + DatabaseOptionNone DatabaseOptionType = iota + DatabaseOptionCharset + DatabaseOptionCollate +) + +// DatabaseOption represents database option. +type DatabaseOption struct { + Tp DatabaseOptionType + Value string +} + +// CreateDatabaseStmt is a statement to create a database. +// See https://dev.mysql.com/doc/refman/5.7/en/create-database.html +type CreateDatabaseStmt struct { + ddlNode + + IfNotExists bool + Name string + Options []*DatabaseOption +} + +// Accept implements Node Accept interface. +func (n *CreateDatabaseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateDatabaseStmt) + return v.Leave(n) +} + +// DropDatabaseStmt is a statement to drop a database and all tables in the database. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-database.html +type DropDatabaseStmt struct { + ddlNode + + IfExists bool + Name string +} + +// Accept implements Node Accept interface. +func (n *DropDatabaseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropDatabaseStmt) + return v.Leave(n) +} + +// IndexColName is used for parsing index column name from SQL. +type IndexColName struct { + node + + Column *ColumnName + Length int +} + +// Accept implements Node Accept interface. +func (n *IndexColName) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IndexColName) + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + return v.Leave(n) +} + +// ReferenceDef is used for parsing foreign key reference option from SQL. +// See http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html +type ReferenceDef struct { + node + + Table *TableName + IndexColNames []*IndexColName + OnDelete *OnDeleteOpt + OnUpdate *OnUpdateOpt +} + +// Accept implements Node Accept interface. +func (n *ReferenceDef) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ReferenceDef) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.IndexColNames { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.IndexColNames[i] = node.(*IndexColName) + } + onDelete, ok := n.OnDelete.Accept(v) + if !ok { + return n, false + } + n.OnDelete = onDelete.(*OnDeleteOpt) + onUpdate, ok := n.OnUpdate.Accept(v) + if !ok { + return n, false + } + n.OnUpdate = onUpdate.(*OnUpdateOpt) + return v.Leave(n) +} + +// ReferOptionType is the type for refer options. +type ReferOptionType int + +// Refer option types. +const ( + ReferOptionNoOption ReferOptionType = iota + ReferOptionRestrict + ReferOptionCascade + ReferOptionSetNull + ReferOptionNoAction +) + +// String implements fmt.Stringer interface. +func (r ReferOptionType) String() string { + switch r { + case ReferOptionRestrict: + return "RESTRICT" + case ReferOptionCascade: + return "CASCADE" + case ReferOptionSetNull: + return "SET NULL" + case ReferOptionNoAction: + return "NO ACTION" + } + return "" +} + +// OnDeleteOpt is used for optional on delete clause. +type OnDeleteOpt struct { + node + ReferOpt ReferOptionType +} + +// Accept implements Node Accept interface. +func (n *OnDeleteOpt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnDeleteOpt) + return v.Leave(n) +} + +// OnUpdateOpt is used for optional on update clause. +type OnUpdateOpt struct { + node + ReferOpt ReferOptionType +} + +// Accept implements Node Accept interface. +func (n *OnUpdateOpt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnUpdateOpt) + return v.Leave(n) +} + +// ColumnOptionType is the type for ColumnOption. +type ColumnOptionType int + +// ColumnOption types. +const ( + ColumnOptionNoOption ColumnOptionType = iota + ColumnOptionPrimaryKey + ColumnOptionNotNull + ColumnOptionAutoIncrement + ColumnOptionDefaultValue + ColumnOptionUniqKey + ColumnOptionNull + ColumnOptionOnUpdate // For Timestamp and Datetime only. + ColumnOptionFulltext + ColumnOptionComment + ColumnOptionGenerated + ColumnOptionReference +) + +// ColumnOption is used for parsing column constraint info from SQL. +type ColumnOption struct { + node + + Tp ColumnOptionType + // Expr is used for ColumnOptionDefaultValue/ColumnOptionOnUpdateColumnOptionGenerated. + // For ColumnOptionDefaultValue or ColumnOptionOnUpdate, it's the target value. + // For ColumnOptionGenerated, it's the target expression. + Expr ExprNode + // Stored is only for ColumnOptionGenerated, default is false. + Stored bool + // Refer is used for foreign key. + Refer *ReferenceDef +} + +// Accept implements Node Accept interface. +func (n *ColumnOption) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnOption) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +// IndexOption is the index options. +// KEY_BLOCK_SIZE [=] value +// | index_type +// | WITH PARSER parser_name +// | COMMENT 'string' +// See http://dev.mysql.com/doc/refman/5.7/en/create-table.html +type IndexOption struct { + node + + KeyBlockSize uint64 + Tp model.IndexType + Comment string +} + +// Accept implements Node Accept interface. +func (n *IndexOption) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IndexOption) + return v.Leave(n) +} + +// ConstraintType is the type for Constraint. +type ConstraintType int + +// ConstraintTypes +const ( + ConstraintNoConstraint ConstraintType = iota + ConstraintPrimaryKey + ConstraintKey + ConstraintIndex + ConstraintUniq + ConstraintUniqKey + ConstraintUniqIndex + ConstraintForeignKey + ConstraintFulltext +) + +// Constraint is constraint for table definition. +type Constraint struct { + node + + Tp ConstraintType + Name string + + Keys []*IndexColName // Used for PRIMARY KEY, UNIQUE, ...... + + Refer *ReferenceDef // Used for foreign key. + + Option *IndexOption // Index Options +} + +// Accept implements Node Accept interface. +func (n *Constraint) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Constraint) + for i, val := range n.Keys { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Keys[i] = node.(*IndexColName) + } + if n.Refer != nil { + node, ok := n.Refer.Accept(v) + if !ok { + return n, false + } + n.Refer = node.(*ReferenceDef) + } + if n.Option != nil { + node, ok := n.Option.Accept(v) + if !ok { + return n, false + } + n.Option = node.(*IndexOption) + } + return v.Leave(n) +} + +// ColumnDef is used for parsing column definition from SQL. +type ColumnDef struct { + node + + Name *ColumnName + Tp *types.FieldType + Options []*ColumnOption +} + +// Accept implements Node Accept interface. +func (n *ColumnDef) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnDef) + node, ok := n.Name.Accept(v) + if !ok { + return n, false + } + n.Name = node.(*ColumnName) + for i, val := range n.Options { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Options[i] = node.(*ColumnOption) + } + return v.Leave(n) +} + +// CreateTableStmt is a statement to create a table. +// See https://dev.mysql.com/doc/refman/5.7/en/create-table.html +type CreateTableStmt struct { + ddlNode + + IfNotExists bool + Table *TableName + ReferTable *TableName + Cols []*ColumnDef + Constraints []*Constraint + Options []*TableOption + Partition *PartitionOptions + OnDuplicate OnDuplicateCreateTableSelectType + Select ResultSetNode +} + +// Accept implements Node Accept interface. +func (n *CreateTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + if n.ReferTable != nil { + node, ok = n.ReferTable.Accept(v) + if !ok { + return n, false + } + n.ReferTable = node.(*TableName) + } + for i, val := range n.Cols { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Cols[i] = node.(*ColumnDef) + } + for i, val := range n.Constraints { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Constraints[i] = node.(*Constraint) + } + if n.Select != nil { + node, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = node.(ResultSetNode) + } + + return v.Leave(n) +} + +// DropTableStmt is a statement to drop one or more tables. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-table.html +type DropTableStmt struct { + ddlNode + + IfExists bool + Tables []*TableName +} + +// Accept implements Node Accept interface. +func (n *DropTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropTableStmt) + for i, val := range n.Tables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + return v.Leave(n) +} + +// RenameTableStmt is a statement to rename a table. +// See http://dev.mysql.com/doc/refman/5.7/en/rename-table.html +type RenameTableStmt struct { + ddlNode + + OldTable *TableName + NewTable *TableName + + // TableToTables is only useful for syncer which depends heavily on tidb parser to do some dirty work for now. + // TODO: Refactor this when you are going to add full support for multiple schema changes. + TableToTables []*TableToTable +} + +// Accept implements Node Accept interface. +func (n *RenameTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RenameTableStmt) + node, ok := n.OldTable.Accept(v) + if !ok { + return n, false + } + n.OldTable = node.(*TableName) + node, ok = n.NewTable.Accept(v) + if !ok { + return n, false + } + n.NewTable = node.(*TableName) + + for i, t := range n.TableToTables { + node, ok := t.Accept(v) + if !ok { + return n, false + } + n.TableToTables[i] = node.(*TableToTable) + } + + return v.Leave(n) +} + +// TableToTable represents renaming old table to new table used in RenameTableStmt. +type TableToTable struct { + node + OldTable *TableName + NewTable *TableName +} + +// Accept implements Node Accept interface. +func (n *TableToTable) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableToTable) + node, ok := n.OldTable.Accept(v) + if !ok { + return n, false + } + n.OldTable = node.(*TableName) + node, ok = n.NewTable.Accept(v) + if !ok { + return n, false + } + n.NewTable = node.(*TableName) + return v.Leave(n) +} + +// CreateViewStmt is a statement to create a View. +// See https://dev.mysql.com/doc/refman/5.7/en/create-view.html +type CreateViewStmt struct { + ddlNode + + OrReplace bool + ViewName *TableName + Cols []model.CIStr + Select StmtNode +} + +// Accept implements Node Accept interface. +func (n *CreateViewStmt) Accept(v Visitor) (Node, bool) { + // TODO: implement the details. + return n, true +} + +// CreateIndexStmt is a statement to create an index. +// See https://dev.mysql.com/doc/refman/5.7/en/create-index.html +type CreateIndexStmt struct { + ddlNode + + IndexName string + Table *TableName + Unique bool + IndexColNames []*IndexColName + IndexOption *IndexOption +} + +// Accept implements Node Accept interface. +func (n *CreateIndexStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateIndexStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.IndexColNames { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.IndexColNames[i] = node.(*IndexColName) + } + if n.IndexOption != nil { + node, ok := n.IndexOption.Accept(v) + if !ok { + return n, false + } + n.IndexOption = node.(*IndexOption) + } + return v.Leave(n) +} + +// DropIndexStmt is a statement to drop the index. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-index.html +type DropIndexStmt struct { + ddlNode + + IfExists bool + IndexName string + Table *TableName +} + +// Accept implements Node Accept interface. +func (n *DropIndexStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropIndexStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + return v.Leave(n) +} + +// TableOptionType is the type for TableOption +type TableOptionType int + +// TableOption types. +const ( + TableOptionNone TableOptionType = iota + TableOptionEngine + TableOptionCharset + TableOptionCollate + TableOptionAutoIncrement + TableOptionComment + TableOptionAvgRowLength + TableOptionCheckSum + TableOptionCompression + TableOptionConnection + TableOptionPassword + TableOptionKeyBlockSize + TableOptionMaxRows + TableOptionMinRows + TableOptionDelayKeyWrite + TableOptionRowFormat + TableOptionStatsPersistent + TableOptionShardRowID + TableOptionPackKeys +) + +// RowFormat types +const ( + RowFormatDefault uint64 = iota + 1 + RowFormatDynamic + RowFormatFixed + RowFormatCompressed + RowFormatRedundant + RowFormatCompact +) + +// OnDuplicateCreateTableSelectType is the option that handle unique key values in 'CREATE TABLE ... SELECT'. +// See https://dev.mysql.com/doc/refman/5.7/en/create-table-select.html +type OnDuplicateCreateTableSelectType int + +// OnDuplicateCreateTableSelect types +const ( + OnDuplicateCreateTableSelectError OnDuplicateCreateTableSelectType = iota + OnDuplicateCreateTableSelectIgnore + OnDuplicateCreateTableSelectReplace +) + +// TableOption is used for parsing table option from SQL. +type TableOption struct { + Tp TableOptionType + StrValue string + UintValue uint64 +} + +// ColumnPositionType is the type for ColumnPosition. +type ColumnPositionType int + +// ColumnPosition Types +const ( + ColumnPositionNone ColumnPositionType = iota + ColumnPositionFirst + ColumnPositionAfter +) + +// ColumnPosition represent the position of the newly added column +type ColumnPosition struct { + node + // Tp is either ColumnPositionNone, ColumnPositionFirst or ColumnPositionAfter. + Tp ColumnPositionType + // RelativeColumn is the column the newly added column after if type is ColumnPositionAfter + RelativeColumn *ColumnName +} + +// Accept implements Node Accept interface. +func (n *ColumnPosition) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnPosition) + if n.RelativeColumn != nil { + node, ok := n.RelativeColumn.Accept(v) + if !ok { + return n, false + } + n.RelativeColumn = node.(*ColumnName) + } + return v.Leave(n) +} + +// AlterTableType is the type for AlterTableSpec. +type AlterTableType int + +// AlterTable types. +const ( + AlterTableOption AlterTableType = iota + 1 + AlterTableAddColumns + AlterTableAddConstraint + AlterTableDropColumn + AlterTableDropPrimaryKey + AlterTableDropIndex + AlterTableDropForeignKey + AlterTableModifyColumn + AlterTableChangeColumn + AlterTableRenameTable + AlterTableAlterColumn + AlterTableLock + AlterTableAlgorithm + AlterTableRenameIndex + AlterTableForce + AlterTableAddPartitions + AlterTableDropPartition + +// TODO: Add more actions +) + +// LockType is the type for AlterTableSpec. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html#alter-table-concurrency +type LockType byte + +// Lock Types. +const ( + LockTypeNone LockType = iota + 1 + LockTypeDefault + LockTypeShared + LockTypeExclusive +) + +// AlterTableSpec represents alter table specification. +type AlterTableSpec struct { + node + + Tp AlterTableType + Name string + Constraint *Constraint + Options []*TableOption + NewTable *TableName + NewColumns []*ColumnDef + OldColumnName *ColumnName + Position *ColumnPosition + LockType LockType + Comment string + FromKey model.CIStr + ToKey model.CIStr + PartDefinitions []*PartitionDefinition +} + +// Accept implements Node Accept interface. +func (n *AlterTableSpec) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterTableSpec) + if n.Constraint != nil { + node, ok := n.Constraint.Accept(v) + if !ok { + return n, false + } + n.Constraint = node.(*Constraint) + } + if n.NewTable != nil { + node, ok := n.NewTable.Accept(v) + if !ok { + return n, false + } + n.NewTable = node.(*TableName) + } + for _, col := range n.NewColumns { + node, ok := col.Accept(v) + if !ok { + return n, false + } + col = node.(*ColumnDef) + } + if n.OldColumnName != nil { + node, ok := n.OldColumnName.Accept(v) + if !ok { + return n, false + } + n.OldColumnName = node.(*ColumnName) + } + if n.Position != nil { + node, ok := n.Position.Accept(v) + if !ok { + return n, false + } + n.Position = node.(*ColumnPosition) + } + return v.Leave(n) +} + +// AlterTableStmt is a statement to change the structure of a table. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html +type AlterTableStmt struct { + ddlNode + + Table *TableName + Specs []*AlterTableSpec +} + +// Accept implements Node Accept interface. +func (n *AlterTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.Specs { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Specs[i] = node.(*AlterTableSpec) + } + return v.Leave(n) +} + +// TruncateTableStmt is a statement to empty a table completely. +// See https://dev.mysql.com/doc/refman/5.7/en/truncate-table.html +type TruncateTableStmt struct { + ddlNode + + Table *TableName +} + +// Accept implements Node Accept interface. +func (n *TruncateTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TruncateTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + return v.Leave(n) +} + +// PartitionDefinition defines a single partition. +type PartitionDefinition struct { + Name model.CIStr + LessThan []ExprNode + MaxValue bool + Comment string +} + +// PartitionOptions specifies the partition options. +type PartitionOptions struct { + Tp model.PartitionType + Expr ExprNode + ColumnNames []*ColumnName + Definitions []*PartitionDefinition +} diff --git a/ast/ddl_test.go b/ast/ddl_test.go new file mode 100644 index 000000000..a7fbd0f64 --- /dev/null +++ b/ast/ddl_test.go @@ -0,0 +1,64 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + . "github.com/pingcap/check" + . "github.com/pingcap/parser/ast" +) + +var _ = Suite(&testDDLSuite{}) + +type testDDLSuite struct { +} + +func (ts *testDDLSuite) TestDDLVisitorCover(c *C) { + ce := &checkExpr{} + constraint := &Constraint{Keys: []*IndexColName{{Column: &ColumnName{}}, {Column: &ColumnName{}}}, Refer: &ReferenceDef{}, Option: &IndexOption{}} + + alterTableSpec := &AlterTableSpec{Constraint: constraint, Options: []*TableOption{{}}, NewTable: &TableName{}, NewColumns: []*ColumnDef{{Name: &ColumnName{}}}, OldColumnName: &ColumnName{}, Position: &ColumnPosition{RelativeColumn: &ColumnName{}}} + + stmts := []struct { + node Node + expectedEnterCnt int + expectedLeaveCnt int + }{ + {&CreateDatabaseStmt{}, 0, 0}, + {&DropDatabaseStmt{}, 0, 0}, + {&DropIndexStmt{Table: &TableName{}}, 0, 0}, + {&DropTableStmt{Tables: []*TableName{{}, {}}}, 0, 0}, + {&RenameTableStmt{OldTable: &TableName{}, NewTable: &TableName{}}, 0, 0}, + {&TruncateTableStmt{Table: &TableName{}}, 0, 0}, + + // TODO: cover children + {&AlterTableStmt{Table: &TableName{}, Specs: []*AlterTableSpec{alterTableSpec}}, 0, 0}, + {&CreateIndexStmt{Table: &TableName{}}, 0, 0}, + {&CreateTableStmt{Table: &TableName{}, ReferTable: &TableName{}}, 0, 0}, + {&AlterTableSpec{}, 0, 0}, + {&ColumnDef{Name: &ColumnName{}, Options: []*ColumnOption{{Expr: ce}}}, 1, 1}, + {&ColumnOption{Expr: ce}, 1, 1}, + {&ColumnPosition{RelativeColumn: &ColumnName{}}, 0, 0}, + {&Constraint{Keys: []*IndexColName{{Column: &ColumnName{}}, {Column: &ColumnName{}}}, Refer: &ReferenceDef{}, Option: &IndexOption{}}, 0, 0}, + {&IndexColName{Column: &ColumnName{}}, 0, 0}, + {&ReferenceDef{Table: &TableName{}, IndexColNames: []*IndexColName{{Column: &ColumnName{}}, {Column: &ColumnName{}}}, OnDelete: &OnDeleteOpt{}, OnUpdate: &OnUpdateOpt{}}, 0, 0}, + } + + for _, v := range stmts { + ce.reset() + v.node.Accept(checkVisitor{}) + c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) + c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + v.node.Accept(visitor1{}) + } +} diff --git a/ast/dml.go b/ast/dml.go new file mode 100644 index 000000000..2046f3ad2 --- /dev/null +++ b/ast/dml.go @@ -0,0 +1,1037 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" +) + +var ( + _ DMLNode = &DeleteStmt{} + _ DMLNode = &InsertStmt{} + _ DMLNode = &UnionStmt{} + _ DMLNode = &UpdateStmt{} + _ DMLNode = &SelectStmt{} + _ DMLNode = &ShowStmt{} + _ DMLNode = &LoadDataStmt{} + + _ Node = &Assignment{} + _ Node = &ByItem{} + _ Node = &FieldList{} + _ Node = &GroupByClause{} + _ Node = &HavingClause{} + _ Node = &Join{} + _ Node = &Limit{} + _ Node = &OnCondition{} + _ Node = &OrderByClause{} + _ Node = &SelectField{} + _ Node = &TableName{} + _ Node = &TableRefsClause{} + _ Node = &TableSource{} + _ Node = &UnionSelectList{} + _ Node = &WildCardField{} +) + +// JoinType is join type, including cross/left/right/full. +type JoinType int + +const ( + // CrossJoin is cross join type. + CrossJoin JoinType = iota + 1 + // LeftJoin is left Join type. + LeftJoin + // RightJoin is right Join type. + RightJoin +) + +// Join represents table join. +type Join struct { + node + resultSetNode + + // Left table can be TableSource or JoinNode. + Left ResultSetNode + // Right table can be TableSource or JoinNode or nil. + Right ResultSetNode + // Tp represents join type. + Tp JoinType + // On represents join on condition. + On *OnCondition + // Using represents join using clause. + Using []*ColumnName + // NaturalJoin represents join is natural join. + NaturalJoin bool + // StraightJoin represents a straight join. + StraightJoin bool +} + +// Accept implements Node Accept interface. +func (n *Join) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Join) + node, ok := n.Left.Accept(v) + if !ok { + return n, false + } + n.Left = node.(ResultSetNode) + if n.Right != nil { + node, ok = n.Right.Accept(v) + if !ok { + return n, false + } + n.Right = node.(ResultSetNode) + } + if n.On != nil { + node, ok = n.On.Accept(v) + if !ok { + return n, false + } + n.On = node.(*OnCondition) + } + return v.Leave(n) +} + +// TableName represents a table name. +type TableName struct { + node + resultSetNode + + Schema model.CIStr + Name model.CIStr + + DBInfo *model.DBInfo + TableInfo *model.TableInfo + + IndexHints []*IndexHint +} + +// IndexHintType is the type for index hint use, ignore or force. +type IndexHintType int + +// IndexHintUseType values. +const ( + HintUse IndexHintType = 1 + HintIgnore IndexHintType = 2 + HintForce IndexHintType = 3 +) + +// IndexHintScope is the type for index hint for join, order by or group by. +type IndexHintScope int + +// Index hint scopes. +const ( + HintForScan IndexHintScope = 1 + HintForJoin IndexHintScope = 2 + HintForOrderBy IndexHintScope = 3 + HintForGroupBy IndexHintScope = 4 +) + +// IndexHint represents a hint for optimizer to use/ignore/force for join/order by/group by. +type IndexHint struct { + IndexNames []model.CIStr + HintType IndexHintType + HintScope IndexHintScope +} + +// Accept implements Node Accept interface. +func (n *TableName) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableName) + return v.Leave(n) +} + +// DeleteTableList is the tablelist used in delete statement multi-table mode. +type DeleteTableList struct { + node + Tables []*TableName +} + +// Accept implements Node Accept interface. +func (n *DeleteTableList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DeleteTableList) + if n != nil { + for i, t := range n.Tables { + node, ok := t.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + } + return v.Leave(n) +} + +// OnCondition represents JOIN on condition. +type OnCondition struct { + node + + Expr ExprNode +} + +// Accept implements Node Accept interface. +func (n *OnCondition) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnCondition) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// TableSource represents table source with a name. +type TableSource struct { + node + + // Source is the source of the data, can be a TableName, + // a SelectStmt, a UnionStmt, or a JoinNode. + Source ResultSetNode + + // AsName is the alias name of the table source. + AsName model.CIStr +} + +// Accept implements Node Accept interface. +func (n *TableSource) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableSource) + node, ok := n.Source.Accept(v) + if !ok { + return n, false + } + n.Source = node.(ResultSetNode) + return v.Leave(n) +} + +// SelectLockType is the lock type for SelectStmt. +type SelectLockType int + +// Select lock types. +const ( + SelectLockNone SelectLockType = iota + SelectLockForUpdate + SelectLockInShareMode +) + +// String implements fmt.Stringer. +func (slt SelectLockType) String() string { + switch slt { + case SelectLockNone: + return "none" + case SelectLockForUpdate: + return "for update" + case SelectLockInShareMode: + return "in share mode" + } + return "unsupported select lock type" +} + +// WildCardField is a special type of select field content. +type WildCardField struct { + node + + Table model.CIStr + Schema model.CIStr +} + +// Accept implements Node Accept interface. +func (n *WildCardField) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*WildCardField) + return v.Leave(n) +} + +// SelectField represents fields in select statement. +// There are two type of select field: wildcard +// and expression with optional alias name. +type SelectField struct { + node + + // Offset is used to get original text. + Offset int + // WildCard is not nil, Expr will be nil. + WildCard *WildCardField + // Expr is not nil, WildCard will be nil. + Expr ExprNode + // AsName is alias name for Expr. + AsName model.CIStr + // Auxiliary stands for if this field is auxiliary. + // When we add a Field into SelectField list which is used for having/orderby clause but the field is not in select clause, + // we should set its Auxiliary to true. Then the TrimExec will trim the field. + Auxiliary bool +} + +// Accept implements Node Accept interface. +func (n *SelectField) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SelectField) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +// FieldList represents field list in select statement. +type FieldList struct { + node + + Fields []*SelectField +} + +// Accept implements Node Accept interface. +func (n *FieldList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FieldList) + for i, val := range n.Fields { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Fields[i] = node.(*SelectField) + } + return v.Leave(n) +} + +// TableRefsClause represents table references clause in dml statement. +type TableRefsClause struct { + node + + TableRefs *Join +} + +// Accept implements Node Accept interface. +func (n *TableRefsClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableRefsClause) + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*Join) + return v.Leave(n) +} + +// ByItem represents an item in order by or group by. +type ByItem struct { + node + + Expr ExprNode + Desc bool +} + +// Accept implements Node Accept interface. +func (n *ByItem) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ByItem) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// GroupByClause represents group by clause. +type GroupByClause struct { + node + Items []*ByItem +} + +// Accept implements Node Accept interface. +func (n *GroupByClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*GroupByClause) + for i, val := range n.Items { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Items[i] = node.(*ByItem) + } + return v.Leave(n) +} + +// HavingClause represents having clause. +type HavingClause struct { + node + Expr ExprNode +} + +// Accept implements Node Accept interface. +func (n *HavingClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*HavingClause) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// OrderByClause represents order by clause. +type OrderByClause struct { + node + Items []*ByItem + ForUnion bool +} + +// Accept implements Node Accept interface. +func (n *OrderByClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OrderByClause) + for i, val := range n.Items { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Items[i] = node.(*ByItem) + } + return v.Leave(n) +} + +// SelectStmt represents the select query node. +// See https://dev.mysql.com/doc/refman/5.7/en/select.html +type SelectStmt struct { + dmlNode + resultSetNode + + // SelectStmtOpts wraps around select hints and switches. + *SelectStmtOpts + // Distinct represents whether the select has distinct option. + Distinct bool + // From is the from clause of the query. + From *TableRefsClause + // Where is the where clause in select statement. + Where ExprNode + // Fields is the select expression list. + Fields *FieldList + // GroupBy is the group by expression list. + GroupBy *GroupByClause + // Having is the having condition. + Having *HavingClause + // OrderBy is the ordering expression list. + OrderBy *OrderByClause + // Limit is the limit clause. + Limit *Limit + // LockTp is the lock type + LockTp SelectLockType + // TableHints represents the table level Optimizer Hint for join type + TableHints []*TableOptimizerHint + // IsAfterUnionDistinct indicates whether it's a stmt after "union distinct". + IsAfterUnionDistinct bool + // IsInBraces indicates whether it's a stmt in brace. + IsInBraces bool +} + +// Accept implements Node Accept interface. +func (n *SelectStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*SelectStmt) + if n.TableHints != nil && len(n.TableHints) != 0 { + newHints := make([]*TableOptimizerHint, len(n.TableHints)) + for i, hint := range n.TableHints { + node, ok := hint.Accept(v) + if !ok { + return n, false + } + newHints[i] = node.(*TableOptimizerHint) + } + n.TableHints = newHints + } + + if n.From != nil { + node, ok := n.From.Accept(v) + if !ok { + return n, false + } + n.From = node.(*TableRefsClause) + } + + if n.Where != nil { + node, ok := n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + + if n.Fields != nil { + node, ok := n.Fields.Accept(v) + if !ok { + return n, false + } + n.Fields = node.(*FieldList) + } + + if n.GroupBy != nil { + node, ok := n.GroupBy.Accept(v) + if !ok { + return n, false + } + n.GroupBy = node.(*GroupByClause) + } + + if n.Having != nil { + node, ok := n.Having.Accept(v) + if !ok { + return n, false + } + n.Having = node.(*HavingClause) + } + + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + + if n.Limit != nil { + node, ok := n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + + return v.Leave(n) +} + +// UnionSelectList represents the select list in a union statement. +type UnionSelectList struct { + node + + Selects []*SelectStmt +} + +// Accept implements Node Accept interface. +func (n *UnionSelectList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UnionSelectList) + for i, sel := range n.Selects { + node, ok := sel.Accept(v) + if !ok { + return n, false + } + n.Selects[i] = node.(*SelectStmt) + } + return v.Leave(n) +} + +// UnionStmt represents "union statement" +// See https://dev.mysql.com/doc/refman/5.7/en/union.html +type UnionStmt struct { + dmlNode + resultSetNode + + SelectList *UnionSelectList + OrderBy *OrderByClause + Limit *Limit +} + +// Accept implements Node Accept interface. +func (n *UnionStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UnionStmt) + if n.SelectList != nil { + node, ok := n.SelectList.Accept(v) + if !ok { + return n, false + } + n.SelectList = node.(*UnionSelectList) + } + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok := n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// Assignment is the expression for assignment, like a = 1. +type Assignment struct { + node + // Column is the column name to be assigned. + Column *ColumnName + // Expr is the expression assigning to ColName. + Expr ExprNode +} + +// Accept implements Node Accept interface. +func (n *Assignment) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Assignment) + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + node, ok = n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// LoadDataStmt is a statement to load data from a specified file, then insert this rows into an existing table. +// See https://dev.mysql.com/doc/refman/5.7/en/load-data.html +type LoadDataStmt struct { + dmlNode + + IsLocal bool + Path string + Table *TableName + Columns []*ColumnName + FieldsInfo *FieldsClause + LinesInfo *LinesClause + IgnoreLines uint64 +} + +// Accept implements Node Accept interface. +func (n *LoadDataStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*LoadDataStmt) + if n.Table != nil { + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + } + for i, val := range n.Columns { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Columns[i] = node.(*ColumnName) + } + return v.Leave(n) +} + +// FieldsClause represents fields references clause in load data statement. +type FieldsClause struct { + Terminated string + Enclosed byte + Escaped byte +} + +// LinesClause represents lines references clause in load data statement. +type LinesClause struct { + Starting string + Terminated string +} + +// InsertStmt is a statement to insert new rows into an existing table. +// See https://dev.mysql.com/doc/refman/5.7/en/insert.html +type InsertStmt struct { + dmlNode + + IsReplace bool + IgnoreErr bool + Table *TableRefsClause + Columns []*ColumnName + Lists [][]ExprNode + Setlist []*Assignment + Priority mysql.PriorityEnum + OnDuplicate []*Assignment + Select ResultSetNode +} + +// Accept implements Node Accept interface. +func (n *InsertStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*InsertStmt) + if n.Select != nil { + node, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = node.(ResultSetNode) + } + + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableRefsClause) + + for i, val := range n.Columns { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Columns[i] = node.(*ColumnName) + } + for i, list := range n.Lists { + for j, val := range list { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Lists[i][j] = node.(ExprNode) + } + } + for i, val := range n.Setlist { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Setlist[i] = node.(*Assignment) + } + for i, val := range n.OnDuplicate { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.OnDuplicate[i] = node.(*Assignment) + } + return v.Leave(n) +} + +// DeleteStmt is a statement to delete rows from table. +// See https://dev.mysql.com/doc/refman/5.7/en/delete.html +type DeleteStmt struct { + dmlNode + + // TableRefs is used in both single table and multiple table delete statement. + TableRefs *TableRefsClause + // Tables is only used in multiple table delete statement. + Tables *DeleteTableList + Where ExprNode + Order *OrderByClause + Limit *Limit + Priority mysql.PriorityEnum + IgnoreErr bool + Quick bool + IsMultiTable bool + BeforeFrom bool + // TableHints represents the table level Optimizer Hint for join type. + TableHints []*TableOptimizerHint +} + +// Accept implements Node Accept interface. +func (n *DeleteStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*DeleteStmt) + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*TableRefsClause) + + node, ok = n.Tables.Accept(v) + if !ok { + return n, false + } + n.Tables = node.(*DeleteTableList) + + if n.Where != nil { + node, ok = n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + if n.Order != nil { + node, ok = n.Order.Accept(v) + if !ok { + return n, false + } + n.Order = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok = n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// UpdateStmt is a statement to update columns of existing rows in tables with new values. +// See https://dev.mysql.com/doc/refman/5.7/en/update.html +type UpdateStmt struct { + dmlNode + + TableRefs *TableRefsClause + List []*Assignment + Where ExprNode + Order *OrderByClause + Limit *Limit + Priority mysql.PriorityEnum + IgnoreErr bool + MultipleTable bool + TableHints []*TableOptimizerHint +} + +// Accept implements Node Accept interface. +func (n *UpdateStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UpdateStmt) + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*TableRefsClause) + for i, val := range n.List { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.List[i] = node.(*Assignment) + } + if n.Where != nil { + node, ok = n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + if n.Order != nil { + node, ok = n.Order.Accept(v) + if !ok { + return n, false + } + n.Order = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok = n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// Limit is the limit clause. +type Limit struct { + node + + Count ExprNode + Offset ExprNode +} + +// Accept implements Node Accept interface. +func (n *Limit) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + if n.Count != nil { + node, ok := n.Count.Accept(v) + if !ok { + return n, false + } + n.Count = node.(ExprNode) + } + if n.Offset != nil { + node, ok := n.Offset.Accept(v) + if !ok { + return n, false + } + n.Offset = node.(ExprNode) + } + + n = newNode.(*Limit) + return v.Leave(n) +} + +// ShowStmtType is the type for SHOW statement. +type ShowStmtType int + +// Show statement types. +const ( + ShowNone = iota + ShowEngines + ShowDatabases + ShowTables + ShowTableStatus + ShowColumns + ShowWarnings + ShowCharset + ShowVariables + ShowStatus + ShowCollation + ShowCreateTable + ShowGrants + ShowTriggers + ShowProcedureStatus + ShowIndex + ShowProcessList + ShowCreateDatabase + ShowEvents + ShowStatsMeta + ShowStatsHistograms + ShowStatsBuckets + ShowStatsHealthy + ShowPlugins + ShowProfiles + ShowMasterStatus + ShowPrivileges + ShowErrors +) + +// ShowStmt is a statement to provide information about databases, tables, columns and so on. +// See https://dev.mysql.com/doc/refman/5.7/en/show.html +type ShowStmt struct { + dmlNode + resultSetNode + + Tp ShowStmtType // Databases/Tables/Columns/.... + DBName string + Table *TableName // Used for showing columns. + Column *ColumnName // Used for `desc table column`. + Flag int // Some flag parsed from sql, such as FULL. + Full bool + User *auth.UserIdentity // Used for show grants. + + // GlobalScope is used by show variables + GlobalScope bool + Pattern *PatternLikeExpr + Where ExprNode +} + +// Accept implements Node Accept interface. +func (n *ShowStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ShowStmt) + if n.Table != nil { + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + } + if n.Column != nil { + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + } + if n.Pattern != nil { + node, ok := n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(*PatternLikeExpr) + } + + switch n.Tp { + case ShowTriggers, ShowProcedureStatus, ShowProcessList, ShowEvents: + // We don't have any data to return for those types, + // but visiting Where may cause resolving error, so return here to avoid error. + return v.Leave(n) + } + + if n.Where != nil { + node, ok := n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + return v.Leave(n) +} diff --git a/ast/dml_test.go b/ast/dml_test.go new file mode 100644 index 000000000..6553c3254 --- /dev/null +++ b/ast/dml_test.go @@ -0,0 +1,70 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + . "github.com/pingcap/check" + . "github.com/pingcap/parser/ast" +) + +var _ = Suite(&testDMLSuite{}) + +type testDMLSuite struct { +} + +func (ts *testDMLSuite) TestDMLVisitorCover(c *C) { + ce := &checkExpr{} + + tableRefsClause := &TableRefsClause{TableRefs: &Join{Left: &TableSource{Source: &TableName{}}, On: &OnCondition{Expr: ce}}} + + stmts := []struct { + node Node + expectedEnterCnt int + expectedLeaveCnt int + }{ + {&DeleteStmt{TableRefs: tableRefsClause, Tables: &DeleteTableList{}, Where: ce, + Order: &OrderByClause{}, Limit: &Limit{Count: ce, Offset: ce}}, 4, 4}, + {&ShowStmt{Table: &TableName{}, Column: &ColumnName{}, Pattern: &PatternLikeExpr{Expr: ce, Pattern: ce}, Where: ce}, 3, 3}, + {&LoadDataStmt{Table: &TableName{}, Columns: []*ColumnName{{}}, FieldsInfo: &FieldsClause{}, LinesInfo: &LinesClause{}}, 0, 0}, + {&Assignment{Column: &ColumnName{}, Expr: ce}, 1, 1}, + {&ByItem{Expr: ce}, 1, 1}, + {&GroupByClause{Items: []*ByItem{{Expr: ce}, {Expr: ce}}}, 2, 2}, + {&HavingClause{Expr: ce}, 1, 1}, + {&Join{Left: &TableSource{Source: &TableName{}}}, 0, 0}, + {&Limit{Count: ce, Offset: ce}, 2, 2}, + {&OnCondition{Expr: ce}, 1, 1}, + {&OrderByClause{Items: []*ByItem{{Expr: ce}, {Expr: ce}}}, 2, 2}, + {&SelectField{Expr: ce, WildCard: &WildCardField{}}, 1, 1}, + {&TableName{}, 0, 0}, + {tableRefsClause, 1, 1}, + {&TableSource{Source: &TableName{}}, 0, 0}, + {&WildCardField{}, 0, 0}, + + // TODO: cover childrens + {&InsertStmt{Table: tableRefsClause}, 1, 1}, + {&UnionStmt{}, 0, 0}, + {&UpdateStmt{TableRefs: tableRefsClause}, 1, 1}, + {&SelectStmt{}, 0, 0}, + {&FieldList{}, 0, 0}, + {&UnionSelectList{}, 0, 0}, + } + + for _, v := range stmts { + ce.reset() + v.node.Accept(checkVisitor{}) + c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) + c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + v.node.Accept(visitor1{}) + } +} diff --git a/ast/expressions.go b/ast/expressions.go new file mode 100644 index 000000000..e81f87876 --- /dev/null +++ b/ast/expressions.go @@ -0,0 +1,914 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "fmt" + "io" + "regexp" + "strings" + + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/opcode" +) + +var ( + _ ExprNode = &BetweenExpr{} + _ ExprNode = &BinaryOperationExpr{} + _ ExprNode = &CaseExpr{} + _ ExprNode = &ColumnNameExpr{} + _ ExprNode = &CompareSubqueryExpr{} + _ ExprNode = &DefaultExpr{} + _ ExprNode = &ExistsSubqueryExpr{} + _ ExprNode = &IsNullExpr{} + _ ExprNode = &IsTruthExpr{} + _ ExprNode = &ParenthesesExpr{} + _ ExprNode = &PatternInExpr{} + _ ExprNode = &PatternLikeExpr{} + _ ExprNode = &PatternRegexpExpr{} + _ ExprNode = &PositionExpr{} + _ ExprNode = &RowExpr{} + _ ExprNode = &SubqueryExpr{} + _ ExprNode = &UnaryOperationExpr{} + _ ExprNode = &ValuesExpr{} + _ ExprNode = &VariableExpr{} + + _ Node = &ColumnName{} + _ Node = &WhenClause{} +) + +// ValueExpr define a interface for ValueExpr. +type ValueExpr interface { + ExprNode + SetValue(val interface{}) + GetValue() interface{} + GetDatumString() string + GetString() string + GetProjectionOffset() int + SetProjectionOffset(offset int) +} + +// NewValueExpr creates a ValueExpr with value, and sets default field type. +var NewValueExpr func(interface{}) ValueExpr + +// NewParamMarkerExpr creates a ParamMarkerExpr. +var NewParamMarkerExpr func(offset int) ParamMarkerExpr + +// BetweenExpr is for "between and" or "not between and" expression. +type BetweenExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Left is the expression for minimal value in the range. + Left ExprNode + // Right is the expression for maximum value in the range. + Right ExprNode + // Not is true, the expression is "not between and". + Not bool +} + +// Format the ExprNode into a Writer. +func (n *BetweenExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT BETWEEN ") + } else { + fmt.Fprint(w, " BETWEEN ") + } + n.Left.Format(w) + fmt.Fprint(w, " AND ") + n.Right.Format(w) +} + +// Accept implements Node interface. +func (n *BetweenExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*BetweenExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + + node, ok = n.Left.Accept(v) + if !ok { + return n, false + } + n.Left = node.(ExprNode) + + node, ok = n.Right.Accept(v) + if !ok { + return n, false + } + n.Right = node.(ExprNode) + + return v.Leave(n) +} + +// BinaryOperationExpr is for binary operation like `1 + 1`, `1 - 1`, etc. +type BinaryOperationExpr struct { + exprNode + // Op is the operator code for BinaryOperation. + Op opcode.Op + // L is the left expression in BinaryOperation. + L ExprNode + // R is the right expression in BinaryOperation. + R ExprNode +} + +// Format the ExprNode into a Writer. +func (n *BinaryOperationExpr) Format(w io.Writer) { + n.L.Format(w) + fmt.Fprint(w, " ") + n.Op.Format(w) + fmt.Fprint(w, " ") + n.R.Format(w) +} + +// Accept implements Node interface. +func (n *BinaryOperationExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*BinaryOperationExpr) + node, ok := n.L.Accept(v) + if !ok { + return n, false + } + n.L = node.(ExprNode) + + node, ok = n.R.Accept(v) + if !ok { + return n, false + } + n.R = node.(ExprNode) + + return v.Leave(n) +} + +// WhenClause is the when clause in Case expression for "when condition then result". +type WhenClause struct { + node + // Expr is the condition expression in WhenClause. + Expr ExprNode + // Result is the result expression in WhenClause. + Result ExprNode +} + +// Accept implements Node Accept interface. +func (n *WhenClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*WhenClause) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + + node, ok = n.Result.Accept(v) + if !ok { + return n, false + } + n.Result = node.(ExprNode) + return v.Leave(n) +} + +// CaseExpr is the case expression. +type CaseExpr struct { + exprNode + // Value is the compare value expression. + Value ExprNode + // WhenClauses is the condition check expression. + WhenClauses []*WhenClause + // ElseClause is the else result expression. + ElseClause ExprNode +} + +// Format the ExprNode into a Writer. +func (n *CaseExpr) Format(w io.Writer) { + fmt.Fprint(w, "CASE ") + // Because the presence of `case when` syntax, `Value` could be nil and we need check this. + if n.Value != nil { + n.Value.Format(w) + fmt.Fprint(w, " ") + } + for _, clause := range n.WhenClauses { + fmt.Fprint(w, "WHEN ") + clause.Expr.Format(w) + fmt.Fprint(w, " THEN ") + clause.Result.Format(w) + } + if n.ElseClause != nil { + fmt.Fprint(w, " ELSE ") + n.ElseClause.Format(w) + } + fmt.Fprint(w, " END") +} + +// Accept implements Node Accept interface. +func (n *CaseExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*CaseExpr) + if n.Value != nil { + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + } + for i, val := range n.WhenClauses { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.WhenClauses[i] = node.(*WhenClause) + } + if n.ElseClause != nil { + node, ok := n.ElseClause.Accept(v) + if !ok { + return n, false + } + n.ElseClause = node.(ExprNode) + } + return v.Leave(n) +} + +// SubqueryExpr represents a subquery. +type SubqueryExpr struct { + exprNode + // Query is the query SelectNode. + Query ResultSetNode + Evaluated bool + Correlated bool + MultiRows bool + Exists bool +} + +// Format the ExprNode into a Writer. +func (n *SubqueryExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *SubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SubqueryExpr) + node, ok := n.Query.Accept(v) + if !ok { + return n, false + } + n.Query = node.(ResultSetNode) + return v.Leave(n) +} + +// CompareSubqueryExpr is the expression for "expr cmp (select ...)". +// See https://dev.mysql.com/doc/refman/5.7/en/comparisons-using-subqueries.html +// See https://dev.mysql.com/doc/refman/5.7/en/any-in-some-subqueries.html +// See https://dev.mysql.com/doc/refman/5.7/en/all-subqueries.html +type CompareSubqueryExpr struct { + exprNode + // L is the left expression + L ExprNode + // Op is the comparison opcode. + Op opcode.Op + // R is the subquery for right expression, may be rewritten to other type of expression. + R ExprNode + // All is true, we should compare all records in subquery. + All bool +} + +// Format the ExprNode into a Writer. +func (n *CompareSubqueryExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *CompareSubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CompareSubqueryExpr) + node, ok := n.L.Accept(v) + if !ok { + return n, false + } + n.L = node.(ExprNode) + node, ok = n.R.Accept(v) + if !ok { + return n, false + } + n.R = node.(ExprNode) + return v.Leave(n) +} + +// ColumnName represents column name. +type ColumnName struct { + node + Schema model.CIStr + Table model.CIStr + Name model.CIStr +} + +// Accept implements Node Accept interface. +func (n *ColumnName) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnName) + return v.Leave(n) +} + +// String implements Stringer interface. +func (n *ColumnName) String() string { + result := n.Name.L + if n.Table.L != "" { + result = n.Table.L + "." + result + } + if n.Schema.L != "" { + result = n.Schema.L + "." + result + } + return result +} + +// OrigColName returns the full original column name. +func (n *ColumnName) OrigColName() (ret string) { + ret = n.Name.O + if n.Table.O == "" { + return + } + ret = n.Table.O + "." + ret + if n.Schema.O == "" { + return + } + ret = n.Schema.O + "." + ret + return +} + +// ColumnNameExpr represents a column name expression. +type ColumnNameExpr struct { + exprNode + + // Name is the referenced column name. + Name *ColumnName + + // Refer is the result field the column name refers to. + // The value of Refer.Expr is used as the value of the expression. + Refer *ResultField +} + +// Format the ExprNode into a Writer. +func (n *ColumnNameExpr) Format(w io.Writer) { + name := strings.Replace(n.Name.String(), ".", "`.`", -1) + fmt.Fprintf(w, "`%s`", name) +} + +// Accept implements Node Accept interface. +func (n *ColumnNameExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnNameExpr) + node, ok := n.Name.Accept(v) + if !ok { + return n, false + } + n.Name = node.(*ColumnName) + return v.Leave(n) +} + +// DefaultExpr is the default expression using default value for a column. +type DefaultExpr struct { + exprNode + // Name is the column name. + Name *ColumnName +} + +// Format the ExprNode into a Writer. +func (n *DefaultExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *DefaultExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DefaultExpr) + if n.Name != nil { + node, ok := n.Name.Accept(v) + if !ok { + return n, false + } + n.Name = node.(*ColumnName) + } + return v.Leave(n) +} + +// ExistsSubqueryExpr is the expression for "exists (select ...)". +// See https://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html +type ExistsSubqueryExpr struct { + exprNode + // Sel is the subquery, may be rewritten to other type of expression. + Sel ExprNode + // Not is true, the expression is "not exists". + Not bool +} + +// Format the ExprNode into a Writer. +func (n *ExistsSubqueryExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *ExistsSubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExistsSubqueryExpr) + node, ok := n.Sel.Accept(v) + if !ok { + return n, false + } + n.Sel = node.(ExprNode) + return v.Leave(n) +} + +// PatternInExpr is the expression for in operator, like "expr in (1, 2, 3)" or "expr in (select c from t)". +type PatternInExpr struct { + exprNode + // Expr is the value expression to be compared. + Expr ExprNode + // List is the list expression in compare list. + List []ExprNode + // Not is true, the expression is "not in". + Not bool + // Sel is the subquery, may be rewritten to other type of expression. + Sel ExprNode +} + +// Format the ExprNode into a Writer. +func (n *PatternInExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT IN (") + } else { + fmt.Fprint(w, " IN (") + } + for i, expr := range n.List { + expr.Format(w) + if i != len(n.List)-1 { + fmt.Fprint(w, ",") + } + } + fmt.Fprint(w, ")") +} + +// Accept implements Node Accept interface. +func (n *PatternInExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternInExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + for i, val := range n.List { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.List[i] = node.(ExprNode) + } + if n.Sel != nil { + node, ok = n.Sel.Accept(v) + if !ok { + return n, false + } + n.Sel = node.(ExprNode) + } + return v.Leave(n) +} + +// IsNullExpr is the expression for null check. +type IsNullExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Not is true, the expression is "is not null". + Not bool +} + +// Format the ExprNode into a Writer. +func (n *IsNullExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " IS NOT NULL") + return + } + fmt.Fprint(w, " IS NULL") +} + +// Accept implements Node Accept interface. +func (n *IsNullExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IsNullExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// IsTruthExpr is the expression for true/false check. +type IsTruthExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Not is true, the expression is "is not true/false". + Not bool + // True indicates checking true or false. + True int64 +} + +// Format the ExprNode into a Writer. +func (n *IsTruthExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " IS NOT") + } else { + fmt.Fprint(w, " IS") + } + if n.True > 0 { + fmt.Fprint(w, " TRUE") + } else { + fmt.Fprint(w, " FALSE") + } +} + +// Accept implements Node Accept interface. +func (n *IsTruthExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IsTruthExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// PatternLikeExpr is the expression for like operator, e.g, expr like "%123%" +type PatternLikeExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Pattern is the like expression. + Pattern ExprNode + // Not is true, the expression is "not like". + Not bool + + Escape byte + + PatChars []byte + PatTypes []byte +} + +// Format the ExprNode into a Writer. +func (n *PatternLikeExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT LIKE ") + } else { + fmt.Fprint(w, " LIKE ") + } + n.Pattern.Format(w) + if n.Escape != '\\' { + fmt.Fprint(w, " ESCAPE ") + fmt.Fprintf(w, "'%c'", n.Escape) + } +} + +// Accept implements Node Accept interface. +func (n *PatternLikeExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternLikeExpr) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + if n.Pattern != nil { + node, ok := n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(ExprNode) + } + return v.Leave(n) +} + +// ParamMarkerExpr expression holds a place for another expression. +// Used in parsing prepare statement. +type ParamMarkerExpr interface { + ValueExpr + SetOrder(int) +} + +// ParenthesesExpr is the parentheses expression. +type ParenthesesExpr struct { + exprNode + // Expr is the expression in parentheses. + Expr ExprNode +} + +// Format the ExprNode into a Writer. +func (n *ParenthesesExpr) Format(w io.Writer) { + fmt.Fprint(w, "(") + n.Expr.Format(w) + fmt.Fprint(w, ")") +} + +// Accept implements Node Accept interface. +func (n *ParenthesesExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ParenthesesExpr) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +// PositionExpr is the expression for order by and group by position. +// MySQL use position expression started from 1, it looks a little confused inner. +// maybe later we will use 0 at first. +type PositionExpr struct { + exprNode + // N is the position, started from 1 now. + N int + // Refer is the result field the position refers to. + Refer *ResultField +} + +// Format the ExprNode into a Writer. +func (n *PositionExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *PositionExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PositionExpr) + return v.Leave(n) +} + +// PatternRegexpExpr is the pattern expression for pattern match. +type PatternRegexpExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Pattern is the expression for pattern. + Pattern ExprNode + // Not is true, the expression is "not rlike", + Not bool + + // Re is the compiled regexp. + Re *regexp.Regexp + // Sexpr is the string for Expr expression. + Sexpr *string +} + +// Format the ExprNode into a Writer. +func (n *PatternRegexpExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT REGEXP ") + } else { + fmt.Fprint(w, " REGEXP ") + } + n.Pattern.Format(w) +} + +// Accept implements Node Accept interface. +func (n *PatternRegexpExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternRegexpExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + node, ok = n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(ExprNode) + return v.Leave(n) +} + +// RowExpr is the expression for row constructor. +// See https://dev.mysql.com/doc/refman/5.7/en/row-subqueries.html +type RowExpr struct { + exprNode + + Values []ExprNode +} + +// Format the ExprNode into a Writer. +func (n *RowExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *RowExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RowExpr) + for i, val := range n.Values { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Values[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// UnaryOperationExpr is the expression for unary operator. +type UnaryOperationExpr struct { + exprNode + // Op is the operator opcode. + Op opcode.Op + // V is the unary expression. + V ExprNode +} + +// Format the ExprNode into a Writer. +func (n *UnaryOperationExpr) Format(w io.Writer) { + n.Op.Format(w) + n.V.Format(w) +} + +// Accept implements Node Accept interface. +func (n *UnaryOperationExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UnaryOperationExpr) + node, ok := n.V.Accept(v) + if !ok { + return n, false + } + n.V = node.(ExprNode) + return v.Leave(n) +} + +// ValuesExpr is the expression used in INSERT VALUES. +type ValuesExpr struct { + exprNode + // Column is column name. + Column *ColumnNameExpr +} + +// Format the ExprNode into a Writer. +func (n *ValuesExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *ValuesExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ValuesExpr) + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + // `node` may be *ast.ValueExpr, to avoid panic, we write `ok` but do not use + // it. + n.Column, ok = node.(*ColumnNameExpr) + return v.Leave(n) +} + +// VariableExpr is the expression for variable. +type VariableExpr struct { + exprNode + // Name is the variable name. + Name string + // IsGlobal indicates whether this variable is global. + IsGlobal bool + // IsSystem indicates whether this variable is a system variable in current session. + IsSystem bool + // ExplicitScope indicates whether this variable scope is set explicitly. + ExplicitScope bool + // Value is the variable value. + Value ExprNode +} + +// Format the ExprNode into a Writer. +func (n *VariableExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *VariableExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*VariableExpr) + if n.Value == nil { + return v.Leave(n) + } + + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + return v.Leave(n) +} + +// MaxValueExpr is the expression for "maxvalue" used in partition. +type MaxValueExpr struct { + exprNode +} + +// Format the ExprNode into a Writer. +func (n *MaxValueExpr) Format(w io.Writer) { + fmt.Fprint(w, "MAXVALUE") +} + +// Accept implements Node Accept interface. +func (n *MaxValueExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + return v.Leave(n) +} diff --git a/ast/expressions_test.go b/ast/expressions_test.go new file mode 100644 index 000000000..80ce65d6e --- /dev/null +++ b/ast/expressions_test.go @@ -0,0 +1,103 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + . "github.com/pingcap/check" + . "github.com/pingcap/parser/ast" + _ "github.com/pingcap/tidb/types/parser_driver" +) + +var _ = Suite(&testExpressionsSuite{}) + +type testExpressionsSuite struct { +} + +type checkVisitor struct{} + +func (v checkVisitor) Enter(in Node) (Node, bool) { + if e, ok := in.(*checkExpr); ok { + e.enterCnt++ + return in, true + } + return in, false +} + +func (v checkVisitor) Leave(in Node) (Node, bool) { + if e, ok := in.(*checkExpr); ok { + e.leaveCnt++ + } + return in, true +} + +type checkExpr struct { + ValueExpr + + enterCnt int + leaveCnt int +} + +func (n *checkExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*checkExpr) + return v.Leave(n) +} + +func (n *checkExpr) reset() { + n.enterCnt = 0 + n.leaveCnt = 0 +} + +func (tc *testExpressionsSuite) TestExpresionsVisitorCover(c *C) { + ce := &checkExpr{} + stmts := + []struct { + node Node + expectedEnterCnt int + expectedLeaveCnt int + }{ + {&BetweenExpr{Expr: ce, Left: ce, Right: ce}, 3, 3}, + {&BinaryOperationExpr{L: ce, R: ce}, 2, 2}, + {&CaseExpr{Value: ce, WhenClauses: []*WhenClause{{Expr: ce, Result: ce}, + {Expr: ce, Result: ce}}, ElseClause: ce}, 6, 6}, + {&ColumnNameExpr{Name: &ColumnName{}}, 0, 0}, + {&CompareSubqueryExpr{L: ce, R: ce}, 2, 2}, + {&DefaultExpr{Name: &ColumnName{}}, 0, 0}, + {&ExistsSubqueryExpr{Sel: ce}, 1, 1}, + {&IsNullExpr{Expr: ce}, 1, 1}, + {&IsTruthExpr{Expr: ce}, 1, 1}, + {NewParamMarkerExpr(0), 0, 0}, + {&ParenthesesExpr{Expr: ce}, 1, 1}, + {&PatternInExpr{Expr: ce, List: []ExprNode{ce, ce, ce}, Sel: ce}, 5, 5}, + {&PatternLikeExpr{Expr: ce, Pattern: ce}, 2, 2}, + {&PatternRegexpExpr{Expr: ce, Pattern: ce}, 2, 2}, + {&PositionExpr{}, 0, 0}, + {&RowExpr{Values: []ExprNode{ce, ce}}, 2, 2}, + {&UnaryOperationExpr{V: ce}, 1, 1}, + {NewValueExpr(0), 0, 0}, + {&ValuesExpr{Column: &ColumnNameExpr{Name: &ColumnName{}}}, 0, 0}, + {&VariableExpr{Value: ce}, 1, 1}, + } + + for _, v := range stmts { + ce.reset() + v.node.Accept(checkVisitor{}) + c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) + c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + v.node.Accept(visitor1{}) + } +} diff --git a/ast/flag.go b/ast/flag.go new file mode 100644 index 000000000..773a2b444 --- /dev/null +++ b/ast/flag.go @@ -0,0 +1,156 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +// HasAggFlag checks if the expr contains FlagHasAggregateFunc. +func HasAggFlag(expr ExprNode) bool { + return expr.GetFlag()&FlagHasAggregateFunc > 0 +} + +// SetFlag sets flag for expression. +func SetFlag(n Node) { + var setter flagSetter + n.Accept(&setter) +} + +type flagSetter struct { +} + +func (f *flagSetter) Enter(in Node) (Node, bool) { + return in, false +} + +func (f *flagSetter) Leave(in Node) (Node, bool) { + if x, ok := in.(ParamMarkerExpr); ok { + x.SetFlag(FlagHasParamMarker) + } + switch x := in.(type) { + case *AggregateFuncExpr: + f.aggregateFunc(x) + case *BetweenExpr: + x.SetFlag(x.Expr.GetFlag() | x.Left.GetFlag() | x.Right.GetFlag()) + case *BinaryOperationExpr: + x.SetFlag(x.L.GetFlag() | x.R.GetFlag()) + case *CaseExpr: + f.caseExpr(x) + case *ColumnNameExpr: + x.SetFlag(FlagHasReference) + case *CompareSubqueryExpr: + x.SetFlag(x.L.GetFlag() | x.R.GetFlag()) + case *DefaultExpr: + x.SetFlag(FlagHasDefault) + case *ExistsSubqueryExpr: + x.SetFlag(x.Sel.GetFlag()) + case *FuncCallExpr: + f.funcCall(x) + case *FuncCastExpr: + x.SetFlag(FlagHasFunc | x.Expr.GetFlag()) + case *IsNullExpr: + x.SetFlag(x.Expr.GetFlag()) + case *IsTruthExpr: + x.SetFlag(x.Expr.GetFlag()) + case *ParenthesesExpr: + x.SetFlag(x.Expr.GetFlag()) + case *PatternInExpr: + f.patternIn(x) + case *PatternLikeExpr: + f.patternLike(x) + case *PatternRegexpExpr: + f.patternRegexp(x) + case *PositionExpr: + x.SetFlag(FlagHasReference) + case *RowExpr: + f.row(x) + case *SubqueryExpr: + x.SetFlag(FlagHasSubquery) + case *UnaryOperationExpr: + x.SetFlag(x.V.GetFlag()) + case *ValuesExpr: + x.SetFlag(FlagHasReference) + case *VariableExpr: + if x.Value == nil { + x.SetFlag(FlagHasVariable) + } else { + x.SetFlag(FlagHasVariable | x.Value.GetFlag()) + } + } + + return in, true +} + +func (f *flagSetter) caseExpr(x *CaseExpr) { + var flag uint64 + if x.Value != nil { + flag |= x.Value.GetFlag() + } + for _, val := range x.WhenClauses { + flag |= val.Expr.GetFlag() + flag |= val.Result.GetFlag() + } + if x.ElseClause != nil { + flag |= x.ElseClause.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) patternIn(x *PatternInExpr) { + flag := x.Expr.GetFlag() + for _, val := range x.List { + flag |= val.GetFlag() + } + if x.Sel != nil { + flag |= x.Sel.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) patternLike(x *PatternLikeExpr) { + flag := x.Pattern.GetFlag() + if x.Expr != nil { + flag |= x.Expr.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) patternRegexp(x *PatternRegexpExpr) { + flag := x.Pattern.GetFlag() + if x.Expr != nil { + flag |= x.Expr.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) row(x *RowExpr) { + var flag uint64 + for _, val := range x.Values { + flag |= val.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) funcCall(x *FuncCallExpr) { + flag := FlagHasFunc + for _, val := range x.Args { + flag |= val.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) aggregateFunc(x *AggregateFuncExpr) { + flag := FlagHasAggregateFunc + for _, val := range x.Args { + flag |= val.GetFlag() + } + x.SetFlag(flag) +} diff --git a/ast/flag_test.go b/ast/flag_test.go new file mode 100644 index 000000000..fc7f773d4 --- /dev/null +++ b/ast/flag_test.go @@ -0,0 +1,153 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testFlagSuite{}) + +type testFlagSuite struct { + *parser.Parser +} + +func (ts *testFlagSuite) SetUpSuite(c *C) { + ts.Parser = parser.New() +} + +func (ts *testFlagSuite) TestHasAggFlag(c *C) { + expr := &ast.BetweenExpr{} + flagTests := []struct { + flag uint64 + hasAgg bool + }{ + {ast.FlagHasAggregateFunc, true}, + {ast.FlagHasAggregateFunc | ast.FlagHasVariable, true}, + {ast.FlagHasVariable, false}, + } + for _, tt := range flagTests { + expr.SetFlag(tt.flag) + c.Assert(ast.HasAggFlag(expr), Equals, tt.hasAgg) + } +} + +func (ts *testFlagSuite) TestFlag(c *C) { + flagTests := []struct { + expr string + flag uint64 + }{ + { + "1 between 0 and 2", + ast.FlagConstant, + }, + { + "case 1 when 1 then 1 else 0 end", + ast.FlagConstant, + }, + { + "case 1 when 1 then 1 else 0 end", + ast.FlagConstant, + }, + { + "case 1 when a > 1 then 1 else 0 end", + ast.FlagConstant | ast.FlagHasReference, + }, + { + "1 = ANY (select 1) OR exists (select 1)", + ast.FlagHasSubquery, + }, + { + "1 in (1) or 1 is true or null is null or 'abc' like 'abc' or 'abc' rlike 'abc'", + ast.FlagConstant, + }, + { + "row (1, 1) = row (1, 1)", + ast.FlagConstant, + }, + { + "(1 + a) > ?", + ast.FlagHasReference | ast.FlagHasParamMarker, + }, + { + "trim('abc ')", + ast.FlagHasFunc, + }, + { + "now() + EXTRACT(YEAR FROM '2009-07-02') + CAST(1 AS UNSIGNED)", + ast.FlagHasFunc, + }, + { + "substring('abc', 1)", + ast.FlagHasFunc, + }, + { + "sum(a)", + ast.FlagHasAggregateFunc | ast.FlagHasReference, + }, + { + "(select 1) as a", + ast.FlagHasSubquery, + }, + { + "@auto_commit", + ast.FlagHasVariable, + }, + { + "default(a)", + ast.FlagHasDefault, + }, + { + "a is null", + ast.FlagHasReference, + }, + { + "1 is true", + ast.FlagConstant, + }, + { + "a in (1, count(*), 3)", + ast.FlagConstant | ast.FlagHasReference | ast.FlagHasAggregateFunc, + }, + { + "'Michael!' REGEXP '.*'", + ast.FlagConstant, + }, + { + "a REGEXP '.*'", + ast.FlagHasReference, + }, + { + "-a", + ast.FlagHasReference, + }, + } + for _, tt := range flagTests { + stmt, err := ts.ParseOneStmt("select "+tt.expr, "", "") + c.Assert(err, IsNil) + selectStmt := stmt.(*ast.SelectStmt) + ast.SetFlag(selectStmt) + expr := selectStmt.Fields.Fields[0].Expr + c.Assert(expr.GetFlag(), Equals, tt.flag, Commentf("For %s", tt.expr)) + } +} diff --git a/ast/format_test.go b/ast/format_test.go new file mode 100644 index 000000000..45422cbc7 --- /dev/null +++ b/ast/format_test.go @@ -0,0 +1,98 @@ +package ast_test + +import ( + "bytes" + "fmt" + + . "github.com/pingcap/check" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" +) + +var _ = Suite(&testAstFormatSuite{}) + +type testAstFormatSuite struct { +} + +func getDefaultCharsetAndCollate() (string, string) { + return "utf8", "utf8_bin" +} + +func (ts *testAstFormatSuite) TestAstFormat(c *C) { + var testcases = []struct { + input string + output string + }{ + // Literals. + {`null`, `NULL`}, + {`true`, `TRUE`}, + {`350`, `350`}, + {`001e-12`, `1e-12`}, // Float. + {`345.678`, `345.678`}, + {`00.0001000`, `0.0001000`}, // Decimal. + {`null`, `NULL`}, + {`"Hello, world"`, `"Hello, world"`}, + {`'Hello, world'`, `"Hello, world"`}, + {`'Hello, "world"'`, `"Hello, \"world\""`}, + {`_utf8'你好'`, `"你好"`}, + {`x'bcde'`, "x'bcde'"}, + {`x''`, "x''"}, + {`x'0035'`, "x'0035'"}, // Shouldn't trim leading zero. + {`b'00111111'`, `b'111111'`}, + {`time'10:10:10.123'`, `timeliteral("10:10:10.123")`}, + {`timestamp'1999-01-01 10:0:0.123'`, `timestampliteral("1999-01-01 10:0:0.123")`}, + {`date '1700-01-01'`, `dateliteral("1700-01-01")`}, + + // Expressions. + {`f between 30 and 50`, "`f` BETWEEN 30 AND 50"}, + {`f not between 30 and 50`, "`f` NOT BETWEEN 30 AND 50"}, + {`345 + " hello "`, `345 + " hello "`}, + {`"hello world" >= 'hello world'`, `"hello world" >= "hello world"`}, + {`case 3 when 1 then false else true end`, `CASE 3 WHEN 1 THEN FALSE ELSE TRUE END`}, + {`database.table.column`, "`database`.`table`.`column`"}, // ColumnNameExpr + {`3 is null`, `3 IS NULL`}, + {`3 is not null`, `3 IS NOT NULL`}, + {`3 is true`, `3 IS TRUE`}, + {`3 is not true`, `3 IS NOT TRUE`}, + {`3 is false`, `3 IS FALSE`}, + {` ( x is false )`, "(`x` IS FALSE)"}, + {`3 in ( a,b,"h",6 )`, "3 IN (`a`,`b`,\"h\",6)"}, + {`3 not in ( a,b,"h",6 )`, "3 NOT IN (`a`,`b`,\"h\",6)"}, + {`"abc" like '%b%'`, `"abc" LIKE "%b%"`}, + {`"abc" not like '%b%'`, `"abc" NOT LIKE "%b%"`}, + {`"abc" like '%b%' escape '_'`, `"abc" LIKE "%b%" ESCAPE '_'`}, + {`"abc" regexp '.*bc?'`, `"abc" REGEXP ".*bc?"`}, + {`"abc" not regexp '.*bc?'`, `"abc" NOT REGEXP ".*bc?"`}, + {`- 4`, `-4`}, + {`- ( - 4 ) `, `-(-4)`}, + // Functions. + {` json_extract ( a,'$.b',"$.\"c d\"" ) `, "json_extract(`a`, \"$.b\", \"$.\\\"c d\\\"\")"}, + {` length ( a )`, "length(`a`)"}, + {`a -> '$.a'`, "json_extract(`a`, \"$.a\")"}, + {`a.b ->> '$.a'`, "json_unquote(json_extract(`a`.`b`, \"$.a\"))"}, + {`DATE_ADD('1970-01-01', interval 3 second)`, `date_add("1970-01-01", INTERVAL 3 SECOND)`}, + {`TIMESTAMPDIFF(month, '2001-01-01', '2001-02-02 12:03:05.123')`, `timestampdiff(MONTH, "2001-01-01", "2001-02-02 12:03:05.123")`}, + // Cast, Convert and Binary. + // There should not be spaces between 'cast' and '(' unless 'IGNORE_SPACE' mode is set. + // see: https://dev.mysql.com/doc/refman/5.7/en/function-resolution.html + {` cast( a as signed ) `, "CAST(`a` AS SIGNED)"}, + {` cast( a as unsigned integer) `, "CAST(`a` AS UNSIGNED)"}, + {` cast( a as char(3) binary) `, "CAST(`a` AS CHAR(3) BINARY)"}, + {` cast( a as decimal ) `, "CAST(`a` AS DECIMAL(11))"}, + {` cast( a as decimal (3) ) `, "CAST(`a` AS DECIMAL(3))"}, + {` cast( a as decimal (3,3) ) `, "CAST(`a` AS DECIMAL(3, 3))"}, + {` convert (a, signed) `, "CONVERT(`a`, SIGNED)"}, + {` binary "hello"`, `BINARY "hello"`}, + } + for _, tt := range testcases { + expr := fmt.Sprintf("select %s", tt.input) + charset, collation := getDefaultCharsetAndCollate() + stmts, err := parser.New().Parse(expr, charset, collation) + node := stmts[0].(*ast.SelectStmt).Fields.Fields[0].Expr + c.Assert(err, IsNil) + + writer := bytes.NewBufferString("") + node.Format(writer) + c.Assert(writer.String(), Equals, tt.output) + } +} diff --git a/ast/functions.go b/ast/functions.go new file mode 100644 index 000000000..495c6e54f --- /dev/null +++ b/ast/functions.go @@ -0,0 +1,520 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "fmt" + "io" + + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/types" +) + +var ( + _ FuncNode = &AggregateFuncExpr{} + _ FuncNode = &FuncCallExpr{} + _ FuncNode = &FuncCastExpr{} +) + +// List scalar function names. +const ( + LogicAnd = "and" + Cast = "cast" + LeftShift = "leftshift" + RightShift = "rightshift" + LogicOr = "or" + GE = "ge" + LE = "le" + EQ = "eq" + NE = "ne" + LT = "lt" + GT = "gt" + Plus = "plus" + Minus = "minus" + And = "bitand" + Or = "bitor" + Mod = "mod" + Xor = "bitxor" + Div = "div" + Mul = "mul" + UnaryNot = "not" // Avoid name conflict with Not in github/pingcap/check. + BitNeg = "bitneg" + IntDiv = "intdiv" + LogicXor = "xor" + NullEQ = "nulleq" + UnaryPlus = "unaryplus" + UnaryMinus = "unaryminus" + In = "in" + Like = "like" + Case = "case" + Regexp = "regexp" + IsNull = "isnull" + IsTruth = "istrue" // Avoid name conflict with IsTrue in github/pingcap/check. + IsFalsity = "isfalse" // Avoid name conflict with IsFalse in github/pingcap/check. + RowFunc = "row" + SetVar = "setvar" + GetVar = "getvar" + Values = "values" + BitCount = "bit_count" + GetParam = "getparam" + + // common functions + Coalesce = "coalesce" + Greatest = "greatest" + Least = "least" + Interval = "interval" + + // math functions + Abs = "abs" + Acos = "acos" + Asin = "asin" + Atan = "atan" + Atan2 = "atan2" + Ceil = "ceil" + Ceiling = "ceiling" + Conv = "conv" + Cos = "cos" + Cot = "cot" + CRC32 = "crc32" + Degrees = "degrees" + Exp = "exp" + Floor = "floor" + Ln = "ln" + Log = "log" + Log2 = "log2" + Log10 = "log10" + PI = "pi" + Pow = "pow" + Power = "power" + Radians = "radians" + Rand = "rand" + Round = "round" + Sign = "sign" + Sin = "sin" + Sqrt = "sqrt" + Tan = "tan" + Truncate = "truncate" + + // time functions + AddDate = "adddate" + AddTime = "addtime" + ConvertTz = "convert_tz" + Curdate = "curdate" + CurrentDate = "current_date" + CurrentTime = "current_time" + CurrentTimestamp = "current_timestamp" + Curtime = "curtime" + Date = "date" + DateLiteral = "dateliteral" + DateAdd = "date_add" + DateFormat = "date_format" + DateSub = "date_sub" + DateDiff = "datediff" + Day = "day" + DayName = "dayname" + DayOfMonth = "dayofmonth" + DayOfWeek = "dayofweek" + DayOfYear = "dayofyear" + Extract = "extract" + FromDays = "from_days" + FromUnixTime = "from_unixtime" + GetFormat = "get_format" + Hour = "hour" + LocalTime = "localtime" + LocalTimestamp = "localtimestamp" + MakeDate = "makedate" + MakeTime = "maketime" + MicroSecond = "microsecond" + Minute = "minute" + Month = "month" + MonthName = "monthname" + Now = "now" + PeriodAdd = "period_add" + PeriodDiff = "period_diff" + Quarter = "quarter" + SecToTime = "sec_to_time" + Second = "second" + StrToDate = "str_to_date" + SubDate = "subdate" + SubTime = "subtime" + Sysdate = "sysdate" + Time = "time" + TimeLiteral = "timeliteral" + TimeFormat = "time_format" + TimeToSec = "time_to_sec" + TimeDiff = "timediff" + Timestamp = "timestamp" + TimestampLiteral = "timestampliteral" + TimestampAdd = "timestampadd" + TimestampDiff = "timestampdiff" + ToDays = "to_days" + ToSeconds = "to_seconds" + UnixTimestamp = "unix_timestamp" + UTCDate = "utc_date" + UTCTime = "utc_time" + UTCTimestamp = "utc_timestamp" + Week = "week" + Weekday = "weekday" + WeekOfYear = "weekofyear" + Year = "year" + YearWeek = "yearweek" + LastDay = "last_day" + + // string functions + ASCII = "ascii" + Bin = "bin" + Concat = "concat" + ConcatWS = "concat_ws" + Convert = "convert" + Elt = "elt" + ExportSet = "export_set" + Field = "field" + Format = "format" + FromBase64 = "from_base64" + InsertFunc = "insert_func" + Instr = "instr" + Lcase = "lcase" + Left = "left" + Length = "length" + LoadFile = "load_file" + Locate = "locate" + Lower = "lower" + Lpad = "lpad" + LTrim = "ltrim" + MakeSet = "make_set" + Mid = "mid" + Oct = "oct" + Ord = "ord" + Position = "position" + Quote = "quote" + Repeat = "repeat" + Replace = "replace" + Reverse = "reverse" + Right = "right" + RTrim = "rtrim" + Space = "space" + Strcmp = "strcmp" + Substring = "substring" + Substr = "substr" + SubstringIndex = "substring_index" + ToBase64 = "to_base64" + Trim = "trim" + Upper = "upper" + Ucase = "ucase" + Hex = "hex" + Unhex = "unhex" + Rpad = "rpad" + BitLength = "bit_length" + CharFunc = "char_func" + CharLength = "char_length" + CharacterLength = "character_length" + FindInSet = "find_in_set" + + // information functions + Benchmark = "benchmark" + Charset = "charset" + Coercibility = "coercibility" + Collation = "collation" + ConnectionID = "connection_id" + CurrentUser = "current_user" + Database = "database" + FoundRows = "found_rows" + LastInsertId = "last_insert_id" + RowCount = "row_count" + Schema = "schema" + SessionUser = "session_user" + SystemUser = "system_user" + User = "user" + Version = "version" + TiDBVersion = "tidb_version" + TiDBIsDDLOwner = "tidb_is_ddl_owner" + + // control functions + If = "if" + Ifnull = "ifnull" + Nullif = "nullif" + + // miscellaneous functions + AnyValue = "any_value" + DefaultFunc = "default_func" + InetAton = "inet_aton" + InetNtoa = "inet_ntoa" + Inet6Aton = "inet6_aton" + Inet6Ntoa = "inet6_ntoa" + IsFreeLock = "is_free_lock" + IsIPv4 = "is_ipv4" + IsIPv4Compat = "is_ipv4_compat" + IsIPv4Mapped = "is_ipv4_mapped" + IsIPv6 = "is_ipv6" + IsUsedLock = "is_used_lock" + MasterPosWait = "master_pos_wait" + NameConst = "name_const" + ReleaseAllLocks = "release_all_locks" + Sleep = "sleep" + UUID = "uuid" + UUIDShort = "uuid_short" + // get_lock() and release_lock() is parsed but do nothing. + // It is used for preventing error in Ruby's activerecord migrations. + GetLock = "get_lock" + ReleaseLock = "release_lock" + + // encryption and compression functions + AesDecrypt = "aes_decrypt" + AesEncrypt = "aes_encrypt" + Compress = "compress" + Decode = "decode" + DesDecrypt = "des_decrypt" + DesEncrypt = "des_encrypt" + Encode = "encode" + Encrypt = "encrypt" + MD5 = "md5" + OldPassword = "old_password" + PasswordFunc = "password_func" + RandomBytes = "random_bytes" + SHA1 = "sha1" + SHA = "sha" + SHA2 = "sha2" + Uncompress = "uncompress" + UncompressedLength = "uncompressed_length" + ValidatePasswordStrength = "validate_password_strength" + + // json functions + JSONType = "json_type" + JSONExtract = "json_extract" + JSONUnquote = "json_unquote" + JSONArray = "json_array" + JSONObject = "json_object" + JSONMerge = "json_merge" + JSONSet = "json_set" + JSONInsert = "json_insert" + JSONReplace = "json_replace" + JSONRemove = "json_remove" + JSONContains = "json_contains" + JSONContainsPath = "json_contains_path" + JSONValid = "json_valid" + JSONArrayAppend = "json_array_append" + JSONArrayInsert = "json_array_insert" + JSONMergePatch = "json_merge_patch" + JSONMergePreserve = "json_merge_preserve" + JSONPretty = "json_pretty" + JSONQuote = "json_quote" + JSONSearch = "json_search" + JSONStorageSize = "json_storage_size" + JSONDepth = "json_depth" + JSONKeys = "json_keys" + JSONLength = "json_length" +) + +// FuncCallExpr is for function expression. +type FuncCallExpr struct { + funcNode + // FnName is the function name. + FnName model.CIStr + // Args is the function args. + Args []ExprNode +} + +// Format the ExprNode into a Writer. +func (n *FuncCallExpr) Format(w io.Writer) { + fmt.Fprintf(w, "%s(", n.FnName.L) + if !n.specialFormatArgs(w) { + for i, arg := range n.Args { + arg.Format(w) + if i != len(n.Args)-1 { + fmt.Fprint(w, ", ") + } + } + } + fmt.Fprint(w, ")") +} + +// specialFormatArgs formats argument list for some special functions. +func (n *FuncCallExpr) specialFormatArgs(w io.Writer) bool { + switch n.FnName.L { + case DateAdd, DateSub, AddDate, SubDate: + n.Args[0].Format(w) + fmt.Fprint(w, ", INTERVAL ") + n.Args[1].Format(w) + fmt.Fprintf(w, " %s", n.Args[2].(ValueExpr).GetDatumString()) + return true + case TimestampAdd, TimestampDiff: + fmt.Fprintf(w, "%s, ", n.Args[0].(ValueExpr).GetDatumString()) + n.Args[1].Format(w) + fmt.Fprint(w, ", ") + n.Args[2].Format(w) + return true + } + return false +} + +// Accept implements Node interface. +func (n *FuncCallExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FuncCallExpr) + for i, val := range n.Args { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Args[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// CastFunctionType is the type for cast function. +type CastFunctionType int + +// CastFunction types +const ( + CastFunction CastFunctionType = iota + 1 + CastConvertFunction + CastBinaryOperator +) + +// FuncCastExpr is the cast function converting value to another type, e.g, cast(expr AS signed). +// See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html +type FuncCastExpr struct { + funcNode + // Expr is the expression to be converted. + Expr ExprNode + // Tp is the conversion type. + Tp *types.FieldType + // FunctionType is either Cast, Convert or Binary. + FunctionType CastFunctionType +} + +// Format the ExprNode into a Writer. +func (n *FuncCastExpr) Format(w io.Writer) { + switch n.FunctionType { + case CastFunction: + fmt.Fprint(w, "CAST(") + n.Expr.Format(w) + fmt.Fprint(w, " AS ") + n.Tp.FormatAsCastType(w) + fmt.Fprint(w, ")") + case CastConvertFunction: + fmt.Fprint(w, "CONVERT(") + n.Expr.Format(w) + fmt.Fprint(w, ", ") + n.Tp.FormatAsCastType(w) + fmt.Fprint(w, ")") + case CastBinaryOperator: + fmt.Fprint(w, "BINARY ") + n.Expr.Format(w) + } +} + +// Accept implements Node Accept interface. +func (n *FuncCastExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FuncCastExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// TrimDirectionType is the type for trim direction. +type TrimDirectionType int + +const ( + // TrimBothDefault trims from both direction by default. + TrimBothDefault TrimDirectionType = iota + // TrimBoth trims from both direction with explicit notation. + TrimBoth + // TrimLeading trims from left. + TrimLeading + // TrimTrailing trims from right. + TrimTrailing +) + +// DateArithType is type for DateArith type. +type DateArithType byte + +const ( + // DateArithAdd is to run adddate or date_add function option. + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_adddate + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-add + DateArithAdd DateArithType = iota + 1 + // DateArithSub is to run subdate or date_sub function option. + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subdate + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-sub + DateArithSub +) + +const ( + // AggFuncCount is the name of Count function. + AggFuncCount = "count" + // AggFuncSum is the name of Sum function. + AggFuncSum = "sum" + // AggFuncAvg is the name of Avg function. + AggFuncAvg = "avg" + // AggFuncFirstRow is the name of FirstRowColumn function. + AggFuncFirstRow = "firstrow" + // AggFuncMax is the name of max function. + AggFuncMax = "max" + // AggFuncMin is the name of min function. + AggFuncMin = "min" + // AggFuncGroupConcat is the name of group_concat function. + AggFuncGroupConcat = "group_concat" + // AggFuncBitOr is the name of bit_or function. + AggFuncBitOr = "bit_or" + // AggFuncBitXor is the name of bit_xor function. + AggFuncBitXor = "bit_xor" + // AggFuncBitAnd is the name of bit_and function. + AggFuncBitAnd = "bit_and" +) + +// AggregateFuncExpr represents aggregate function expression. +type AggregateFuncExpr struct { + funcNode + // F is the function name. + F string + // Args is the function args. + Args []ExprNode + // Distinct is true, function hence only aggregate distinct values. + // For example, column c1 values are "1", "2", "2", "sum(c1)" is "5", + // but "sum(distinct c1)" is "3". + Distinct bool +} + +// Format the ExprNode into a Writer. +func (n *AggregateFuncExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *AggregateFuncExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AggregateFuncExpr) + for i, val := range n.Args { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Args[i] = node.(ExprNode) + } + return v.Leave(n) +} diff --git a/ast/functions_test.go b/ast/functions_test.go new file mode 100644 index 000000000..d07db759b --- /dev/null +++ b/ast/functions_test.go @@ -0,0 +1,38 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + . "github.com/pingcap/check" + . "github.com/pingcap/parser/ast" +) + +var _ = Suite(&testFunctionsSuite{}) + +type testFunctionsSuite struct { +} + +func (ts *testFunctionsSuite) TestFunctionsVisitorCover(c *C) { + valueExpr := NewValueExpr(42) + stmts := []Node{ + &AggregateFuncExpr{Args: []ExprNode{valueExpr}}, + &FuncCallExpr{Args: []ExprNode{valueExpr}}, + &FuncCastExpr{Expr: valueExpr}, + } + + for _, stmt := range stmts { + stmt.Accept(visitor{}) + stmt.Accept(visitor1{}) + } +} diff --git a/ast/misc.go b/ast/misc.go new file mode 100644 index 000000000..fd179f6c6 --- /dev/null +++ b/ast/misc.go @@ -0,0 +1,879 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "bytes" + "fmt" + "strings" + + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" +) + +var ( + _ StmtNode = &AdminStmt{} + _ StmtNode = &AlterUserStmt{} + _ StmtNode = &BeginStmt{} + _ StmtNode = &BinlogStmt{} + _ StmtNode = &CommitStmt{} + _ StmtNode = &CreateUserStmt{} + _ StmtNode = &DeallocateStmt{} + _ StmtNode = &DoStmt{} + _ StmtNode = &ExecuteStmt{} + _ StmtNode = &ExplainStmt{} + _ StmtNode = &GrantStmt{} + _ StmtNode = &PrepareStmt{} + _ StmtNode = &RollbackStmt{} + _ StmtNode = &SetPwdStmt{} + _ StmtNode = &SetStmt{} + _ StmtNode = &UseStmt{} + _ StmtNode = &FlushStmt{} + _ StmtNode = &KillStmt{} + + _ Node = &PrivElem{} + _ Node = &VariableAssignment{} +) + +// Isolation level constants. +const ( + ReadCommitted = "READ-COMMITTED" + ReadUncommitted = "READ-UNCOMMITTED" + Serializable = "SERIALIZABLE" + RepeatableRead = "REPEATABLE-READ" + + // Valid formats for explain statement. + ExplainFormatROW = "row" + ExplainFormatDOT = "dot" +) + +var ( + // ExplainFormats stores the valid formats for explain statement, used by validator. + ExplainFormats = []string{ + ExplainFormatROW, + ExplainFormatDOT, + } +) + +// TypeOpt is used for parsing data type option from SQL. +type TypeOpt struct { + IsUnsigned bool + IsZerofill bool +} + +// FloatOpt is used for parsing floating-point type option from SQL. +// See http://dev.mysql.com/doc/refman/5.7/en/floating-point-types.html +type FloatOpt struct { + Flen int + Decimal int +} + +// AuthOption is used for parsing create use statement. +type AuthOption struct { + // ByAuthString set as true, if AuthString is used for authorization. Otherwise, authorization is done by HashString. + ByAuthString bool + AuthString string + HashString string + // TODO: support auth_plugin +} + +// TraceStmt is a statement to trace what sql actually does at background. +type TraceStmt struct { + stmtNode + + Stmt StmtNode + Format string +} + +// Accept implements Node Accept interface. +func (n *TraceStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TraceStmt) + node, ok := n.Stmt.Accept(v) + if !ok { + return n, false + } + n.Stmt = node.(DMLNode) + return v.Leave(n) +} + +// ExplainStmt is a statement to provide information about how is SQL statement executed +// or get columns information in a table. +// See https://dev.mysql.com/doc/refman/5.7/en/explain.html +type ExplainStmt struct { + stmtNode + + Stmt StmtNode + Format string + Analyze bool +} + +// Accept implements Node Accept interface. +func (n *ExplainStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExplainStmt) + node, ok := n.Stmt.Accept(v) + if !ok { + return n, false + } + n.Stmt = node.(DMLNode) + return v.Leave(n) +} + +// PrepareStmt is a statement to prepares a SQL statement which contains placeholders, +// and it is executed with ExecuteStmt and released with DeallocateStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/prepare.html +type PrepareStmt struct { + stmtNode + + Name string + SQLText string + SQLVar *VariableExpr +} + +// Accept implements Node Accept interface. +func (n *PrepareStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PrepareStmt) + if n.SQLVar != nil { + node, ok := n.SQLVar.Accept(v) + if !ok { + return n, false + } + n.SQLVar = node.(*VariableExpr) + } + return v.Leave(n) +} + +// DeallocateStmt is a statement to release PreparedStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/deallocate-prepare.html +type DeallocateStmt struct { + stmtNode + + Name string +} + +// Accept implements Node Accept interface. +func (n *DeallocateStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DeallocateStmt) + return v.Leave(n) +} + +// Prepared represents a prepared statement. +type Prepared struct { + Stmt StmtNode + Params []ParamMarkerExpr + SchemaVersion int64 + UseCache bool +} + +// ExecuteStmt is a statement to execute PreparedStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/execute.html +type ExecuteStmt struct { + stmtNode + + Name string + UsingVars []ExprNode + ExecID uint32 +} + +// Accept implements Node Accept interface. +func (n *ExecuteStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExecuteStmt) + for i, val := range n.UsingVars { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.UsingVars[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// BeginStmt is a statement to start a new transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type BeginStmt struct { + stmtNode +} + +// Accept implements Node Accept interface. +func (n *BeginStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*BeginStmt) + return v.Leave(n) +} + +// BinlogStmt is an internal-use statement. +// We just parse and ignore it. +// See http://dev.mysql.com/doc/refman/5.7/en/binlog.html +type BinlogStmt struct { + stmtNode + Str string +} + +// Accept implements Node Accept interface. +func (n *BinlogStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*BinlogStmt) + return v.Leave(n) +} + +// CommitStmt is a statement to commit the current transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type CommitStmt struct { + stmtNode +} + +// Accept implements Node Accept interface. +func (n *CommitStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CommitStmt) + return v.Leave(n) +} + +// RollbackStmt is a statement to roll back the current transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type RollbackStmt struct { + stmtNode +} + +// Accept implements Node Accept interface. +func (n *RollbackStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RollbackStmt) + return v.Leave(n) +} + +// UseStmt is a statement to use the DBName database as the current database. +// See https://dev.mysql.com/doc/refman/5.7/en/use.html +type UseStmt struct { + stmtNode + + DBName string +} + +// Accept implements Node Accept interface. +func (n *UseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UseStmt) + return v.Leave(n) +} + +const ( + // SetNames is the const for set names/charset stmt. + // If VariableAssignment.Name == Names, it should be set names/charset stmt. + SetNames = "SetNAMES" +) + +// VariableAssignment is a variable assignment struct. +type VariableAssignment struct { + node + Name string + Value ExprNode + IsGlobal bool + IsSystem bool + + // ExtendValue is a way to store extended info. + // VariableAssignment should be able to store information for SetCharset/SetPWD Stmt. + // For SetCharsetStmt, Value is charset, ExtendValue is collation. + // TODO: Use SetStmt to implement set password statement. + ExtendValue ValueExpr +} + +// Accept implements Node interface. +func (n *VariableAssignment) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*VariableAssignment) + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + return v.Leave(n) +} + +// FlushStmtType is the type for FLUSH statement. +type FlushStmtType int + +// Flush statement types. +const ( + FlushNone FlushStmtType = iota + FlushTables + FlushPrivileges + FlushStatus +) + +// FlushStmt is a statement to flush tables/privileges/optimizer costs and so on. +type FlushStmt struct { + stmtNode + + Tp FlushStmtType // Privileges/Tables/... + NoWriteToBinLog bool + Tables []*TableName // For FlushTableStmt, if Tables is empty, it means flush all tables. + ReadLock bool +} + +// Accept implements Node Accept interface. +func (n *FlushStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FlushStmt) + return v.Leave(n) +} + +// KillStmt is a statement to kill a query or connection. +type KillStmt struct { + stmtNode + + // Query indicates whether terminate a single query on this connection or the whole connection. + // If Query is true, terminates the statement the connection is currently executing, but leaves the connection itself intact. + // If Query is false, terminates the connection associated with the given ConnectionID, after terminating any statement the connection is executing. + Query bool + ConnectionID uint64 + // TiDBExtension is used to indicate whether the user knows he is sending kill statement to the right tidb-server. + // When the SQL grammar is "KILL TIDB [CONNECTION | QUERY] connectionID", TiDBExtension will be set. + // It's a special grammar extension in TiDB. This extension exists because, when the connection is: + // client -> LVS proxy -> TiDB, and type Ctrl+C in client, the following action will be executed: + // new a connection; kill xxx; + // kill command may send to the wrong TiDB, because the exists of LVS proxy, and kill the wrong session. + // So, "KILL TIDB" grammar is introduced, and it REQUIRES DIRECT client -> TiDB TOPOLOGY. + // TODO: The standard KILL grammar will be supported once we have global connectionID. + TiDBExtension bool +} + +// Accept implements Node Accept interface. +func (n *KillStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*KillStmt) + return v.Leave(n) +} + +// SetStmt is the statement to set variables. +type SetStmt struct { + stmtNode + // Variables is the list of variable assignment. + Variables []*VariableAssignment +} + +// Accept implements Node Accept interface. +func (n *SetStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetStmt) + for i, val := range n.Variables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Variables[i] = node.(*VariableAssignment) + } + return v.Leave(n) +} + +/* +// SetCharsetStmt is a statement to assign values to character and collation variables. +// See https://dev.mysql.com/doc/refman/5.7/en/set-statement.html +type SetCharsetStmt struct { + stmtNode + + Charset string + Collate string +} + +// Accept implements Node Accept interface. +func (n *SetCharsetStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetCharsetStmt) + return v.Leave(n) +} +*/ + +// SetPwdStmt is a statement to assign a password to user account. +// See https://dev.mysql.com/doc/refman/5.7/en/set-password.html +type SetPwdStmt struct { + stmtNode + + User *auth.UserIdentity + Password string +} + +// SecureText implements SensitiveStatement interface. +func (n *SetPwdStmt) SecureText() string { + return fmt.Sprintf("set password for user %s", n.User) +} + +// Accept implements Node Accept interface. +func (n *SetPwdStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetPwdStmt) + return v.Leave(n) +} + +// UserSpec is used for parsing create user statement. +type UserSpec struct { + User *auth.UserIdentity + AuthOpt *AuthOption +} + +// SecurityString formats the UserSpec without password information. +func (u *UserSpec) SecurityString() string { + withPassword := false + if opt := u.AuthOpt; opt != nil { + if len(opt.AuthString) > 0 || len(opt.HashString) > 0 { + withPassword = true + } + } + if withPassword { + return fmt.Sprintf("{%s password = ***}", u.User) + } + return u.User.String() +} + +// EncodedPassword returns the encoded password (which is the real data mysql.user). +// The boolean value indicates input's password format is legal or not. +func (u *UserSpec) EncodedPassword() (string, bool) { + if u.AuthOpt == nil { + return "", true + } + + opt := u.AuthOpt + if opt.ByAuthString { + return auth.EncodePassword(opt.AuthString), true + } + + // Not a legal password string. + if len(opt.HashString) != 41 || !strings.HasPrefix(opt.HashString, "*") { + return "", false + } + return opt.HashString, true +} + +// CreateUserStmt creates user account. +// See https://dev.mysql.com/doc/refman/5.7/en/create-user.html +type CreateUserStmt struct { + stmtNode + + IfNotExists bool + Specs []*UserSpec +} + +// Accept implements Node Accept interface. +func (n *CreateUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateUserStmt) + return v.Leave(n) +} + +// SecureText implements SensitiveStatement interface. +func (n *CreateUserStmt) SecureText() string { + var buf bytes.Buffer + buf.WriteString("create user") + for _, user := range n.Specs { + buf.WriteString(" ") + buf.WriteString(user.SecurityString()) + } + return buf.String() +} + +// AlterUserStmt modifies user account. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-user.html +type AlterUserStmt struct { + stmtNode + + IfExists bool + CurrentAuth *AuthOption + Specs []*UserSpec +} + +// SecureText implements SensitiveStatement interface. +func (n *AlterUserStmt) SecureText() string { + var buf bytes.Buffer + buf.WriteString("alter user") + for _, user := range n.Specs { + buf.WriteString(" ") + buf.WriteString(user.SecurityString()) + } + return buf.String() +} + +// Accept implements Node Accept interface. +func (n *AlterUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterUserStmt) + return v.Leave(n) +} + +// DropUserStmt creates user account. +// See http://dev.mysql.com/doc/refman/5.7/en/drop-user.html +type DropUserStmt struct { + stmtNode + + IfExists bool + UserList []*auth.UserIdentity +} + +// Accept implements Node Accept interface. +func (n *DropUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropUserStmt) + return v.Leave(n) +} + +// DoStmt is the struct for DO statement. +type DoStmt struct { + stmtNode + + Exprs []ExprNode +} + +// Accept implements Node Accept interface. +func (n *DoStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DoStmt) + for i, val := range n.Exprs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Exprs[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// AdminStmtType is the type for admin statement. +type AdminStmtType int + +// Admin statement types. +const ( + AdminShowDDL = iota + 1 + AdminCheckTable + AdminShowDDLJobs + AdminCancelDDLJobs + AdminCheckIndex + AdminRecoverIndex + AdminCleanupIndex + AdminCheckIndexRange + AdminShowDDLJobQueries + AdminChecksumTable + AdminShowSlow +) + +// HandleRange represents a range where handle value >= Begin and < End. +type HandleRange struct { + Begin int64 + End int64 +} + +// ShowSlowType defines the type for SlowSlow statement. +type ShowSlowType int + +const ( + // ShowSlowTop is a ShowSlowType constant. + ShowSlowTop ShowSlowType = iota + // ShowSlowRecent is a ShowSlowType constant. + ShowSlowRecent +) + +// ShowSlowKind defines the kind for SlowSlow statement when the type is ShowSlowTop. +type ShowSlowKind int + +const ( + // ShowSlowKindDefault is a ShowSlowKind constant. + ShowSlowKindDefault ShowSlowKind = iota + // ShowSlowKindInternal is a ShowSlowKind constant. + ShowSlowKindInternal + // ShowSlowKindAll is a ShowSlowKind constant. + ShowSlowKindAll +) + +// ShowSlow is used for the following command: +// admin show slow top [ internal | all] N +// admin show slow recent N +type ShowSlow struct { + Tp ShowSlowType + Count uint64 + Kind ShowSlowKind +} + +// AdminStmt is the struct for Admin statement. +type AdminStmt struct { + stmtNode + + Tp AdminStmtType + Index string + Tables []*TableName + JobIDs []int64 + JobNumber int64 + + HandleRanges []HandleRange + ShowSlow *ShowSlow +} + +// Accept implements Node Accept interface. +func (n *AdminStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*AdminStmt) + for i, val := range n.Tables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + + return v.Leave(n) +} + +// PrivElem is the privilege type and optional column list. +type PrivElem struct { + node + + Priv mysql.PrivilegeType + Cols []*ColumnName +} + +// Accept implements Node Accept interface. +func (n *PrivElem) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PrivElem) + for i, val := range n.Cols { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Cols[i] = node.(*ColumnName) + } + return v.Leave(n) +} + +// ObjectTypeType is the type for object type. +type ObjectTypeType int + +const ( + // ObjectTypeNone is for empty object type. + ObjectTypeNone ObjectTypeType = iota + 1 + // ObjectTypeTable means the following object is a table. + ObjectTypeTable +) + +// GrantLevelType is the type for grant level. +type GrantLevelType int + +const ( + // GrantLevelNone is the dummy const for default value. + GrantLevelNone GrantLevelType = iota + 1 + // GrantLevelGlobal means the privileges are administrative or apply to all databases on a given server. + GrantLevelGlobal + // GrantLevelDB means the privileges apply to all objects in a given database. + GrantLevelDB + // GrantLevelTable means the privileges apply to all columns in a given table. + GrantLevelTable +) + +// GrantLevel is used for store the privilege scope. +type GrantLevel struct { + Level GrantLevelType + DBName string + TableName string +} + +// RevokeStmt is the struct for REVOKE statement. +type RevokeStmt struct { + stmtNode + + Privs []*PrivElem + ObjectType ObjectTypeType + Level *GrantLevel + Users []*UserSpec +} + +// Accept implements Node Accept interface. +func (n *RevokeStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RevokeStmt) + for i, val := range n.Privs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Privs[i] = node.(*PrivElem) + } + return v.Leave(n) +} + +// GrantStmt is the struct for GRANT statement. +type GrantStmt struct { + stmtNode + + Privs []*PrivElem + ObjectType ObjectTypeType + Level *GrantLevel + Users []*UserSpec + WithGrant bool +} + +// SecureText implements SensitiveStatement interface. +func (n *GrantStmt) SecureText() string { + text := n.text + // Filter "identified by xxx" because it would expose password information. + idx := strings.Index(strings.ToLower(text), "identified") + if idx > 0 { + text = text[:idx] + } + return text +} + +// Accept implements Node Accept interface. +func (n *GrantStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*GrantStmt) + for i, val := range n.Privs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Privs[i] = node.(*PrivElem) + } + return v.Leave(n) +} + +// Ident is the table identifier composed of schema name and table name. +type Ident struct { + Schema model.CIStr + Name model.CIStr +} + +// String implements fmt.Stringer interface. +func (i Ident) String() string { + if i.Schema.O == "" { + return i.Name.O + } + return fmt.Sprintf("%s.%s", i.Schema, i.Name) +} + +// SelectStmtOpts wrap around select hints and switches +type SelectStmtOpts struct { + Distinct bool + SQLCache bool + CalcFoundRows bool + StraightJoin bool + Priority mysql.PriorityEnum + TableHints []*TableOptimizerHint +} + +// TableOptimizerHint is Table level optimizer hint +type TableOptimizerHint struct { + node + // HintName is the name or alias of the table(s) which the hint will affect. + // Table hints has no schema info + // It allows only table name or alias (if table has an alias) + HintName model.CIStr + Tables []model.CIStr + // Statement Execution Time Optimizer Hints + // See https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html#optimizer-hints-execution-time + MaxExecutionTime uint64 +} + +// Accept implements Node Accept interface. +func (n *TableOptimizerHint) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableOptimizerHint) + return v.Leave(n) +} + +// NewDecimal creates a types.Decimal value, it's provided by parser driver. +var NewDecimal func(string) (interface{}, error) + +// NewHexLiteral creates a types.HexLiteral value, it's provided by parser driver. +var NewHexLiteral func(string) (interface{}, error) + +// NewBitLiteral creates a types.BitLiteral value, it's provided by parser driver. +var NewBitLiteral func(string) (interface{}, error) diff --git a/ast/misc_test.go b/ast/misc_test.go new file mode 100644 index 000000000..7e1b80ec0 --- /dev/null +++ b/ast/misc_test.go @@ -0,0 +1,190 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/parser" + . "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/auth" +) + +var _ = Suite(&testMiscSuite{}) + +type testMiscSuite struct { +} + +type visitor struct{} + +func (v visitor) Enter(in Node) (Node, bool) { + return in, false +} + +func (v visitor) Leave(in Node) (Node, bool) { + return in, true +} + +type visitor1 struct { + visitor +} + +func (visitor1) Enter(in Node) (Node, bool) { + return in, true +} + +func (ts *testMiscSuite) TestMiscVisitorCover(c *C) { + valueExpr := NewValueExpr(42) + stmts := []Node{ + &AdminStmt{}, + &AlterUserStmt{}, + &BeginStmt{}, + &BinlogStmt{}, + &CommitStmt{}, + &CreateUserStmt{}, + &DeallocateStmt{}, + &DoStmt{}, + &ExecuteStmt{UsingVars: []ExprNode{valueExpr}}, + &ExplainStmt{Stmt: &ShowStmt{}}, + &GrantStmt{}, + &PrepareStmt{SQLVar: &VariableExpr{Value: valueExpr}}, + &RollbackStmt{}, + &SetPwdStmt{}, + &SetStmt{Variables: []*VariableAssignment{ + { + Value: valueExpr, + }, + }}, + &UseStmt{}, + &AnalyzeTableStmt{ + TableNames: []*TableName{ + {}, + }, + }, + &FlushStmt{}, + &PrivElem{}, + &VariableAssignment{Value: valueExpr}, + &KillStmt{}, + &DropStatsStmt{Table: &TableName{}}, + } + + for _, v := range stmts { + v.Accept(visitor{}) + v.Accept(visitor1{}) + } +} + +func (ts *testMiscSuite) TestDDLVisitorCover(c *C) { + sql := ` +create table t (c1 smallint unsigned, c2 int unsigned); +alter table t add column a smallint unsigned after b; +create index t_i on t (id); +create database test character set utf8; +drop database test; +drop index t_i on t; +drop table t; +truncate t; +create table t ( +jobAbbr char(4) not null, +constraint foreign key (jobabbr) references ffxi_jobtype (jobabbr) on delete cascade on update cascade +); +` + parse := parser.New() + stmts, err := parse.Parse(sql, "", "") + c.Assert(err, IsNil) + for _, stmt := range stmts { + stmt.Accept(visitor{}) + stmt.Accept(visitor1{}) + } +} + +func (ts *testMiscSuite) TestDMLVistorCover(c *C) { + sql := `delete from somelog where user = 'jcole' order by timestamp_column limit 1; +delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id; +select * from t where exists(select * from t k where t.c = k.c having sum(c) = 1); +insert into t_copy select * from t where t.x > 5; +(select /*+ TIDB_INLJ(t1) */ a from t1 where a=10 and b=1) union (select /*+ TIDB_SMJ(t2) */ a from t2 where a=11 and b=2) order by a limit 10; +update t1 set col1 = col1 + 1, col2 = col1; +show create table t; +load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b';` + + p := parser.New() + stmts, err := p.Parse(sql, "", "") + c.Assert(err, IsNil) + for _, stmt := range stmts { + stmt.Accept(visitor{}) + stmt.Accept(visitor1{}) + } +} + +func (ts *testMiscSuite) TestSensitiveStatement(c *C) { + positive := []StmtNode{ + &SetPwdStmt{}, + &CreateUserStmt{}, + &AlterUserStmt{}, + &GrantStmt{}, + } + for i, stmt := range positive { + _, ok := stmt.(SensitiveStmtNode) + c.Assert(ok, IsTrue, Commentf("%d, %#v fail", i, stmt)) + } + + negative := []StmtNode{ + &DropUserStmt{}, + &RevokeStmt{}, + &AlterTableStmt{}, + &CreateDatabaseStmt{}, + &CreateIndexStmt{}, + &CreateTableStmt{}, + &DropDatabaseStmt{}, + &DropIndexStmt{}, + &DropTableStmt{}, + &RenameTableStmt{}, + &TruncateTableStmt{}, + } + for _, stmt := range negative { + _, ok := stmt.(SensitiveStmtNode) + c.Assert(ok, IsFalse) + } +} + +func (ts *testMiscSuite) TestUserSpec(c *C) { + hashString := "*3D56A309CD04FA2EEF181462E59011F075C89548" + u := UserSpec{ + User: &auth.UserIdentity{ + Username: "test", + }, + AuthOpt: &AuthOption{ + ByAuthString: false, + AuthString: "xxx", + HashString: hashString, + }, + } + pwd, ok := u.EncodedPassword() + c.Assert(ok, IsTrue) + c.Assert(pwd, Equals, u.AuthOpt.HashString) + + u.AuthOpt.HashString = "not-good-password-format" + pwd, ok = u.EncodedPassword() + c.Assert(ok, IsFalse) + + u.AuthOpt.ByAuthString = true + pwd, ok = u.EncodedPassword() + c.Assert(ok, IsTrue) + c.Assert(pwd, Equals, hashString) + + u.AuthOpt.AuthString = "" + pwd, ok = u.EncodedPassword() + c.Assert(ok, IsTrue) + c.Assert(pwd, Equals, "") +} diff --git a/ast/read_only_checker.go b/ast/read_only_checker.go new file mode 100644 index 000000000..99c48f580 --- /dev/null +++ b/ast/read_only_checker.go @@ -0,0 +1,61 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +// IsReadOnly checks whether the input ast is readOnly. +func IsReadOnly(node Node) bool { + switch st := node.(type) { + case *SelectStmt: + if st.LockTp == SelectLockForUpdate { + return false + } + + checker := readOnlyChecker{ + readOnly: true, + } + + node.Accept(&checker) + return checker.readOnly + case *ExplainStmt, *DoStmt: + return true + default: + return false + } +} + +// readOnlyChecker checks whether a query's ast is readonly, if it satisfied +// 1. selectstmt; +// 2. need not to set var; +// it is readonly statement. +type readOnlyChecker struct { + readOnly bool +} + +// Enter implements Visitor interface. +func (checker *readOnlyChecker) Enter(in Node) (out Node, skipChildren bool) { + switch node := in.(type) { + case *VariableExpr: + // like func rewriteVariable(), this stands for SetVar. + if !node.IsSystem && node.Value != nil { + checker.readOnly = false + return in, true + } + } + return in, false +} + +// Leave implements Visitor interface. +func (checker *readOnlyChecker) Leave(in Node) (out Node, ok bool) { + return in, checker.readOnly +} diff --git a/ast/read_only_checker_test.go b/ast/read_only_checker_test.go new file mode 100644 index 000000000..7abd27f06 --- /dev/null +++ b/ast/read_only_checker_test.go @@ -0,0 +1,44 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + . "github.com/pingcap/check" +) + +var _ = Suite(&testCacheableSuite{}) + +type testCacheableSuite struct { +} + +func (s *testCacheableSuite) TestCacheable(c *C) { + // test non-SelectStmt + var stmt Node = &DeleteStmt{} + c.Assert(IsReadOnly(stmt), IsFalse) + + stmt = &InsertStmt{} + c.Assert(IsReadOnly(stmt), IsFalse) + + stmt = &UpdateStmt{} + c.Assert(IsReadOnly(stmt), IsFalse) + + stmt = &ExplainStmt{} + c.Assert(IsReadOnly(stmt), IsTrue) + + stmt = &ExplainStmt{} + c.Assert(IsReadOnly(stmt), IsTrue) + + stmt = &DoStmt{} + c.Assert(IsReadOnly(stmt), IsTrue) +} diff --git a/ast/stats.go b/ast/stats.go new file mode 100644 index 000000000..5db8664a5 --- /dev/null +++ b/ast/stats.go @@ -0,0 +1,91 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import "github.com/pingcap/parser/model" + +var ( + _ StmtNode = &AnalyzeTableStmt{} + _ StmtNode = &DropStatsStmt{} + _ StmtNode = &LoadStatsStmt{} +) + +// AnalyzeTableStmt is used to create table statistics. +type AnalyzeTableStmt struct { + stmtNode + + TableNames []*TableName + PartitionNames []model.CIStr + IndexNames []model.CIStr + MaxNumBuckets uint64 + + // IndexFlag is true when we only analyze indices for a table. + IndexFlag bool +} + +// Accept implements Node Accept interface. +func (n *AnalyzeTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AnalyzeTableStmt) + for i, val := range n.TableNames { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.TableNames[i] = node.(*TableName) + } + return v.Leave(n) +} + +// DropStatsStmt is used to drop table statistics. +type DropStatsStmt struct { + stmtNode + + Table *TableName +} + +// Accept implements Node Accept interface. +func (n *DropStatsStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropStatsStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + return v.Leave(n) +} + +// LoadStatsStmt is the statement node for loading statistic. +type LoadStatsStmt struct { + stmtNode + + Path string +} + +// Accept implements Node Accept interface. +func (n *LoadStatsStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*LoadStatsStmt) + return v.Leave(n) +} diff --git a/auth/auth.go b/auth/auth.go new file mode 100644 index 000000000..1d33fbdc0 --- /dev/null +++ b/auth/auth.go @@ -0,0 +1,103 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package auth + +import ( + "bytes" + "crypto/sha1" + "encoding/hex" + "fmt" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/terror" +) + +// UserIdentity represents username and hostname. +type UserIdentity struct { + Username string + Hostname string + CurrentUser bool + AuthUsername string // Username matched in privileges system + AuthHostname string // Match in privs system (i.e. could be a wildcard) +} + +// String converts UserIdentity to the format user@host. +func (user *UserIdentity) String() string { + // TODO: Escape username and hostname. + return fmt.Sprintf("%s@%s", user.Username, user.Hostname) +} + +// AuthIdentityString returns matched identity in user@host format +func (user *UserIdentity) AuthIdentityString() string { + // TODO: Escape username and hostname. + return fmt.Sprintf("%s@%s", user.AuthUsername, user.AuthHostname) +} + +// CheckScrambledPassword check scrambled password received from client. +// The new authentication is performed in following manner: +// SERVER: public_seed=create_random_string() +// send(public_seed) +// CLIENT: recv(public_seed) +// hash_stage1=sha1("password") +// hash_stage2=sha1(hash_stage1) +// reply=xor(hash_stage1, sha1(public_seed,hash_stage2) +// // this three steps are done in scramble() +// send(reply) +// SERVER: recv(reply) +// hash_stage1=xor(reply, sha1(public_seed,hash_stage2)) +// candidate_hash2=sha1(hash_stage1) +// check(candidate_hash2==hash_stage2) +// // this three steps are done in check_scramble() +func CheckScrambledPassword(salt, hpwd, auth []byte) bool { + crypt := sha1.New() + _, err := crypt.Write(salt) + terror.Log(errors.Trace(err)) + _, err = crypt.Write(hpwd) + terror.Log(errors.Trace(err)) + hash := crypt.Sum(nil) + // token = scrambleHash XOR stage1Hash + for i := range hash { + hash[i] ^= auth[i] + } + + return bytes.Equal(hpwd, Sha1Hash(hash)) +} + +// Sha1Hash is an util function to calculate sha1 hash. +func Sha1Hash(bs []byte) []byte { + crypt := sha1.New() + _, err := crypt.Write(bs) + terror.Log(errors.Trace(err)) + return crypt.Sum(nil) +} + +// EncodePassword converts plaintext password to hashed hex string. +func EncodePassword(pwd string) string { + if len(pwd) == 0 { + return "" + } + hash1 := Sha1Hash([]byte(pwd)) + hash2 := Sha1Hash(hash1) + + return fmt.Sprintf("*%X", hash2) +} + +// DecodePassword converts hex string password without prefix '*' to byte array. +func DecodePassword(pwd string) ([]byte, error) { + x, err := hex.DecodeString(pwd[1:]) + if err != nil { + return nil, errors.Trace(err) + } + return x, nil +} diff --git a/auth/auth_test.go b/auth/auth_test.go new file mode 100644 index 000000000..86cdd11ed --- /dev/null +++ b/auth/auth_test.go @@ -0,0 +1,50 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package auth + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/tidb/util/testleak" +) + +var _ = Suite(&testAuthSuite{}) + +type testAuthSuite struct { +} + +func (s *testAuthSuite) TestEncodePassword(c *C) { + defer testleak.AfterTest(c)() + pwd := "123" + c.Assert(EncodePassword(pwd), Equals, "*23AE809DDACAF96AF0FD78ED04B6A265E05AA257") +} + +func (s *testAuthSuite) TestDecodePassword(c *C) { + defer testleak.AfterTest(c)() + x, err := DecodePassword(EncodePassword("123")) + c.Assert(err, IsNil) + c.Assert(x, DeepEquals, Sha1Hash(Sha1Hash([]byte("123")))) +} + +func (s *testAuthSuite) TestCheckScramble(c *C) { + defer testleak.AfterTest(c)() + pwd := "abc" + salt := []byte{85, 92, 45, 22, 58, 79, 107, 6, 122, 125, 58, 80, 12, 90, 103, 32, 90, 10, 74, 82} + auth := []byte{24, 180, 183, 225, 166, 6, 81, 102, 70, 248, 199, 143, 91, 204, 169, 9, 161, 171, 203, 33} + encodepwd := EncodePassword(pwd) + hpwd, err := DecodePassword(encodepwd) + c.Assert(err, IsNil) + + res := CheckScrambledPassword(salt, hpwd, auth) + c.Assert(res, IsTrue) +} diff --git a/bench_test.go b/bench_test.go new file mode 100644 index 000000000..b22f81146 --- /dev/null +++ b/bench_test.go @@ -0,0 +1,66 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "testing" +) + +func BenchmarkSysbenchSelect(b *testing.B) { + parser := New() + sql := "SELECT pad FROM sbtest1 WHERE id=1;" + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := parser.Parse(sql, "", "") + if err != nil { + b.Fatal(err) + } + } + b.ReportAllocs() +} + +func BenchmarkParseComplex(b *testing.B) { + var table = []string{ + `SELECT DISTINCT ca.l9_convergence_code AS atb2, cu.cust_sub_type AS account_type, cst.description AS account_type_desc, ss.prim_resource_val AS msisdn, ca.ban AS ban_key, To_char(mo.memo_date, 'YYYYMMDD') AS memo_date, cu.l9_identification AS thai_id, ss.subscriber_no AS subs_key, ss.dealer_code AS shop_code, cd.description AS shop_name, mot.short_desc, Regexp_substr(mo.attr1value, '[^ ;]+', 1, 3) staff_id, mo.operator_id AS user_id, mo.memo_system_text, co2.soc_name AS first_socname, co3.soc_name AS previous_socname, co.soc_name AS current_socname, Regexp_substr(mo.attr1value, '[^ ; ]+', 1, 1) NAME, co.soc_description AS current_pp_desc, co3.soc_description AS prev_pp_desc, co.soc_cd AS soc_cd, ( SELECT Sum(br.amount) FROM bl1_rc_rates BR, customer CU, subscriber SS WHERE br.service_receiver_id = ss.subscriber_no AND br.receiver_customer = ss.customer_id AND br.effective_date <= br.expiration_date AND (( ss. sub_status <> 'C' AND ss. sub_status <> 'T' AND br.expiration_date IS NULL) OR ( ss. sub_status = 'C' AND br.expiration_date LIKE ss.effective_date)) AND br.pp_ind = 'Y' AND br.cycle_code = cu.bill_cycle) AS pp_rate, cu.bill_cycle AS cycle_code, To_char(Nvl(ss.l9_tmv_act_date, ss.init_act_date),'YYYYMMDD') AS activated_date, To_char(cd.effective_date, 'YYYYMMDD') AS shop_effective_date, cd.expiration_date AS shop_expired_date, ca.l9_company_code AS company_code FROM service_details S, product CO, csm_pay_channel CPC, account CA, subscriber SS, customer CU, customer_sub_type CST, csm_dealer CD, service_details S2, product CO2, service_details S3, product CO3, memo MO , memo_type MOT, logical_date LO, charge_details CHD WHERE ss.subscriber_no = chd.agreement_no AND cpc.pym_channel_no = chd.target_pcn AND chd.chg_split_type = 'DR' AND chd.expiration_date IS NULL AND s.soc = co.soc_cd AND co.soc_type = 'P' AND s.agreement_no = ss.subscriber_no AND ss.prim_resource_tp = 'C' AND cpc.payment_category = 'POST' AND ca.ban = cpc.ban AND ( ca.l9_company_code = 'RF' OR ca.l9_company_code = 'RM' OR ca.l9_company_code = 'TM') AND ss.customer_id = cu.customer_id AND cu.cust_sub_type = cst.cust_sub_type AND cu.customer_type = cst.customer_type AND ss.dealer_code = cd.dealer AND s2.effective_date= ( SELECT Max(sa1.effective_date) FROM service_details SA1, product o1 WHERE sa1.agreement_no = ss.subscriber_no AND co.soc_cd = sa1.soc AND co.soc_type = 'P' ) AND s2.agreement_no = s.agreement_no AND s2.soc = co2.soc_cd AND co2.soc_type = 'P' AND s2.effective_date = ( SELECT Min(sa1.effective_date) FROM service_details SA1, product o1 WHERE sa1.agreement_no = ss.subscriber_no AND co2.soc_cd = sa1.soc AND co.soc_type = 'P' ) AND s3.agreement_no = s.agreement_no AND s3.soc = co3.soc_cd AND co3.soc_type = 'P' AND s3.effective_date = ( SELECT Max(sa1.effective_date) FROM service_details SA1, a product o1 WHERE sa1.agreement_no = ss.subscriber_no AND sa1.effective_date < ( SELECT Max(sa1.effective_date) FROM service_details SA1, product o1 WHERE sa1.agreement_no = ss.subscriber_no AND co3.soc_cd = sa1.soc AND co3.soc_type = 'P' ) AND co3.soc_cd = sa1.soc AND o1.soc_type = 'P' ) AND mo.entity_id = ss.subscriber_no AND mo.entity_type_id = 6 AND mo.memo_type_id = mot.memo_type_id AND Trunc(mo.sys_creation_date) = ( SELECT Trunc(lo.logical_date - 1) FROM lo) trunc(lo.logical_date - 1) AND lo.expiration_date IS NULL AND lo.logical_date_type = 'B' AND lo.expiration_date IS NULL AND ( mot.short_desc = 'BCN' OR mot.short_desc = 'BCNM' )`} + parser := New() + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, v := range table { + _, err := parser.Parse(v, "", "") + if err != nil { + b.Failed() + } + } + } + b.ReportAllocs() +} + +func BenchmarkParseSimple(b *testing.B) { + var table = []string{ + "insert into t values (1), (2), (3)", + "insert into t values (4), (5), (6), (7)", + "select c from t where c > 2", + } + parser := New() + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, v := range table { + _, err := parser.Parse(v, "", "") + if err != nil { + b.Failed() + } + } + } + b.ReportAllocs() +} diff --git a/charset/charset.go b/charset/charset.go new file mode 100644 index 000000000..0511f5540 --- /dev/null +++ b/charset/charset.go @@ -0,0 +1,417 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" +) + +// Charset is a charset. +// Now we only support MySQL. +type Charset struct { + Name string + DefaultCollation string + Collations map[string]*Collation + Desc string + Maxlen int +} + +// Collation is a collation. +// Now we only support MySQL. +type Collation struct { + ID int + CharsetName string + Name string + IsDefault bool +} + +var charsets = make(map[string]*Charset) + +// All the supported charsets should be in the following table. +var charsetInfos = []*Charset{ + {CharsetUTF8, CollationUTF8, make(map[string]*Collation), "UTF-8 Unicode", 3}, + {CharsetUTF8MB4, CollationUTF8MB4, make(map[string]*Collation), "UTF-8 Unicode", 4}, + {CharsetASCII, CollationASCII, make(map[string]*Collation), "US ASCII", 1}, + {CharsetLatin1, CollationLatin1, make(map[string]*Collation), "Latin1", 1}, + {CharsetBin, CollationBin, make(map[string]*Collation), "binary", 1}, +} + +// Desc is a charset description. +type Desc struct { + Name string + Desc string + DefaultCollation string + Maxlen int +} + +// GetAllCharsets gets all charset descriptions in the local charsets. +func GetAllCharsets() []*Desc { + descs := make([]*Desc, 0, len(charsets)) + // The charsetInfos is an array, so the iterate order will be stable. + for _, ci := range charsetInfos { + c, ok := charsets[ci.Name] + if !ok { + continue + } + desc := &Desc{ + Name: c.Name, + DefaultCollation: c.DefaultCollation, + Desc: c.Desc, + Maxlen: c.Maxlen, + } + descs = append(descs, desc) + } + return descs +} + +// ValidCharsetAndCollation checks the charset and the collation validity +// and returns a boolean. +func ValidCharsetAndCollation(cs string, co string) bool { + // We will use utf8 as a default charset. + if cs == "" { + cs = "utf8" + } + cs = strings.ToLower(cs) + c, ok := charsets[cs] + if !ok { + return false + } + + if co == "" { + return true + } + _, ok = c.Collations[co] + if !ok { + return false + } + + return true +} + +// GetDefaultCollation returns the default collation for charset. +func GetDefaultCollation(charset string) (string, error) { + charset = strings.ToLower(charset) + if charset == CharsetBin { + return CollationBin, nil + } + c, ok := charsets[charset] + if !ok { + return "", errors.Errorf("Unknown charset %s", charset) + } + return c.DefaultCollation, nil +} + +// GetCharsetInfo returns charset and collation for cs as name. +func GetCharsetInfo(cs string) (string, string, error) { + c, ok := charsets[strings.ToLower(cs)] + if !ok { + return "", "", errors.Errorf("Unknown charset %s", cs) + } + return c.Name, c.DefaultCollation, nil +} + +// GetCharsetDesc gets charset descriptions in the local charsets. +func GetCharsetDesc(cs string) (*Desc, error) { + c, ok := charsets[strings.ToLower(cs)] + if !ok { + return nil, errors.Errorf("Unknown charset %s", cs) + } + desc := &Desc{ + Name: c.Name, + DefaultCollation: c.DefaultCollation, + Desc: c.Desc, + Maxlen: c.Maxlen, + } + return desc, nil +} + +// GetCharsetInfoByID returns charset and collation for id as cs_number. +func GetCharsetInfoByID(coID int) (string, string, error) { + if coID == mysql.DefaultCollationID { + return mysql.DefaultCharset, mysql.DefaultCollationName, nil + } + for _, collation := range collations { + if coID == collation.ID { + return collation.CharsetName, collation.Name, nil + } + } + return "", "", errors.Errorf("Unknown charset id %d", coID) +} + +// GetCollations returns a list for all collations. +func GetCollations() []*Collation { + return collations +} + +const ( + // CharsetBin is used for marking binary charset. + CharsetBin = "binary" + // CollationBin is the default collation for CharsetBin. + CollationBin = "binary" + // CharsetUTF8 is the default charset for string types. + CharsetUTF8 = "utf8" + // CollationUTF8 is the default collation for CharsetUTF8. + CollationUTF8 = "utf8_bin" + // CharsetUTF8MB4 represents 4 bytes utf8, which works the same way as utf8 in Go. + CharsetUTF8MB4 = "utf8mb4" + // CollationUTF8MB4 is the default collation for CharsetUTF8MB4. + CollationUTF8MB4 = "utf8mb4_bin" + // CharsetASCII is a subset of UTF8. + CharsetASCII = "ascii" + // CollationASCII is the default collation for CharsetACSII. + CollationASCII = "ascii_bin" + // CharsetLatin1 is a single byte charset. + CharsetLatin1 = "latin1" + // CollationLatin1 is the default collation for CharsetLatin1. + CollationLatin1 = "latin1_bin" +) + +var collations = []*Collation{ + {1, "big5", "big5_chinese_ci", true}, + {2, "latin2", "latin2_czech_cs", false}, + {3, "dec8", "dec8_swedish_ci", true}, + {4, "cp850", "cp850_general_ci", true}, + {5, "latin1", "latin1_german1_ci", false}, + {6, "hp8", "hp8_english_ci", true}, + {7, "koi8r", "koi8r_general_ci", true}, + {8, "latin1", "latin1_swedish_ci", true}, + {9, "latin2", "latin2_general_ci", true}, + {10, "swe7", "swe7_swedish_ci", true}, + {11, "ascii", "ascii_general_ci", true}, + {12, "ujis", "ujis_japanese_ci", true}, + {13, "sjis", "sjis_japanese_ci", true}, + {14, "cp1251", "cp1251_bulgarian_ci", false}, + {15, "latin1", "latin1_danish_ci", false}, + {16, "hebrew", "hebrew_general_ci", true}, + {18, "tis620", "tis620_thai_ci", true}, + {19, "euckr", "euckr_korean_ci", true}, + {20, "latin7", "latin7_estonian_cs", false}, + {21, "latin2", "latin2_hungarian_ci", false}, + {22, "koi8u", "koi8u_general_ci", true}, + {23, "cp1251", "cp1251_ukrainian_ci", false}, + {24, "gb2312", "gb2312_chinese_ci", true}, + {25, "greek", "greek_general_ci", true}, + {26, "cp1250", "cp1250_general_ci", true}, + {27, "latin2", "latin2_croatian_ci", false}, + {28, "gbk", "gbk_chinese_ci", true}, + {29, "cp1257", "cp1257_lithuanian_ci", false}, + {30, "latin5", "latin5_turkish_ci", true}, + {31, "latin1", "latin1_german2_ci", false}, + {32, "armscii8", "armscii8_general_ci", true}, + {33, "utf8", "utf8_general_ci", true}, + {34, "cp1250", "cp1250_czech_cs", false}, + {35, "ucs2", "ucs2_general_ci", true}, + {36, "cp866", "cp866_general_ci", true}, + {37, "keybcs2", "keybcs2_general_ci", true}, + {38, "macce", "macce_general_ci", true}, + {39, "macroman", "macroman_general_ci", true}, + {40, "cp852", "cp852_general_ci", true}, + {41, "latin7", "latin7_general_ci", true}, + {42, "latin7", "latin7_general_cs", false}, + {43, "macce", "macce_bin", false}, + {44, "cp1250", "cp1250_croatian_ci", false}, + {45, "utf8mb4", "utf8mb4_general_ci", true}, + {46, "utf8mb4", "utf8mb4_bin", false}, + {47, "latin1", "latin1_bin", false}, + {48, "latin1", "latin1_general_ci", false}, + {49, "latin1", "latin1_general_cs", false}, + {50, "cp1251", "cp1251_bin", false}, + {51, "cp1251", "cp1251_general_ci", true}, + {52, "cp1251", "cp1251_general_cs", false}, + {53, "macroman", "macroman_bin", false}, + {54, "utf16", "utf16_general_ci", true}, + {55, "utf16", "utf16_bin", false}, + {56, "utf16le", "utf16le_general_ci", true}, + {57, "cp1256", "cp1256_general_ci", true}, + {58, "cp1257", "cp1257_bin", false}, + {59, "cp1257", "cp1257_general_ci", true}, + {60, "utf32", "utf32_general_ci", true}, + {61, "utf32", "utf32_bin", false}, + {62, "utf16le", "utf16le_bin", false}, + {63, "binary", "binary", true}, + {64, "armscii8", "armscii8_bin", false}, + {65, "ascii", "ascii_bin", false}, + {66, "cp1250", "cp1250_bin", false}, + {67, "cp1256", "cp1256_bin", false}, + {68, "cp866", "cp866_bin", false}, + {69, "dec8", "dec8_bin", false}, + {70, "greek", "greek_bin", false}, + {71, "hebrew", "hebrew_bin", false}, + {72, "hp8", "hp8_bin", false}, + {73, "keybcs2", "keybcs2_bin", false}, + {74, "koi8r", "koi8r_bin", false}, + {75, "koi8u", "koi8u_bin", false}, + {77, "latin2", "latin2_bin", false}, + {78, "latin5", "latin5_bin", false}, + {79, "latin7", "latin7_bin", false}, + {80, "cp850", "cp850_bin", false}, + {81, "cp852", "cp852_bin", false}, + {82, "swe7", "swe7_bin", false}, + {83, "utf8", "utf8_bin", false}, + {84, "big5", "big5_bin", false}, + {85, "euckr", "euckr_bin", false}, + {86, "gb2312", "gb2312_bin", false}, + {87, "gbk", "gbk_bin", false}, + {88, "sjis", "sjis_bin", false}, + {89, "tis620", "tis620_bin", false}, + {90, "ucs2", "ucs2_bin", false}, + {91, "ujis", "ujis_bin", false}, + {92, "geostd8", "geostd8_general_ci", true}, + {93, "geostd8", "geostd8_bin", false}, + {94, "latin1", "latin1_spanish_ci", false}, + {95, "cp932", "cp932_japanese_ci", true}, + {96, "cp932", "cp932_bin", false}, + {97, "eucjpms", "eucjpms_japanese_ci", true}, + {98, "eucjpms", "eucjpms_bin", false}, + {99, "cp1250", "cp1250_polish_ci", false}, + {101, "utf16", "utf16_unicode_ci", false}, + {102, "utf16", "utf16_icelandic_ci", false}, + {103, "utf16", "utf16_latvian_ci", false}, + {104, "utf16", "utf16_romanian_ci", false}, + {105, "utf16", "utf16_slovenian_ci", false}, + {106, "utf16", "utf16_polish_ci", false}, + {107, "utf16", "utf16_estonian_ci", false}, + {108, "utf16", "utf16_spanish_ci", false}, + {109, "utf16", "utf16_swedish_ci", false}, + {110, "utf16", "utf16_turkish_ci", false}, + {111, "utf16", "utf16_czech_ci", false}, + {112, "utf16", "utf16_danish_ci", false}, + {113, "utf16", "utf16_lithuanian_ci", false}, + {114, "utf16", "utf16_slovak_ci", false}, + {115, "utf16", "utf16_spanish2_ci", false}, + {116, "utf16", "utf16_roman_ci", false}, + {117, "utf16", "utf16_persian_ci", false}, + {118, "utf16", "utf16_esperanto_ci", false}, + {119, "utf16", "utf16_hungarian_ci", false}, + {120, "utf16", "utf16_sinhala_ci", false}, + {121, "utf16", "utf16_german2_ci", false}, + {122, "utf16", "utf16_croatian_ci", false}, + {123, "utf16", "utf16_unicode_520_ci", false}, + {124, "utf16", "utf16_vietnamese_ci", false}, + {128, "ucs2", "ucs2_unicode_ci", false}, + {129, "ucs2", "ucs2_icelandic_ci", false}, + {130, "ucs2", "ucs2_latvian_ci", false}, + {131, "ucs2", "ucs2_romanian_ci", false}, + {132, "ucs2", "ucs2_slovenian_ci", false}, + {133, "ucs2", "ucs2_polish_ci", false}, + {134, "ucs2", "ucs2_estonian_ci", false}, + {135, "ucs2", "ucs2_spanish_ci", false}, + {136, "ucs2", "ucs2_swedish_ci", false}, + {137, "ucs2", "ucs2_turkish_ci", false}, + {138, "ucs2", "ucs2_czech_ci", false}, + {139, "ucs2", "ucs2_danish_ci", false}, + {140, "ucs2", "ucs2_lithuanian_ci", false}, + {141, "ucs2", "ucs2_slovak_ci", false}, + {142, "ucs2", "ucs2_spanish2_ci", false}, + {143, "ucs2", "ucs2_roman_ci", false}, + {144, "ucs2", "ucs2_persian_ci", false}, + {145, "ucs2", "ucs2_esperanto_ci", false}, + {146, "ucs2", "ucs2_hungarian_ci", false}, + {147, "ucs2", "ucs2_sinhala_ci", false}, + {148, "ucs2", "ucs2_german2_ci", false}, + {149, "ucs2", "ucs2_croatian_ci", false}, + {150, "ucs2", "ucs2_unicode_520_ci", false}, + {151, "ucs2", "ucs2_vietnamese_ci", false}, + {159, "ucs2", "ucs2_general_mysql500_ci", false}, + {160, "utf32", "utf32_unicode_ci", false}, + {161, "utf32", "utf32_icelandic_ci", false}, + {162, "utf32", "utf32_latvian_ci", false}, + {163, "utf32", "utf32_romanian_ci", false}, + {164, "utf32", "utf32_slovenian_ci", false}, + {165, "utf32", "utf32_polish_ci", false}, + {166, "utf32", "utf32_estonian_ci", false}, + {167, "utf32", "utf32_spanish_ci", false}, + {168, "utf32", "utf32_swedish_ci", false}, + {169, "utf32", "utf32_turkish_ci", false}, + {170, "utf32", "utf32_czech_ci", false}, + {171, "utf32", "utf32_danish_ci", false}, + {172, "utf32", "utf32_lithuanian_ci", false}, + {173, "utf32", "utf32_slovak_ci", false}, + {174, "utf32", "utf32_spanish2_ci", false}, + {175, "utf32", "utf32_roman_ci", false}, + {176, "utf32", "utf32_persian_ci", false}, + {177, "utf32", "utf32_esperanto_ci", false}, + {178, "utf32", "utf32_hungarian_ci", false}, + {179, "utf32", "utf32_sinhala_ci", false}, + {180, "utf32", "utf32_german2_ci", false}, + {181, "utf32", "utf32_croatian_ci", false}, + {182, "utf32", "utf32_unicode_520_ci", false}, + {183, "utf32", "utf32_vietnamese_ci", false}, + {192, "utf8", "utf8_unicode_ci", false}, + {193, "utf8", "utf8_icelandic_ci", false}, + {194, "utf8", "utf8_latvian_ci", false}, + {195, "utf8", "utf8_romanian_ci", false}, + {196, "utf8", "utf8_slovenian_ci", false}, + {197, "utf8", "utf8_polish_ci", false}, + {198, "utf8", "utf8_estonian_ci", false}, + {199, "utf8", "utf8_spanish_ci", false}, + {200, "utf8", "utf8_swedish_ci", false}, + {201, "utf8", "utf8_turkish_ci", false}, + {202, "utf8", "utf8_czech_ci", false}, + {203, "utf8", "utf8_danish_ci", false}, + {204, "utf8", "utf8_lithuanian_ci", false}, + {205, "utf8", "utf8_slovak_ci", false}, + {206, "utf8", "utf8_spanish2_ci", false}, + {207, "utf8", "utf8_roman_ci", false}, + {208, "utf8", "utf8_persian_ci", false}, + {209, "utf8", "utf8_esperanto_ci", false}, + {210, "utf8", "utf8_hungarian_ci", false}, + {211, "utf8", "utf8_sinhala_ci", false}, + {212, "utf8", "utf8_german2_ci", false}, + {213, "utf8", "utf8_croatian_ci", false}, + {214, "utf8", "utf8_unicode_520_ci", false}, + {215, "utf8", "utf8_vietnamese_ci", false}, + {223, "utf8", "utf8_general_mysql500_ci", false}, + {224, "utf8mb4", "utf8mb4_unicode_ci", false}, + {225, "utf8mb4", "utf8mb4_icelandic_ci", false}, + {226, "utf8mb4", "utf8mb4_latvian_ci", false}, + {227, "utf8mb4", "utf8mb4_romanian_ci", false}, + {228, "utf8mb4", "utf8mb4_slovenian_ci", false}, + {229, "utf8mb4", "utf8mb4_polish_ci", false}, + {230, "utf8mb4", "utf8mb4_estonian_ci", false}, + {231, "utf8mb4", "utf8mb4_spanish_ci", false}, + {232, "utf8mb4", "utf8mb4_swedish_ci", false}, + {233, "utf8mb4", "utf8mb4_turkish_ci", false}, + {234, "utf8mb4", "utf8mb4_czech_ci", false}, + {235, "utf8mb4", "utf8mb4_danish_ci", false}, + {236, "utf8mb4", "utf8mb4_lithuanian_ci", false}, + {237, "utf8mb4", "utf8mb4_slovak_ci", false}, + {238, "utf8mb4", "utf8mb4_spanish2_ci", false}, + {239, "utf8mb4", "utf8mb4_roman_ci", false}, + {240, "utf8mb4", "utf8mb4_persian_ci", false}, + {241, "utf8mb4", "utf8mb4_esperanto_ci", false}, + {242, "utf8mb4", "utf8mb4_hungarian_ci", false}, + {243, "utf8mb4", "utf8mb4_sinhala_ci", false}, + {244, "utf8mb4", "utf8mb4_german2_ci", false}, + {245, "utf8mb4", "utf8mb4_croatian_ci", false}, + {246, "utf8mb4", "utf8mb4_unicode_520_ci", false}, + {247, "utf8mb4", "utf8mb4_vietnamese_ci", false}, +} + +// init method always puts to the end of file. +func init() { + for _, c := range charsetInfos { + charsets[c.Name] = c + } + for _, c := range collations { + charset, ok := charsets[c.CharsetName] + if !ok { + continue + } + charset.Collations[c.Name] = c + } +} diff --git a/charset/charset_test.go b/charset/charset_test.go new file mode 100644 index 000000000..c400d97f1 --- /dev/null +++ b/charset/charset_test.go @@ -0,0 +1,94 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/util/testleak" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testCharsetSuite{}) + +type testCharsetSuite struct { +} + +func testValidCharset(c *C, charset string, collation string, expect bool) { + b := ValidCharsetAndCollation(charset, collation) + c.Assert(b, Equals, expect) +} + +func (s *testCharsetSuite) TestValidCharset(c *C) { + defer testleak.AfterTest(c)() + tests := []struct { + cs string + co string + succ bool + }{ + {"utf8", "utf8_general_ci", true}, + {"", "utf8_general_ci", true}, + {"utf8mb4", "utf8mb4_bin", true}, + {"latin1", "latin1_bin", true}, + {"utf8", "utf8_invalid_ci", false}, + {"utf16", "utf16_bin", false}, + {"gb2312", "gb2312_chinese_ci", false}, + } + for _, tt := range tests { + testValidCharset(c, tt.cs, tt.co, tt.succ) + } +} + +func (s *testCharsetSuite) TestGetAllCharsets(c *C) { + defer testleak.AfterTest(c)() + charset := &Charset{"test", "test_bin", nil, "Test", 5} + charsetInfos = append(charsetInfos, charset) + descs := GetAllCharsets() + c.Assert(len(descs), Equals, len(charsetInfos)-1) +} + +func testGetDefaultCollation(c *C, charset string, expectCollation string, succ bool) { + b, err := GetDefaultCollation(charset) + if !succ { + c.Assert(err, NotNil) + return + } + c.Assert(b, Equals, expectCollation) +} + +func (s *testCharsetSuite) TestGetDefaultCollation(c *C) { + defer testleak.AfterTest(c)() + tests := []struct { + cs string + co string + succ bool + }{ + {"utf8", "utf8_bin", true}, + {"UTF8", "utf8_bin", true}, + {"utf8mb4", "utf8mb4_bin", true}, + {"ascii", "ascii_bin", true}, + {"binary", "binary", true}, + {"latin1", "latin1_bin", true}, + {"invalid_cs", "", false}, + {"", "utf8_bin", false}, + } + for _, tt := range tests { + testGetDefaultCollation(c, tt.cs, tt.co, tt.succ) + } +} diff --git a/charset/encoding_table.go b/charset/encoding_table.go new file mode 100644 index 000000000..37a5550b7 --- /dev/null +++ b/charset/encoding_table.go @@ -0,0 +1,260 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "strings" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/charmap" + "golang.org/x/text/encoding/japanese" + "golang.org/x/text/encoding/korean" + "golang.org/x/text/encoding/simplifiedchinese" + "golang.org/x/text/encoding/traditionalchinese" + "golang.org/x/text/encoding/unicode" +) + +// Lookup returns the encoding with the specified label, and its canonical +// name. It returns nil and the empty string if label is not one of the +// standard encodings for HTML. Matching is case-insensitive and ignores +// leading and trailing whitespace. +func Lookup(label string) (e encoding.Encoding, name string) { + label = strings.ToLower(strings.Trim(label, "\t\n\r\f ")) + enc := encodings[label] + return enc.e, enc.name +} + +var encodings = map[string]struct { + e encoding.Encoding + name string +}{ + "unicode-1-1-utf-8": {encoding.Nop, "utf-8"}, + "utf-8": {encoding.Nop, "utf-8"}, + "utf8": {encoding.Nop, "utf-8"}, + "utf8mb4": {encoding.Nop, "utf-8"}, + "binary": {encoding.Nop, "binary"}, + "866": {charmap.CodePage866, "ibm866"}, + "cp866": {charmap.CodePage866, "ibm866"}, + "csibm866": {charmap.CodePage866, "ibm866"}, + "ibm866": {charmap.CodePage866, "ibm866"}, + "csisolatin2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso-8859-2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso-ir-101": {charmap.ISO8859_2, "iso-8859-2"}, + "iso8859-2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso88592": {charmap.ISO8859_2, "iso-8859-2"}, + "iso_8859-2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso_8859-2:1987": {charmap.ISO8859_2, "iso-8859-2"}, + "l2": {charmap.ISO8859_2, "iso-8859-2"}, + "latin2": {charmap.ISO8859_2, "iso-8859-2"}, + "csisolatin3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso-8859-3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso-ir-109": {charmap.ISO8859_3, "iso-8859-3"}, + "iso8859-3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso88593": {charmap.ISO8859_3, "iso-8859-3"}, + "iso_8859-3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso_8859-3:1988": {charmap.ISO8859_3, "iso-8859-3"}, + "l3": {charmap.ISO8859_3, "iso-8859-3"}, + "latin3": {charmap.ISO8859_3, "iso-8859-3"}, + "csisolatin4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso-8859-4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso-ir-110": {charmap.ISO8859_4, "iso-8859-4"}, + "iso8859-4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso88594": {charmap.ISO8859_4, "iso-8859-4"}, + "iso_8859-4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso_8859-4:1988": {charmap.ISO8859_4, "iso-8859-4"}, + "l4": {charmap.ISO8859_4, "iso-8859-4"}, + "latin4": {charmap.ISO8859_4, "iso-8859-4"}, + "csisolatincyrillic": {charmap.ISO8859_5, "iso-8859-5"}, + "cyrillic": {charmap.ISO8859_5, "iso-8859-5"}, + "iso-8859-5": {charmap.ISO8859_5, "iso-8859-5"}, + "iso-ir-144": {charmap.ISO8859_5, "iso-8859-5"}, + "iso8859-5": {charmap.ISO8859_5, "iso-8859-5"}, + "iso88595": {charmap.ISO8859_5, "iso-8859-5"}, + "iso_8859-5": {charmap.ISO8859_5, "iso-8859-5"}, + "iso_8859-5:1988": {charmap.ISO8859_5, "iso-8859-5"}, + "arabic": {charmap.ISO8859_6, "iso-8859-6"}, + "asmo-708": {charmap.ISO8859_6, "iso-8859-6"}, + "csiso88596e": {charmap.ISO8859_6, "iso-8859-6"}, + "csiso88596i": {charmap.ISO8859_6, "iso-8859-6"}, + "csisolatinarabic": {charmap.ISO8859_6, "iso-8859-6"}, + "ecma-114": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-8859-6": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-8859-6-e": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-8859-6-i": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-ir-127": {charmap.ISO8859_6, "iso-8859-6"}, + "iso8859-6": {charmap.ISO8859_6, "iso-8859-6"}, + "iso88596": {charmap.ISO8859_6, "iso-8859-6"}, + "iso_8859-6": {charmap.ISO8859_6, "iso-8859-6"}, + "iso_8859-6:1987": {charmap.ISO8859_6, "iso-8859-6"}, + "csisolatingreek": {charmap.ISO8859_7, "iso-8859-7"}, + "ecma-118": {charmap.ISO8859_7, "iso-8859-7"}, + "elot_928": {charmap.ISO8859_7, "iso-8859-7"}, + "greek": {charmap.ISO8859_7, "iso-8859-7"}, + "greek8": {charmap.ISO8859_7, "iso-8859-7"}, + "iso-8859-7": {charmap.ISO8859_7, "iso-8859-7"}, + "iso-ir-126": {charmap.ISO8859_7, "iso-8859-7"}, + "iso8859-7": {charmap.ISO8859_7, "iso-8859-7"}, + "iso88597": {charmap.ISO8859_7, "iso-8859-7"}, + "iso_8859-7": {charmap.ISO8859_7, "iso-8859-7"}, + "iso_8859-7:1987": {charmap.ISO8859_7, "iso-8859-7"}, + "sun_eu_greek": {charmap.ISO8859_7, "iso-8859-7"}, + "csiso88598e": {charmap.ISO8859_8, "iso-8859-8"}, + "csisolatinhebrew": {charmap.ISO8859_8, "iso-8859-8"}, + "hebrew": {charmap.ISO8859_8, "iso-8859-8"}, + "iso-8859-8": {charmap.ISO8859_8, "iso-8859-8"}, + "iso-8859-8-e": {charmap.ISO8859_8, "iso-8859-8"}, + "iso-ir-138": {charmap.ISO8859_8, "iso-8859-8"}, + "iso8859-8": {charmap.ISO8859_8, "iso-8859-8"}, + "iso88598": {charmap.ISO8859_8, "iso-8859-8"}, + "iso_8859-8": {charmap.ISO8859_8, "iso-8859-8"}, + "iso_8859-8:1988": {charmap.ISO8859_8, "iso-8859-8"}, + "visual": {charmap.ISO8859_8, "iso-8859-8"}, + "csiso88598i": {charmap.ISO8859_8, "iso-8859-8-i"}, + "iso-8859-8-i": {charmap.ISO8859_8, "iso-8859-8-i"}, + "logical": {charmap.ISO8859_8, "iso-8859-8-i"}, + "csisolatin6": {charmap.ISO8859_10, "iso-8859-10"}, + "iso-8859-10": {charmap.ISO8859_10, "iso-8859-10"}, + "iso-ir-157": {charmap.ISO8859_10, "iso-8859-10"}, + "iso8859-10": {charmap.ISO8859_10, "iso-8859-10"}, + "iso885910": {charmap.ISO8859_10, "iso-8859-10"}, + "l6": {charmap.ISO8859_10, "iso-8859-10"}, + "latin6": {charmap.ISO8859_10, "iso-8859-10"}, + "iso-8859-13": {charmap.ISO8859_13, "iso-8859-13"}, + "iso8859-13": {charmap.ISO8859_13, "iso-8859-13"}, + "iso885913": {charmap.ISO8859_13, "iso-8859-13"}, + "iso-8859-14": {charmap.ISO8859_14, "iso-8859-14"}, + "iso8859-14": {charmap.ISO8859_14, "iso-8859-14"}, + "iso885914": {charmap.ISO8859_14, "iso-8859-14"}, + "csisolatin9": {charmap.ISO8859_15, "iso-8859-15"}, + "iso-8859-15": {charmap.ISO8859_15, "iso-8859-15"}, + "iso8859-15": {charmap.ISO8859_15, "iso-8859-15"}, + "iso885915": {charmap.ISO8859_15, "iso-8859-15"}, + "iso_8859-15": {charmap.ISO8859_15, "iso-8859-15"}, + "l9": {charmap.ISO8859_15, "iso-8859-15"}, + "iso-8859-16": {charmap.ISO8859_16, "iso-8859-16"}, + "cskoi8r": {charmap.KOI8R, "koi8-r"}, + "koi": {charmap.KOI8R, "koi8-r"}, + "koi8": {charmap.KOI8R, "koi8-r"}, + "koi8-r": {charmap.KOI8R, "koi8-r"}, + "koi8_r": {charmap.KOI8R, "koi8-r"}, + "koi8-u": {charmap.KOI8U, "koi8-u"}, + "csmacintosh": {charmap.Macintosh, "macintosh"}, + "mac": {charmap.Macintosh, "macintosh"}, + "macintosh": {charmap.Macintosh, "macintosh"}, + "x-mac-roman": {charmap.Macintosh, "macintosh"}, + "dos-874": {charmap.Windows874, "windows-874"}, + "iso-8859-11": {charmap.Windows874, "windows-874"}, + "iso8859-11": {charmap.Windows874, "windows-874"}, + "iso885911": {charmap.Windows874, "windows-874"}, + "tis-620": {charmap.Windows874, "windows-874"}, + "windows-874": {charmap.Windows874, "windows-874"}, + "cp1250": {charmap.Windows1250, "windows-1250"}, + "windows-1250": {charmap.Windows1250, "windows-1250"}, + "x-cp1250": {charmap.Windows1250, "windows-1250"}, + "cp1251": {charmap.Windows1251, "windows-1251"}, + "windows-1251": {charmap.Windows1251, "windows-1251"}, + "x-cp1251": {charmap.Windows1251, "windows-1251"}, + "ansi_x3.4-1968": {charmap.Windows1252, "windows-1252"}, + "ascii": {charmap.Windows1252, "windows-1252"}, + "cp1252": {charmap.Windows1252, "windows-1252"}, + "cp819": {charmap.Windows1252, "windows-1252"}, + "csisolatin1": {charmap.Windows1252, "windows-1252"}, + "ibm819": {charmap.Windows1252, "windows-1252"}, + "iso-8859-1": {charmap.Windows1252, "windows-1252"}, + "iso-ir-100": {charmap.Windows1252, "windows-1252"}, + "iso8859-1": {charmap.Windows1252, "windows-1252"}, + "iso88591": {charmap.Windows1252, "windows-1252"}, + "iso_8859-1": {charmap.Windows1252, "windows-1252"}, + "iso_8859-1:1987": {charmap.Windows1252, "windows-1252"}, + "l1": {charmap.Windows1252, "windows-1252"}, + "latin1": {charmap.Windows1252, "windows-1252"}, + "us-ascii": {charmap.Windows1252, "windows-1252"}, + "windows-1252": {charmap.Windows1252, "windows-1252"}, + "x-cp1252": {charmap.Windows1252, "windows-1252"}, + "cp1253": {charmap.Windows1253, "windows-1253"}, + "windows-1253": {charmap.Windows1253, "windows-1253"}, + "x-cp1253": {charmap.Windows1253, "windows-1253"}, + "cp1254": {charmap.Windows1254, "windows-1254"}, + "csisolatin5": {charmap.Windows1254, "windows-1254"}, + "iso-8859-9": {charmap.Windows1254, "windows-1254"}, + "iso-ir-148": {charmap.Windows1254, "windows-1254"}, + "iso8859-9": {charmap.Windows1254, "windows-1254"}, + "iso88599": {charmap.Windows1254, "windows-1254"}, + "iso_8859-9": {charmap.Windows1254, "windows-1254"}, + "iso_8859-9:1989": {charmap.Windows1254, "windows-1254"}, + "l5": {charmap.Windows1254, "windows-1254"}, + "latin5": {charmap.Windows1254, "windows-1254"}, + "windows-1254": {charmap.Windows1254, "windows-1254"}, + "x-cp1254": {charmap.Windows1254, "windows-1254"}, + "cp1255": {charmap.Windows1255, "windows-1255"}, + "windows-1255": {charmap.Windows1255, "windows-1255"}, + "x-cp1255": {charmap.Windows1255, "windows-1255"}, + "cp1256": {charmap.Windows1256, "windows-1256"}, + "windows-1256": {charmap.Windows1256, "windows-1256"}, + "x-cp1256": {charmap.Windows1256, "windows-1256"}, + "cp1257": {charmap.Windows1257, "windows-1257"}, + "windows-1257": {charmap.Windows1257, "windows-1257"}, + "x-cp1257": {charmap.Windows1257, "windows-1257"}, + "cp1258": {charmap.Windows1258, "windows-1258"}, + "windows-1258": {charmap.Windows1258, "windows-1258"}, + "x-cp1258": {charmap.Windows1258, "windows-1258"}, + "x-mac-cyrillic": {charmap.MacintoshCyrillic, "x-mac-cyrillic"}, + "x-mac-ukrainian": {charmap.MacintoshCyrillic, "x-mac-cyrillic"}, + "chinese": {simplifiedchinese.GBK, "gbk"}, + "csgb2312": {simplifiedchinese.GBK, "gbk"}, + "csiso58gb231280": {simplifiedchinese.GBK, "gbk"}, + "gb2312": {simplifiedchinese.GBK, "gbk"}, + "gb_2312": {simplifiedchinese.GBK, "gbk"}, + "gb_2312-80": {simplifiedchinese.GBK, "gbk"}, + "gbk": {simplifiedchinese.GBK, "gbk"}, + "iso-ir-58": {simplifiedchinese.GBK, "gbk"}, + "x-gbk": {simplifiedchinese.GBK, "gbk"}, + "gb18030": {simplifiedchinese.GB18030, "gb18030"}, + "hz-gb-2312": {simplifiedchinese.HZGB2312, "hz-gb-2312"}, + "big5": {traditionalchinese.Big5, "big5"}, + "big5-hkscs": {traditionalchinese.Big5, "big5"}, + "cn-big5": {traditionalchinese.Big5, "big5"}, + "csbig5": {traditionalchinese.Big5, "big5"}, + "x-x-big5": {traditionalchinese.Big5, "big5"}, + "cseucpkdfmtjapanese": {japanese.EUCJP, "euc-jp"}, + "euc-jp": {japanese.EUCJP, "euc-jp"}, + "x-euc-jp": {japanese.EUCJP, "euc-jp"}, + "csiso2022jp": {japanese.ISO2022JP, "iso-2022-jp"}, + "iso-2022-jp": {japanese.ISO2022JP, "iso-2022-jp"}, + "csshiftjis": {japanese.ShiftJIS, "shift_jis"}, + "ms_kanji": {japanese.ShiftJIS, "shift_jis"}, + "shift-jis": {japanese.ShiftJIS, "shift_jis"}, + "shift_jis": {japanese.ShiftJIS, "shift_jis"}, + "sjis": {japanese.ShiftJIS, "shift_jis"}, + "windows-31j": {japanese.ShiftJIS, "shift_jis"}, + "x-sjis": {japanese.ShiftJIS, "shift_jis"}, + "cseuckr": {korean.EUCKR, "euc-kr"}, + "csksc56011987": {korean.EUCKR, "euc-kr"}, + "euc-kr": {korean.EUCKR, "euc-kr"}, + "iso-ir-149": {korean.EUCKR, "euc-kr"}, + "korean": {korean.EUCKR, "euc-kr"}, + "ks_c_5601-1987": {korean.EUCKR, "euc-kr"}, + "ks_c_5601-1989": {korean.EUCKR, "euc-kr"}, + "ksc5601": {korean.EUCKR, "euc-kr"}, + "ksc_5601": {korean.EUCKR, "euc-kr"}, + "windows-949": {korean.EUCKR, "euc-kr"}, + "csiso2022kr": {encoding.Replacement, "replacement"}, + "iso-2022-kr": {encoding.Replacement, "replacement"}, + "iso-2022-cn": {encoding.Replacement, "replacement"}, + "iso-2022-cn-ext": {encoding.Replacement, "replacement"}, + "utf-16be": {unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), "utf-16be"}, + "utf-16": {unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), "utf-16le"}, + "utf-16le": {unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), "utf-16le"}, + "x-user-defined": {charmap.XUserDefined, "x-user-defined"}, +} diff --git a/consistent_test.go b/consistent_test.go new file mode 100644 index 000000000..387279213 --- /dev/null +++ b/consistent_test.go @@ -0,0 +1,108 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "io/ioutil" + "os" + "path" + "runtime" + "sort" + "strings" + + . "github.com/pingcap/check" +) + +var _ = Suite(&testConsistentSuite{}) + +type testConsistentSuite struct { +} + +func (s *testConsistentSuite) TestKeywordConsistent(c *C) { + _, filename, _, _ := runtime.Caller(0) + parserFilename := path.Join(path.Dir(filename), "parser.y") + parserFile, err := os.Open(parserFilename) + c.Assert(err, IsNil) + data, err := ioutil.ReadAll(parserFile) + c.Assert(err, IsNil) + content := string(data) + + reservedKeywordStartMarker := "\t/* The following tokens belong to ReservedKeyword. */" + unreservedKeywordStartMarker := "\t/* The following tokens belong to UnReservedKeyword. */" + notKeywordTokenStartMarker := "\t/* The following tokens belong to NotKeywordToken. */" + tidbKeywordStartMarker := "\t/* The following tokens belong to TiDBKeyword. */" + identTokenEndMarker := "%token\t" + + reservedKeywords := extractKeywords(content, reservedKeywordStartMarker, unreservedKeywordStartMarker) + + unreservedKeywords := extractKeywords(content, unreservedKeywordStartMarker, notKeywordTokenStartMarker) + + notKeywordTokens := extractKeywords(content, notKeywordTokenStartMarker, tidbKeywordStartMarker) + + tidbKeywords := extractKeywords(content, tidbKeywordStartMarker, identTokenEndMarker) + + for k, v := range aliases { + c.Assert(k != v, IsTrue) + c.Assert(tokenMap[k], Equals, tokenMap[v]) + } + keywordCount := len(reservedKeywords) + len(unreservedKeywords) + len(notKeywordTokens) + len(tidbKeywords) + c.Assert(len(tokenMap)-len(aliases), Equals, keywordCount) + + unreservedCollectionDef := extractKeywordsFromCollectionDef(content, "\nUnReservedKeyword:") + c.Assert(unreservedKeywords, DeepEquals, unreservedCollectionDef) + + notKeywordTokensCollectionDef := extractKeywordsFromCollectionDef(content, "\nNotKeywordToken:") + c.Assert(notKeywordTokens, DeepEquals, notKeywordTokensCollectionDef) + + tidbKeywordsCollectionDef := extractKeywordsFromCollectionDef(content, "\nTiDBKeyword:") + c.Assert(tidbKeywords, DeepEquals, tidbKeywordsCollectionDef) +} + +func extractMiddle(str, startMarker, endMarker string) string { + startIdx := strings.Index(str, startMarker) + if startIdx == -1 { + return "" + } + str = str[startIdx+len(startMarker):] + endIdx := strings.Index(str, endMarker) + if endIdx == -1 { + return "" + } + return str[:endIdx] +} + +func extractQuotedWords(strs []string) []string { + var words []string + for _, str := range strs { + word := extractMiddle(str, "\"", "\"") + if word == "" { + continue + } + words = append(words, word) + } + sort.Strings(words) + return words +} + +func extractKeywords(content, startMarker, endMarker string) []string { + keywordSection := extractMiddle(content, startMarker, endMarker) + lines := strings.Split(keywordSection, "\n") + return extractQuotedWords(lines) +} + +func extractKeywordsFromCollectionDef(content, startMarker string) []string { + keywordSection := extractMiddle(content, startMarker, "\n\n") + words := strings.Split(keywordSection, "|") + return extractQuotedWords(words) +} diff --git a/format/format.go b/format/format.go new file mode 100644 index 000000000..0a14a6d36 --- /dev/null +++ b/format/format.go @@ -0,0 +1,195 @@ +// Copyright (c) 2014 The sortutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/STRUTIL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package format + +import ( + "bytes" + "fmt" + "io" +) + +const ( + st0 = iota + stBOL + stPERC + stBOLPERC +) + +// Formatter is an io.Writer extended formatter by a fmt.Printf like function Format. +type Formatter interface { + io.Writer + Format(format string, args ...interface{}) (n int, errno error) +} + +type indentFormatter struct { + io.Writer + indent []byte + indentLevel int + state int +} + +var replace = map[rune]string{ + '\000': "\\0", + '\'': "''", + '\n': "\\n", + '\r': "\\r", +} + +// IndentFormatter returns a new Formatter which interprets %i and %u in the +// Format() formats string as indent and unindent commands. The commands can +// nest. The Formatter writes to io.Writer 'w' and inserts one 'indent' +// string per current indent level value. +// Behaviour of commands reaching negative indent levels is undefined. +// IndentFormatter(os.Stdout, "\t").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// output: +// abc3%e +// x +// y +// z +// The Go quoted string literal form of the above is: +// "abc%%e\n\tx\n\tx\nz\n" +// The commands can be scattered between separate invocations of Format(), +// i.e. the formatter keeps track of the indent level and knows if it is +// positioned on start of a line and should emit indentation(s). +// The same output as above can be produced by e.g.: +// f := IndentFormatter(os.Stdout, " ") +// f.Format("abc%d%%e%i\nx\n", 3) +// f.Format("y\n%uz\n") +func IndentFormatter(w io.Writer, indent string) Formatter { + return &indentFormatter{w, []byte(indent), 0, stBOL} +} + +func (f *indentFormatter) format(flat bool, format string, args ...interface{}) (n int, errno error) { + var buf = make([]byte, 0) + for i := 0; i < len(format); i++ { + c := format[i] + switch f.state { + case st0: + switch c { + case '\n': + cc := c + if flat && f.indentLevel != 0 { + cc = ' ' + } + buf = append(buf, cc) + f.state = stBOL + case '%': + f.state = stPERC + default: + buf = append(buf, c) + } + case stBOL: + switch c { + case '\n': + cc := c + if flat && f.indentLevel != 0 { + cc = ' ' + } + buf = append(buf, cc) + case '%': + f.state = stBOLPERC + default: + if !flat { + for i := 0; i < f.indentLevel; i++ { + buf = append(buf, f.indent...) + } + } + buf = append(buf, c) + f.state = st0 + } + case stBOLPERC: + switch c { + case 'i': + f.indentLevel++ + f.state = stBOL + case 'u': + f.indentLevel-- + f.state = stBOL + default: + if !flat { + for i := 0; i < f.indentLevel; i++ { + buf = append(buf, f.indent...) + } + } + buf = append(buf, '%', c) + f.state = st0 + } + case stPERC: + switch c { + case 'i': + f.indentLevel++ + f.state = st0 + case 'u': + f.indentLevel-- + f.state = st0 + default: + buf = append(buf, '%', c) + f.state = st0 + } + default: + panic("unexpected state") + } + } + switch f.state { + case stPERC, stBOLPERC: + buf = append(buf, '%') + } + return f.Write([]byte(fmt.Sprintf(string(buf), args...))) +} + +// Format implements Format interface. +func (f *indentFormatter) Format(format string, args ...interface{}) (n int, errno error) { + return f.format(false, format, args...) +} + +type flatFormatter indentFormatter + +// FlatFormatter returns a newly created Formatter with the same functionality as the one returned +// by IndentFormatter except it allows a newline in the 'format' string argument of Format +// to pass through if the indent level is current zero. +// +// If the indent level is non-zero then such new lines are changed to a space character. +// There is no indent string, the %i and %u format verbs are used solely to determine the indent level. +// +// The FlatFormatter is intended for flattening of normally nested structure textual representation to +// a one top level structure per line form. +// FlatFormatter(os.Stdout, " ").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// output in the form of a Go quoted string literal: +// "abc3%%e x y z\n" +func FlatFormatter(w io.Writer) Formatter { + return (*flatFormatter)(IndentFormatter(w, "").(*indentFormatter)) +} + +// Format implements Format interface. +func (f *flatFormatter) Format(format string, args ...interface{}) (n int, errno error) { + return (*indentFormatter)(f).format(true, format, args...) +} + +// OutputFormat output escape character with backslash. +func OutputFormat(s string) string { + var buf bytes.Buffer + for _, old := range s { + if newVal, ok := replace[old]; ok { + buf.WriteString(newVal) + continue + } + buf.WriteRune(old) + } + + return buf.String() +} diff --git a/format/format_test.go b/format/format_test.go new file mode 100644 index 000000000..78cdcd72b --- /dev/null +++ b/format/format_test.go @@ -0,0 +1,60 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package format + +import ( + "bytes" + "io/ioutil" + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/util/testleak" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testFormatSuite{}) + +type testFormatSuite struct { +} + +func checkFormat(c *C, f Formatter, buf *bytes.Buffer, str, expect string) { + _, err := f.Format(str, 3) + c.Assert(err, IsNil) + b, err := ioutil.ReadAll(buf) + c.Assert(err, IsNil) + c.Assert(string(b), Equals, expect) +} + +func (s *testFormatSuite) TestFormat(c *C) { + defer testleak.AfterTest(c)() + str := "abc%d%%e%i\nx\ny\n%uz\n" + buf := &bytes.Buffer{} + f := IndentFormatter(buf, "\t") + expect := `abc3%e + x + y +z +` + checkFormat(c, f, buf, str, expect) + + str = "abc%d%%e%i\nx\ny\n%uz\n%i\n" + buf = &bytes.Buffer{} + f = FlatFormatter(buf) + expect = "abc3%e x y z\n " + checkFormat(c, f, buf, str, expect) +} diff --git a/goyacc/main.go b/goyacc/main.go new file mode 100644 index 000000000..69da64b73 --- /dev/null +++ b/goyacc/main.go @@ -0,0 +1,819 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Copyright 2014 The goyacc Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This source code uses portions of code previously published in the Go tool +// yacc[0] program, the respective license can be found in the LICENSE-GO-YACC +// file. + +// Goyacc is a version of yacc generating Go parsers. +// +// Usage +// +// Note: If no non flag arguments are given, goyacc reads standard input. +// +// goyacc [options] [input] +// +// options and (defaults) +// -c Report state closures. (false) +// -cr Check all states are reducible. (false) +// -dlval Debug value when runtime yyDebug >= 3. ("lval") +// -dlvalf Debug format of -dlval. ("%+v") +// -ex Explain how were conflicts resolved. (false) +// -l Disable line directives, for compatibility only - ignored. (false) +// -la Report all lookahead sets. (false) +// -o outputFile Parser output. ("y.go") +// -p prefix Name prefix to use in generated code. ("yy") +// -v reportFile Create grammar report. ("y.output") +// -xe examplesFile Generate error messages by examples. ("") +// -xegen examplesFile Generate a file suitable for -xe automatically from the grammar. +// The file must not exist. ("") +// +// +// +// Changelog +// +// 2015-03-24: The search for a custom error message is now extended to include +// also the last state that was shifted into, if any. This change resolves a +// problem in which a lookahead symbol is valid for a reduce action in state A, +// but the same symbol is later never accepted by any shift action in some +// state B which is popped from the state stack after the reduction is +// performed. The computed from example state is A but when the error is +// actually detected, the state is now B and the custom error was thus not +// used. +// +// 2015-02-23: Added -xegen flag. It can be used to automagically generate a +// skeleton errors by example file which can be, for example, edited and/or +// submited later as an argument of the -xe option. +// +// 2014-12-18: Support %precedence for better bison compatibility[3]. The +// actual changes are in packages goyacc is dependent on. Goyacc users should +// rebuild the binary: +// +// $ go get -u github.com/cznic/goyacc +// +// 2014-12-02: Added support for the optional yyLexerEx interface. The Reduced +// method can be useful for debugging and/or automatically producing examples +// by parsing code fragments. If it returns true the parser exits immediately +// with return value -1. +// +// Overview +// +// The generated parser is reentrant and mostly backwards compatible with +// parsers generated by go tool yacc[0]. yyParse expects to be given an +// argument that conforms to the following interface: +// +// type yyLexer interface { +// Lex(lval *yySymType) int +// Errorf(format string, a ...interface{}) +// Errors() []error +// } +// +// Optionally the argument to yyParse may implement the following interface: +// +// type yyLexerEx interface { +// yyLexer +// // Hook for recording a reduction. +// Reduced(rule, state int, lval *yySymType) (stop bool) // Client should copy *lval. +// } +// +// Lex should return the token identifier, and place other token information in +// lval (which replaces the usual yylval). Error is equivalent to yyerror in +// the original yacc. +// +// Code inside the parser may refer to the variable yylex, which holds the +// yyLexer passed to Parse. +// +// Multiple grammars compiled into a single program should be placed in +// distinct packages. If that is impossible, the "-p prefix" flag to yacc sets +// the prefix, by default yy, that begins the names of symbols, including +// types, the parser, and the lexer, generated and referenced by yacc's +// generated code. Setting it to distinct values allows multiple grammars to be +// placed in a single package. +// +// Differences wrt go tool yacc +// +// - goyacc implements ideas from "Generating LR Syntax Error Messages from +// Examples"[1]. Use the -xe flag to pass a name of the example file. For more +// details about the example format please see [2]. +// +// - The grammar report includes example token sequences leading to the +// particular state. Can help understanding conflicts. +// +// - Minor changes in parser debug output. +// +// Links +// +// Referenced from elsewhere: +// +// [0]: http://golang.org/cmd/yacc/ +// [1]: http://people.via.ecp.fr/~stilgar/doc/compilo/parser/Generating%20LR%20Syntax%20Error%20Messages.pdf +// [2]: http://godoc.org/github.com/cznic/y#hdr-Error_Examples +// [3]: http://www.gnu.org/software/bison/manual/html_node/Precedence-Only.html#Precedence-Only +package main + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "go/format" + "go/scanner" + "go/token" + "io" + "io/ioutil" + "log" + "os" + "runtime" + "sort" + "strings" + + "github.com/cznic/mathutil" + "github.com/cznic/parser/yacc" + "github.com/cznic/sortutil" + "github.com/cznic/strutil" + "github.com/cznic/y" +) + +var ( + //oNoDefault = flag.Bool("nodefault", false, "disable generating $default actions") + oClosures = flag.Bool("c", false, "report state closures") + oReducible = flag.Bool("cr", false, "check all states are reducible") + oDlval = flag.String("dlval", "lval", "debug value (runtime yyDebug >= 3)") + oDlvalf = flag.String("dlvalf", "%+v", "debug format of -dlval (runtime yyDebug >= 3)") + oLA = flag.Bool("la", false, "report all lookahead sets") + oNoLines = flag.Bool("l", false, "disable line directives (for compatibility ony - ignored)") + oOut = flag.String("o", "y.go", "parser output") + oPref = flag.String("p", "yy", "name prefix to use in generated code") + oReport = flag.String("v", "y.output", "create grammar report") + oResolved = flag.Bool("ex", false, "explain how were conflicts resolved") + oXErrors = flag.String("xe", "", "generate eXtra errors from examples source file") + oXErrorsGen = flag.String("xegen", "", "generate error from examples source file automatically from the grammar") +) + +func main() { + log.SetFlags(0) + + defer func() { + _, file, line, ok := runtime.Caller(2) + if e := recover(); e != nil { + switch { + case ok: + log.Fatalf("%s:%d: panic: %v", file, line, e) + default: + log.Fatalf("panic: %v", e) + } + } + }() + + flag.Parse() + var in string + switch flag.NArg() { + case 0: + in = os.Stdin.Name() + case 1: + in = flag.Arg(0) + default: + log.Fatal("expected at most one non flag argument") + } + + if err := main1(in); err != nil { + switch x := err.(type) { + case scanner.ErrorList: + for _, v := range x { + fmt.Fprintf(os.Stderr, "%v\n", v) + } + os.Exit(1) + default: + log.Fatal(err) + } + } +} + +type symUsed struct { + sym *y.Symbol + used int +} + +type symsUsed []symUsed + +func (s symsUsed) Len() int { return len(s) } +func (s symsUsed) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +func (s symsUsed) Less(i, j int) bool { + if s[i].used > s[j].used { + return true + } + + if s[i].used < s[j].used { + return false + } + + return strings.ToLower(s[i].sym.Name) < strings.ToLower(s[j].sym.Name) +} + +func main1(in string) (err error) { + var out io.Writer + if nm := *oOut; nm != "" { + var f *os.File + var e error + if f, err = os.Create(nm); err != nil { + return err + } + + defer func() { + if e1 := f.Close(); e1 != nil && err == nil { + err = e1 + } + }() + w := bufio.NewWriter(f) + defer func() { + if e1 := w.Flush(); e1 != nil && err == nil { + err = e1 + } + }() + buf := bytes.NewBuffer(nil) + out = buf + defer func() { + var dest []byte + if dest, e = format.Source(buf.Bytes()); e != nil { + dest = buf.Bytes() + } + + if _, e = w.Write(dest); e != nil && err == nil { + err = e + } + }() + } + + var rep io.Writer + if nm := *oReport; nm != "" { + f, err1 := os.Create(nm) + if err1 != nil { + return err1 + } + + defer func() { + if e := f.Close(); e != nil && err == nil { + err = e + } + }() + w := bufio.NewWriter(f) + defer func() { + if e := w.Flush(); e != nil && err == nil { + err = e + } + }() + rep = w + } + + var xerrors []byte + if nm := *oXErrors; nm != "" { + b, err1 := ioutil.ReadFile(nm) + if err1 != nil { + return err1 + } + + xerrors = b + } + + p, err := y.ProcessFile(token.NewFileSet(), in, &y.Options{ + //NoDefault: *oNoDefault, + AllowConflicts: true, + Closures: *oClosures, + LA: *oLA, + Reducible: *oReducible, + Report: rep, + Resolved: *oResolved, + XErrorsName: *oXErrors, + XErrorsSrc: xerrors, + }) + if err != nil { + return err + } + + if fn := *oXErrorsGen; fn != "" { + f, err := os.OpenFile(fn, os.O_RDWR|os.O_CREATE, 0666) + if err != nil { + return err + } + + b := bufio.NewWriter(f) + if err := p.SkeletonXErrors(b); err != nil { + return err + } + + if err := b.Flush(); err != nil { + return err + } + + if err := f.Close(); err != nil { + return err + } + } + + msu := make(map[*y.Symbol]int, len(p.Syms)) // sym -> usage + for nm, sym := range p.Syms { + if nm == "" || nm == "ε" || nm == "$accept" || nm == "#" { + continue + } + + msu[sym] = 0 + } + var minArg, maxArg int + for _, state := range p.Table { + for _, act := range state { + msu[act.Sym]++ + k, arg := act.Kind() + if k == 'a' { + continue + } + + if k == 'r' { + arg = -arg + } + minArg, maxArg = mathutil.Min(minArg, arg), mathutil.Max(maxArg, arg) + } + } + su := make(symsUsed, 0, len(msu)) + for sym, used := range msu { + su = append(su, symUsed{sym, used}) + } + sort.Sort(su) + + // ----------------------------------------------------------- Prologue + f := strutil.IndentFormatter(out, "\t") + mustFormat(f, "// CAUTION: Generated file - DO NOT EDIT.\n\n") + mustFormat(f, "%s", injectImport(p.Prologue)) + mustFormat(f, ` +type %[1]sSymType %i%s%u + +type %[1]sXError struct { + state, xsym int +} +`, *oPref, p.UnionSrc) + + // ---------------------------------------------------------- Constants + nsyms := map[string]*y.Symbol{} + a := make([]string, 0, len(msu)) + maxTokName := 0 + for sym := range msu { + nm := sym.Name + if nm == "$default" || nm == "$end" || sym.IsTerminal && nm[0] != '\'' && sym.Value > 0 { + maxTokName = mathutil.Max(maxTokName, len(nm)) + a = append(a, nm) + } + nsyms[nm] = sym + } + sort.Strings(a) + mustFormat(f, "\nconst (%i\n") + for _, v := range a { + nm := v + switch nm { + case "error": + nm = *oPref + "ErrCode" + case "$default": + nm = *oPref + "Default" + case "$end": + nm = *oPref + "EOFCode" + } + mustFormat(f, "%s%s = %d\n", nm, strings.Repeat(" ", maxTokName-len(nm)+1), nsyms[v].Value) + } + minArg-- // eg: [-13, 42], minArg -14 maps -13 to 1 so zero cell values -> empty. + mustFormat(f, "\n%sMaxDepth = 200\n", *oPref) + mustFormat(f, "%sTabOfs = %d\n", *oPref, minArg) + mustFormat(f, "%u)") + + // ---------------------------------------------------------- Variables + mustFormat(f, "\n\nvar (%i\n") + + // Lex translation table + mustFormat(f, "%sXLAT = map[int]int{%i\n", *oPref) + xlat := make(map[int]int, len(su)) + var errSym int + for i, v := range su { + if v.sym.Name == "error" { + errSym = i + } + xlat[v.sym.Value] = i + mustFormat(f, "%6d: %3d, // %s (%dx)\n", v.sym.Value, i, v.sym.Name, msu[v.sym]) + } + mustFormat(f, "%u}\n") + + // Symbol names + mustFormat(f, "\n%sSymNames = []string{%i\n", *oPref) + for _, v := range su { + mustFormat(f, "%q,\n", v.sym.Name) + } + mustFormat(f, "%u}\n") + + // Reduction table + mustFormat(f, "\n%sReductions = []struct{xsym, components int}{%i\n", *oPref) + for _, rule := range p.Rules { + mustFormat(f, "{%d, %d},\n", xlat[rule.Sym.Value], len(rule.Components)) + } + mustFormat(f, "%u}\n") + + // XError table + mustFormat(f, "\n%[1]sXErrors = map[%[1]sXError]string{%i\n", *oPref) + for _, xerr := range p.XErrors { + state := xerr.Stack[len(xerr.Stack)-1] + xsym := -1 + if xerr.Lookahead != nil { + xsym = xlat[xerr.Lookahead.Value] + } + mustFormat(f, "%[1]sXError{%d, %d}: \"%s\",\n", *oPref, state, xsym, xerr.Msg) + } + mustFormat(f, "%u}\n\n") + + // Parse table + tbits := 32 + switch n := mathutil.BitLen(maxArg - minArg + 1); { + case n < 8: + tbits = 8 + case n < 16: + tbits = 16 + } + mustFormat(f, "%sParseTab = [%d][]uint%d{%i\n", *oPref, len(p.Table), tbits) + nCells := 0 + var tabRow sortutil.Uint64Slice + for si, state := range p.Table { + tabRow = tabRow[:0] + max := 0 + for _, act := range state { + sym := act.Sym + xsym, ok := xlat[sym.Value] + if !ok { + panic("internal error 001") + } + + max = mathutil.Max(max, xsym) + kind, arg := act.Kind() + switch kind { + case 'a': + arg = 0 + case 'r': + arg *= -1 + } + tabRow = append(tabRow, uint64(xsym)<<32|uint64(arg-minArg)) + } + nCells += max + tabRow.Sort() + col := -1 + if si%5 == 0 { + mustFormat(f, "// %d\n", si) + } + mustFormat(f, "{") + for i, v := range tabRow { + xsym := int(uint32(v >> 32)) + arg := int(uint32(v)) + if col+1 != xsym { + mustFormat(f, "%d: ", xsym) + } + switch { + case i == len(tabRow)-1: + mustFormat(f, "%d", arg) + default: + mustFormat(f, "%d, ", arg) + } + col = xsym + } + mustFormat(f, "},\n") + } + mustFormat(f, "%u}\n") + fmt.Fprintf(os.Stderr, "Parse table entries: %d of %d, x %d bits == %d bytes\n", nCells, len(p.Table)*len(msu), tbits, nCells*tbits/8) + if n := p.ConflictsSR; n != 0 { + fmt.Fprintf(os.Stderr, "conflicts: %d shift/reduce\n", n) + } + if n := p.ConflictsRR; n != 0 { + fmt.Fprintf(os.Stderr, "conflicts: %d reduce/reduce\n", n) + } + + mustFormat(f, `%u) + +var %[1]sDebug = 0 + +type %[1]sLexer interface { + Lex(lval *%[1]sSymType) int + Errorf(format string, a ...interface{}) + Errors() []error +} + +type %[1]sLexerEx interface { + %[1]sLexer + Reduced(rule, state int, lval *%[1]sSymType) bool +} + +func %[1]sSymName(c int) (s string) { + x, ok := %[1]sXLAT[c] + if ok { + return %[1]sSymNames[x] + } + + return __yyfmt__.Sprintf("%%d", c) +} + +func %[1]slex1(yylex %[1]sLexer, lval *%[1]sSymType) (n int) { + n = yylex.Lex(lval) + if n <= 0 { + n = %[1]sEOFCode + } + if %[1]sDebug >= 3 { + __yyfmt__.Printf("\nlex %%s(%%#x %%d), %[4]s: %[3]s\n", %[1]sSymName(n), n, n, %[4]s) + } + return n +} + +func %[1]sParse(yylex %[1]sLexer, parser *Parser) int { + const yyError = %[2]d + + yyEx, _ := yylex.(%[1]sLexerEx) + var yyn int + parser.yylval = %[1]sSymType{} + parser.yyVAL = %[1]sSymType{} + yyS := parser.cache + + Nerrs := 0 /* number of errors */ + Errflag := 0 /* error recovery flag */ + yyerrok := func() { + if %[1]sDebug >= 2 { + __yyfmt__.Printf("yyerrok()\n") + } + Errflag = 0 + } + _ = yyerrok + yystate := 0 + yychar := -1 + var yyxchar int + var yyshift int + yyp := -1 + goto yystack + +ret0: + return 0 + +ret1: + return 1 + +yystack: + /* put a state and value onto the stack */ + yyp++ + if yyp >= len(yyS) { + nyys := make([]%[1]sSymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + yyS[yyp] = parser.yyVAL + yyS[yyp].yys = yystate + +yynewstate: + if yychar < 0 { + yychar = %[1]slex1(yylex, &parser.yylval) + var ok bool + if yyxchar, ok = %[1]sXLAT[yychar]; !ok { + yyxchar = len(%[1]sSymNames) // > tab width + } + } + if %[1]sDebug >= 4 { + var a []int + for _, v := range yyS[:yyp+1] { + a = append(a, v.yys) + } + __yyfmt__.Printf("state stack %%v\n", a) + } + row := %[1]sParseTab[yystate] + yyn = 0 + if yyxchar < len(row) { + if yyn = int(row[yyxchar]); yyn != 0 { + yyn += %[1]sTabOfs + } + } + switch { + case yyn > 0: // shift + yychar = -1 + parser.yyVAL = parser.yylval + yystate = yyn + yyshift = yyn + if %[1]sDebug >= 2 { + __yyfmt__.Printf("shift, and goto state %%d\n", yystate) + } + if Errflag > 0 { + Errflag-- + } + goto yystack + case yyn < 0: // reduce + case yystate == 1: // accept + if %[1]sDebug >= 2 { + __yyfmt__.Println("accept") + } + goto ret0 + } + + if yyn == 0 { + /* error ... attempt to resume parsing */ + switch Errflag { + case 0: /* brand new error */ + if %[1]sDebug >= 1 { + __yyfmt__.Printf("no action for %%s in state %%d\n", %[1]sSymName(yychar), yystate) + } + msg, ok := %[1]sXErrors[%[1]sXError{yystate, yyxchar}] + if !ok { + msg, ok = %[1]sXErrors[%[1]sXError{yystate, -1}] + } + if !ok && yyshift != 0 { + msg, ok = %[1]sXErrors[%[1]sXError{yyshift, yyxchar}] + } + if !ok { + msg, ok = %[1]sXErrors[%[1]sXError{yyshift, -1}] + } + if !ok || msg == "" { + msg = "syntax error" + } + // ignore goyacc error message + yylex.Errorf("") + Nerrs++ + fallthrough + + case 1, 2: /* incompletely recovered error ... try again */ + Errflag = 3 + + /* find a state where "error" is a legal shift action */ + for yyp >= 0 { + row := %[1]sParseTab[yyS[yyp].yys] + if yyError < len(row) { + yyn = int(row[yyError])+%[1]sTabOfs + if yyn > 0 { // hit + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery found error shift in state %%d\n", yyS[yyp].yys) + } + yystate = yyn /* simulate a shift of "error" */ + goto yystack + } + } + + /* the current p has no shift on "error", pop stack */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery pops state %%d\n", yyS[yyp].yys) + } + yyp-- + } + /* there is no state on the stack with an error shift ... abort */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery failed\n") + } + goto ret1 + + case 3: /* no shift yet; clobber input char */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery discards %%s\n", %[1]sSymName(yychar)) + } + if yychar == %[1]sEOFCode { + goto ret1 + } + + yychar = -1 + goto yynewstate /* try again in the same state */ + } + } + + r := -yyn + x0 := %[1]sReductions[r] + x, n := x0.xsym, x0.components + yypt := yyp + _ = yypt // guard against "declared and not used" + + yyp -= n + if yyp+1 >= len(yyS) { + nyys := make([]%[1]sSymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = yyS[yyp+1] + + /* consult goto table to find next state */ + exState := yystate + yystate = int(%[1]sParseTab[yyS[yyp].yys][x])+%[1]sTabOfs + /* reduction by production r */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("reduce using rule %%v (%%s), and goto state %%d\n", r, %[1]sSymNames[x], yystate) + } + + switch r {%i +`, + *oPref, errSym, *oDlvalf, *oDlval) + for r, rule := range p.Rules { + if rule.Action == nil { + continue + } + + action := rule.Action.Values + if len(action) == 0 { + continue + } + + if len(action) == 1 { + part := action[0] + if part.Type == parser.ActionValueGo { + src := part.Src + src = src[1 : len(src)-1] // Remove lead '{' and trail '}' + if strings.TrimSpace(src) == "" { + continue + } + } + } + + components := rule.Components + typ := rule.Sym.Type + max := len(components) + if p1 := rule.Parent; p1 != nil { + max = rule.MaxParentDlr + components = p1.Components + } + mustFormat(f, "case %d: ", r) + for _, part := range action { + num := part.Num + switch part.Type { + case parser.ActionValueGo: + mustFormat(f, "%s", part.Src) + case parser.ActionValueDlrDlr: + mustFormat(f, "parser.yyVAL.%s", typ) + if typ == "" { + panic("internal error 002") + } + case parser.ActionValueDlrNum: + typ := p.Syms[components[num-1]].Type + if typ == "" { + panic("internal error 003") + } + mustFormat(f, "yyS[yypt-%d].%s", max-num, typ) + case parser.ActionValueDlrTagDlr: + mustFormat(f, "parser.yyVAL.%s", part.Tag) + case parser.ActionValueDlrTagNum: + mustFormat(f, "yyS[yypt-%d].%s", max-num, part.Tag) + } + } + mustFormat(f, "\n") + } + mustFormat(f, `%u + } + + if yyEx != nil && yyEx.Reduced(r, exState, &parser.yyVAL) { + return -1 + } + goto yystack /* stack new state and value */ +} + +%[2]s +`, *oPref, p.Tail) + _ = oNoLines //TODO Ignored for now + return nil +} + +func injectImport(src string) string { + const inj = ` + +import __yyfmt__ "fmt" +` + fset := token.NewFileSet() + file := fset.AddFile("", -1, len(src)) + var s scanner.Scanner + s.Init( + file, + []byte(src), + nil, + scanner.ScanComments, + ) + for { + switch _, tok, _ := s.Scan(); tok { + case token.EOF: + return inj + src + case token.PACKAGE: + s.Scan() // ident + pos, _, _ := s.Scan() + ofs := file.Offset(pos) + return src[:ofs] + inj + src[ofs:] + } + } +} + +func mustFormat(f strutil.Formatter, format string, args ...interface{}) { + _, err := f.Format(format, args...) + if err != nil { + log.Fatalf("format error %v", err) + } +} diff --git a/lexer.go b/lexer.go new file mode 100644 index 000000000..beabc37c6 --- /dev/null +++ b/lexer.go @@ -0,0 +1,785 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "bytes" + "fmt" + "strings" + "unicode" + "unicode/utf8" + + "github.com/pingcap/parser/mysql" +) + +var _ = yyLexer(&Scanner{}) + +// Pos represents the position of a token. +type Pos struct { + Line int + Col int + Offset int +} + +// Scanner implements the yyLexer interface. +type Scanner struct { + r reader + buf bytes.Buffer + + errs []error + stmtStartPos int + + // For scanning such kind of comment: /*! MySQL-specific code */ or /*+ optimizer hint */ + specialComment specialCommentScanner + + sqlMode mysql.SQLMode +} + +type specialCommentScanner interface { + scan() (tok int, pos Pos, lit string) +} + +type mysqlSpecificCodeScanner struct { + *Scanner + Pos +} + +func (s *mysqlSpecificCodeScanner) scan() (tok int, pos Pos, lit string) { + tok, pos, lit = s.Scanner.scan() + pos.Line += s.Pos.Line + pos.Col += s.Pos.Col + pos.Offset += s.Pos.Offset + return +} + +type optimizerHintScanner struct { + *Scanner + Pos + end bool +} + +func (s *optimizerHintScanner) scan() (tok int, pos Pos, lit string) { + tok, pos, lit = s.Scanner.scan() + pos.Line += s.Pos.Line + pos.Col += s.Pos.Col + pos.Offset += s.Pos.Offset + if tok == 0 { + if !s.end { + tok = hintEnd + s.end = true + } + } + return +} + +// Errors returns the errors during a scan. +func (s *Scanner) Errors() []error { + return s.errs +} + +// reset resets the sql string to be scanned. +func (s *Scanner) reset(sql string) { + s.r = reader{s: sql, p: Pos{Line: 1}} + s.buf.Reset() + s.errs = s.errs[:0] + s.stmtStartPos = 0 + s.specialComment = nil +} + +func (s *Scanner) stmtText() string { + endPos := s.r.pos().Offset + if s.r.s[endPos-1] == '\n' { + endPos = endPos - 1 // trim new line + } + if s.r.s[s.stmtStartPos] == '\n' { + s.stmtStartPos++ + } + + text := s.r.s[s.stmtStartPos:endPos] + + s.stmtStartPos = endPos + return text +} + +// Errorf tells scanner something is wrong. +// Scanner satisfies yyLexer interface which need this function. +func (s *Scanner) Errorf(format string, a ...interface{}) { + str := fmt.Sprintf(format, a...) + val := s.r.s[s.r.pos().Offset:] + if len(val) > 2048 { + val = val[:2048] + } + err := fmt.Errorf("line %d column %d near \"%s\"%s (total length %d)", s.r.p.Line, s.r.p.Col, val, str, len(s.r.s)) + s.errs = append(s.errs, err) +} + +// Lex returns a token and store the token value in v. +// Scanner satisfies yyLexer interface. +// 0 and invalid are special token id this function would return: +// return 0 tells parser that scanner meets EOF, +// return invalid tells parser that scanner meets illegal character. +func (s *Scanner) Lex(v *yySymType) int { + tok, pos, lit := s.scan() + v.offset = pos.Offset + v.ident = lit + if tok == identifier { + tok = handleIdent(v) + } + if tok == identifier { + if tok1 := s.isTokenIdentifier(lit, pos.Offset); tok1 != 0 { + tok = tok1 + } + } + if s.sqlMode.HasANSIQuotesMode() && + tok == stringLit && + s.r.s[v.offset] == '"' { + tok = identifier + } + + if tok == pipes && !(s.sqlMode.HasPipesAsConcatMode()) { + return pipesAsOr + } + + if tok == not && s.sqlMode.HasHighNotPrecedenceMode() { + return not2 + } + + switch tok { + case intLit: + return toInt(s, v, lit) + case floatLit: + return toFloat(s, v, lit) + case decLit: + return toDecimal(s, v, lit) + case hexLit: + return toHex(s, v, lit) + case bitLit: + return toBit(s, v, lit) + case singleAtIdentifier, doubleAtIdentifier, cast, extract: + v.item = lit + return tok + case null: + v.item = nil + case quotedIdentifier: + tok = identifier + } + if tok == unicode.ReplacementChar && s.r.eof() { + return 0 + } + return tok +} + +// SetSQLMode sets the SQL mode for scanner. +func (s *Scanner) SetSQLMode(mode mysql.SQLMode) { + s.sqlMode = mode +} + +// GetSQLMode return the SQL mode of scanner. +func (s *Scanner) GetSQLMode() mysql.SQLMode { + return s.sqlMode +} + +// NewScanner returns a new scanner object. +func NewScanner(s string) *Scanner { + return &Scanner{r: reader{s: s}} +} + +func (s *Scanner) skipWhitespace() rune { + return s.r.incAsLongAs(unicode.IsSpace) +} + +func (s *Scanner) scan() (tok int, pos Pos, lit string) { + if s.specialComment != nil { + // Enter specialComment scan mode. + // for scanning such kind of comment: /*! MySQL-specific code */ + specialComment := s.specialComment + tok, pos, lit = specialComment.scan() + if tok != 0 { + // return the specialComment scan result as the result + return + } + // leave specialComment scan mode after all stream consumed. + s.specialComment = nil + } + + ch0 := s.r.peek() + if unicode.IsSpace(ch0) { + ch0 = s.skipWhitespace() + } + pos = s.r.pos() + if s.r.eof() { + // when scanner meets EOF, the returned token should be 0, + // because 0 is a special token id to remind the parser that stream is end. + return 0, pos, "" + } + + if !s.r.eof() && isIdentExtend(ch0) { + return scanIdentifier(s) + } + + // search a trie to get a token. + node := &ruleTable + for ch0 >= 0 && ch0 <= 255 { + if node.childs[ch0] == nil || s.r.eof() { + break + } + node = node.childs[ch0] + if node.fn != nil { + return node.fn(s) + } + s.r.inc() + ch0 = s.r.peek() + } + + tok, lit = node.token, s.r.data(&pos) + return +} + +func startWithXx(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + if s.r.peek() == '\'' { + s.r.inc() + s.scanHex() + if s.r.peek() == '\'' { + s.r.inc() + tok, lit = hexLit, s.r.data(&pos) + } else { + tok = unicode.ReplacementChar + } + return + } + s.r.incAsLongAs(isIdentChar) + tok, lit = identifier, s.r.data(&pos) + return +} + +func startWithNn(s *Scanner) (tok int, pos Pos, lit string) { + tok, pos, lit = scanIdentifier(s) + // The National Character Set, N'some text' or n'some test'. + // See https://dev.mysql.com/doc/refman/5.7/en/string-literals.html + // and https://dev.mysql.com/doc/refman/5.7/en/charset-national.html + if lit == "N" || lit == "n" { + if s.r.peek() == '\'' { + tok = underscoreCS + lit = "utf8" + } + } + return +} + +func startWithBb(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + if s.r.peek() == '\'' { + s.r.inc() + s.scanBit() + if s.r.peek() == '\'' { + s.r.inc() + tok, lit = bitLit, s.r.data(&pos) + } else { + tok = unicode.ReplacementChar + } + return + } + s.r.incAsLongAs(isIdentChar) + tok, lit = identifier, s.r.data(&pos) + return +} + +func startWithSharp(s *Scanner) (tok int, pos Pos, lit string) { + s.r.incAsLongAs(func(ch rune) bool { + return ch != '\n' + }) + return s.scan() +} + +func startWithDash(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + if strings.HasPrefix(s.r.s[pos.Offset:], "--") { + remainLen := len(s.r.s[pos.Offset:]) + if remainLen == 2 || (remainLen > 2 && unicode.IsSpace(rune(s.r.s[pos.Offset+2]))) { + s.r.incAsLongAs(func(ch rune) bool { + return ch != '\n' + }) + return s.scan() + } + } + if strings.HasPrefix(s.r.s[pos.Offset:], "->>") { + tok = juss + s.r.incN(3) + return + } + if strings.HasPrefix(s.r.s[pos.Offset:], "->") { + tok = jss + s.r.incN(2) + return + } + tok = int('-') + s.r.inc() + return +} + +func startWithSlash(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + ch0 := s.r.peek() + if ch0 == '*' { + s.r.inc() + startWithAsterisk := false + for { + ch0 = s.r.readByte() + if startWithAsterisk && ch0 == '/' { + // Meets */, means comment end. + break + } else if ch0 == '*' { + startWithAsterisk = true + } else { + startWithAsterisk = false + } + + if ch0 == unicode.ReplacementChar && s.r.eof() { + // unclosed comment + s.errs = append(s.errs, ParseErrorWith(s.r.data(&pos), s.r.p.Line)) + return + } + + } + + comment := s.r.data(&pos) + + // See https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html + if strings.HasPrefix(comment, "/*+") { + begin := sqlOffsetInComment(comment) + end := len(comment) - 2 + sql := comment[begin:end] + s.specialComment = &optimizerHintScanner{ + Scanner: NewScanner(sql), + Pos: Pos{ + pos.Line, + pos.Col, + pos.Offset + begin, + }, + } + + tok = hintBegin + return + } + + // See http://dev.mysql.com/doc/refman/5.7/en/comments.html + // Convert "/*!VersionNumber MySQL-specific-code */" to "MySQL-specific-code". + if strings.HasPrefix(comment, "/*!") { + sql := specCodePattern.ReplaceAllStringFunc(comment, TrimComment) + s.specialComment = &mysqlSpecificCodeScanner{ + Scanner: NewScanner(sql), + Pos: Pos{ + pos.Line, + pos.Col, + pos.Offset + sqlOffsetInComment(comment), + }, + } + } + + return s.scan() + } + tok = int('/') + return +} + +func sqlOffsetInComment(comment string) int { + // find the first SQL token offset in pattern like "/*!40101 mysql specific code */" + offset := 0 + for i := 0; i < len(comment); i++ { + if unicode.IsSpace(rune(comment[i])) { + offset = i + break + } + } + for offset < len(comment) { + offset++ + if !unicode.IsSpace(rune(comment[offset])) { + break + } + } + return offset +} + +func startWithAt(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + ch1 := s.r.peek() + if ch1 == '\'' || ch1 == '"' { + nTok, nPos, nLit := startString(s) + if nTok == stringLit { + tok = singleAtIdentifier + pos = nPos + lit = nLit + } else { + tok = int('@') + } + } else if ch1 == '`' { + nTok, nPos, nLit := scanQuotedIdent(s) + if nTok == quotedIdentifier { + tok = singleAtIdentifier + pos = nPos + lit = nLit + } else { + tok = int('@') + } + } else if isUserVarChar(ch1) { + s.r.incAsLongAs(isUserVarChar) + tok, lit = singleAtIdentifier, s.r.data(&pos) + } else if ch1 == '@' { + s.r.inc() + stream := s.r.s[pos.Offset+2:] + for _, v := range []string{"global.", "session.", "local."} { + if len(v) > len(stream) { + continue + } + if strings.EqualFold(stream[:len(v)], v) { + s.r.incN(len(v)) + break + } + } + s.r.incAsLongAs(isIdentChar) + tok, lit = doubleAtIdentifier, s.r.data(&pos) + } else { + tok, lit = singleAtIdentifier, s.r.data(&pos) + } + return +} + +func scanIdentifier(s *Scanner) (int, Pos, string) { + pos := s.r.pos() + s.r.inc() + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) +} + +var ( + quotedIdentifier = -identifier +) + +func scanQuotedIdent(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + s.buf.Reset() + for { + ch := s.r.readByte() + if ch == unicode.ReplacementChar && s.r.eof() { + tok = unicode.ReplacementChar + return + } + if ch == '`' { + if s.r.peek() != '`' { + // don't return identifier in case that it's interpreted as keyword token later. + tok, lit = quotedIdentifier, s.buf.String() + return + } + s.r.inc() + } + s.buf.WriteRune(ch) + } +} + +func startString(s *Scanner) (tok int, pos Pos, lit string) { + return s.scanString() +} + +// lazyBuf is used to avoid allocation if possible. +// it has a useBuf field indicates whether bytes.Buffer is necessary. if +// useBuf is false, we can avoid calling bytes.Buffer.String(), which +// make a copy of data and cause allocation. +type lazyBuf struct { + useBuf bool + r *reader + b *bytes.Buffer + p *Pos +} + +func (mb *lazyBuf) setUseBuf(str string) { + if !mb.useBuf { + mb.useBuf = true + mb.b.Reset() + mb.b.WriteString(str) + } +} + +func (mb *lazyBuf) writeRune(r rune, w int) { + if mb.useBuf { + if w > 1 { + mb.b.WriteRune(r) + } else { + mb.b.WriteByte(byte(r)) + } + } +} + +func (mb *lazyBuf) data() string { + var lit string + if mb.useBuf { + lit = mb.b.String() + } else { + lit = mb.r.data(mb.p) + lit = lit[1 : len(lit)-1] + } + return lit +} + +func (s *Scanner) scanString() (tok int, pos Pos, lit string) { + tok, pos = stringLit, s.r.pos() + mb := lazyBuf{false, &s.r, &s.buf, &pos} + ending := s.r.readByte() + ch0 := s.r.peek() + for !s.r.eof() { + if ch0 == ending { + s.r.inc() + if s.r.peek() != ending { + lit = mb.data() + return + } + str := mb.r.data(&pos) + mb.setUseBuf(str[1 : len(str)-1]) + } else if ch0 == '\\' && !s.sqlMode.HasNoBackslashEscapesMode() { + mb.setUseBuf(mb.r.data(&pos)[1:]) + ch0 = handleEscape(s) + } + mb.writeRune(ch0, s.r.w) + if !s.r.eof() { + s.r.inc() + ch0 = s.r.peek() + } + } + + tok = unicode.ReplacementChar + return +} + +// handleEscape handles the case in scanString when previous char is '\'. +func handleEscape(s *Scanner) rune { + s.r.inc() + ch0 := s.r.peek() + /* + \" \' \\ \n \0 \b \Z \r \t ==> escape to one char + \% \_ ==> preserve both char + other ==> remove \ + */ + switch ch0 { + case 'n': + ch0 = '\n' + case '0': + ch0 = 0 + case 'b': + ch0 = 8 + case 'Z': + ch0 = 26 + case 'r': + ch0 = '\r' + case 't': + ch0 = '\t' + case '%', '_': + s.buf.WriteByte('\\') + } + return ch0 +} + +func startWithNumber(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + tok = intLit + ch0 := s.r.readByte() + if ch0 == '0' { + tok = intLit + ch1 := s.r.peek() + switch { + case ch1 >= '0' && ch1 <= '7': + s.r.inc() + s.scanOct() + case ch1 == 'x' || ch1 == 'X': + s.r.inc() + s.scanHex() + tok = hexLit + case ch1 == 'b': + s.r.inc() + s.scanBit() + tok = bitLit + case ch1 == '.': + return s.scanFloat(&pos) + case ch1 == 'B': + tok = unicode.ReplacementChar + return + } + } + + s.scanDigits() + ch0 = s.r.peek() + if ch0 == '.' || ch0 == 'e' || ch0 == 'E' { + return s.scanFloat(&pos) + } + + // Identifiers may begin with a digit but unless quoted may not consist solely of digits. + if !s.r.eof() && isIdentChar(ch0) { + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) + } + lit = s.r.data(&pos) + return +} + +func startWithDot(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + save := s.r.pos() + if isDigit(s.r.peek()) { + tok, _, lit = s.scanFloat(&pos) + if s.r.eof() || !isIdentChar(s.r.peek()) { + return + } + // Fail to parse a float, reset to dot. + s.r.p = save + } + tok, lit = int('.'), "." + return +} + +func (s *Scanner) scanOct() { + s.r.incAsLongAs(func(ch rune) bool { + return ch >= '0' && ch <= '7' + }) +} + +func (s *Scanner) scanHex() { + s.r.incAsLongAs(func(ch rune) bool { + return ch >= '0' && ch <= '9' || + ch >= 'a' && ch <= 'f' || + ch >= 'A' && ch <= 'F' + }) +} + +func (s *Scanner) scanBit() { + s.r.incAsLongAs(func(ch rune) bool { + return ch == '0' || ch == '1' + }) +} + +func (s *Scanner) scanFloat(beg *Pos) (tok int, pos Pos, lit string) { + s.r.p = *beg + // float = D1 . D2 e D3 + s.scanDigits() + ch0 := s.r.peek() + if ch0 == '.' { + s.r.inc() + s.scanDigits() + ch0 = s.r.peek() + } + if ch0 == 'e' || ch0 == 'E' { + s.r.inc() + ch0 = s.r.peek() + if ch0 == '-' || ch0 == '+' { + s.r.inc() + } + s.scanDigits() + tok = floatLit + } else { + tok = decLit + } + pos, lit = *beg, s.r.data(beg) + return +} + +func (s *Scanner) scanDigits() string { + pos := s.r.pos() + s.r.incAsLongAs(isDigit) + return s.r.data(&pos) +} + +type reader struct { + s string + p Pos + w int +} + +var eof = Pos{-1, -1, -1} + +func (r *reader) eof() bool { + return r.p.Offset >= len(r.s) +} + +// peek() peeks a rune from underlying reader. +// if reader meets EOF, it will return unicode.ReplacementChar. to distinguish from +// the real unicode.ReplacementChar, the caller should call r.eof() again to check. +func (r *reader) peek() rune { + if r.eof() { + return unicode.ReplacementChar + } + v, w := rune(r.s[r.p.Offset]), 1 + switch { + case v == 0: + r.w = w + return v // illegal UTF-8 encoding + case v >= 0x80: + v, w = utf8.DecodeRuneInString(r.s[r.p.Offset:]) + if v == utf8.RuneError && w == 1 { + v = rune(r.s[r.p.Offset]) // illegal UTF-8 encoding + } + } + r.w = w + return v +} + +// inc increase the position offset of the reader. +// peek must be called before calling inc! +func (r *reader) inc() { + if r.s[r.p.Offset] == '\n' { + r.p.Line++ + r.p.Col = 0 + } + r.p.Offset += r.w + r.p.Col++ +} + +func (r *reader) incN(n int) { + for i := 0; i < n; i++ { + r.inc() + } +} + +func (r *reader) readByte() (ch rune) { + ch = r.peek() + if ch == unicode.ReplacementChar && r.eof() { + return + } + r.inc() + return +} + +func (r *reader) pos() Pos { + return r.p +} + +func (r *reader) data(from *Pos) string { + return r.s[from.Offset:r.p.Offset] +} + +func (r *reader) incAsLongAs(fn func(rune) bool) rune { + for { + ch := r.peek() + if !fn(ch) { + return ch + } + if ch == unicode.ReplacementChar && r.eof() { + return 0 + } + r.inc() + } +} diff --git a/lexer_test.go b/lexer_test.go new file mode 100644 index 000000000..122e5d3e6 --- /dev/null +++ b/lexer_test.go @@ -0,0 +1,351 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "fmt" + "unicode" + + . "github.com/pingcap/check" + "github.com/pingcap/parser/mysql" +) + +var _ = Suite(&testLexerSuite{}) + +type testLexerSuite struct { +} + +func (s *testLexerSuite) TestTokenID(c *C) { + for str, tok := range tokenMap { + l := NewScanner(str) + var v yySymType + tok1 := l.Lex(&v) + c.Check(tok, Equals, tok1) + } +} + +func (s *testLexerSuite) TestSingleChar(c *C) { + table := []byte{'|', '&', '-', '+', '*', '/', '%', '^', '~', '(', ',', ')'} + for _, tok := range table { + l := NewScanner(string(tok)) + var v yySymType + tok1 := l.Lex(&v) + c.Check(int(tok), Equals, tok1) + } +} + +type testCaseItem struct { + str string + tok int +} + +func (s *testLexerSuite) TestSingleCharOther(c *C) { + table := []testCaseItem{ + {"AT", identifier}, + {"?", paramMarker}, + {"PLACEHOLDER", identifier}, + {"=", eq}, + {".", int('.')}, + } + runTest(c, table) +} + +func (s *testLexerSuite) TestAtLeadingIdentifier(c *C) { + table := []testCaseItem{ + {"@", singleAtIdentifier}, + {"@''", singleAtIdentifier}, + {"@1", singleAtIdentifier}, + {"@.1_", singleAtIdentifier}, + {"@-1.", singleAtIdentifier}, + {"@~", singleAtIdentifier}, + {"@$", singleAtIdentifier}, + {"@a_3cbbc", singleAtIdentifier}, + {"@`a_3cbbc`", singleAtIdentifier}, + {"@-3cbbc", singleAtIdentifier}, + {"@!3cbbc", singleAtIdentifier}, + {"@@global.test", doubleAtIdentifier}, + {"@@session.test", doubleAtIdentifier}, + {"@@local.test", doubleAtIdentifier}, + {"@@test", doubleAtIdentifier}, + } + runTest(c, table) +} + +func (s *testLexerSuite) TestUnderscoreCS(c *C) { + var v yySymType + scanner := NewScanner(`_utf8"string"`) + tok := scanner.Lex(&v) + c.Check(tok, Equals, underscoreCS) + tok = scanner.Lex(&v) + c.Check(tok, Equals, stringLit) + + scanner.reset("N'string'") + tok = scanner.Lex(&v) + c.Check(tok, Equals, underscoreCS) + tok = scanner.Lex(&v) + c.Check(tok, Equals, stringLit) +} + +func (s *testLexerSuite) TestLiteral(c *C) { + table := []testCaseItem{ + {`'''a'''`, stringLit}, + {`''a''`, stringLit}, + {`""a""`, stringLit}, + {`\'a\'`, int('\\')}, + {`\"a\"`, int('\\')}, + {"0.2314", decLit}, + {"1234567890123456789012345678901234567890", decLit}, + {"132.313", decLit}, + {"132.3e231", floatLit}, + {"132.3e-231", floatLit}, + {"23416", intLit}, + {"123test", identifier}, + {"123" + string(unicode.ReplacementChar) + "xxx", identifier}, + {"0", intLit}, + {"0x3c26", hexLit}, + {"x'13181C76734725455A'", hexLit}, + {"0b01", bitLit}, + {fmt.Sprintf("t1%c", 0), identifier}, + {"N'some text'", underscoreCS}, + {"n'some text'", underscoreCS}, + {"\\N", null}, + {".*", int('.')}, // `.`, `*` + {".1_t_1_x", int('.')}, // `.`, `1_t_1_x` + // Issue #3954 + {".1e23", floatLit}, // `.1e23` + {".123", decLit}, // `.123` + {".1*23", decLit}, // `.1`, `*`, `23` + {".1,23", decLit}, // `.1`, `,`, `23` + {".1 23", decLit}, // `.1`, `23` + // TODO: See #3963. The following test cases do not test the ambiguity. + {".1$23", int('.')}, // `.`, `1$23` + {".1a23", int('.')}, // `.`, `1a23` + {".1e23$23", int('.')}, // `.`, `1e23$23` + {".1e23a23", int('.')}, // `.`, `1e23a23` + {".1C23", int('.')}, // `.`, `1C23` + {".1\u0081", int('.')}, // `.`, `1\u0081` + {".1\uff34", int('.')}, // `.`, `1\uff34` + {`b''`, bitLit}, + {`b'0101'`, bitLit}, + {`0b0101`, bitLit}, + } + runTest(c, table) +} + +func runTest(c *C, table []testCaseItem) { + var val yySymType + for _, v := range table { + l := NewScanner(v.str) + tok := l.Lex(&val) + c.Check(tok, Equals, v.tok, Commentf(v.str)) + } +} + +func (s *testLexerSuite) TestComment(c *C) { + + table := []testCaseItem{ + {"-- select --\n1", intLit}, + {"/*!40101 SET character_set_client = utf8 */;", set}, + {"/*+ BKA(t1) */", hintBegin}, + {"/* SET character_set_client = utf8 */;", int(';')}, + {"/* some comments */ SELECT ", selectKwd}, + {`-- comment continues to the end of line +SELECT`, selectKwd}, + {`# comment continues to the end of line +SELECT`, selectKwd}, + {"#comment\n123", intLit}, + {"--5", int('-')}, + {"--\nSELECT", selectKwd}, + {"--\tSELECT", 0}, + {"--\r\nSELECT", selectKwd}, + {"--", 0}, + } + runTest(c, table) +} + +func (s *testLexerSuite) TestscanQuotedIdent(c *C) { + l := NewScanner("`fk`") + l.r.peek() + tok, pos, lit := scanQuotedIdent(l) + c.Assert(pos.Offset, Equals, 0) + c.Assert(tok, Equals, quotedIdentifier) + c.Assert(lit, Equals, "fk") +} + +func (s *testLexerSuite) TestscanString(c *C) { + table := []struct { + raw string + expect string + }{ + {`' \n\tTest String'`, " \n\tTest String"}, + {`'\x\B'`, "xB"}, + {`'\0\'\"\b\n\r\t\\'`, "\000'\"\b\n\r\t\\"}, + {`'\Z'`, string(26)}, + {`'\%\_'`, `\%\_`}, + {`'hello'`, "hello"}, + {`'"hello"'`, `"hello"`}, + {`'""hello""'`, `""hello""`}, + {`'hel''lo'`, "hel'lo"}, + {`'\'hello'`, "'hello"}, + {`"hello"`, "hello"}, + {`"'hello'"`, "'hello'"}, + {`"''hello''"`, "''hello''"}, + {`"hel""lo"`, `hel"lo`}, + {`"\"hello"`, `"hello`}, + {`'disappearing\ backslash'`, "disappearing backslash"}, + {"'한국의中文UTF8およびテキストトラック'", "한국의中文UTF8およびテキストトラック"}, + {"'\\a\x90'", "a\x90"}, + {`"\aèàø»"`, `aèàø»`}, + } + + for _, v := range table { + l := NewScanner(v.raw) + tok, pos, lit := l.scan() + c.Assert(tok, Equals, stringLit) + c.Assert(pos.Offset, Equals, 0) + c.Assert(lit, Equals, v.expect) + } +} + +func (s *testLexerSuite) TestIdentifier(c *C) { + replacementString := string(unicode.ReplacementChar) + "xxx" + table := [][2]string{ + {`哈哈`, "哈哈"}, + {"`numeric`", "numeric"}, + {"\r\n \r \n \tthere\t \n", "there"}, + {`5number`, `5number`}, + {"1_x", "1_x"}, + {"0_x", "0_x"}, + {replacementString, replacementString}, + {fmt.Sprintf("t1%cxxx", 0), "t1"}, + } + l := &Scanner{} + for _, item := range table { + l.reset(item[0]) + var v yySymType + tok := l.Lex(&v) + c.Assert(tok, Equals, identifier) + c.Assert(v.ident, Equals, item[1]) + } +} + +func (s *testLexerSuite) TestSpecialComment(c *C) { + l := NewScanner("/*!40101 select\n5*/") + tok, pos, lit := l.scan() + c.Assert(tok, Equals, identifier) + c.Assert(lit, Equals, "select") + c.Assert(pos, Equals, Pos{0, 0, 9}) + + tok, pos, lit = l.scan() + c.Assert(tok, Equals, intLit) + c.Assert(lit, Equals, "5") + c.Assert(pos, Equals, Pos{1, 1, 16}) +} + +func (s *testLexerSuite) TestOptimizerHint(c *C) { + l := NewScanner(" /*+ BKA(t1) */") + tokens := []struct { + tok int + lit string + pos int + }{ + {hintBegin, "", 2}, + {identifier, "BKA", 6}, + {int('('), "(", 9}, + {identifier, "t1", 10}, + {int(')'), ")", 12}, + {hintEnd, "", 14}, + } + for i := 0; ; i++ { + tok, pos, lit := l.scan() + if tok == 0 { + return + } + c.Assert(tok, Equals, tokens[i].tok, Commentf("%d", i)) + c.Assert(lit, Equals, tokens[i].lit, Commentf("%d", i)) + c.Assert(pos.Offset, Equals, tokens[i].pos, Commentf("%d", i)) + } +} + +func (s *testLexerSuite) TestInt(c *C) { + tests := []struct { + input string + expect uint64 + }{ + {"01000001783", 1000001783}, + {"00001783", 1783}, + {"0", 0}, + {"0000", 0}, + {"01", 1}, + {"10", 10}, + } + scanner := NewScanner("") + for _, t := range tests { + var v yySymType + scanner.reset(t.input) + tok := scanner.Lex(&v) + c.Assert(tok, Equals, intLit) + switch i := v.item.(type) { + case int64: + c.Assert(uint64(i), Equals, t.expect) + case uint64: + c.Assert(i, Equals, t.expect) + default: + c.Fail() + } + } +} + +func (s *testLexerSuite) TestSQLModeANSIQuotes(c *C) { + tests := []struct { + input string + tok int + ident string + }{ + {`"identifier"`, identifier, "identifier"}, + {"`identifier`", identifier, "identifier"}, + {`"identifier""and"`, identifier, `identifier"and`}, + {`'string''string'`, stringLit, "string'string"}, + {`"identifier"'and'`, identifier, "identifier"}, + {`'string'"identifier"`, stringLit, "string"}, + } + scanner := NewScanner("") + scanner.SetSQLMode(mysql.ModeANSIQuotes) + for _, t := range tests { + var v yySymType + scanner.reset(t.input) + tok := scanner.Lex(&v) + c.Assert(tok, Equals, t.tok) + c.Assert(v.ident, Equals, t.ident) + } + scanner.reset(`'string' 'string'`) + var v yySymType + tok := scanner.Lex(&v) + c.Assert(tok, Equals, stringLit) + c.Assert(v.ident, Equals, "string") + tok = scanner.Lex(&v) + c.Assert(tok, Equals, stringLit) + c.Assert(v.ident, Equals, "string") +} + +func (s *testLexerSuite) TestIllegal(c *C) { + table := []testCaseItem{ + {"'", 0}, + {"'fu", 0}, + {"'\\n", 0}, + {"'\\", 0}, + {fmt.Sprintf("%c", 0), invalid}, + } + runTest(c, table) +} diff --git a/misc.go b/misc.go new file mode 100644 index 000000000..fbf19262e --- /dev/null +++ b/misc.go @@ -0,0 +1,618 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "strings" + + "github.com/pingcap/parser/charset" +) + +func isLetter(ch rune) bool { + return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') +} + +func isDigit(ch rune) bool { + return ch >= '0' && ch <= '9' +} + +func isIdentChar(ch rune) bool { + return isLetter(ch) || isDigit(ch) || ch == '_' || ch == '$' || isIdentExtend(ch) +} + +func isIdentExtend(ch rune) bool { + return ch >= 0x80 && ch <= '\uffff' +} + +func isUserVarChar(ch rune) bool { + return isLetter(ch) || isDigit(ch) || ch == '_' || ch == '$' || ch == '.' || isIdentExtend(ch) +} + +type trieNode struct { + childs [256]*trieNode + token int + fn func(s *Scanner) (int, Pos, string) +} + +var ruleTable trieNode + +func initTokenByte(c byte, tok int) { + if ruleTable.childs[c] == nil { + ruleTable.childs[c] = &trieNode{} + } + ruleTable.childs[c].token = tok +} + +func initTokenString(str string, tok int) { + node := &ruleTable + for _, c := range str { + if node.childs[c] == nil { + node.childs[c] = &trieNode{} + } + node = node.childs[c] + } + node.token = tok +} + +func initTokenFunc(str string, fn func(s *Scanner) (int, Pos, string)) { + for i := 0; i < len(str); i++ { + c := str[i] + if ruleTable.childs[c] == nil { + ruleTable.childs[c] = &trieNode{} + } + ruleTable.childs[c].fn = fn + } + return +} + +func init() { + // invalid is a special token defined in parser.y, when parser meet + // this token, it will throw an error. + // set root trie node's token to invalid, so when input match nothing + // in the trie, invalid will be the default return token. + ruleTable.token = invalid + initTokenByte('*', int('*')) + initTokenByte('/', int('/')) + initTokenByte('+', int('+')) + initTokenByte('>', int('>')) + initTokenByte('<', int('<')) + initTokenByte('(', int('(')) + initTokenByte(')', int(')')) + initTokenByte(';', int(';')) + initTokenByte(',', int(',')) + initTokenByte('&', int('&')) + initTokenByte('%', int('%')) + initTokenByte(':', int(':')) + initTokenByte('|', int('|')) + initTokenByte('!', int('!')) + initTokenByte('^', int('^')) + initTokenByte('~', int('~')) + initTokenByte('\\', int('\\')) + initTokenByte('?', paramMarker) + initTokenByte('=', eq) + initTokenByte('{', int('{')) + initTokenByte('}', int('}')) + + initTokenString("||", pipes) + initTokenString("&&", andand) + initTokenString("&^", andnot) + initTokenString(":=", assignmentEq) + initTokenString("<=>", nulleq) + initTokenString(">=", ge) + initTokenString("<=", le) + initTokenString("!=", neq) + initTokenString("<>", neqSynonym) + initTokenString("<<", lsh) + initTokenString(">>", rsh) + initTokenString("\\N", null) + + initTokenFunc("@", startWithAt) + initTokenFunc("/", startWithSlash) + initTokenFunc("-", startWithDash) + initTokenFunc("#", startWithSharp) + initTokenFunc("Xx", startWithXx) + initTokenFunc("Nn", startWithNn) + initTokenFunc("Bb", startWithBb) + initTokenFunc(".", startWithDot) + initTokenFunc("_$ACDEFGHIJKLMOPQRSTUVWYZacdefghijklmopqrstuvwyz", scanIdentifier) + initTokenFunc("`", scanQuotedIdent) + initTokenFunc("0123456789", startWithNumber) + initTokenFunc("'\"", startString) +} + +var tokenMap = map[string]int{ + "ACTION": action, + "ADD": add, + "ADDDATE": addDate, + "ADMIN": admin, + "AFTER": after, + "ALL": all, + "ALGORITHM": algorithm, + "ALTER": alter, + "ALWAYS": always, + "ANALYZE": analyze, + "AND": and, + "ANY": any, + "AS": as, + "ASC": asc, + "ASCII": ascii, + "AUTO_INCREMENT": autoIncrement, + "AVG": avg, + "AVG_ROW_LENGTH": avgRowLength, + "BEGIN": begin, + "BETWEEN": between, + "BIGINT": bigIntType, + "BINARY": binaryType, + "BINLOG": binlog, + "BIT": bitType, + "BIT_AND": bitAnd, + "BIT_OR": bitOr, + "BIT_XOR": bitXor, + "BLOB": blobType, + "BOOL": boolType, + "BOOLEAN": booleanType, + "BOTH": both, + "BTREE": btree, + "BUCKETS": buckets, + "BY": by, + "BYTE": byteType, + "CANCEL": cancel, + "CASCADE": cascade, + "CASCADED": cascaded, + "CASE": caseKwd, + "CAST": cast, + "CHANGE": change, + "CHAR": charType, + "CHARACTER": character, + "CHARSET": charsetKwd, + "CHECK": check, + "CHECKSUM": checksum, + "CLEANUP": cleanup, + "CLIENT": client, + "COALESCE": coalesce, + "COLLATE": collate, + "COLLATION": collation, + "COLUMN": column, + "COLUMNS": columns, + "COMMENT": comment, + "COMMIT": commit, + "COMMITTED": committed, + "COMPACT": compact, + "COMPRESSED": compressed, + "COMPRESSION": compression, + "CONNECTION": connection, + "CONSISTENT": consistent, + "CONSTRAINT": constraint, + "CONVERT": convert, + "COPY": copyKwd, + "COUNT": count, + "CREATE": create, + "CROSS": cross, + "CURRENT_DATE": currentDate, + "CURRENT_TIME": currentTime, + "CURRENT_TIMESTAMP": currentTs, + "CURRENT_USER": currentUser, + "CURTIME": curTime, + "DATA": data, + "DATABASE": database, + "DATABASES": databases, + "DATE": dateType, + "DATE_ADD": dateAdd, + "DATE_SUB": dateSub, + "DATETIME": datetimeType, + "DAY": day, + "DAY_HOUR": dayHour, + "DAY_MICROSECOND": dayMicrosecond, + "DAY_MINUTE": dayMinute, + "DAY_SECOND": daySecond, + "DDL": ddl, + "DEALLOCATE": deallocate, + "DEC": decimalType, + "DECIMAL": decimalType, + "DEFAULT": defaultKwd, + "DEFINER": definer, + "DELAY_KEY_WRITE": delayKeyWrite, + "DELAYED": delayed, + "DELETE": deleteKwd, + "DESC": desc, + "DESCRIBE": describe, + "DISABLE": disable, + "DISTINCT": distinct, + "DISTINCTROW": distinct, + "DIV": div, + "DO": do, + "DOUBLE": doubleType, + "DROP": drop, + "DUAL": dual, + "DUPLICATE": duplicate, + "DYNAMIC": dynamic, + "ELSE": elseKwd, + "ENABLE": enable, + "ENCLOSED": enclosed, + "END": end, + "ENGINE": engine, + "ENGINES": engines, + "ENUM": enum, + "ESCAPE": escape, + "ESCAPED": escaped, + "EVENT": event, + "EVENTS": events, + "EXCLUSIVE": exclusive, + "EXECUTE": execute, + "EXISTS": exists, + "EXPLAIN": explain, + "EXTRACT": extract, + "FALSE": falseKwd, + "FIELDS": fields, + "FIRST": first, + "FIXED": fixed, + "FLOAT": floatType, + "FLUSH": flush, + "FOR": forKwd, + "FORCE": force, + "FOREIGN": foreign, + "FORMAT": format, + "FROM": from, + "FULL": full, + "FULLTEXT": fulltext, + "FUNCTION": function, + "GENERATED": generated, + "GET_FORMAT": getFormat, + "GLOBAL": global, + "GRANT": grant, + "GRANTS": grants, + "GROUP": group, + "GROUP_CONCAT": groupConcat, + "HASH": hash, + "HAVING": having, + "HIGH_PRIORITY": highPriority, + "HOUR": hour, + "HOUR_MICROSECOND": hourMicrosecond, + "HOUR_MINUTE": hourMinute, + "HOUR_SECOND": hourSecond, + "IDENTIFIED": identified, + "IF": ifKwd, + "IGNORE": ignore, + "IN": in, + "INDEX": index, + "INDEXES": indexes, + "INFILE": infile, + "INNER": inner, + "INPLACE": inplace, + "INSERT": insert, + "INT": intType, + "INT1": int1Type, + "INT2": int2Type, + "INT3": int3Type, + "INT4": int4Type, + "INT8": int8Type, + "INTEGER": integerType, + "INTERVAL": interval, + "INTERNAL": internal, + "INTO": into, + "INVOKER": invoker, + "IS": is, + "ISOLATION": isolation, + "JOBS": jobs, + "JOB": job, + "JOIN": join, + "JSON": jsonType, + "KEY": key, + "KEY_BLOCK_SIZE": keyBlockSize, + "KEYS": keys, + "KILL": kill, + "LEADING": leading, + "LEFT": left, + "LESS": less, + "LEVEL": level, + "LIKE": like, + "LIMIT": limit, + "LINES": lines, + "LOAD": load, + "LOCAL": local, + "LOCALTIME": localTime, + "LOCALTIMESTAMP": localTs, + "LOCK": lock, + "LONG": long, + "LONGBLOB": longblobType, + "LONGTEXT": longtextType, + "LOW_PRIORITY": lowPriority, + "MASTER": master, + "MAX": max, + "MAX_CONNECTIONS_PER_HOUR": maxConnectionsPerHour, + "MAX_EXECUTION_TIME": maxExecutionTime, + "MAX_QUERIES_PER_HOUR": maxQueriesPerHour, + "MAX_ROWS": maxRows, + "MAX_UPDATES_PER_HOUR": maxUpdatesPerHour, + "MAX_USER_CONNECTIONS": maxUserConnections, + "MAXVALUE": maxValue, + "MEDIUMBLOB": mediumblobType, + "MEDIUMINT": mediumIntType, + "MEDIUMTEXT": mediumtextType, + "MERGE": merge, + "MICROSECOND": microsecond, + "MIN": min, + "MIN_ROWS": minRows, + "MINUTE": minute, + "MINUTE_MICROSECOND": minuteMicrosecond, + "MINUTE_SECOND": minuteSecond, + "MOD": mod, + "MODE": mode, + "MODIFY": modify, + "MONTH": month, + "NAMES": names, + "NATIONAL": national, + "NATURAL": natural, + "NO": no, + "NO_WRITE_TO_BINLOG": noWriteToBinLog, + "NONE": none, + "NOT": not, + "NOW": now, + "NULL": null, + "NUMERIC": numericType, + "NVARCHAR": nvarcharType, + "OFFSET": offset, + "ON": on, + "ONLY": only, + "OPTION": option, + "OR": or, + "ORDER": order, + "OUTER": outer, + "PACK_KEYS": packKeys, + "PARTITION": partition, + "PARTITIONS": partitions, + "PASSWORD": password, + "PLUGINS": plugins, + "POSITION": position, + "PRECISION": precisionType, + "PREPARE": prepare, + "PRIMARY": primary, + "PRIVILEGES": privileges, + "PROCEDURE": procedure, + "PROCESS": process, + "PROCESSLIST": processlist, + "PROFILES": profiles, + "QUARTER": quarter, + "QUERY": query, + "QUERIES": queries, + "QUICK": quick, + "SHARD_ROW_ID_BITS": shardRowIDBits, + "RANGE": rangeKwd, + "RECOVER": recover, + "READ": read, + "REAL": realType, + "RECENT": recent, + "REDUNDANT": redundant, + "REFERENCES": references, + "REGEXP": regexpKwd, + "RELOAD": reload, + "RENAME": rename, + "REPEAT": repeat, + "REPEATABLE": repeatable, + "REPLACE": replace, + "REPLICATION": replication, + "RESTRICT": restrict, + "REVERSE": reverse, + "REVOKE": revoke, + "RIGHT": right, + "RLIKE": rlike, + "ROLLBACK": rollback, + "ROUTINE": routine, + "ROW": row, + "ROW_COUNT": rowCount, + "ROW_FORMAT": rowFormat, + "SCHEMA": database, + "SCHEMAS": databases, + "SECOND": second, + "SECOND_MICROSECOND": secondMicrosecond, + "SECURITY": security, + "SELECT": selectKwd, + "SERIALIZABLE": serializable, + "SESSION": session, + "SET": set, + "SEPARATOR": separator, + "SHARE": share, + "SHARED": shared, + "SHOW": show, + "SIGNED": signed, + "SLAVE": slave, + "SLOW": slow, + "SMALLINT": smallIntType, + "SNAPSHOT": snapshot, + "SOME": some, + "SQL": sql, + "SQL_CACHE": sqlCache, + "SQL_CALC_FOUND_ROWS": sqlCalcFoundRows, + "SQL_NO_CACHE": sqlNoCache, + "START": start, + "STARTING": starting, + "STATS": stats, + "STATS_BUCKETS": statsBuckets, + "STATS_HISTOGRAMS": statsHistograms, + "STATS_HEALTHY": statsHealthy, + "STATS_META": statsMeta, + "STATS_PERSISTENT": statsPersistent, + "STATUS": status, + "STORED": stored, + "STRAIGHT_JOIN": straightJoin, + "SUBDATE": subDate, + "SUBPARTITION": subpartition, + "SUBPARTITIONS": subpartitions, + "SUBSTR": substring, + "SUBSTRING": substring, + "SUM": sum, + "SUPER": super, + "TABLE": tableKwd, + "TABLES": tables, + "TABLESPACE": tablespace, + "TEMPORARY": temporary, + "TEMPTABLE": temptable, + "TERMINATED": terminated, + "TEXT": textType, + "THAN": than, + "THEN": then, + "TIDB": tidb, + "TIDB_HJ": tidbHJ, + "TIDB_INLJ": tidbINLJ, + "TIDB_SMJ": tidbSMJ, + "TIME": timeType, + "TIMESTAMP": timestampType, + "TIMESTAMPADD": timestampAdd, + "TIMESTAMPDIFF": timestampDiff, + "TINYBLOB": tinyblobType, + "TINYINT": tinyIntType, + "TINYTEXT": tinytextType, + "TO": to, + "TOP": top, + "TRACE": trace, + "TRAILING": trailing, + "TRANSACTION": transaction, + "TRIGGER": trigger, + "TRIGGERS": triggers, + "TRIM": trim, + "TRUE": trueKwd, + "TRUNCATE": truncate, + "UNCOMMITTED": uncommitted, + "UNDEFINED": undefined, + "UNION": union, + "UNIQUE": unique, + "UNKNOWN": unknown, + "UNLOCK": unlock, + "UNSIGNED": unsigned, + "UPDATE": update, + "USAGE": usage, + "USE": use, + "USER": user, + "USING": using, + "UTC_DATE": utcDate, + "UTC_TIME": utcTime, + "UTC_TIMESTAMP": utcTimestamp, + "VALUE": value, + "VALUES": values, + "VARBINARY": varbinaryType, + "VARCHAR": varcharType, + "VARIABLES": variables, + "VIEW": view, + "VIRTUAL": virtual, + "WARNINGS": warnings, + "ERRORS": identSQLErrors, + "WEEK": week, + "WHEN": when, + "WHERE": where, + "WITH": with, + "WRITE": write, + "XOR": xor, + "YEAR": yearType, + "YEAR_MONTH": yearMonth, + "ZEROFILL": zerofill, +} + +// See https://dev.mysql.com/doc/refman/5.7/en/function-resolution.html for details +var btFuncTokenMap = map[string]int{ + "ADDDATE": builtinAddDate, + "BIT_AND": builtinBitAnd, + "BIT_OR": builtinBitOr, + "BIT_XOR": builtinBitXor, + "CAST": builtinCast, + "COUNT": builtinCount, + "CURDATE": builtinCurDate, + "CURTIME": builtinCurTime, + "DATE_ADD": builtinDateAdd, + "DATE_SUB": builtinDateSub, + "EXTRACT": builtinExtract, + "GROUP_CONCAT": builtinGroupConcat, + "MAX": builtinMax, + "MID": builtinSubstring, + "MIN": builtinMin, + "NOW": builtinNow, + "POSITION": builtinPosition, + "SESSION_USER": builtinUser, + "STD": builtinStddevPop, + "STDDEV": builtinStddevPop, + "STDDEV_POP": builtinStddevPop, + "STDDEV_SAMP": builtinVarSamp, + "SUBDATE": builtinSubDate, + "SUBSTR": builtinSubstring, + "SUBSTRING": builtinSubstring, + "SUM": builtinSum, + "SYSDATE": builtinSysDate, + "SYSTEM_USER": builtinUser, + "TRIM": builtinTrim, + "VARIANCE": builtinVarPop, + "VAR_POP": builtinVarPop, + "VAR_SAMP": builtinVarSamp, +} + +// aliases are strings directly map to another string and use the same token. +var aliases = map[string]string{ + "SCHEMA": "DATABASE", + "SCHEMAS": "DATABASES", + "DEC": "DECIMAL", + "SUBSTR": "SUBSTRING", +} + +func (s *Scanner) isTokenIdentifier(lit string, offset int) int { + // An identifier before or after '.' means it is part of a qualified identifier. + // We do not parse it as keyword. + if s.r.peek() == '.' { + return 0 + } + if offset > 0 && s.r.s[offset-1] == '.' { + return 0 + } + buf := &s.buf + buf.Reset() + buf.Grow(len(lit)) + data := buf.Bytes()[:len(lit)] + for i := 0; i < len(lit); i++ { + if lit[i] >= 'a' && lit[i] <= 'z' { + data[i] = lit[i] + 'A' - 'a' + } else { + data[i] = lit[i] + } + } + + checkBtFuncToken, tokenStr := false, string(data) + if s.r.peek() == '(' { + checkBtFuncToken = true + } else if s.sqlMode.HasIgnoreSpaceMode() { + s.skipWhitespace() + if s.r.peek() == '(' { + checkBtFuncToken = true + } + } + if checkBtFuncToken { + if tok := btFuncTokenMap[tokenStr]; tok != 0 { + return tok + } + } + tok := tokenMap[tokenStr] + return tok +} + +func handleIdent(lval *yySymType) int { + s := lval.ident + // A character string literal may have an optional character set introducer and COLLATE clause: + // [_charset_name]'string' [COLLATE collation_name] + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + if !strings.HasPrefix(s, "_") { + return identifier + } + cs, _, err := charset.GetCharsetInfo(s[1:]) + if err != nil { + return identifier + } + lval.ident = cs + return underscoreCS +} diff --git a/model/ddl.go b/model/ddl.go new file mode 100644 index 000000000..fa7e9887e --- /dev/null +++ b/model/ddl.go @@ -0,0 +1,384 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "math" + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/terror" +) + +// ActionType is the type for DDL action. +type ActionType byte + +// List DDL actions. +const ( + ActionNone ActionType = 0 + ActionCreateSchema ActionType = 1 + ActionDropSchema ActionType = 2 + ActionCreateTable ActionType = 3 + ActionDropTable ActionType = 4 + ActionAddColumn ActionType = 5 + ActionDropColumn ActionType = 6 + ActionAddIndex ActionType = 7 + ActionDropIndex ActionType = 8 + ActionAddForeignKey ActionType = 9 + ActionDropForeignKey ActionType = 10 + ActionTruncateTable ActionType = 11 + ActionModifyColumn ActionType = 12 + ActionRebaseAutoID ActionType = 13 + ActionRenameTable ActionType = 14 + ActionSetDefaultValue ActionType = 15 + ActionShardRowID ActionType = 16 + ActionModifyTableComment ActionType = 17 + ActionRenameIndex ActionType = 18 + ActionAddTablePartition ActionType = 19 + ActionDropTablePartition ActionType = 20 +) + +// AddIndexStr is a string related to the operation of "add index". +const AddIndexStr = "add index" + +var actionMap = map[ActionType]string{ + ActionCreateSchema: "create schema", + ActionDropSchema: "drop schema", + ActionCreateTable: "create table", + ActionDropTable: "drop table", + ActionAddColumn: "add column", + ActionDropColumn: "drop column", + ActionAddIndex: AddIndexStr, + ActionDropIndex: "drop index", + ActionAddForeignKey: "add foreign key", + ActionDropForeignKey: "drop foreign key", + ActionTruncateTable: "truncate table", + ActionModifyColumn: "modify column", + ActionRebaseAutoID: "rebase auto_increment ID", + ActionRenameTable: "rename table", + ActionSetDefaultValue: "set default value", + ActionShardRowID: "shard row ID", + ActionModifyTableComment: "modify table comment", + ActionRenameIndex: "rename index", + ActionAddTablePartition: "add partition", + ActionDropTablePartition: "drop table partition", +} + +// String return current ddl action in string +func (action ActionType) String() string { + if v, ok := actionMap[action]; ok { + return v + } + return "none" +} + +// HistoryInfo is used for binlog. +type HistoryInfo struct { + SchemaVersion int64 + DBInfo *DBInfo + TableInfo *TableInfo + FinishedTS uint64 +} + +// AddDBInfo adds schema version and schema information that are used for binlog. +// dbInfo is added in the following operations: create database, drop database. +func (h *HistoryInfo) AddDBInfo(schemaVer int64, dbInfo *DBInfo) { + h.SchemaVersion = schemaVer + h.DBInfo = dbInfo +} + +// AddTableInfo adds schema version and table information that are used for binlog. +// tblInfo is added except for the following operations: create database, drop database. +func (h *HistoryInfo) AddTableInfo(schemaVer int64, tblInfo *TableInfo) { + h.SchemaVersion = schemaVer + h.TableInfo = tblInfo +} + +// Clean cleans history information. +func (h *HistoryInfo) Clean() { + h.SchemaVersion = 0 + h.DBInfo = nil + h.TableInfo = nil +} + +// DDLReorgMeta is meta info of DDL reorganization. +type DDLReorgMeta struct { + // EndHandle is the last handle of the adding indices table. + // We should only backfill indices in the range [startHandle, EndHandle]. + EndHandle int64 `json:"end_handle"` +} + +// NewDDLReorgMeta new a DDLReorgMeta. +func NewDDLReorgMeta() *DDLReorgMeta { + return &DDLReorgMeta{ + EndHandle: math.MaxInt64, + } +} + +// Job is for a DDL operation. +type Job struct { + ID int64 `json:"id"` + Type ActionType `json:"type"` + SchemaID int64 `json:"schema_id"` + TableID int64 `json:"table_id"` + State JobState `json:"state"` + Error *terror.Error `json:"err"` + // ErrorCount will be increased, every time we meet an error when running job. + ErrorCount int64 `json:"err_count"` + // RowCount means the number of rows that are processed. + RowCount int64 `json:"row_count"` + Mu sync.Mutex `json:"-"` + Args []interface{} `json:"-"` + // RawArgs : We must use json raw message to delay parsing special args. + RawArgs json.RawMessage `json:"raw_args"` + SchemaState SchemaState `json:"schema_state"` + // SnapshotVer means snapshot version for this job. + SnapshotVer uint64 `json:"snapshot_ver"` + // StartTS uses timestamp allocated by TSO. + // Now it's the TS when we put the job to TiKV queue. + StartTS uint64 `json:"start_ts"` + // DependencyID is the job's ID that the current job depends on. + DependencyID int64 `json:"dependency_id"` + // Query string of the ddl job. + Query string `json:"query"` + BinlogInfo *HistoryInfo `json:"binlog"` + + // Version indicates the DDL job version. For old jobs, it will be 0. + Version int64 `json:"version"` + + // ReorgMeta is meta info of ddl reorganization. + // This field is depreciated. + ReorgMeta *DDLReorgMeta `json:"reorg_meta"` + + // Priority is only used to set the operation priority of adding indices. + Priority int `json:"priority"` +} + +// FinishTableJob is called when a job is finished. +// It updates the job's state information and adds tblInfo to the binlog. +func (job *Job) FinishTableJob(jobState JobState, schemaState SchemaState, ver int64, tblInfo *TableInfo) { + job.State = jobState + job.SchemaState = schemaState + job.BinlogInfo.AddTableInfo(ver, tblInfo) +} + +// FinishDBJob is called when a job is finished. +// It updates the job's state information and adds dbInfo the binlog. +func (job *Job) FinishDBJob(jobState JobState, schemaState SchemaState, ver int64, dbInfo *DBInfo) { + job.State = jobState + job.SchemaState = schemaState + job.BinlogInfo.AddDBInfo(ver, dbInfo) +} + +// TSConvert2Time converts timestamp to time. +func TSConvert2Time(ts uint64) time.Time { + t := int64(ts >> 18) // 18 is for the logical time. + return time.Unix(t/1e3, (t%1e3)*1e6) +} + +// SetRowCount sets the number of rows. Make sure it can pass `make race`. +func (job *Job) SetRowCount(count int64) { + job.Mu.Lock() + defer job.Mu.Unlock() + + job.RowCount = count +} + +// GetRowCount gets the number of rows. Make sure it can pass `make race`. +func (job *Job) GetRowCount() int64 { + job.Mu.Lock() + defer job.Mu.Unlock() + + return job.RowCount +} + +// Encode encodes job with json format. +// updateRawArgs is used to determine whether to update the raw args. +func (job *Job) Encode(updateRawArgs bool) ([]byte, error) { + var err error + if updateRawArgs { + job.RawArgs, err = json.Marshal(job.Args) + if err != nil { + return nil, errors.Trace(err) + } + } + + var b []byte + job.Mu.Lock() + defer job.Mu.Unlock() + b, err = json.Marshal(job) + + return b, errors.Trace(err) +} + +// Decode decodes job from the json buffer, we must use DecodeArgs later to +// decode special args for this job. +func (job *Job) Decode(b []byte) error { + err := json.Unmarshal(b, job) + return errors.Trace(err) +} + +// DecodeArgs decodes job args. +func (job *Job) DecodeArgs(args ...interface{}) error { + job.Args = args + err := json.Unmarshal(job.RawArgs, &job.Args) + return errors.Trace(err) +} + +// String implements fmt.Stringer interface. +func (job *Job) String() string { + rowCount := job.GetRowCount() + return fmt.Sprintf("ID:%d, Type:%s, State:%s, SchemaState:%s, SchemaID:%d, TableID:%d, RowCount:%d, ArgLen:%d, start time: %v, Err:%v, ErrCount:%d, SnapshotVersion:%v", + job.ID, job.Type, job.State, job.SchemaState, job.SchemaID, job.TableID, rowCount, len(job.Args), TSConvert2Time(job.StartTS), job.Error, job.ErrorCount, job.SnapshotVer) +} + +func (job *Job) hasDependentSchema(other *Job) (bool, error) { + if other.Type == ActionDropSchema || other.Type == ActionCreateSchema { + if other.SchemaID == job.SchemaID { + return true, nil + } + if job.Type == ActionRenameTable { + var oldSchemaID int64 + if err := job.DecodeArgs(&oldSchemaID); err != nil { + return false, errors.Trace(err) + } + if other.SchemaID == oldSchemaID { + return true, nil + } + } + } + return false, nil +} + +// IsDependentOn returns whether the job depends on "other". +// How to check the job depends on "other"? +// 1. The two jobs handle the same database when one of the two jobs is an ActionDropSchema or ActionCreateSchema type. +// 2. Or the two jobs handle the same table. +func (job *Job) IsDependentOn(other *Job) (bool, error) { + isDependent, err := job.hasDependentSchema(other) + if err != nil || isDependent { + return isDependent, errors.Trace(err) + } + isDependent, err = other.hasDependentSchema(job) + if err != nil || isDependent { + return isDependent, errors.Trace(err) + } + + // TODO: If a job is ActionRenameTable, we need to check table name. + if other.TableID == job.TableID { + return true, nil + } + return false, nil +} + +// IsFinished returns whether job is finished or not. +// If the job state is Done or Cancelled, it is finished. +func (job *Job) IsFinished() bool { + return job.State == JobStateDone || job.State == JobStateRollbackDone || job.State == JobStateCancelled +} + +// IsCancelled returns whether the job is cancelled or not. +func (job *Job) IsCancelled() bool { + return job.State == JobStateCancelled +} + +// IsRollbackDone returns whether the job is rolled back or not. +func (job *Job) IsRollbackDone() bool { + return job.State == JobStateRollbackDone +} + +// IsRollingback returns whether the job is rolling back or not. +func (job *Job) IsRollingback() bool { + return job.State == JobStateRollingback +} + +// IsCancelling returns whether the job is cancelling or not. +func (job *Job) IsCancelling() bool { + return job.State == JobStateCancelling +} + +// IsSynced returns whether the DDL modification is synced among all TiDB servers. +func (job *Job) IsSynced() bool { + return job.State == JobStateSynced +} + +// IsDone returns whether job is done. +func (job *Job) IsDone() bool { + return job.State == JobStateDone +} + +// IsRunning returns whether job is still running or not. +func (job *Job) IsRunning() bool { + return job.State == JobStateRunning +} + +// JobState is for job state. +type JobState byte + +// List job states. +const ( + JobStateNone JobState = 0 + JobStateRunning JobState = 1 + // When DDL encountered an unrecoverable error at reorganization state, + // some keys has been added already, we need to remove them. + // JobStateRollingback is the state to do the rolling back job. + JobStateRollingback JobState = 2 + JobStateRollbackDone JobState = 3 + JobStateDone JobState = 4 + JobStateCancelled JobState = 5 + // JobStateSynced is used to mark the information about the completion of this job + // has been synchronized to all servers. + JobStateSynced JobState = 6 + // JobStateCancelling is used to mark the DDL job is cancelled by the client, but the DDL work hasn't handle it. + JobStateCancelling JobState = 7 +) + +// String implements fmt.Stringer interface. +func (s JobState) String() string { + switch s { + case JobStateRunning: + return "running" + case JobStateRollingback: + return "rollingback" + case JobStateRollbackDone: + return "rollback done" + case JobStateDone: + return "done" + case JobStateCancelled: + return "cancelled" + case JobStateCancelling: + return "cancelling" + case JobStateSynced: + return "synced" + default: + return "none" + } +} + +// SchemaDiff contains the schema modification at a particular schema version. +// It is used to reduce schema reload cost. +type SchemaDiff struct { + Version int64 `json:"version"` + Type ActionType `json:"type"` + SchemaID int64 `json:"schema_id"` + TableID int64 `json:"table_id"` + + // OldTableID is the table ID before truncate, only used by truncate table DDL. + OldTableID int64 `json:"old_table_id"` + // OldSchemaID is the schema ID before rename table, only used by rename table DDL. + OldSchemaID int64 `json:"old_schema_id"` +} diff --git a/model/flags.go b/model/flags.go new file mode 100644 index 000000000..33b040edf --- /dev/null +++ b/model/flags.go @@ -0,0 +1,43 @@ +// Copyright 2018 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +// Flags are used by tipb.SelectRequest.Flags to handle execution mode, like how to handle truncate error. +const ( + // FlagIgnoreTruncate indicates if truncate error should be ignored. + // Read-only statements should ignore truncate error, write statements should not ignore truncate error. + FlagIgnoreTruncate uint64 = 1 + // FlagTruncateAsWarning indicates if truncate error should be returned as warning. + // This flag only matters if FlagIgnoreTruncate is not set, in strict sql mode, truncate error should + // be returned as error, in non-strict sql mode, truncate error should be saved as warning. + FlagTruncateAsWarning = 1 << 1 + // FlagPadCharToFullLength indicates if sql_mode 'PAD_CHAR_TO_FULL_LENGTH' is set. + FlagPadCharToFullLength = 1 << 2 + // FlagInInsertStmt indicates if this is a INSERT statement. + FlagInInsertStmt = 1 << 3 + // FlagInUpdateOrDeleteStmt indicates if this is a UPDATE statement or a DELETE statement. + FlagInUpdateOrDeleteStmt = 1 << 4 + // FlagInSelectStmt indicates if this is a SELECT statement. + FlagInSelectStmt = 1 << 5 + // FlagOverflowAsWarning indicates if overflow error should be returned as warning. + // In strict sql mode, overflow error should be returned as error, + // in non-strict sql mode, overflow error should be saved as warning. + FlagOverflowAsWarning = 1 << 6 + // FlagIgnoreZeroInDate indicates if ZeroInDate error should be ignored. + // Read-only statements should ignore ZeroInDate error. + // Write statements should not ignore ZeroInDate error in strict sql mode. + FlagIgnoreZeroInDate = 1 << 7 + // FlagDividedByZeroAsWarning indicates if DividedByZero should be returned as warning. + FlagDividedByZeroAsWarning = 1 << 8 +) diff --git a/model/model.go b/model/model.go new file mode 100644 index 000000000..22891f9d2 --- /dev/null +++ b/model/model.go @@ -0,0 +1,572 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "strings" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/types" + "github.com/pingcap/tipb/go-tipb" +) + +// SchemaState is the state for schema elements. +type SchemaState byte + +const ( + // StateNone means this schema element is absent and can't be used. + StateNone SchemaState = iota + // StateDeleteOnly means we can only delete items for this schema element. + StateDeleteOnly + // StateWriteOnly means we can use any write operation on this schema element, + // but outer can't read the changed data. + StateWriteOnly + // StateWriteReorganization means we are re-organizing whole data after write only state. + StateWriteReorganization + // StateDeleteReorganization means we are re-organizing whole data after delete only state. + StateDeleteReorganization + // StatePublic means this schema element is ok for all write and read operations. + StatePublic +) + +// String implements fmt.Stringer interface. +func (s SchemaState) String() string { + switch s { + case StateDeleteOnly: + return "delete only" + case StateWriteOnly: + return "write only" + case StateWriteReorganization: + return "write reorganization" + case StateDeleteReorganization: + return "delete reorganization" + case StatePublic: + return "public" + default: + return "none" + } +} + +// ColumnInfo provides meta data describing of a table column. +type ColumnInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"name"` + Offset int `json:"offset"` + OriginDefaultValue interface{} `json:"origin_default"` + DefaultValue interface{} `json:"default"` + DefaultValueBit []byte `json:"default_bit"` + GeneratedExprString string `json:"generated_expr_string"` + GeneratedStored bool `json:"generated_stored"` + Dependences map[string]struct{} `json:"dependences"` + types.FieldType `json:"type"` + State SchemaState `json:"state"` + Comment string `json:"comment"` +} + +// Clone clones ColumnInfo. +func (c *ColumnInfo) Clone() *ColumnInfo { + nc := *c + return &nc +} + +// IsGenerated returns true if the column is generated column. +func (c *ColumnInfo) IsGenerated() bool { + return len(c.GeneratedExprString) != 0 +} + +// SetDefaultValue sets the default value. +func (c *ColumnInfo) SetDefaultValue(value interface{}) error { + c.DefaultValue = value + if c.Tp == mysql.TypeBit { + // For mysql.TypeBit type, the default value storage format must be a string. + // Other value such as int must convert to string format first. + // The mysql.TypeBit type supports the null default value. + if value == nil { + return nil + } + if v, ok := value.(string); ok { + c.DefaultValueBit = []byte(v) + return nil + } + return types.ErrInvalidDefault.GenWithStackByArgs(c.Name) + } + return nil +} + +// GetDefaultValue gets the default value of the column. +// Default value use to stored in DefaultValue field, but now, +// bit type default value will store in DefaultValueBit for fix bit default value decode/encode bug. +func (c *ColumnInfo) GetDefaultValue() interface{} { + if c.Tp == mysql.TypeBit && c.DefaultValueBit != nil { + return string(c.DefaultValueBit) + } + return c.DefaultValue +} + +// FindColumnInfo finds ColumnInfo in cols by name. +func FindColumnInfo(cols []*ColumnInfo, name string) *ColumnInfo { + name = strings.ToLower(name) + for _, col := range cols { + if col.Name.L == name { + return col + } + } + + return nil +} + +// ExtraHandleID is the column ID of column which we need to append to schema to occupy the handle's position +// for use of execution phase. +const ExtraHandleID = -1 + +// ExtraHandleName is the name of ExtraHandle Column. +var ExtraHandleName = NewCIStr("_tidb_rowid") + +// TableInfo provides meta data describing a DB table. +type TableInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"name"` + Charset string `json:"charset"` + Collate string `json:"collate"` + // Columns are listed in the order in which they appear in the schema. + Columns []*ColumnInfo `json:"cols"` + Indices []*IndexInfo `json:"index_info"` + ForeignKeys []*FKInfo `json:"fk_info"` + State SchemaState `json:"state"` + PKIsHandle bool `json:"pk_is_handle"` + Comment string `json:"comment"` + AutoIncID int64 `json:"auto_inc_id"` + MaxColumnID int64 `json:"max_col_id"` + MaxIndexID int64 `json:"max_idx_id"` + // UpdateTS is used to record the timestamp of updating the table's schema information. + // These changing schema operations don't include 'truncate table' and 'rename table'. + UpdateTS uint64 `json:"update_timestamp"` + // OldSchemaID : + // Because auto increment ID has schemaID as prefix, + // We need to save original schemaID to keep autoID unchanged + // while renaming a table from one database to another. + // TODO: Remove it. + // Now it only uses for compatibility with the old version that already uses this field. + OldSchemaID int64 `json:"old_schema_id,omitempty"` + + // ShardRowIDBits specify if the implicit row ID is sharded. + ShardRowIDBits uint64 + + Partition *PartitionInfo `json:"partition"` + + Compression string `json:"compression"` +} + +// GetPartitionInfo returns the partition information. +func (t *TableInfo) GetPartitionInfo() *PartitionInfo { + if t.Partition != nil && t.Partition.Enable { + return t.Partition + } + return nil +} + +// GetUpdateTime gets the table's updating time. +func (t *TableInfo) GetUpdateTime() time.Time { + return TSConvert2Time(t.UpdateTS) +} + +// GetDBID returns the schema ID that is used to create an allocator. +// TODO: Remove it after removing OldSchemaID. +func (t *TableInfo) GetDBID(dbID int64) int64 { + if t.OldSchemaID != 0 { + return t.OldSchemaID + } + return dbID +} + +// Clone clones TableInfo. +func (t *TableInfo) Clone() *TableInfo { + nt := *t + nt.Columns = make([]*ColumnInfo, len(t.Columns)) + nt.Indices = make([]*IndexInfo, len(t.Indices)) + nt.ForeignKeys = make([]*FKInfo, len(t.ForeignKeys)) + + for i := range t.Columns { + nt.Columns[i] = t.Columns[i].Clone() + } + + for i := range t.Indices { + nt.Indices[i] = t.Indices[i].Clone() + } + + for i := range t.ForeignKeys { + nt.ForeignKeys[i] = t.ForeignKeys[i].Clone() + } + + return &nt +} + +// GetPkName will return the pk name if pk exists. +func (t *TableInfo) GetPkName() CIStr { + if t.PKIsHandle { + for _, colInfo := range t.Columns { + if mysql.HasPriKeyFlag(colInfo.Flag) { + return colInfo.Name + } + } + } + return CIStr{} +} + +// GetPkColInfo gets the ColumnInfo of pk if exists. +// Make sure PkIsHandle checked before call this method. +func (t *TableInfo) GetPkColInfo() *ColumnInfo { + for _, colInfo := range t.Columns { + if mysql.HasPriKeyFlag(colInfo.Flag) { + return colInfo + } + } + return nil +} + +// Cols returns the columns of the table in public state. +func (t *TableInfo) Cols() []*ColumnInfo { + publicColumns := make([]*ColumnInfo, len(t.Columns)) + maxOffset := -1 + for _, col := range t.Columns { + if col.State != StatePublic { + continue + } + publicColumns[col.Offset] = col + if maxOffset < col.Offset { + maxOffset = col.Offset + } + } + return publicColumns[0 : maxOffset+1] +} + +// NewExtraHandleColInfo mocks a column info for extra handle column. +func NewExtraHandleColInfo() *ColumnInfo { + colInfo := &ColumnInfo{ + ID: ExtraHandleID, + Name: ExtraHandleName, + } + colInfo.Flag = mysql.PriKeyFlag + colInfo.Tp = mysql.TypeLonglong + colInfo.Flen, colInfo.Decimal = mysql.GetDefaultFieldLengthAndDecimal(mysql.TypeLonglong) + return colInfo +} + +// ColumnIsInIndex checks whether c is included in any indices of t. +func (t *TableInfo) ColumnIsInIndex(c *ColumnInfo) bool { + for _, index := range t.Indices { + for _, column := range index.Columns { + if column.Name.L == c.Name.L { + return true + } + } + } + return false +} + +// PartitionType is the type for PartitionInfo +type PartitionType int + +// Partition types. +const ( + PartitionTypeRange PartitionType = 1 + PartitionTypeHash PartitionType = 2 + PartitionTypeList PartitionType = 3 +) + +func (p PartitionType) String() string { + switch p { + case PartitionTypeRange: + return "RANGE" + case PartitionTypeHash: + return "HASH" + case PartitionTypeList: + return "LIST" + default: + return "" + } + +} + +// PartitionInfo provides table partition info. +type PartitionInfo struct { + Type PartitionType `json:"type"` + Expr string `json:"expr"` + Columns []CIStr `json:"columns"` + + // User may already creates table with partition but table partition is not + // yet supported back then. When Enable is true, write/read need use tid + // rather than pid. + Enable bool `json:"enable"` + + Definitions []PartitionDefinition `json:"definitions"` +} + +// GetNameByID gets the partition name by ID. +func (pi *PartitionInfo) GetNameByID(id int64) string { + for _, def := range pi.Definitions { + if id == def.ID { + return def.Name.L + } + } + return "" +} + +// PartitionDefinition defines a single partition. +type PartitionDefinition struct { + ID int64 `json:"id"` + Name CIStr `json:"name"` + LessThan []string `json:"less_than"` + Comment string `json:"comment,omitempty"` +} + +// IndexColumn provides index column info. +type IndexColumn struct { + Name CIStr `json:"name"` // Index name + Offset int `json:"offset"` // Index offset + // Length of prefix when using column prefix + // for indexing; + // UnspecifedLength if not using prefix indexing + Length int `json:"length"` +} + +// Clone clones IndexColumn. +func (i *IndexColumn) Clone() *IndexColumn { + ni := *i + return &ni +} + +// IndexType is the type of index +type IndexType int + +// String implements Stringer interface. +func (t IndexType) String() string { + switch t { + case IndexTypeBtree: + return "BTREE" + case IndexTypeHash: + return "HASH" + default: + return "" + } +} + +// IndexTypes +const ( + IndexTypeInvalid IndexType = iota + IndexTypeBtree + IndexTypeHash +) + +// IndexInfo provides meta data describing a DB index. +// It corresponds to the statement `CREATE INDEX Name ON Table (Column);` +// See https://dev.mysql.com/doc/refman/5.7/en/create-index.html +type IndexInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"idx_name"` // Index name. + Table CIStr `json:"tbl_name"` // Table name. + Columns []*IndexColumn `json:"idx_cols"` // Index columns. + Unique bool `json:"is_unique"` // Whether the index is unique. + Primary bool `json:"is_primary"` // Whether the index is primary key. + State SchemaState `json:"state"` + Comment string `json:"comment"` // Comment + Tp IndexType `json:"index_type"` // Index type: Btree or Hash +} + +// Clone clones IndexInfo. +func (index *IndexInfo) Clone() *IndexInfo { + ni := *index + ni.Columns = make([]*IndexColumn, len(index.Columns)) + for i := range index.Columns { + ni.Columns[i] = index.Columns[i].Clone() + } + return &ni +} + +// HasPrefixIndex returns whether any columns of this index uses prefix length. +func (index *IndexInfo) HasPrefixIndex() bool { + for _, ic := range index.Columns { + if ic.Length != types.UnspecifiedLength { + return true + } + } + return false +} + +// FKInfo provides meta data describing a foreign key constraint. +type FKInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"fk_name"` + RefTable CIStr `json:"ref_table"` + RefCols []CIStr `json:"ref_cols"` + Cols []CIStr `json:"cols"` + OnDelete int `json:"on_delete"` + OnUpdate int `json:"on_update"` + State SchemaState `json:"state"` +} + +// Clone clones FKInfo. +func (fk *FKInfo) Clone() *FKInfo { + nfk := *fk + + nfk.RefCols = make([]CIStr, len(fk.RefCols)) + nfk.Cols = make([]CIStr, len(fk.Cols)) + copy(nfk.RefCols, fk.RefCols) + copy(nfk.Cols, fk.Cols) + + return &nfk +} + +// DBInfo provides meta data describing a DB. +type DBInfo struct { + ID int64 `json:"id"` // Database ID + Name CIStr `json:"db_name"` // DB name. + Charset string `json:"charset"` + Collate string `json:"collate"` + Tables []*TableInfo `json:"-"` // Tables in the DB. + State SchemaState `json:"state"` +} + +// Clone clones DBInfo. +func (db *DBInfo) Clone() *DBInfo { + newInfo := *db + newInfo.Tables = make([]*TableInfo, len(db.Tables)) + for i := range db.Tables { + newInfo.Tables[i] = db.Tables[i].Clone() + } + return &newInfo +} + +// Copy shallow copies DBInfo. +func (db *DBInfo) Copy() *DBInfo { + newInfo := *db + newInfo.Tables = make([]*TableInfo, len(db.Tables)) + copy(newInfo.Tables, db.Tables) + return &newInfo +} + +// CIStr is case insensitive string. +type CIStr struct { + O string `json:"O"` // Original string. + L string `json:"L"` // Lower case string. +} + +// String implements fmt.Stringer interface. +func (cis CIStr) String() string { + return cis.O +} + +// NewCIStr creates a new CIStr. +func NewCIStr(s string) (cs CIStr) { + cs.O = s + cs.L = strings.ToLower(s) + return +} + +// UnmarshalJSON implements the user defined unmarshal method. +// CIStr can be unmarshaled from a single string, so PartitionDefinition.Name +// in this change https://github.com/pingcap/tidb/pull/6460/files would be +// compatible during TiDB upgrading. +func (cis *CIStr) UnmarshalJSON(b []byte) error { + type T CIStr + if err := json.Unmarshal(b, (*T)(cis)); err == nil { + return nil + } + + // Unmarshal CIStr from a single string. + err := json.Unmarshal(b, &cis.O) + if err != nil { + return errors.Trace(err) + } + cis.L = strings.ToLower(cis.O) + return nil +} + +// ColumnsToProto converts a slice of model.ColumnInfo to a slice of tipb.ColumnInfo. +func ColumnsToProto(columns []*ColumnInfo, pkIsHandle bool) []*tipb.ColumnInfo { + cols := make([]*tipb.ColumnInfo, 0, len(columns)) + for _, c := range columns { + col := ColumnToProto(c) + // TODO: Here `PkHandle`'s meaning is changed, we will change it to `IsHandle` when tikv's old select logic + // is abandoned. + if (pkIsHandle && mysql.HasPriKeyFlag(c.Flag)) || c.ID == ExtraHandleID { + col.PkHandle = true + } else { + col.PkHandle = false + } + cols = append(cols, col) + } + return cols +} + +// IndexToProto converts a model.IndexInfo to a tipb.IndexInfo. +func IndexToProto(t *TableInfo, idx *IndexInfo) *tipb.IndexInfo { + pi := &tipb.IndexInfo{ + TableId: t.ID, + IndexId: idx.ID, + Unique: idx.Unique, + } + cols := make([]*tipb.ColumnInfo, 0, len(idx.Columns)+1) + for _, c := range idx.Columns { + cols = append(cols, ColumnToProto(t.Columns[c.Offset])) + } + if t.PKIsHandle { + // Coprocessor needs to know PKHandle column info, so we need to append it. + for _, col := range t.Columns { + if mysql.HasPriKeyFlag(col.Flag) { + colPB := ColumnToProto(col) + colPB.PkHandle = true + cols = append(cols, colPB) + break + } + } + } + pi.Columns = cols + return pi +} + +// ColumnToProto converts model.ColumnInfo to tipb.ColumnInfo. +func ColumnToProto(c *ColumnInfo) *tipb.ColumnInfo { + pc := &tipb.ColumnInfo{ + ColumnId: c.ID, + Collation: collationToProto(c.FieldType.Collate), + ColumnLen: int32(c.FieldType.Flen), + Decimal: int32(c.FieldType.Decimal), + Flag: int32(c.Flag), + Elems: c.Elems, + } + pc.Tp = int32(c.FieldType.Tp) + return pc +} + +// TODO: update it when more collate is supported. +func collationToProto(c string) int32 { + v := mysql.CollationNames[c] + if v == mysql.BinaryCollationID { + return int32(mysql.BinaryCollationID) + } + // We only support binary and utf8_bin collation. + // Setting other collations to utf8_bin for old data compatibility. + // For the data created when we didn't enforce utf8_bin collation in create table. + return int32(mysql.DefaultCollationID) +} + +// TableColumnID is composed by table ID and column ID. +type TableColumnID struct { + TableID int64 + ColumnID int64 +} diff --git a/model/model_test.go b/model/model_test.go new file mode 100644 index 000000000..9d5403f59 --- /dev/null +++ b/model/model_test.go @@ -0,0 +1,307 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "testing" + "time" + + . "github.com/pingcap/check" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/types" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testModelSuite{}) + +type testModelSuite struct { +} + +func (*testModelSuite) TestT(c *C) { + abc := NewCIStr("aBC") + c.Assert(abc.O, Equals, "aBC") + c.Assert(abc.L, Equals, "abc") + c.Assert(abc.String(), Equals, "aBC") +} + +func (*testModelSuite) TestModelBasic(c *C) { + column := &ColumnInfo{ + ID: 1, + Name: NewCIStr("c"), + Offset: 0, + DefaultValue: 0, + FieldType: *types.NewFieldType(0), + } + column.Flag |= mysql.PriKeyFlag + + index := &IndexInfo{ + Name: NewCIStr("key"), + Table: NewCIStr("t"), + Columns: []*IndexColumn{ + { + Name: NewCIStr("c"), + Offset: 0, + Length: 10, + }}, + Unique: true, + Primary: true, + } + + fk := &FKInfo{ + RefCols: []CIStr{NewCIStr("a")}, + Cols: []CIStr{NewCIStr("a")}, + } + + table := &TableInfo{ + ID: 1, + Name: NewCIStr("t"), + Charset: "utf8", + Collate: "utf8_bin", + Columns: []*ColumnInfo{column}, + Indices: []*IndexInfo{index}, + ForeignKeys: []*FKInfo{fk}, + PKIsHandle: true, + } + + dbInfo := &DBInfo{ + ID: 1, + Name: NewCIStr("test"), + Charset: "utf8", + Collate: "utf8_bin", + Tables: []*TableInfo{table}, + } + + n := dbInfo.Clone() + c.Assert(n, DeepEquals, dbInfo) + + pkName := table.GetPkName() + c.Assert(pkName, Equals, NewCIStr("c")) + newColumn := table.GetPkColInfo() + c.Assert(newColumn, DeepEquals, column) + inIdx := table.ColumnIsInIndex(column) + c.Assert(inIdx, Equals, true) + tp := IndexTypeBtree + c.Assert(tp.String(), Equals, "BTREE") + tp = IndexTypeHash + c.Assert(tp.String(), Equals, "HASH") + tp = 1E5 + c.Assert(tp.String(), Equals, "") + has := index.HasPrefixIndex() + c.Assert(has, Equals, true) + t := table.GetUpdateTime() + c.Assert(t, Equals, TSConvert2Time(table.UpdateTS)) + + // Corner cases + column.Flag ^= mysql.PriKeyFlag + pkName = table.GetPkName() + c.Assert(pkName, Equals, NewCIStr("")) + newColumn = table.GetPkColInfo() + c.Assert(newColumn, IsNil) + anCol := &ColumnInfo{ + Name: NewCIStr("d"), + } + exIdx := table.ColumnIsInIndex(anCol) + c.Assert(exIdx, Equals, false) + anIndex := &IndexInfo{ + Columns: []*IndexColumn{}, + } + no := anIndex.HasPrefixIndex() + c.Assert(no, Equals, false) +} + +func (*testModelSuite) TestJobStartTime(c *C) { + job := &Job{ + ID: 123, + BinlogInfo: &HistoryInfo{}, + } + t := time.Unix(0, 0) + c.Assert(t, Equals, TSConvert2Time(job.StartTS)) + ret := fmt.Sprintf("%s", job) + c.Assert(job.String(), Equals, ret) +} + +func (*testModelSuite) TestJobCodec(c *C) { + type A struct { + Name string + } + job := &Job{ + ID: 1, + TableID: 2, + SchemaID: 1, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{NewCIStr("a"), A{Name: "abc"}}, + } + job.BinlogInfo.AddDBInfo(123, &DBInfo{ID: 1, Name: NewCIStr("test_history_db")}) + job.BinlogInfo.AddTableInfo(123, &TableInfo{ID: 1, Name: NewCIStr("test_history_tbl")}) + + // Test IsDependentOn. + // job: table ID is 2 + // job1: table ID is 2 + var err error + job1 := &Job{ + ID: 2, + TableID: 2, + SchemaID: 1, + Type: ActionRenameTable, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{int64(3), NewCIStr("new_table_name")}, + } + job1.RawArgs, err = json.Marshal(job1.Args) + c.Assert(err, IsNil) + isDependent, err := job.IsDependentOn(job1) + c.Assert(err, IsNil) + c.Assert(isDependent, IsTrue) + // job1: rename table, old schema ID is 3 + // job2: create schema, schema ID is 3 + job2 := &Job{ + ID: 3, + TableID: 3, + SchemaID: 3, + Type: ActionCreateSchema, + BinlogInfo: &HistoryInfo{}, + } + isDependent, err = job2.IsDependentOn(job1) + c.Assert(err, IsNil) + c.Assert(isDependent, IsTrue) + + c.Assert(job.IsCancelled(), Equals, false) + b, err := job.Encode(false) + c.Assert(err, IsNil) + newJob := &Job{} + err = newJob.Decode(b) + c.Assert(err, IsNil) + c.Assert(newJob.BinlogInfo, DeepEquals, job.BinlogInfo) + name := CIStr{} + a := A{} + err = newJob.DecodeArgs(&name, &a) + c.Assert(err, IsNil) + c.Assert(name, DeepEquals, NewCIStr("")) + c.Assert(a, DeepEquals, A{Name: ""}) + c.Assert(len(newJob.String()), Greater, 0) + + job.BinlogInfo.Clean() + b1, err := job.Encode(true) + c.Assert(err, IsNil) + newJob = &Job{} + err = newJob.Decode(b1) + c.Assert(err, IsNil) + c.Assert(newJob.BinlogInfo, DeepEquals, &HistoryInfo{}) + name = CIStr{} + a = A{} + err = newJob.DecodeArgs(&name, &a) + c.Assert(err, IsNil) + c.Assert(name, DeepEquals, NewCIStr("a")) + c.Assert(a, DeepEquals, A{Name: "abc"}) + c.Assert(len(newJob.String()), Greater, 0) + + b2, err := job.Encode(true) + c.Assert(err, IsNil) + newJob = &Job{} + err = newJob.Decode(b2) + c.Assert(err, IsNil) + name = CIStr{} + // Don't decode to a here. + err = newJob.DecodeArgs(&name) + c.Assert(err, IsNil) + c.Assert(name, DeepEquals, NewCIStr("a")) + c.Assert(len(newJob.String()), Greater, 0) + + job.State = JobStateDone + c.Assert(job.IsDone(), IsTrue) + c.Assert(job.IsFinished(), IsTrue) + c.Assert(job.IsRunning(), IsFalse) + c.Assert(job.IsSynced(), IsFalse) + c.Assert(job.IsRollbackDone(), IsFalse) + job.SetRowCount(3) + c.Assert(job.GetRowCount(), Equals, int64(3)) +} + +func (testModelSuite) TestState(c *C) { + schemaTbl := []SchemaState{ + StateDeleteOnly, + StateWriteOnly, + StateWriteReorganization, + StateDeleteReorganization, + StatePublic, + } + + for _, state := range schemaTbl { + c.Assert(len(state.String()), Greater, 0) + } + + jobTbl := []JobState{ + JobStateRunning, + JobStateDone, + JobStateCancelled, + JobStateRollingback, + JobStateRollbackDone, + JobStateSynced, + } + + for _, state := range jobTbl { + c.Assert(len(state.String()), Greater, 0) + } +} + +func (testModelSuite) TestString(c *C) { + acts := []struct { + act ActionType + result string + }{ + {ActionNone, "none"}, + {ActionAddForeignKey, "add foreign key"}, + {ActionDropForeignKey, "drop foreign key"}, + {ActionTruncateTable, "truncate table"}, + {ActionModifyColumn, "modify column"}, + {ActionRenameTable, "rename table"}, + {ActionSetDefaultValue, "set default value"}, + {ActionCreateSchema, "create schema"}, + {ActionDropSchema, "drop schema"}, + {ActionCreateTable, "create table"}, + {ActionDropTable, "drop table"}, + {ActionAddIndex, "add index"}, + {ActionDropIndex, "drop index"}, + {ActionAddColumn, "add column"}, + {ActionDropColumn, "drop column"}, + } + + for _, v := range acts { + str := v.act.String() + c.Assert(str, Equals, v.result) + } +} + +func (testModelSuite) TestUnmarshalCIStr(c *C) { + var ci CIStr + + // Test unmarshal CIStr from a single string. + str := "aaBB" + buf, err := json.Marshal(str) + c.Assert(err, IsNil) + ci.UnmarshalJSON(buf) + c.Assert(ci.O, Equals, str) + c.Assert(ci.L, Equals, "aabb") + + buf, err = json.Marshal(ci) + c.Assert(string(buf), Equals, `{"O":"aaBB","L":"aabb"}`) + ci.UnmarshalJSON(buf) + c.Assert(ci.O, Equals, str) + c.Assert(ci.L, Equals, "aabb") +} diff --git a/mysql/charset.go b/mysql/charset.go new file mode 100644 index 000000000..9cd96796e --- /dev/null +++ b/mysql/charset.go @@ -0,0 +1,608 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import "unicode" + +// CharsetIDs maps charset name to its default collation ID. +var CharsetIDs = map[string]uint8{ + "big5": 1, + "dec8": 3, + "cp850": 4, + "hp8": 6, + "koi8r": 7, + "latin1": 8, + "latin2": 9, + "swe7": 10, + "ascii": 11, + "ujis": 12, + "sjis": 13, + "hebrew": 16, + "tis620": 18, + "euckr": 19, + "koi8u": 22, + "gb2312": 24, + "greek": 25, + "cp1250": 26, + "gbk": 28, + "latin5": 30, + "armscii8": 32, + "utf8": 33, + "ucs2": 35, + "cp866": 36, + "keybcs2": 37, + "macce": 38, + "macroman": 39, + "cp852": 40, + "latin7": 41, + "utf8mb4": 45, + "cp1251": 51, + "utf16": 54, + "utf16le": 56, + "cp1256": 57, + "cp1257": 59, + "utf32": 60, + "binary": 63, + "geostd8": 92, + "cp932": 95, + "eucjpms": 97, +} + +// Charsets maps charset name to its default collation name. +var Charsets = map[string]string{ + "big5": "big5_chinese_ci", + "dec8": "dec8_swedish_ci", + "cp850": "cp850_general_ci", + "hp8": "hp8_english_ci", + "koi8r": "koi8r_general_ci", + "latin1": "latin1_swedish_ci", + "latin2": "latin2_general_ci", + "swe7": "swe7_swedish_ci", + "ascii": "ascii_general_ci", + "ujis": "ujis_japanese_ci", + "sjis": "sjis_japanese_ci", + "hebrew": "hebrew_general_ci", + "tis620": "tis620_thai_ci", + "euckr": "euckr_korean_ci", + "koi8u": "koi8u_general_ci", + "gb2312": "gb2312_chinese_ci", + "greek": "greek_general_ci", + "cp1250": "cp1250_general_ci", + "gbk": "gbk_chinese_ci", + "latin5": "latin5_turkish_ci", + "armscii8": "armscii8_general_ci", + "utf8": "utf8_general_ci", + "ucs2": "ucs2_general_ci", + "cp866": "cp866_general_ci", + "keybcs2": "keybcs2_general_ci", + "macce": "macce_general_ci", + "macroman": "macroman_general_ci", + "cp852": "cp852_general_ci", + "latin7": "latin7_general_ci", + "utf8mb4": "utf8mb4_general_ci", + "cp1251": "cp1251_general_ci", + "utf16": "utf16_general_ci", + "utf16le": "utf16le_general_ci", + "cp1256": "cp1256_general_ci", + "cp1257": "cp1257_general_ci", + "utf32": "utf32_general_ci", + "binary": "binary", + "geostd8": "geostd8_general_ci", + "cp932": "cp932_japanese_ci", + "eucjpms": "eucjpms_japanese_ci", +} + +// Collations maps MySQL default collation ID to its name. +var Collations = map[uint8]string{ + 1: "big5_chinese_ci", + 2: "latin2_czech_cs", + 3: "dec8_swedish_ci", + 4: "cp850_general_ci", + 5: "latin1_german1_ci", + 6: "hp8_english_ci", + 7: "koi8r_general_ci", + 8: "latin1_swedish_ci", + 9: "latin2_general_ci", + 10: "swe7_swedish_ci", + 11: "ascii_general_ci", + 12: "ujis_japanese_ci", + 13: "sjis_japanese_ci", + 14: "cp1251_bulgarian_ci", + 15: "latin1_danish_ci", + 16: "hebrew_general_ci", + 18: "tis620_thai_ci", + 19: "euckr_korean_ci", + 20: "latin7_estonian_cs", + 21: "latin2_hungarian_ci", + 22: "koi8u_general_ci", + 23: "cp1251_ukrainian_ci", + 24: "gb2312_chinese_ci", + 25: "greek_general_ci", + 26: "cp1250_general_ci", + 27: "latin2_croatian_ci", + 28: "gbk_chinese_ci", + 29: "cp1257_lithuanian_ci", + 30: "latin5_turkish_ci", + 31: "latin1_german2_ci", + 32: "armscii8_general_ci", + 33: "utf8_general_ci", + 34: "cp1250_czech_cs", + 35: "ucs2_general_ci", + 36: "cp866_general_ci", + 37: "keybcs2_general_ci", + 38: "macce_general_ci", + 39: "macroman_general_ci", + 40: "cp852_general_ci", + 41: "latin7_general_ci", + 42: "latin7_general_cs", + 43: "macce_bin", + 44: "cp1250_croatian_ci", + 45: "utf8mb4_general_ci", + 46: "utf8mb4_bin", + 47: "latin1_bin", + 48: "latin1_general_ci", + 49: "latin1_general_cs", + 50: "cp1251_bin", + 51: "cp1251_general_ci", + 52: "cp1251_general_cs", + 53: "macroman_bin", + 54: "utf16_general_ci", + 55: "utf16_bin", + 56: "utf16le_general_ci", + 57: "cp1256_general_ci", + 58: "cp1257_bin", + 59: "cp1257_general_ci", + 60: "utf32_general_ci", + 61: "utf32_bin", + 62: "utf16le_bin", + 63: "binary", + 64: "armscii8_bin", + 65: "ascii_bin", + 66: "cp1250_bin", + 67: "cp1256_bin", + 68: "cp866_bin", + 69: "dec8_bin", + 70: "greek_bin", + 71: "hebrew_bin", + 72: "hp8_bin", + 73: "keybcs2_bin", + 74: "koi8r_bin", + 75: "koi8u_bin", + 77: "latin2_bin", + 78: "latin5_bin", + 79: "latin7_bin", + 80: "cp850_bin", + 81: "cp852_bin", + 82: "swe7_bin", + 83: "utf8_bin", + 84: "big5_bin", + 85: "euckr_bin", + 86: "gb2312_bin", + 87: "gbk_bin", + 88: "sjis_bin", + 89: "tis620_bin", + 90: "ucs2_bin", + 91: "ujis_bin", + 92: "geostd8_general_ci", + 93: "geostd8_bin", + 94: "latin1_spanish_ci", + 95: "cp932_japanese_ci", + 96: "cp932_bin", + 97: "eucjpms_japanese_ci", + 98: "eucjpms_bin", + 99: "cp1250_polish_ci", + 101: "utf16_unicode_ci", + 102: "utf16_icelandic_ci", + 103: "utf16_latvian_ci", + 104: "utf16_romanian_ci", + 105: "utf16_slovenian_ci", + 106: "utf16_polish_ci", + 107: "utf16_estonian_ci", + 108: "utf16_spanish_ci", + 109: "utf16_swedish_ci", + 110: "utf16_turkish_ci", + 111: "utf16_czech_ci", + 112: "utf16_danish_ci", + 113: "utf16_lithuanian_ci", + 114: "utf16_slovak_ci", + 115: "utf16_spanish2_ci", + 116: "utf16_roman_ci", + 117: "utf16_persian_ci", + 118: "utf16_esperanto_ci", + 119: "utf16_hungarian_ci", + 120: "utf16_sinhala_ci", + 121: "utf16_german2_ci", + 122: "utf16_croatian_ci", + 123: "utf16_unicode_520_ci", + 124: "utf16_vietnamese_ci", + 128: "ucs2_unicode_ci", + 129: "ucs2_icelandic_ci", + 130: "ucs2_latvian_ci", + 131: "ucs2_romanian_ci", + 132: "ucs2_slovenian_ci", + 133: "ucs2_polish_ci", + 134: "ucs2_estonian_ci", + 135: "ucs2_spanish_ci", + 136: "ucs2_swedish_ci", + 137: "ucs2_turkish_ci", + 138: "ucs2_czech_ci", + 139: "ucs2_danish_ci", + 140: "ucs2_lithuanian_ci", + 141: "ucs2_slovak_ci", + 142: "ucs2_spanish2_ci", + 143: "ucs2_roman_ci", + 144: "ucs2_persian_ci", + 145: "ucs2_esperanto_ci", + 146: "ucs2_hungarian_ci", + 147: "ucs2_sinhala_ci", + 148: "ucs2_german2_ci", + 149: "ucs2_croatian_ci", + 150: "ucs2_unicode_520_ci", + 151: "ucs2_vietnamese_ci", + 159: "ucs2_general_mysql500_ci", + 160: "utf32_unicode_ci", + 161: "utf32_icelandic_ci", + 162: "utf32_latvian_ci", + 163: "utf32_romanian_ci", + 164: "utf32_slovenian_ci", + 165: "utf32_polish_ci", + 166: "utf32_estonian_ci", + 167: "utf32_spanish_ci", + 168: "utf32_swedish_ci", + 169: "utf32_turkish_ci", + 170: "utf32_czech_ci", + 171: "utf32_danish_ci", + 172: "utf32_lithuanian_ci", + 173: "utf32_slovak_ci", + 174: "utf32_spanish2_ci", + 175: "utf32_roman_ci", + 176: "utf32_persian_ci", + 177: "utf32_esperanto_ci", + 178: "utf32_hungarian_ci", + 179: "utf32_sinhala_ci", + 180: "utf32_german2_ci", + 181: "utf32_croatian_ci", + 182: "utf32_unicode_520_ci", + 183: "utf32_vietnamese_ci", + 192: "utf8_unicode_ci", + 193: "utf8_icelandic_ci", + 194: "utf8_latvian_ci", + 195: "utf8_romanian_ci", + 196: "utf8_slovenian_ci", + 197: "utf8_polish_ci", + 198: "utf8_estonian_ci", + 199: "utf8_spanish_ci", + 200: "utf8_swedish_ci", + 201: "utf8_turkish_ci", + 202: "utf8_czech_ci", + 203: "utf8_danish_ci", + 204: "utf8_lithuanian_ci", + 205: "utf8_slovak_ci", + 206: "utf8_spanish2_ci", + 207: "utf8_roman_ci", + 208: "utf8_persian_ci", + 209: "utf8_esperanto_ci", + 210: "utf8_hungarian_ci", + 211: "utf8_sinhala_ci", + 212: "utf8_german2_ci", + 213: "utf8_croatian_ci", + 214: "utf8_unicode_520_ci", + 215: "utf8_vietnamese_ci", + 223: "utf8_general_mysql500_ci", + 224: "utf8mb4_unicode_ci", + 225: "utf8mb4_icelandic_ci", + 226: "utf8mb4_latvian_ci", + 227: "utf8mb4_romanian_ci", + 228: "utf8mb4_slovenian_ci", + 229: "utf8mb4_polish_ci", + 230: "utf8mb4_estonian_ci", + 231: "utf8mb4_spanish_ci", + 232: "utf8mb4_swedish_ci", + 233: "utf8mb4_turkish_ci", + 234: "utf8mb4_czech_ci", + 235: "utf8mb4_danish_ci", + 236: "utf8mb4_lithuanian_ci", + 237: "utf8mb4_slovak_ci", + 238: "utf8mb4_spanish2_ci", + 239: "utf8mb4_roman_ci", + 240: "utf8mb4_persian_ci", + 241: "utf8mb4_esperanto_ci", + 242: "utf8mb4_hungarian_ci", + 243: "utf8mb4_sinhala_ci", + 244: "utf8mb4_german2_ci", + 245: "utf8mb4_croatian_ci", + 246: "utf8mb4_unicode_520_ci", + 247: "utf8mb4_vietnamese_ci", +} + +// CollationNames maps MySQL default collation name to its ID +var CollationNames = map[string]uint8{ + "big5_chinese_ci": 1, + "latin2_czech_cs": 2, + "dec8_swedish_ci": 3, + "cp850_general_ci": 4, + "latin1_german1_ci": 5, + "hp8_english_ci": 6, + "koi8r_general_ci": 7, + "latin1_swedish_ci": 8, + "latin2_general_ci": 9, + "swe7_swedish_ci": 10, + "ascii_general_ci": 11, + "ujis_japanese_ci": 12, + "sjis_japanese_ci": 13, + "cp1251_bulgarian_ci": 14, + "latin1_danish_ci": 15, + "hebrew_general_ci": 16, + "tis620_thai_ci": 18, + "euckr_korean_ci": 19, + "latin7_estonian_cs": 20, + "latin2_hungarian_ci": 21, + "koi8u_general_ci": 22, + "cp1251_ukrainian_ci": 23, + "gb2312_chinese_ci": 24, + "greek_general_ci": 25, + "cp1250_general_ci": 26, + "latin2_croatian_ci": 27, + "gbk_chinese_ci": 28, + "cp1257_lithuanian_ci": 29, + "latin5_turkish_ci": 30, + "latin1_german2_ci": 31, + "armscii8_general_ci": 32, + "utf8_general_ci": 33, + "cp1250_czech_cs": 34, + "ucs2_general_ci": 35, + "cp866_general_ci": 36, + "keybcs2_general_ci": 37, + "macce_general_ci": 38, + "macroman_general_ci": 39, + "cp852_general_ci": 40, + "latin7_general_ci": 41, + "latin7_general_cs": 42, + "macce_bin": 43, + "cp1250_croatian_ci": 44, + "utf8mb4_general_ci": 45, + "utf8mb4_bin": 46, + "latin1_bin": 47, + "latin1_general_ci": 48, + "latin1_general_cs": 49, + "cp1251_bin": 50, + "cp1251_general_ci": 51, + "cp1251_general_cs": 52, + "macroman_bin": 53, + "utf16_general_ci": 54, + "utf16_bin": 55, + "utf16le_general_ci": 56, + "cp1256_general_ci": 57, + "cp1257_bin": 58, + "cp1257_general_ci": 59, + "utf32_general_ci": 60, + "utf32_bin": 61, + "utf16le_bin": 62, + "binary": 63, + "armscii8_bin": 64, + "ascii_bin": 65, + "cp1250_bin": 66, + "cp1256_bin": 67, + "cp866_bin": 68, + "dec8_bin": 69, + "greek_bin": 70, + "hebrew_bin": 71, + "hp8_bin": 72, + "keybcs2_bin": 73, + "koi8r_bin": 74, + "koi8u_bin": 75, + "latin2_bin": 77, + "latin5_bin": 78, + "latin7_bin": 79, + "cp850_bin": 80, + "cp852_bin": 81, + "swe7_bin": 82, + "utf8_bin": 83, + "big5_bin": 84, + "euckr_bin": 85, + "gb2312_bin": 86, + "gbk_bin": 87, + "sjis_bin": 88, + "tis620_bin": 89, + "ucs2_bin": 90, + "ujis_bin": 91, + "geostd8_general_ci": 92, + "geostd8_bin": 93, + "latin1_spanish_ci": 94, + "cp932_japanese_ci": 95, + "cp932_bin": 96, + "eucjpms_japanese_ci": 97, + "eucjpms_bin": 98, + "cp1250_polish_ci": 99, + "utf16_unicode_ci": 101, + "utf16_icelandic_ci": 102, + "utf16_latvian_ci": 103, + "utf16_romanian_ci": 104, + "utf16_slovenian_ci": 105, + "utf16_polish_ci": 106, + "utf16_estonian_ci": 107, + "utf16_spanish_ci": 108, + "utf16_swedish_ci": 109, + "utf16_turkish_ci": 110, + "utf16_czech_ci": 111, + "utf16_danish_ci": 112, + "utf16_lithuanian_ci": 113, + "utf16_slovak_ci": 114, + "utf16_spanish2_ci": 115, + "utf16_roman_ci": 116, + "utf16_persian_ci": 117, + "utf16_esperanto_ci": 118, + "utf16_hungarian_ci": 119, + "utf16_sinhala_ci": 120, + "utf16_german2_ci": 121, + "utf16_croatian_ci": 122, + "utf16_unicode_520_ci": 123, + "utf16_vietnamese_ci": 124, + "ucs2_unicode_ci": 128, + "ucs2_icelandic_ci": 129, + "ucs2_latvian_ci": 130, + "ucs2_romanian_ci": 131, + "ucs2_slovenian_ci": 132, + "ucs2_polish_ci": 133, + "ucs2_estonian_ci": 134, + "ucs2_spanish_ci": 135, + "ucs2_swedish_ci": 136, + "ucs2_turkish_ci": 137, + "ucs2_czech_ci": 138, + "ucs2_danish_ci": 139, + "ucs2_lithuanian_ci": 140, + "ucs2_slovak_ci": 141, + "ucs2_spanish2_ci": 142, + "ucs2_roman_ci": 143, + "ucs2_persian_ci": 144, + "ucs2_esperanto_ci": 145, + "ucs2_hungarian_ci": 146, + "ucs2_sinhala_ci": 147, + "ucs2_german2_ci": 148, + "ucs2_croatian_ci": 149, + "ucs2_unicode_520_ci": 150, + "ucs2_vietnamese_ci": 151, + "ucs2_general_mysql500_ci": 159, + "utf32_unicode_ci": 160, + "utf32_icelandic_ci": 161, + "utf32_latvian_ci": 162, + "utf32_romanian_ci": 163, + "utf32_slovenian_ci": 164, + "utf32_polish_ci": 165, + "utf32_estonian_ci": 166, + "utf32_spanish_ci": 167, + "utf32_swedish_ci": 168, + "utf32_turkish_ci": 169, + "utf32_czech_ci": 170, + "utf32_danish_ci": 171, + "utf32_lithuanian_ci": 172, + "utf32_slovak_ci": 173, + "utf32_spanish2_ci": 174, + "utf32_roman_ci": 175, + "utf32_persian_ci": 176, + "utf32_esperanto_ci": 177, + "utf32_hungarian_ci": 178, + "utf32_sinhala_ci": 179, + "utf32_german2_ci": 180, + "utf32_croatian_ci": 181, + "utf32_unicode_520_ci": 182, + "utf32_vietnamese_ci": 183, + "utf8_unicode_ci": 192, + "utf8_icelandic_ci": 193, + "utf8_latvian_ci": 194, + "utf8_romanian_ci": 195, + "utf8_slovenian_ci": 196, + "utf8_polish_ci": 197, + "utf8_estonian_ci": 198, + "utf8_spanish_ci": 199, + "utf8_swedish_ci": 200, + "utf8_turkish_ci": 201, + "utf8_czech_ci": 202, + "utf8_danish_ci": 203, + "utf8_lithuanian_ci": 204, + "utf8_slovak_ci": 205, + "utf8_spanish2_ci": 206, + "utf8_roman_ci": 207, + "utf8_persian_ci": 208, + "utf8_esperanto_ci": 209, + "utf8_hungarian_ci": 210, + "utf8_sinhala_ci": 211, + "utf8_german2_ci": 212, + "utf8_croatian_ci": 213, + "utf8_unicode_520_ci": 214, + "utf8_vietnamese_ci": 215, + "utf8_general_mysql500_ci": 223, + "utf8mb4_unicode_ci": 224, + "utf8mb4_icelandic_ci": 225, + "utf8mb4_latvian_ci": 226, + "utf8mb4_romanian_ci": 227, + "utf8mb4_slovenian_ci": 228, + "utf8mb4_polish_ci": 229, + "utf8mb4_estonian_ci": 230, + "utf8mb4_spanish_ci": 231, + "utf8mb4_swedish_ci": 232, + "utf8mb4_turkish_ci": 233, + "utf8mb4_czech_ci": 234, + "utf8mb4_danish_ci": 235, + "utf8mb4_lithuanian_ci": 236, + "utf8mb4_slovak_ci": 237, + "utf8mb4_spanish2_ci": 238, + "utf8mb4_roman_ci": 239, + "utf8mb4_persian_ci": 240, + "utf8mb4_esperanto_ci": 241, + "utf8mb4_hungarian_ci": 242, + "utf8mb4_sinhala_ci": 243, + "utf8mb4_german2_ci": 244, + "utf8mb4_croatian_ci": 245, + "utf8mb4_unicode_520_ci": 246, + "utf8mb4_vietnamese_ci": 247, +} + +// MySQL collation information. +const ( + UTF8Charset = "utf8" + UTF8MB4Charset = "utf8mb4" + DefaultCharset = UTF8Charset + DefaultCollationID = 83 + BinaryCollationID = 63 + UTF8DefaultCollation = "utf8_bin" + DefaultCollationName = UTF8DefaultCollation + + // MaxBytesOfCharacter, is the max bytes length of a character, + // refer to RFC3629, in UTF-8, characters from the U+0000..U+10FFFF range + // (the UTF-16 accessible range) are encoded using sequences of 1 to 4 octets. + MaxBytesOfCharacter = 4 +) + +// IsUTF8Charset checks if charset is utf8 or utf8mb4 +func IsUTF8Charset(charset string) bool { + return charset == UTF8Charset || charset == UTF8MB4Charset +} + +// RangeGraph defines valid unicode characters to use in column names. It strictly follows MySQL's definition. +// See #3994. +var RangeGraph = []*unicode.RangeTable{ + // _MY_PNT + unicode.No, + unicode.Mn, + unicode.Me, + unicode.Pc, + unicode.Pd, + unicode.Pd, + unicode.Ps, + unicode.Pe, + unicode.Pi, + unicode.Pf, + unicode.Po, + unicode.Sm, + unicode.Sc, + unicode.Sk, + unicode.So, + // _MY_U + unicode.Lu, + unicode.Lt, + unicode.Nl, + // _MY_L + unicode.Ll, + unicode.Lm, + unicode.Lo, + unicode.Nl, + unicode.Mn, + unicode.Mc, + unicode.Me, + // _MY_NMR + unicode.Nd, + unicode.Nl, + unicode.No, +} diff --git a/mysql/const.go b/mysql/const.go new file mode 100644 index 000000000..47623f180 --- /dev/null +++ b/mysql/const.go @@ -0,0 +1,695 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "fmt" + "strings" +) + +func newInvalidModeErr(s string) error { + return NewErr(ErrWrongValueForVar, "sql_mode", s) +} + +// Version information. +var ( + // TiDBReleaseVersion is initialized by (git describe --tags) in Makefile. + TiDBReleaseVersion = "None" + + // ServerVersion is the version information of this tidb-server in MySQL's format. + ServerVersion = fmt.Sprintf("5.7.10-TiDB-%s", TiDBReleaseVersion) +) + +// Header information. +const ( + OKHeader byte = 0x00 + ErrHeader byte = 0xff + EOFHeader byte = 0xfe + LocalInFileHeader byte = 0xfb +) + +// Server information. +const ( + ServerStatusInTrans uint16 = 0x0001 + ServerStatusAutocommit uint16 = 0x0002 + ServerMoreResultsExists uint16 = 0x0008 + ServerStatusNoGoodIndexUsed uint16 = 0x0010 + ServerStatusNoIndexUsed uint16 = 0x0020 + ServerStatusCursorExists uint16 = 0x0040 + ServerStatusLastRowSend uint16 = 0x0080 + ServerStatusDBDropped uint16 = 0x0100 + ServerStatusNoBackslashEscaped uint16 = 0x0200 + ServerStatusMetadataChanged uint16 = 0x0400 + ServerStatusWasSlow uint16 = 0x0800 + ServerPSOutParams uint16 = 0x1000 +) + +// HasCursorExistsFlag return true if cursor exists indicated by server status. +func HasCursorExistsFlag(serverStatus uint16) bool { + return serverStatus&ServerStatusCursorExists > 0 +} + +// Identifier length limitations. +// See https://dev.mysql.com/doc/refman/5.7/en/identifiers.html +const ( + // MaxPayloadLen is the max packet payload length. + MaxPayloadLen = 1<<24 - 1 + // MaxTableNameLength is max length of table name identifier. + MaxTableNameLength = 64 + // MaxDatabaseNameLength is max length of database name identifier. + MaxDatabaseNameLength = 64 + // MaxColumnNameLength is max length of column name identifier. + MaxColumnNameLength = 64 + // MaxKeyParts is max length of key parts. + MaxKeyParts = 16 + // MaxIndexIdentifierLen is max length of index identifier. + MaxIndexIdentifierLen = 64 + // MaxConstraintIdentifierLen is max length of constrain identifier. + MaxConstraintIdentifierLen = 64 + // MaxViewIdentifierLen is max length of view identifier. + MaxViewIdentifierLen = 64 + // MaxAliasIdentifierLen is max length of alias identifier. + MaxAliasIdentifierLen = 256 + // MaxUserDefinedVariableLen is max length of user-defined variable. + MaxUserDefinedVariableLen = 64 +) + +// ErrTextLength error text length limit. +const ErrTextLength = 80 + +// Command information. +const ( + ComSleep byte = iota + ComQuit + ComInitDB + ComQuery + ComFieldList + ComCreateDB + ComDropDB + ComRefresh + ComShutdown + ComStatistics + ComProcessInfo + ComConnect + ComProcessKill + ComDebug + ComPing + ComTime + ComDelayedInsert + ComChangeUser + ComBinlogDump + ComTableDump + ComConnectOut + ComRegisterSlave + ComStmtPrepare + ComStmtExecute + ComStmtSendLongData + ComStmtClose + ComStmtReset + ComSetOption + ComStmtFetch + ComDaemon + ComBinlogDumpGtid + ComResetConnection + ComEnd +) + +// Client information. +const ( + ClientLongPassword uint32 = 1 << iota + ClientFoundRows + ClientLongFlag + ClientConnectWithDB + ClientNoSchema + ClientCompress + ClientODBC + ClientLocalFiles + ClientIgnoreSpace + ClientProtocol41 + ClientInteractive + ClientSSL + ClientIgnoreSigpipe + ClientTransactions + ClientReserved + ClientSecureConnection + ClientMultiStatements + ClientMultiResults + ClientPSMultiResults + ClientPluginAuth + ClientConnectAtts + ClientPluginAuthLenencClientData +) + +// Cache type information. +const ( + TypeNoCache byte = 0xff +) + +// Auth name information. +const ( + AuthName = "mysql_native_password" +) + +// MySQL database and tables. +const ( + // SystemDB is the name of system database. + SystemDB = "mysql" + // UserTable is the table in system db contains user info. + UserTable = "User" + // DBTable is the table in system db contains db scope privilege info. + DBTable = "DB" + // TablePrivTable is the table in system db contains table scope privilege info. + TablePrivTable = "Tables_priv" + // ColumnPrivTable is the table in system db contains column scope privilege info. + ColumnPrivTable = "Columns_priv" + // GlobalVariablesTable is the table contains global system variables. + GlobalVariablesTable = "GLOBAL_VARIABLES" + // GlobalStatusTable is the table contains global status variables. + GlobalStatusTable = "GLOBAL_STATUS" + // TiDBTable is the table contains tidb info. + TiDBTable = "tidb" +) + +// PrivilegeType privilege +type PrivilegeType uint32 + +const ( + _ PrivilegeType = 1 << iota + // CreatePriv is the privilege to create schema/table. + CreatePriv + // SelectPriv is the privilege to read from table. + SelectPriv + // InsertPriv is the privilege to insert data into table. + InsertPriv + // UpdatePriv is the privilege to update data in table. + UpdatePriv + // DeletePriv is the privilege to delete data from table. + DeletePriv + // ShowDBPriv is the privilege to run show databases statement. + ShowDBPriv + // SuperPriv enables many operations and server behaviors. + SuperPriv + // CreateUserPriv is the privilege to create user. + CreateUserPriv + // TriggerPriv is not checked yet. + TriggerPriv + // DropPriv is the privilege to drop schema/table. + DropPriv + // ProcessPriv pertains to display of information about the threads executing within the server. + ProcessPriv + // GrantPriv is the privilege to grant privilege to user. + GrantPriv + // ReferencesPriv is not checked yet. + ReferencesPriv + // AlterPriv is the privilege to run alter statement. + AlterPriv + // ExecutePriv is the privilege to run execute statement. + ExecutePriv + // IndexPriv is the privilege to create/drop index. + IndexPriv + // AllPriv is the privilege for all actions. + AllPriv +) + +// AllPrivMask is the mask for PrivilegeType with all bits set to 1. +// If it's passed to RequestVerification, it means any privilege would be OK. +const AllPrivMask = AllPriv - 1 + +// MySQL type maximum length. +const ( + // For arguments that have no fixed number of decimals, the decimals value is set to 31, + // which is 1 more than the maximum number of decimals permitted for the DECIMAL, FLOAT, and DOUBLE data types. + NotFixedDec = 31 + + MaxIntWidth = 20 + MaxRealWidth = 23 + MaxFloatingTypeScale = 30 + MaxFloatingTypeWidth = 255 + MaxDecimalScale = 30 + MaxDecimalWidth = 65 + MaxDateWidth = 10 // YYYY-MM-DD. + MaxDatetimeWidthNoFsp = 19 // YYYY-MM-DD HH:MM:SS + MaxDatetimeWidthWithFsp = 26 // YYYY-MM-DD HH:MM:SS[.fraction] + MaxDatetimeFullWidth = 29 // YYYY-MM-DD HH:MM:SS.###### AM + MaxDurationWidthNoFsp = 10 // HH:MM:SS + MaxDurationWidthWithFsp = 15 // HH:MM:SS[.fraction] + MaxBlobWidth = 16777216 +) + +// MySQL max type field length. +const ( + MaxFieldCharLength = 255 + MaxFieldVarCharLength = 65535 +) + +// MaxTypeSetMembers is the number of set members. +const MaxTypeSetMembers = 64 + +// PWDHashLen is the length of password's hash. +const PWDHashLen = 40 + +// Priv2UserCol is the privilege to mysql.user table column name. +var Priv2UserCol = map[PrivilegeType]string{ + CreatePriv: "Create_priv", + SelectPriv: "Select_priv", + InsertPriv: "Insert_priv", + UpdatePriv: "Update_priv", + DeletePriv: "Delete_priv", + ShowDBPriv: "Show_db_priv", + SuperPriv: "Super_priv", + CreateUserPriv: "Create_user_priv", + TriggerPriv: "Trigger_priv", + DropPriv: "Drop_priv", + ProcessPriv: "Process_priv", + GrantPriv: "Grant_priv", + ReferencesPriv: "References_priv", + AlterPriv: "Alter_priv", + ExecutePriv: "Execute_priv", + IndexPriv: "Index_priv", +} + +// Command2Str is the command information to command name. +var Command2Str = map[byte]string{ + ComSleep: "Sleep", + ComQuit: "Quit", + ComInitDB: "Init DB", + ComQuery: "Query", + ComFieldList: "Field List", + ComCreateDB: "Create DB", + ComDropDB: "Drop DB", + ComRefresh: "Refresh", + ComShutdown: "Shutdown", + ComStatistics: "Statistics", + ComProcessInfo: "Processlist", + ComConnect: "Connect", + ComProcessKill: "Kill", + ComDebug: "Debug", + ComPing: "Ping", + ComTime: "Time", + ComDelayedInsert: "Delayed Insert", + ComChangeUser: "Change User", + ComBinlogDump: "Binlog Dump", + ComTableDump: "Table Dump", + ComConnectOut: "Connect out", + ComRegisterSlave: "Register Slave", + ComStmtPrepare: "Prepare", + ComStmtExecute: "Execute", + ComStmtSendLongData: "Long Data", + ComStmtClose: "Close stmt", + ComStmtReset: "Reset stmt", + ComSetOption: "Set option", + ComStmtFetch: "Fetch", + ComDaemon: "Daemon", + ComBinlogDumpGtid: "Binlog Dump", + ComResetConnection: "Reset connect", +} + +// Col2PrivType is the privilege tables column name to privilege type. +var Col2PrivType = map[string]PrivilegeType{ + "Create_priv": CreatePriv, + "Select_priv": SelectPriv, + "Insert_priv": InsertPriv, + "Update_priv": UpdatePriv, + "Delete_priv": DeletePriv, + "Show_db_priv": ShowDBPriv, + "Super_priv": SuperPriv, + "Create_user_priv": CreateUserPriv, + "Trigger_priv": TriggerPriv, + "Drop_priv": DropPriv, + "Process_priv": ProcessPriv, + "Grant_priv": GrantPriv, + "References_priv": ReferencesPriv, + "Alter_priv": AlterPriv, + "Execute_priv": ExecutePriv, + "Index_priv": IndexPriv, +} + +// AllGlobalPrivs is all the privileges in global scope. +var AllGlobalPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, ProcessPriv, GrantPriv, ReferencesPriv, AlterPriv, ShowDBPriv, SuperPriv, ExecutePriv, IndexPriv, CreateUserPriv, TriggerPriv} + +// Priv2Str is the map for privilege to string. +var Priv2Str = map[PrivilegeType]string{ + CreatePriv: "Create", + SelectPriv: "Select", + InsertPriv: "Insert", + UpdatePriv: "Update", + DeletePriv: "Delete", + ShowDBPriv: "Show Databases", + SuperPriv: "Super", + CreateUserPriv: "Create User", + TriggerPriv: "Trigger", + DropPriv: "Drop", + ProcessPriv: "Process", + GrantPriv: "Grant Option", + ReferencesPriv: "References", + AlterPriv: "Alter", + ExecutePriv: "Execute", + IndexPriv: "Index", +} + +// Priv2SetStr is the map for privilege to string. +var Priv2SetStr = map[PrivilegeType]string{ + CreatePriv: "Create", + SelectPriv: "Select", + InsertPriv: "Insert", + UpdatePriv: "Update", + DeletePriv: "Delete", + DropPriv: "Drop", + GrantPriv: "Grant", + AlterPriv: "Alter", + ExecutePriv: "Execute", + IndexPriv: "Index", +} + +// SetStr2Priv is the map for privilege set string to privilege type. +var SetStr2Priv = map[string]PrivilegeType{ + "Create": CreatePriv, + "Select": SelectPriv, + "Insert": InsertPriv, + "Update": UpdatePriv, + "Delete": DeletePriv, + "Drop": DropPriv, + "Grant": GrantPriv, + "Alter": AlterPriv, + "Execute": ExecutePriv, + "Index": IndexPriv, +} + +// AllDBPrivs is all the privileges in database scope. +var AllDBPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, GrantPriv, AlterPriv, ExecutePriv, IndexPriv} + +// AllTablePrivs is all the privileges in table scope. +var AllTablePrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, GrantPriv, AlterPriv, IndexPriv} + +// AllColumnPrivs is all the privileges in column scope. +var AllColumnPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv} + +// AllPrivilegeLiteral is the string literal for All Privilege. +const AllPrivilegeLiteral = "ALL PRIVILEGES" + +// DefaultSQLMode for GLOBAL_VARIABLES +const DefaultSQLMode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" + +// DefaultLengthOfMysqlTypes is the map for default physical length of MySQL data types. +// See http://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html +var DefaultLengthOfMysqlTypes = map[byte]int{ + TypeYear: 1, + TypeDate: 3, + TypeDuration: 3, + TypeDatetime: 8, + TypeTimestamp: 4, + + TypeTiny: 1, + TypeShort: 2, + TypeInt24: 3, + TypeLong: 4, + TypeLonglong: 8, + TypeFloat: 4, + TypeDouble: 8, + + TypeEnum: 2, + TypeString: 1, + TypeSet: 8, +} + +// DefaultLengthOfTimeFraction is the map for default physical length of time fractions. +var DefaultLengthOfTimeFraction = map[int]int{ + 0: 0, + + 1: 1, + 2: 1, + + 3: 2, + 4: 2, + + 5: 3, + 6: 3, +} + +// SQLMode is the type for MySQL sql_mode. +// See https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html +type SQLMode int + +// HasNoZeroDateMode detects if 'NO_ZERO_DATE' mode is set in SQLMode +func (m SQLMode) HasNoZeroDateMode() bool { + return m&ModeNoZeroDate == ModeNoZeroDate +} + +// HasNoZeroInDateMode detects if 'NO_ZERO_IN_DATE' mode is set in SQLMode +func (m SQLMode) HasNoZeroInDateMode() bool { + return m&ModeNoZeroInDate == ModeNoZeroInDate +} + +// HasErrorForDivisionByZeroMode detects if 'ERROR_FOR_DIVISION_BY_ZERO' mode is set in SQLMode +func (m SQLMode) HasErrorForDivisionByZeroMode() bool { + return m&ModeErrorForDivisionByZero == ModeErrorForDivisionByZero +} + +// HasOnlyFullGroupBy detects if 'ONLY_FULL_GROUP_BY' mode is set in SQLMode +func (m SQLMode) HasOnlyFullGroupBy() bool { + return m&ModeOnlyFullGroupBy == ModeOnlyFullGroupBy +} + +// HasStrictMode detects if 'STRICT_TRANS_TABLES' or 'STRICT_ALL_TABLES' mode is set in SQLMode +func (m SQLMode) HasStrictMode() bool { + return m&ModeStrictTransTables == ModeStrictTransTables || m&ModeStrictAllTables == ModeStrictAllTables +} + +// HasPipesAsConcatMode detects if 'PIPES_AS_CONCAT' mode is set in SQLMode +func (m SQLMode) HasPipesAsConcatMode() bool { + return m&ModePipesAsConcat == ModePipesAsConcat +} + +// HasNoUnsignedSubtractionMode detects if 'NO_UNSIGNED_SUBTRACTION' mode is set in SQLMode +func (m SQLMode) HasNoUnsignedSubtractionMode() bool { + return m&ModeNoUnsignedSubtraction == ModeNoUnsignedSubtraction +} + +// HasHighNotPrecedenceMode detects if 'HIGH_NOT_PRECEDENCE' mode is set in SQLMode +func (m SQLMode) HasHighNotPrecedenceMode() bool { + return m&ModeHighNotPrecedence == ModeHighNotPrecedence +} + +// HasANSIQuotesMode detects if 'ANSI_QUOTES' mode is set in SQLMode +func (m SQLMode) HasANSIQuotesMode() bool { + return m&ModeANSIQuotes == ModeANSIQuotes +} + +// HasRealAsFloatMode detects if 'REAL_AS_FLOAT' mode is set in SQLMode +func (m SQLMode) HasRealAsFloatMode() bool { + return m&ModeRealAsFloat == ModeRealAsFloat +} + +// HasPadCharToFullLengthMode detects if 'PAD_CHAR_TO_FULL_LENGTH' mode is set in SQLMode +func (m SQLMode) HasPadCharToFullLengthMode() bool { + return m&ModePadCharToFullLength == ModePadCharToFullLength +} + +// HasNoBackslashEscapesMode detects if 'NO_BACKSLASH_ESCAPES' mode is set in SQLMode +func (m SQLMode) HasNoBackslashEscapesMode() bool { + return m&ModeNoBackslashEscapes == ModeNoBackslashEscapes +} + +// HasIgnoreSpaceMode detects if 'IGNORE_SPACE' mode is set in SQLMode +func (m SQLMode) HasIgnoreSpaceMode() bool { + return m&ModeIgnoreSpace == ModeIgnoreSpace +} + +// consts for sql modes. +const ( + ModeNone SQLMode = 0 + ModeRealAsFloat SQLMode = 1 << iota + ModePipesAsConcat + ModeANSIQuotes + ModeIgnoreSpace + ModeNotUsed + ModeOnlyFullGroupBy + ModeNoUnsignedSubtraction + ModeNoDirInCreate + ModePostgreSQL + ModeOracle + ModeMsSQL + ModeDb2 + ModeMaxdb + ModeNoKeyOptions + ModeNoTableOptions + ModeNoFieldOptions + ModeMySQL323 + ModeMySQL40 + ModeANSI + ModeNoAutoValueOnZero + ModeNoBackslashEscapes + ModeStrictTransTables + ModeStrictAllTables + ModeNoZeroInDate + ModeNoZeroDate + ModeInvalidDates + ModeErrorForDivisionByZero + ModeTraditional + ModeNoAutoCreateUser + ModeHighNotPrecedence + ModeNoEngineSubstitution + ModePadCharToFullLength +) + +// FormatSQLModeStr re-format 'SQL_MODE' variable. +func FormatSQLModeStr(s string) string { + s = strings.ToUpper(strings.TrimRight(s, " ")) + parts := strings.Split(s, ",") + var nonEmptyParts []string + existParts := make(map[string]string) + for _, part := range parts { + if len(part) == 0 { + continue + } + if modeParts, ok := CombinationSQLMode[part]; ok { + for _, modePart := range modeParts { + if _, exist := existParts[modePart]; !exist { + nonEmptyParts = append(nonEmptyParts, modePart) + existParts[modePart] = modePart + } + } + } + if _, exist := existParts[part]; !exist { + nonEmptyParts = append(nonEmptyParts, part) + existParts[part] = part + } + } + return strings.Join(nonEmptyParts, ",") +} + +// GetSQLMode gets the sql mode for string literal. SQL_mode is a list of different modes separated by commas. +// The input string must be formatted by 'FormatSQLModeStr' +func GetSQLMode(s string) (SQLMode, error) { + strs := strings.Split(s, ",") + var sqlMode SQLMode + for i, length := 0, len(strs); i < length; i++ { + mode, ok := Str2SQLMode[strs[i]] + if !ok && strs[i] != "" { + return sqlMode, newInvalidModeErr(strs[i]) + } + sqlMode = sqlMode | mode + } + return sqlMode, nil +} + +// Str2SQLMode is the string represent of sql_mode to sql_mode map. +var Str2SQLMode = map[string]SQLMode{ + "REAL_AS_FLOAT": ModeRealAsFloat, + "PIPES_AS_CONCAT": ModePipesAsConcat, + "ANSI_QUOTES": ModeANSIQuotes, + "IGNORE_SPACE": ModeIgnoreSpace, + "NOT_USED": ModeNotUsed, + "ONLY_FULL_GROUP_BY": ModeOnlyFullGroupBy, + "NO_UNSIGNED_SUBTRACTION": ModeNoUnsignedSubtraction, + "NO_DIR_IN_CREATE": ModeNoDirInCreate, + "POSTGRESQL": ModePostgreSQL, + "ORACLE": ModeOracle, + "MSSQL": ModeMsSQL, + "DB2": ModeDb2, + "MAXDB": ModeMaxdb, + "NO_KEY_OPTIONS": ModeNoKeyOptions, + "NO_TABLE_OPTIONS": ModeNoTableOptions, + "NO_FIELD_OPTIONS": ModeNoFieldOptions, + "MYSQL323": ModeMySQL323, + "MYSQL40": ModeMySQL40, + "ANSI": ModeANSI, + "NO_AUTO_VALUE_ON_ZERO": ModeNoAutoValueOnZero, + "NO_BACKSLASH_ESCAPES": ModeNoBackslashEscapes, + "STRICT_TRANS_TABLES": ModeStrictTransTables, + "STRICT_ALL_TABLES": ModeStrictAllTables, + "NO_ZERO_IN_DATE": ModeNoZeroInDate, + "NO_ZERO_DATE": ModeNoZeroDate, + "INVALID_DATES": ModeInvalidDates, + "ERROR_FOR_DIVISION_BY_ZERO": ModeErrorForDivisionByZero, + "TRADITIONAL": ModeTraditional, + "NO_AUTO_CREATE_USER": ModeNoAutoCreateUser, + "HIGH_NOT_PRECEDENCE": ModeHighNotPrecedence, + "NO_ENGINE_SUBSTITUTION": ModeNoEngineSubstitution, + "PAD_CHAR_TO_FULL_LENGTH": ModePadCharToFullLength, +} + +// CombinationSQLMode is the special modes that provided as shorthand for combinations of mode values. +// See https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-combo. +var CombinationSQLMode = map[string][]string{ + "ANSI": {"REAL_AS_FLOAT", "PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "ONLY_FULL_GROUP_BY"}, + "DB2": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS"}, + "MAXDB": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS", "NO_AUTO_CREATE_USER"}, + "MSSQL": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS"}, + "MYSQL323": {"MYSQL323", "HIGH_NOT_PRECEDENCE"}, + "MYSQL40": {"MYSQL40", "HIGH_NOT_PRECEDENCE"}, + "ORACLE": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS", "NO_AUTO_CREATE_USER"}, + "POSTGRESQL": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS"}, + "TRADITIONAL": {"STRICT_TRANS_TABLES", "STRICT_ALL_TABLES", "NO_ZERO_IN_DATE", "NO_ZERO_DATE", "ERROR_FOR_DIVISION_BY_ZERO", "NO_AUTO_CREATE_USER", "NO_ENGINE_SUBSTITUTION"}, +} + +// FormatFunc is the locale format function signature. +type FormatFunc func(string, string) (string, error) + +// GetLocaleFormatFunction get the format function for sepcific locale. +func GetLocaleFormatFunction(loc string) FormatFunc { + locale, exist := locale2FormatFunction[loc] + if !exist { + return formatNotSupport + } + return locale +} + +// locale2FormatFunction is the string represent of locale format function. +var locale2FormatFunction = map[string]FormatFunc{ + "en_US": formatENUS, + "zh_CN": formatZHCN, +} + +// PriorityEnum is defined for Priority const values. +type PriorityEnum int + +// Priority const values. +// See https://dev.mysql.com/doc/refman/5.7/en/insert.html +const ( + NoPriority PriorityEnum = iota + LowPriority + HighPriority + DelayedPriority +) + +// Priority2Str is used to convert the statement priority to string. +var Priority2Str = map[PriorityEnum]string{ + NoPriority: "NO_PRIORITY", + LowPriority: "LOW_PRIORITY", + HighPriority: "HIGH_PRIORITY", + DelayedPriority: "DELAYED", +} + +// Str2Priority is used to convert a string to a priority. +func Str2Priority(val string) PriorityEnum { + val = strings.ToUpper(val) + switch val { + case "NO_PRIORITY": + return NoPriority + case "HIGH_PRIORITY": + return HighPriority + case "LOW_PRIORITY": + return LowPriority + case "DELAYED": + return DelayedPriority + default: + return NoPriority + } +} + +// PrimaryKeyName defines primary key name. +const ( + PrimaryKeyName = "PRIMARY" +) diff --git a/mysql/const_test.go b/mysql/const_test.go new file mode 100644 index 000000000..4ad54fd5d --- /dev/null +++ b/mysql/const_test.go @@ -0,0 +1,321 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql_test + +import ( + "flag" + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/mysql" + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/util/testleak" + "golang.org/x/net/context" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testMySQLConstSuite{}) + +type testMySQLConstSuite struct { + cluster *mocktikv.Cluster + mvccStore mocktikv.MVCCStore + store kv.Storage + dom *domain.Domain + *parser.Parser +} + +var mockTikv = flag.Bool("mockTikv", true, "use mock tikv store in executor test") + +func (s *testMySQLConstSuite) SetUpSuite(c *C) { + s.Parser = parser.New() + flag.Lookup("mockTikv") + useMockTikv := *mockTikv + if useMockTikv { + s.cluster = mocktikv.NewCluster() + mocktikv.BootstrapWithSingleStore(s.cluster) + s.mvccStore = mocktikv.MustNewMVCCStore() + store, err := mockstore.NewMockTikvStore( + mockstore.WithCluster(s.cluster), + mockstore.WithMVCCStore(s.mvccStore), + ) + c.Assert(err, IsNil) + s.store = store + session.SetSchemaLease(0) + session.SetStatsLease(0) + } + var err error + s.dom, err = session.BootstrapSession(s.store) + c.Assert(err, IsNil) +} + +func (s *testMySQLConstSuite) TearDownSuite(c *C) { + s.dom.Close() + s.store.Close() + testleak.AfterTest(c)() +} + +func (s *testMySQLConstSuite) TestGetSQLMode(c *C) { + positiveCases := []struct { + arg string + }{ + {"NO_ZERO_DATE"}, + {",,NO_ZERO_DATE"}, + {"NO_ZERO_DATE,NO_ZERO_IN_DATE"}, + {""}, + {", "}, + {","}, + } + + for _, t := range positiveCases { + _, err := mysql.GetSQLMode(mysql.FormatSQLModeStr(t.arg)) + c.Assert(err, IsNil) + } + + negativeCases := []struct { + arg string + }{ + {"NO_ZERO_DATE, NO_ZERO_IN_DATE"}, + {"NO_ZERO_DATE,adfadsdfasdfads"}, + {", ,NO_ZERO_DATE"}, + {" ,"}, + } + + for _, t := range negativeCases { + _, err := mysql.GetSQLMode(mysql.FormatSQLModeStr(t.arg)) + c.Assert(err, NotNil) + } +} + +func (s *testMySQLConstSuite) TestSQLMode(c *C) { + tests := []struct { + arg string + hasNoZeroDateMode bool + hasNoZeroInDateMode bool + hasErrorForDivisionByZeroMode bool + }{ + {"NO_ZERO_DATE", true, false, false}, + {"NO_ZERO_IN_DATE", false, true, false}, + {"ERROR_FOR_DIVISION_BY_ZERO", false, false, true}, + {"NO_ZERO_IN_DATE,NO_ZERO_DATE", true, true, false}, + {"NO_ZERO_DATE,NO_ZERO_IN_DATE", true, true, false}, + {"NO_ZERO_DATE,NO_ZERO_IN_DATE", true, true, false}, + {"NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO", true, true, true}, + {"NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO", false, true, true}, + {"", false, false, false}, + } + + for _, t := range tests { + sqlMode, _ := mysql.GetSQLMode(t.arg) + c.Assert(sqlMode.HasNoZeroDateMode(), Equals, t.hasNoZeroDateMode) + c.Assert(sqlMode.HasNoZeroInDateMode(), Equals, t.hasNoZeroInDateMode) + c.Assert(sqlMode.HasErrorForDivisionByZeroMode(), Equals, t.hasErrorForDivisionByZeroMode) + } +} + +func (s *testMySQLConstSuite) TestRealAsFloatMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a real);") + result := tk.MustQuery("desc t") + c.Check(result.Rows(), HasLen, 1) + row := result.Rows()[0] + c.Assert(row[1], Equals, "double") + + tk.MustExec("drop table if exists t;") + tk.MustExec("set sql_mode='REAL_AS_FLOAT'") + tk.MustExec("create table t (a real)") + result = tk.MustQuery("desc t") + c.Check(result.Rows(), HasLen, 1) + row = result.Rows()[0] + c.Assert(row[1], Equals, "float") +} + +func (s *testMySQLConstSuite) TestPipesAsConcatMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("SET sql_mode='PIPES_AS_CONCAT';") + r := tk.MustQuery(`SELECT 'hello' || 'world';`) + r.Check(testkit.Rows("helloworld")) +} + +func (s *testMySQLConstSuite) TestNoUnsignedSubtractionMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + ctx := context.Background() + tk.MustExec("set sql_mode='NO_UNSIGNED_SUBTRACTION'") + r := tk.MustQuery("SELECT CAST(0 as UNSIGNED) - 1;") + r.Check(testkit.Rows("-1")) + rs, _ := tk.Exec("SELECT CAST(18446744073709551615 as UNSIGNED) - 1;") + _, err := session.GetRows4Test(ctx, tk.Se, rs) + c.Assert(err, NotNil) + c.Assert(rs.Close(), IsNil) + rs, _ = tk.Exec("SELECT 1 - CAST(18446744073709551615 as UNSIGNED);") + _, err = session.GetRows4Test(ctx, tk.Se, rs) + c.Assert(err, NotNil) + c.Assert(rs.Close(), IsNil) + rs, _ = tk.Exec("SELECT CAST(-1 as UNSIGNED) - 1") + _, err = session.GetRows4Test(ctx, tk.Se, rs) + c.Assert(err, NotNil) + c.Assert(rs.Close(), IsNil) + rs, _ = tk.Exec("SELECT CAST(9223372036854775808 as UNSIGNED) - 1") + _, err = session.GetRows4Test(ctx, tk.Se, rs) + c.Assert(err, NotNil) + c.Assert(rs.Close(), IsNil) +} + +func (s *testMySQLConstSuite) TestHighNotPrecedenceMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a int);") + tk.MustExec("insert into t1 values (0),(1),(NULL);") + r := tk.MustQuery(`SELECT * FROM t1 WHERE NOT a BETWEEN 2 AND 3;`) + r.Check(testkit.Rows("0", "1")) + r = tk.MustQuery(`SELECT NOT 1 BETWEEN -5 AND 5;`) + r.Check(testkit.Rows("0")) + tk.MustExec("set sql_mode='high_not_precedence';") + r = tk.MustQuery(`SELECT * FROM t1 WHERE NOT a BETWEEN 2 AND 3;`) + r.Check(testkit.Rows()) + r = tk.MustQuery(`SELECT NOT 1 BETWEEN -5 AND 5;`) + r.Check(testkit.Rows("1")) +} + +func (s *testMySQLConstSuite) TestIgnoreSpaceMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set sql_mode=''") + tk.MustExec("CREATE TABLE COUNT (a bigint);") + tk.MustExec("DROP TABLE COUNT;") + tk.MustExec("CREATE TABLE `COUNT` (a bigint);") + tk.MustExec("DROP TABLE COUNT;") + _, err := tk.Exec("CREATE TABLE COUNT(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.COUNT(a bigint);") + tk.MustExec("DROP TABLE COUNT;") + + tk.MustExec("CREATE TABLE BIT_AND (a bigint);") + tk.MustExec("DROP TABLE BIT_AND;") + tk.MustExec("CREATE TABLE `BIT_AND` (a bigint);") + tk.MustExec("DROP TABLE BIT_AND;") + _, err = tk.Exec("CREATE TABLE BIT_AND(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.BIT_AND(a bigint);") + tk.MustExec("DROP TABLE BIT_AND;") + + tk.MustExec("CREATE TABLE NOW (a bigint);") + tk.MustExec("DROP TABLE NOW;") + tk.MustExec("CREATE TABLE `NOW` (a bigint);") + tk.MustExec("DROP TABLE NOW;") + _, err = tk.Exec("CREATE TABLE NOW(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.NOW(a bigint);") + tk.MustExec("DROP TABLE NOW;") + + tk.MustExec("set sql_mode='IGNORE_SPACE'") + _, err = tk.Exec("CREATE TABLE COUNT (a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE `COUNT` (a bigint);") + tk.MustExec("DROP TABLE COUNT;") + _, err = tk.Exec("CREATE TABLE COUNT(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.COUNT(a bigint);") + tk.MustExec("DROP TABLE COUNT;") + + _, err = tk.Exec("CREATE TABLE BIT_AND (a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE `BIT_AND` (a bigint);") + tk.MustExec("DROP TABLE BIT_AND;") + _, err = tk.Exec("CREATE TABLE BIT_AND(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.BIT_AND(a bigint);") + tk.MustExec("DROP TABLE BIT_AND;") + + _, err = tk.Exec("CREATE TABLE NOW (a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE `NOW` (a bigint);") + tk.MustExec("DROP TABLE NOW;") + _, err = tk.Exec("CREATE TABLE NOW(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.NOW(a bigint);") + tk.MustExec("DROP TABLE NOW;") + +} + +func (s *testMySQLConstSuite) TestPadCharToFullLengthMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // test type `CHAR(n)` + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a char(10));") + tk.MustExec("insert into t1 values ('xy');") + tk.MustExec("set sql_mode='';") + r := tk.MustQuery(`SELECT a='xy ', char_length(a) FROM t1;`) + r.Check(testkit.Rows("0 2")) + r = tk.MustQuery(`SELECT count(*) FROM t1 WHERE a='xy ';`) + r.Check(testkit.Rows("0")) + tk.MustExec("set sql_mode='PAD_CHAR_TO_FULL_LENGTH';") + r = tk.MustQuery(`SELECT a='xy ', char_length(a) FROM t1;`) + r.Check(testkit.Rows("1 10")) + r = tk.MustQuery(`SELECT count(*) FROM t1 WHERE a='xy ';`) + r.Check(testkit.Rows("1")) + + // test type `VARCHAR(n)` + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a varchar(10));") + tk.MustExec("insert into t1 values ('xy');") + tk.MustExec("set sql_mode='';") + r = tk.MustQuery(`SELECT a='xy ', char_length(a) FROM t1;`) + r.Check(testkit.Rows("0 2")) + r = tk.MustQuery(`SELECT count(*) FROM t1 WHERE a='xy ';`) + r.Check(testkit.Rows("0")) + tk.MustExec("set sql_mode='PAD_CHAR_TO_FULL_LENGTH';") + r = tk.MustQuery(`SELECT a='xy ', char_length(a) FROM t1;`) + r.Check(testkit.Rows("0 2")) +} + +func (s *testMySQLConstSuite) TestNoBackslashEscapesMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set sql_mode=''") + r := tk.MustQuery("SELECT '\\\\'") + r.Check(testkit.Rows("\\")) + tk.MustExec("set sql_mode='NO_BACKSLASH_ESCAPES'") + r = tk.MustQuery("SELECT '\\\\'") + r.Check(testkit.Rows("\\\\")) +} + +func (s *testMySQLConstSuite) TestServerStatus(c *C) { + tests := []struct { + arg uint16 + IsCursorExists bool + }{ + {0, false}, + {mysql.ServerStatusInTrans | mysql.ServerStatusNoBackslashEscaped, false}, + {mysql.ServerStatusCursorExists, true}, + {mysql.ServerStatusCursorExists | mysql.ServerStatusLastRowSend, true}, + } + + for _, t := range tests { + ret := mysql.HasCursorExistsFlag(t.arg) + c.Assert(ret, Equals, t.IsCursorExists) + } +} diff --git a/mysql/errcode.go b/mysql/errcode.go new file mode 100644 index 000000000..79c699949 --- /dev/null +++ b/mysql/errcode.go @@ -0,0 +1,910 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQL error code. +// This value is numeric. It is not portable to other database systems. +const ( + ErrErrorFirst uint16 = 1000 + ErrHashchk = 1000 + ErrNisamchk = 1001 + ErrNo = 1002 + ErrYes = 1003 + ErrCantCreateFile = 1004 + ErrCantCreateTable = 1005 + ErrCantCreateDB = 1006 + ErrDBCreateExists = 1007 + ErrDBDropExists = 1008 + ErrDBDropDelete = 1009 + ErrDBDropRmdir = 1010 + ErrCantDeleteFile = 1011 + ErrCantFindSystemRec = 1012 + ErrCantGetStat = 1013 + ErrCantGetWd = 1014 + ErrCantLock = 1015 + ErrCantOpenFile = 1016 + ErrFileNotFound = 1017 + ErrCantReadDir = 1018 + ErrCantSetWd = 1019 + ErrCheckread = 1020 + ErrDiskFull = 1021 + ErrDupKey = 1022 + ErrErrorOnClose = 1023 + ErrErrorOnRead = 1024 + ErrErrorOnRename = 1025 + ErrErrorOnWrite = 1026 + ErrFileUsed = 1027 + ErrFilsortAbort = 1028 + ErrFormNotFound = 1029 + ErrGetErrno = 1030 + ErrIllegalHa = 1031 + ErrKeyNotFound = 1032 + ErrNotFormFile = 1033 + ErrNotKeyFile = 1034 + ErrOldKeyFile = 1035 + ErrOpenAsReadonly = 1036 + ErrOutofMemory = 1037 + ErrOutOfSortMemory = 1038 + ErrUnexpectedEOF = 1039 + ErrConCount = 1040 + ErrOutOfResources = 1041 + ErrBadHost = 1042 + ErrHandshake = 1043 + ErrDBaccessDenied = 1044 + ErrAccessDenied = 1045 + ErrNoDB = 1046 + ErrUnknownCom = 1047 + ErrBadNull = 1048 + ErrBadDB = 1049 + ErrTableExists = 1050 + ErrBadTable = 1051 + ErrNonUniq = 1052 + ErrServerShutdown = 1053 + ErrBadField = 1054 + ErrFieldNotInGroupBy = 1055 + ErrWrongGroupField = 1056 + ErrWrongSumSelect = 1057 + ErrWrongValueCount = 1058 + ErrTooLongIdent = 1059 + ErrDupFieldName = 1060 + ErrDupKeyName = 1061 + ErrDupEntry = 1062 + ErrWrongFieldSpec = 1063 + ErrParse = 1064 + ErrEmptyQuery = 1065 + ErrNonuniqTable = 1066 + ErrInvalidDefault = 1067 + ErrMultiplePriKey = 1068 + ErrTooManyKeys = 1069 + ErrTooManyKeyParts = 1070 + ErrTooLongKey = 1071 + ErrKeyColumnDoesNotExits = 1072 + ErrBlobUsedAsKey = 1073 + ErrTooBigFieldlength = 1074 + ErrWrongAutoKey = 1075 + ErrReady = 1076 + ErrNormalShutdown = 1077 + ErrGotSignal = 1078 + ErrShutdownComplete = 1079 + ErrForcingClose = 1080 + ErrIpsock = 1081 + ErrNoSuchIndex = 1082 + ErrWrongFieldTerminators = 1083 + ErrBlobsAndNoTerminated = 1084 + ErrTextFileNotReadable = 1085 + ErrFileExists = 1086 + ErrLoadInfo = 1087 + ErrAlterInfo = 1088 + ErrWrongSubKey = 1089 + ErrCantRemoveAllFields = 1090 + ErrCantDropFieldOrKey = 1091 + ErrInsertInfo = 1092 + ErrUpdateTableUsed = 1093 + ErrNoSuchThread = 1094 + ErrKillDenied = 1095 + ErrNoTablesUsed = 1096 + ErrTooBigSet = 1097 + ErrNoUniqueLogFile = 1098 + ErrTableNotLockedForWrite = 1099 + ErrTableNotLocked = 1100 + ErrBlobCantHaveDefault = 1101 + ErrWrongDBName = 1102 + ErrWrongTableName = 1103 + ErrTooBigSelect = 1104 + ErrUnknown = 1105 + ErrUnknownProcedure = 1106 + ErrWrongParamcountToProcedure = 1107 + ErrWrongParametersToProcedure = 1108 + ErrUnknownTable = 1109 + ErrFieldSpecifiedTwice = 1110 + ErrInvalidGroupFuncUse = 1111 + ErrUnsupportedExtension = 1112 + ErrTableMustHaveColumns = 1113 + ErrRecordFileFull = 1114 + ErrUnknownCharacterSet = 1115 + ErrTooManyTables = 1116 + ErrTooManyFields = 1117 + ErrTooBigRowsize = 1118 + ErrStackOverrun = 1119 + ErrWrongOuterJoin = 1120 + ErrNullColumnInIndex = 1121 + ErrCantFindUdf = 1122 + ErrCantInitializeUdf = 1123 + ErrUdfNoPaths = 1124 + ErrUdfExists = 1125 + ErrCantOpenLibrary = 1126 + ErrCantFindDlEntry = 1127 + ErrFunctionNotDefined = 1128 + ErrHostIsBlocked = 1129 + ErrHostNotPrivileged = 1130 + ErrPasswordAnonymousUser = 1131 + ErrPasswordNotAllowed = 1132 + ErrPasswordNoMatch = 1133 + ErrUpdateInfo = 1134 + ErrCantCreateThread = 1135 + ErrWrongValueCountOnRow = 1136 + ErrCantReopenTable = 1137 + ErrInvalidUseOfNull = 1138 + ErrRegexp = 1139 + ErrMixOfGroupFuncAndFields = 1140 + ErrNonexistingGrant = 1141 + ErrTableaccessDenied = 1142 + ErrColumnaccessDenied = 1143 + ErrIllegalGrantForTable = 1144 + ErrGrantWrongHostOrUser = 1145 + ErrNoSuchTable = 1146 + ErrNonexistingTableGrant = 1147 + ErrNotAllowedCommand = 1148 + ErrSyntax = 1149 + ErrDelayedCantChangeLock = 1150 + ErrTooManyDelayedThreads = 1151 + ErrAbortingConnection = 1152 + ErrNetPacketTooLarge = 1153 + ErrNetReadErrorFromPipe = 1154 + ErrNetFcntl = 1155 + ErrNetPacketsOutOfOrder = 1156 + ErrNetUncompress = 1157 + ErrNetRead = 1158 + ErrNetReadInterrupted = 1159 + ErrNetErrorOnWrite = 1160 + ErrNetWriteInterrupted = 1161 + ErrTooLongString = 1162 + ErrTableCantHandleBlob = 1163 + ErrTableCantHandleAutoIncrement = 1164 + ErrDelayedInsertTableLocked = 1165 + ErrWrongColumnName = 1166 + ErrWrongKeyColumn = 1167 + ErrWrongMrgTable = 1168 + ErrDupUnique = 1169 + ErrBlobKeyWithoutLength = 1170 + ErrPrimaryCantHaveNull = 1171 + ErrTooManyRows = 1172 + ErrRequiresPrimaryKey = 1173 + ErrNoRaidCompiled = 1174 + ErrUpdateWithoutKeyInSafeMode = 1175 + ErrKeyDoesNotExist = 1176 + ErrCheckNoSuchTable = 1177 + ErrCheckNotImplemented = 1178 + ErrCantDoThisDuringAnTransaction = 1179 + ErrErrorDuringCommit = 1180 + ErrErrorDuringRollback = 1181 + ErrErrorDuringFlushLogs = 1182 + ErrErrorDuringCheckpoint = 1183 + ErrNewAbortingConnection = 1184 + ErrDumpNotImplemented = 1185 + ErrFlushMasterBinlogClosed = 1186 + ErrIndexRebuild = 1187 + ErrMaster = 1188 + ErrMasterNetRead = 1189 + ErrMasterNetWrite = 1190 + ErrFtMatchingKeyNotFound = 1191 + ErrLockOrActiveTransaction = 1192 + ErrUnknownSystemVariable = 1193 + ErrCrashedOnUsage = 1194 + ErrCrashedOnRepair = 1195 + ErrWarningNotCompleteRollback = 1196 + ErrTransCacheFull = 1197 + ErrSlaveMustStop = 1198 + ErrSlaveNotRunning = 1199 + ErrBadSlave = 1200 + ErrMasterInfo = 1201 + ErrSlaveThread = 1202 + ErrTooManyUserConnections = 1203 + ErrSetConstantsOnly = 1204 + ErrLockWaitTimeout = 1205 + ErrLockTableFull = 1206 + ErrReadOnlyTransaction = 1207 + ErrDropDBWithReadLock = 1208 + ErrCreateDBWithReadLock = 1209 + ErrWrongArguments = 1210 + ErrNoPermissionToCreateUser = 1211 + ErrUnionTablesInDifferentDir = 1212 + ErrLockDeadlock = 1213 + ErrTableCantHandleFt = 1214 + ErrCannotAddForeign = 1215 + ErrNoReferencedRow = 1216 + ErrRowIsReferenced = 1217 + ErrConnectToMaster = 1218 + ErrQueryOnMaster = 1219 + ErrErrorWhenExecutingCommand = 1220 + ErrWrongUsage = 1221 + ErrWrongNumberOfColumnsInSelect = 1222 + ErrCantUpdateWithReadlock = 1223 + ErrMixingNotAllowed = 1224 + ErrDupArgument = 1225 + ErrUserLimitReached = 1226 + ErrSpecificAccessDenied = 1227 + ErrLocalVariable = 1228 + ErrGlobalVariable = 1229 + ErrNoDefault = 1230 + ErrWrongValueForVar = 1231 + ErrWrongTypeForVar = 1232 + ErrVarCantBeRead = 1233 + ErrCantUseOptionHere = 1234 + ErrNotSupportedYet = 1235 + ErrMasterFatalErrorReadingBinlog = 1236 + ErrSlaveIgnoredTable = 1237 + ErrIncorrectGlobalLocalVar = 1238 + ErrWrongFkDef = 1239 + ErrKeyRefDoNotMatchTableRef = 1240 + ErrOperandColumns = 1241 + ErrSubqueryNo1Row = 1242 + ErrUnknownStmtHandler = 1243 + ErrCorruptHelpDB = 1244 + ErrCyclicReference = 1245 + ErrAutoConvert = 1246 + ErrIllegalReference = 1247 + ErrDerivedMustHaveAlias = 1248 + ErrSelectReduced = 1249 + ErrTablenameNotAllowedHere = 1250 + ErrNotSupportedAuthMode = 1251 + ErrSpatialCantHaveNull = 1252 + ErrCollationCharsetMismatch = 1253 + ErrSlaveWasRunning = 1254 + ErrSlaveWasNotRunning = 1255 + ErrTooBigForUncompress = 1256 + ErrZlibZMem = 1257 + ErrZlibZBuf = 1258 + ErrZlibZData = 1259 + ErrCutValueGroupConcat = 1260 + ErrWarnTooFewRecords = 1261 + ErrWarnTooManyRecords = 1262 + ErrWarnNullToNotnull = 1263 + ErrWarnDataOutOfRange = 1264 + WarnDataTruncated = 1265 + ErrWarnUsingOtherHandler = 1266 + ErrCantAggregate2collations = 1267 + ErrDropUser = 1268 + ErrRevokeGrants = 1269 + ErrCantAggregate3collations = 1270 + ErrCantAggregateNcollations = 1271 + ErrVariableIsNotStruct = 1272 + ErrUnknownCollation = 1273 + ErrSlaveIgnoredSslParams = 1274 + ErrServerIsInSecureAuthMode = 1275 + ErrWarnFieldResolved = 1276 + ErrBadSlaveUntilCond = 1277 + ErrMissingSkipSlave = 1278 + ErrUntilCondIgnored = 1279 + ErrWrongNameForIndex = 1280 + ErrWrongNameForCatalog = 1281 + ErrWarnQcResize = 1282 + ErrBadFtColumn = 1283 + ErrUnknownKeyCache = 1284 + ErrWarnHostnameWontWork = 1285 + ErrUnknownStorageEngine = 1286 + ErrWarnDeprecatedSyntax = 1287 + ErrNonUpdatableTable = 1288 + ErrFeatureDisabled = 1289 + ErrOptionPreventsStatement = 1290 + ErrDuplicatedValueInType = 1291 + ErrTruncatedWrongValue = 1292 + ErrTooMuchAutoTimestampCols = 1293 + ErrInvalidOnUpdate = 1294 + ErrUnsupportedPs = 1295 + ErrGetErrmsg = 1296 + ErrGetTemporaryErrmsg = 1297 + ErrUnknownTimeZone = 1298 + ErrWarnInvalidTimestamp = 1299 + ErrInvalidCharacterString = 1300 + ErrWarnAllowedPacketOverflowed = 1301 + ErrConflictingDeclarations = 1302 + ErrSpNoRecursiveCreate = 1303 + ErrSpAlreadyExists = 1304 + ErrSpDoesNotExist = 1305 + ErrSpDropFailed = 1306 + ErrSpStoreFailed = 1307 + ErrSpLilabelMismatch = 1308 + ErrSpLabelRedefine = 1309 + ErrSpLabelMismatch = 1310 + ErrSpUninitVar = 1311 + ErrSpBadselect = 1312 + ErrSpBadreturn = 1313 + ErrSpBadstatement = 1314 + ErrUpdateLogDeprecatedIgnored = 1315 + ErrUpdateLogDeprecatedTranslated = 1316 + ErrQueryInterrupted = 1317 + ErrSpWrongNoOfArgs = 1318 + ErrSpCondMismatch = 1319 + ErrSpNoreturn = 1320 + ErrSpNoreturnend = 1321 + ErrSpBadCursorQuery = 1322 + ErrSpBadCursorSelect = 1323 + ErrSpCursorMismatch = 1324 + ErrSpCursorAlreadyOpen = 1325 + ErrSpCursorNotOpen = 1326 + ErrSpUndeclaredVar = 1327 + ErrSpWrongNoOfFetchArgs = 1328 + ErrSpFetchNoData = 1329 + ErrSpDupParam = 1330 + ErrSpDupVar = 1331 + ErrSpDupCond = 1332 + ErrSpDupCurs = 1333 + ErrSpCantAlter = 1334 + ErrSpSubselectNyi = 1335 + ErrStmtNotAllowedInSfOrTrg = 1336 + ErrSpVarcondAfterCurshndlr = 1337 + ErrSpCursorAfterHandler = 1338 + ErrSpCaseNotFound = 1339 + ErrFparserTooBigFile = 1340 + ErrFparserBadHeader = 1341 + ErrFparserEOFInComment = 1342 + ErrFparserErrorInParameter = 1343 + ErrFparserEOFInUnknownParameter = 1344 + ErrViewNoExplain = 1345 + ErrFrmUnknownType = 1346 + ErrWrongObject = 1347 + ErrNonupdateableColumn = 1348 + ErrViewSelectDerived = 1349 + ErrViewSelectClause = 1350 + ErrViewSelectVariable = 1351 + ErrViewSelectTmptable = 1352 + ErrViewWrongList = 1353 + ErrWarnViewMerge = 1354 + ErrWarnViewWithoutKey = 1355 + ErrViewInvalid = 1356 + ErrSpNoDropSp = 1357 + ErrSpGotoInHndlr = 1358 + ErrTrgAlreadyExists = 1359 + ErrTrgDoesNotExist = 1360 + ErrTrgOnViewOrTempTable = 1361 + ErrTrgCantChangeRow = 1362 + ErrTrgNoSuchRowInTrg = 1363 + ErrNoDefaultForField = 1364 + ErrDivisionByZero = 1365 + ErrTruncatedWrongValueForField = 1366 + ErrIllegalValueForType = 1367 + ErrViewNonupdCheck = 1368 + ErrViewCheckFailed = 1369 + ErrProcaccessDenied = 1370 + ErrRelayLogFail = 1371 + ErrPasswdLength = 1372 + ErrUnknownTargetBinlog = 1373 + ErrIoErrLogIndexRead = 1374 + ErrBinlogPurgeProhibited = 1375 + ErrFseekFail = 1376 + ErrBinlogPurgeFatalErr = 1377 + ErrLogInUse = 1378 + ErrLogPurgeUnknownErr = 1379 + ErrRelayLogInit = 1380 + ErrNoBinaryLogging = 1381 + ErrReservedSyntax = 1382 + ErrWsasFailed = 1383 + ErrDiffGroupsProc = 1384 + ErrNoGroupForProc = 1385 + ErrOrderWithProc = 1386 + ErrLoggingProhibitChangingOf = 1387 + ErrNoFileMapping = 1388 + ErrWrongMagic = 1389 + ErrPsManyParam = 1390 + ErrKeyPart0 = 1391 + ErrViewChecksum = 1392 + ErrViewMultiupdate = 1393 + ErrViewNoInsertFieldList = 1394 + ErrViewDeleteMergeView = 1395 + ErrCannotUser = 1396 + ErrXaerNota = 1397 + ErrXaerInval = 1398 + ErrXaerRmfail = 1399 + ErrXaerOutside = 1400 + ErrXaerRmerr = 1401 + ErrXaRbrollback = 1402 + ErrNonexistingProcGrant = 1403 + ErrProcAutoGrantFail = 1404 + ErrProcAutoRevokeFail = 1405 + ErrDataTooLong = 1406 + ErrSpBadSQLstate = 1407 + ErrStartup = 1408 + ErrLoadFromFixedSizeRowsToVar = 1409 + ErrCantCreateUserWithGrant = 1410 + ErrWrongValueForType = 1411 + ErrTableDefChanged = 1412 + ErrSpDupHandler = 1413 + ErrSpNotVarArg = 1414 + ErrSpNoRetset = 1415 + ErrCantCreateGeometryObject = 1416 + ErrFailedRoutineBreakBinlog = 1417 + ErrBinlogUnsafeRoutine = 1418 + ErrBinlogCreateRoutineNeedSuper = 1419 + ErrExecStmtWithOpenCursor = 1420 + ErrStmtHasNoOpenCursor = 1421 + ErrCommitNotAllowedInSfOrTrg = 1422 + ErrNoDefaultForViewField = 1423 + ErrSpNoRecursion = 1424 + ErrTooBigScale = 1425 + ErrTooBigPrecision = 1426 + ErrMBiggerThanD = 1427 + ErrWrongLockOfSystemTable = 1428 + ErrConnectToForeignDataSource = 1429 + ErrQueryOnForeignDataSource = 1430 + ErrForeignDataSourceDoesntExist = 1431 + ErrForeignDataStringInvalidCantCreate = 1432 + ErrForeignDataStringInvalid = 1433 + ErrCantCreateFederatedTable = 1434 + ErrTrgInWrongSchema = 1435 + ErrStackOverrunNeedMore = 1436 + ErrTooLongBody = 1437 + ErrWarnCantDropDefaultKeycache = 1438 + ErrTooBigDisplaywidth = 1439 + ErrXaerDupid = 1440 + ErrDatetimeFunctionOverflow = 1441 + ErrCantUpdateUsedTableInSfOrTrg = 1442 + ErrViewPreventUpdate = 1443 + ErrPsNoRecursion = 1444 + ErrSpCantSetAutocommit = 1445 + ErrMalformedDefiner = 1446 + ErrViewFrmNoUser = 1447 + ErrViewOtherUser = 1448 + ErrNoSuchUser = 1449 + ErrForbidSchemaChange = 1450 + ErrRowIsReferenced2 = 1451 + ErrNoReferencedRow2 = 1452 + ErrSpBadVarShadow = 1453 + ErrTrgNoDefiner = 1454 + ErrOldFileFormat = 1455 + ErrSpRecursionLimit = 1456 + ErrSpProcTableCorrupt = 1457 + ErrSpWrongName = 1458 + ErrTableNeedsUpgrade = 1459 + ErrSpNoAggregate = 1460 + ErrMaxPreparedStmtCountReached = 1461 + ErrViewRecursive = 1462 + ErrNonGroupingFieldUsed = 1463 + ErrTableCantHandleSpkeys = 1464 + ErrNoTriggersOnSystemSchema = 1465 + ErrRemovedSpaces = 1466 + ErrAutoincReadFailed = 1467 + ErrUsername = 1468 + ErrHostname = 1469 + ErrWrongStringLength = 1470 + ErrNonInsertableTable = 1471 + ErrAdminWrongMrgTable = 1472 + ErrTooHighLevelOfNestingForSelect = 1473 + ErrNameBecomesEmpty = 1474 + ErrAmbiguousFieldTerm = 1475 + ErrForeignServerExists = 1476 + ErrForeignServerDoesntExist = 1477 + ErrIllegalHaCreateOption = 1478 + ErrPartitionRequiresValues = 1479 + ErrPartitionWrongValues = 1480 + ErrPartitionMaxvalue = 1481 + ErrPartitionSubpartition = 1482 + ErrPartitionSubpartMix = 1483 + ErrPartitionWrongNoPart = 1484 + ErrPartitionWrongNoSubpart = 1485 + ErrWrongExprInPartitionFunc = 1486 + ErrNoConstExprInRangeOrList = 1487 + ErrFieldNotFoundPart = 1488 + ErrListOfFieldsOnlyInHash = 1489 + ErrInconsistentPartitionInfo = 1490 + ErrPartitionFuncNotAllowed = 1491 + ErrPartitionsMustBeDefined = 1492 + ErrRangeNotIncreasing = 1493 + ErrInconsistentTypeOfFunctions = 1494 + ErrMultipleDefConstInListPart = 1495 + ErrPartitionEntry = 1496 + ErrMixHandler = 1497 + ErrPartitionNotDefined = 1498 + ErrTooManyPartitions = 1499 + ErrSubpartition = 1500 + ErrCantCreateHandlerFile = 1501 + ErrBlobFieldInPartFunc = 1502 + ErrUniqueKeyNeedAllFieldsInPf = 1503 + ErrNoParts = 1504 + ErrPartitionMgmtOnNonpartitioned = 1505 + ErrForeignKeyOnPartitioned = 1506 + ErrDropPartitionNonExistent = 1507 + ErrDropLastPartition = 1508 + ErrCoalesceOnlyOnHashPartition = 1509 + ErrReorgHashOnlyOnSameNo = 1510 + ErrReorgNoParam = 1511 + ErrOnlyOnRangeListPartition = 1512 + ErrAddPartitionSubpart = 1513 + ErrAddPartitionNoNewPartition = 1514 + ErrCoalescePartitionNoPartition = 1515 + ErrReorgPartitionNotExist = 1516 + ErrSameNamePartition = 1517 + ErrNoBinlog = 1518 + ErrConsecutiveReorgPartitions = 1519 + ErrReorgOutsideRange = 1520 + ErrPartitionFunctionFailure = 1521 + ErrPartState = 1522 + ErrLimitedPartRange = 1523 + ErrPluginIsNotLoaded = 1524 + ErrWrongValue = 1525 + ErrNoPartitionForGivenValue = 1526 + ErrFilegroupOptionOnlyOnce = 1527 + ErrCreateFilegroupFailed = 1528 + ErrDropFilegroupFailed = 1529 + ErrTablespaceAutoExtend = 1530 + ErrWrongSizeNumber = 1531 + ErrSizeOverflow = 1532 + ErrAlterFilegroupFailed = 1533 + ErrBinlogRowLoggingFailed = 1534 + ErrBinlogRowWrongTableDef = 1535 + ErrBinlogRowRbrToSbr = 1536 + ErrEventAlreadyExists = 1537 + ErrEventStoreFailed = 1538 + ErrEventDoesNotExist = 1539 + ErrEventCantAlter = 1540 + ErrEventDropFailed = 1541 + ErrEventIntervalNotPositiveOrTooBig = 1542 + ErrEventEndsBeforeStarts = 1543 + ErrEventExecTimeInThePast = 1544 + ErrEventOpenTableFailed = 1545 + ErrEventNeitherMExprNorMAt = 1546 + ErrObsoleteColCountDoesntMatchCorrupted = 1547 + ErrObsoleteCannotLoadFromTable = 1548 + ErrEventCannotDelete = 1549 + ErrEventCompile = 1550 + ErrEventSameName = 1551 + ErrEventDataTooLong = 1552 + ErrDropIndexFk = 1553 + ErrWarnDeprecatedSyntaxWithVer = 1554 + ErrCantWriteLockLogTable = 1555 + ErrCantLockLogTable = 1556 + ErrForeignDuplicateKeyOldUnused = 1557 + ErrColCountDoesntMatchPleaseUpdate = 1558 + ErrTempTablePreventsSwitchOutOfRbr = 1559 + ErrStoredFunctionPreventsSwitchBinlogFormat = 1560 + ErrNdbCantSwitchBinlogFormat = 1561 + ErrPartitionNoTemporary = 1562 + ErrPartitionConstDomain = 1563 + ErrPartitionFunctionIsNotAllowed = 1564 + ErrDdlLog = 1565 + ErrNullInValuesLessThan = 1566 + ErrWrongPartitionName = 1567 + ErrCantChangeTxCharacteristics = 1568 + ErrDupEntryAutoincrementCase = 1569 + ErrEventModifyQueue = 1570 + ErrEventSetVar = 1571 + ErrPartitionMerge = 1572 + ErrCantActivateLog = 1573 + ErrRbrNotAvailable = 1574 + ErrBase64Decode = 1575 + ErrEventRecursionForbidden = 1576 + ErrEventsDB = 1577 + ErrOnlyIntegersAllowed = 1578 + ErrUnsuportedLogEngine = 1579 + ErrBadLogStatement = 1580 + ErrCantRenameLogTable = 1581 + ErrWrongParamcountToNativeFct = 1582 + ErrWrongParametersToNativeFct = 1583 + ErrWrongParametersToStoredFct = 1584 + ErrNativeFctNameCollision = 1585 + ErrDupEntryWithKeyName = 1586 + ErrBinlogPurgeEmFile = 1587 + ErrEventCannotCreateInThePast = 1588 + ErrEventCannotAlterInThePast = 1589 + ErrSlaveIncident = 1590 + ErrNoPartitionForGivenValueSilent = 1591 + ErrBinlogUnsafeStatement = 1592 + ErrSlaveFatal = 1593 + ErrSlaveRelayLogReadFailure = 1594 + ErrSlaveRelayLogWriteFailure = 1595 + ErrSlaveCreateEventFailure = 1596 + ErrSlaveMasterComFailure = 1597 + ErrBinlogLoggingImpossible = 1598 + ErrViewNoCreationCtx = 1599 + ErrViewInvalidCreationCtx = 1600 + ErrSrInvalidCreationCtx = 1601 + ErrTrgCorruptedFile = 1602 + ErrTrgNoCreationCtx = 1603 + ErrTrgInvalidCreationCtx = 1604 + ErrEventInvalidCreationCtx = 1605 + ErrTrgCantOpenTable = 1606 + ErrCantCreateSroutine = 1607 + ErrNeverUsed = 1608 + ErrNoFormatDescriptionEventBeforeBinlogStatement = 1609 + ErrSlaveCorruptEvent = 1610 + ErrLoadDataInvalidColumn = 1611 + ErrLogPurgeNoFile = 1612 + ErrXaRbtimeout = 1613 + ErrXaRbdeadlock = 1614 + ErrNeedReprepare = 1615 + ErrDelayedNotSupported = 1616 + WarnNoMasterInfo = 1617 + WarnOptionIgnored = 1618 + WarnPluginDeleteBuiltin = 1619 + WarnPluginBusy = 1620 + ErrVariableIsReadonly = 1621 + ErrWarnEngineTransactionRollback = 1622 + ErrSlaveHeartbeatFailure = 1623 + ErrSlaveHeartbeatValueOutOfRange = 1624 + ErrNdbReplicationSchema = 1625 + ErrConflictFnParse = 1626 + ErrExceptionsWrite = 1627 + ErrTooLongTableComment = 1628 + ErrTooLongFieldComment = 1629 + ErrFuncInexistentNameCollision = 1630 + ErrDatabaseName = 1631 + ErrTableName = 1632 + ErrPartitionName = 1633 + ErrSubpartitionName = 1634 + ErrTemporaryName = 1635 + ErrRenamedName = 1636 + ErrTooManyConcurrentTrxs = 1637 + WarnNonASCIISeparatorNotImplemented = 1638 + ErrDebugSyncTimeout = 1639 + ErrDebugSyncHitLimit = 1640 + ErrDupSignalSet = 1641 + ErrSignalWarn = 1642 + ErrSignalNotFound = 1643 + ErrSignalException = 1644 + ErrResignalWithoutActiveHandler = 1645 + ErrSignalBadConditionType = 1646 + WarnCondItemTruncated = 1647 + ErrCondItemTooLong = 1648 + ErrUnknownLocale = 1649 + ErrSlaveIgnoreServerIds = 1650 + ErrQueryCacheDisabled = 1651 + ErrSameNamePartitionField = 1652 + ErrPartitionColumnList = 1653 + ErrWrongTypeColumnValue = 1654 + ErrTooManyPartitionFuncFields = 1655 + ErrMaxvalueInValuesIn = 1656 + ErrTooManyValues = 1657 + ErrRowSinglePartitionField = 1658 + ErrFieldTypeNotAllowedAsPartitionField = 1659 + ErrPartitionFieldsTooLong = 1660 + ErrBinlogRowEngineAndStmtEngine = 1661 + ErrBinlogRowModeAndStmtEngine = 1662 + ErrBinlogUnsafeAndStmtEngine = 1663 + ErrBinlogRowInjectionAndStmtEngine = 1664 + ErrBinlogStmtModeAndRowEngine = 1665 + ErrBinlogRowInjectionAndStmtMode = 1666 + ErrBinlogMultipleEnginesAndSelfLoggingEngine = 1667 + ErrBinlogUnsafeLimit = 1668 + ErrBinlogUnsafeInsertDelayed = 1669 + ErrBinlogUnsafeSystemTable = 1670 + ErrBinlogUnsafeAutoincColumns = 1671 + ErrBinlogUnsafeUdf = 1672 + ErrBinlogUnsafeSystemVariable = 1673 + ErrBinlogUnsafeSystemFunction = 1674 + ErrBinlogUnsafeNontransAfterTrans = 1675 + ErrMessageAndStatement = 1676 + ErrSlaveConversionFailed = 1677 + ErrSlaveCantCreateConversion = 1678 + ErrInsideTransactionPreventsSwitchBinlogFormat = 1679 + ErrPathLength = 1680 + ErrWarnDeprecatedSyntaxNoReplacement = 1681 + ErrWrongNativeTableStructure = 1682 + ErrWrongPerfSchemaUsage = 1683 + ErrWarnISSkippedTable = 1684 + ErrInsideTransactionPreventsSwitchBinlogDirect = 1685 + ErrStoredFunctionPreventsSwitchBinlogDirect = 1686 + ErrSpatialMustHaveGeomCol = 1687 + ErrTooLongIndexComment = 1688 + ErrLockAborted = 1689 + ErrDataOutOfRange = 1690 + ErrWrongSpvarTypeInLimit = 1691 + ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine = 1692 + ErrBinlogUnsafeMixedStatement = 1693 + ErrInsideTransactionPreventsSwitchSQLLogBin = 1694 + ErrStoredFunctionPreventsSwitchSQLLogBin = 1695 + ErrFailedReadFromParFile = 1696 + ErrValuesIsNotIntType = 1697 + ErrAccessDeniedNoPassword = 1698 + ErrSetPasswordAuthPlugin = 1699 + ErrGrantPluginUserExists = 1700 + ErrTruncateIllegalFk = 1701 + ErrPluginIsPermanent = 1702 + ErrSlaveHeartbeatValueOutOfRangeMin = 1703 + ErrSlaveHeartbeatValueOutOfRangeMax = 1704 + ErrStmtCacheFull = 1705 + ErrMultiUpdateKeyConflict = 1706 + ErrTableNeedsRebuild = 1707 + WarnOptionBelowLimit = 1708 + ErrIndexColumnTooLong = 1709 + ErrErrorInTriggerBody = 1710 + ErrErrorInUnknownTriggerBody = 1711 + ErrIndexCorrupt = 1712 + ErrUndoRecordTooBig = 1713 + ErrBinlogUnsafeInsertIgnoreSelect = 1714 + ErrBinlogUnsafeInsertSelectUpdate = 1715 + ErrBinlogUnsafeReplaceSelect = 1716 + ErrBinlogUnsafeCreateIgnoreSelect = 1717 + ErrBinlogUnsafeCreateReplaceSelect = 1718 + ErrBinlogUnsafeUpdateIgnore = 1719 + ErrPluginNoUninstall = 1720 + ErrPluginNoInstall = 1721 + ErrBinlogUnsafeWriteAutoincSelect = 1722 + ErrBinlogUnsafeCreateSelectAutoinc = 1723 + ErrBinlogUnsafeInsertTwoKeys = 1724 + ErrTableInFkCheck = 1725 + ErrUnsupportedEngine = 1726 + ErrBinlogUnsafeAutoincNotFirst = 1727 + ErrCannotLoadFromTableV2 = 1728 + ErrMasterDelayValueOutOfRange = 1729 + ErrOnlyFdAndRbrEventsAllowedInBinlogStatement = 1730 + ErrPartitionExchangeDifferentOption = 1731 + ErrPartitionExchangePartTable = 1732 + ErrPartitionExchangeTempTable = 1733 + ErrPartitionInsteadOfSubpartition = 1734 + ErrUnknownPartition = 1735 + ErrTablesDifferentMetadata = 1736 + ErrRowDoesNotMatchPartition = 1737 + ErrBinlogCacheSizeGreaterThanMax = 1738 + ErrWarnIndexNotApplicable = 1739 + ErrPartitionExchangeForeignKey = 1740 + ErrNoSuchKeyValue = 1741 + ErrRplInfoDataTooLong = 1742 + ErrNetworkReadEventChecksumFailure = 1743 + ErrBinlogReadEventChecksumFailure = 1744 + ErrBinlogStmtCacheSizeGreaterThanMax = 1745 + ErrCantUpdateTableInCreateTableSelect = 1746 + ErrPartitionClauseOnNonpartitioned = 1747 + ErrRowDoesNotMatchGivenPartitionSet = 1748 + ErrNoSuchPartitionunused = 1749 + ErrChangeRplInfoRepositoryFailure = 1750 + ErrWarningNotCompleteRollbackWithCreatedTempTable = 1751 + ErrWarningNotCompleteRollbackWithDroppedTempTable = 1752 + ErrMtsFeatureIsNotSupported = 1753 + ErrMtsUpdatedDBsGreaterMax = 1754 + ErrMtsCantParallel = 1755 + ErrMtsInconsistentData = 1756 + ErrFulltextNotSupportedWithPartitioning = 1757 + ErrDaInvalidConditionNumber = 1758 + ErrInsecurePlainText = 1759 + ErrInsecureChangeMaster = 1760 + ErrForeignDuplicateKeyWithChildInfo = 1761 + ErrForeignDuplicateKeyWithoutChildInfo = 1762 + ErrSQLthreadWithSecureSlave = 1763 + ErrTableHasNoFt = 1764 + ErrVariableNotSettableInSfOrTrigger = 1765 + ErrVariableNotSettableInTransaction = 1766 + ErrGtidNextIsNotInGtidNextList = 1767 + ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull = 1768 + ErrSetStatementCannotInvokeFunction = 1769 + ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull = 1770 + ErrSkippingLoggedTransaction = 1771 + ErrMalformedGtidSetSpecification = 1772 + ErrMalformedGtidSetEncoding = 1773 + ErrMalformedGtidSpecification = 1774 + ErrGnoExhausted = 1775 + ErrBadSlaveAutoPosition = 1776 + ErrAutoPositionRequiresGtidModeOn = 1777 + ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet = 1778 + ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn = 1779 + ErrGtidModeRequiresBinlog = 1780 + ErrCantSetGtidNextToGtidWhenGtidModeIsOff = 1781 + ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn = 1782 + ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff = 1783 + ErrFoundGtidEventWhenGtidModeIsOff = 1784 + ErrGtidUnsafeNonTransactionalTable = 1785 + ErrGtidUnsafeCreateSelect = 1786 + ErrGtidUnsafeCreateDropTemporaryTableInTransaction = 1787 + ErrGtidModeCanOnlyChangeOneStepAtATime = 1788 + ErrMasterHasPurgedRequiredGtids = 1789 + ErrCantSetGtidNextWhenOwningGtid = 1790 + ErrUnknownExplainFormat = 1791 + ErrCantExecuteInReadOnlyTransaction = 1792 + ErrTooLongTablePartitionComment = 1793 + ErrSlaveConfiguration = 1794 + ErrInnodbFtLimit = 1795 + ErrInnodbNoFtTempTable = 1796 + ErrInnodbFtWrongDocidColumn = 1797 + ErrInnodbFtWrongDocidIndex = 1798 + ErrInnodbOnlineLogTooBig = 1799 + ErrUnknownAlterAlgorithm = 1800 + ErrUnknownAlterLock = 1801 + ErrMtsChangeMasterCantRunWithGaps = 1802 + ErrMtsRecoveryFailure = 1803 + ErrMtsResetWorkers = 1804 + ErrColCountDoesntMatchCorruptedV2 = 1805 + ErrSlaveSilentRetryTransaction = 1806 + ErrDiscardFkChecksRunning = 1807 + ErrTableSchemaMismatch = 1808 + ErrTableInSystemTablespace = 1809 + ErrIoRead = 1810 + ErrIoWrite = 1811 + ErrTablespaceMissing = 1812 + ErrTablespaceExists = 1813 + ErrTablespaceDiscarded = 1814 + ErrInternal = 1815 + ErrInnodbImport = 1816 + ErrInnodbIndexCorrupt = 1817 + ErrInvalidYearColumnLength = 1818 + ErrNotValidPassword = 1819 + ErrMustChangePassword = 1820 + ErrFkNoIndexChild = 1821 + ErrFkNoIndexParent = 1822 + ErrFkFailAddSystem = 1823 + ErrFkCannotOpenParent = 1824 + ErrFkIncorrectOption = 1825 + ErrFkDupName = 1826 + ErrPasswordFormat = 1827 + ErrFkColumnCannotDrop = 1828 + ErrFkColumnCannotDropChild = 1829 + ErrFkColumnNotNull = 1830 + ErrDupIndex = 1831 + ErrFkColumnCannotChange = 1832 + ErrFkColumnCannotChangeChild = 1833 + ErrFkCannotDeleteParent = 1834 + ErrMalformedPacket = 1835 + ErrReadOnlyMode = 1836 + ErrGtidNextTypeUndefinedGroup = 1837 + ErrVariableNotSettableInSp = 1838 + ErrCantSetGtidPurgedWhenGtidModeIsOff = 1839 + ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty = 1840 + ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty = 1841 + ErrGtidPurgedWasChanged = 1842 + ErrGtidExecutedWasChanged = 1843 + ErrBinlogStmtModeAndNoReplTables = 1844 + ErrAlterOperationNotSupported = 1845 + ErrAlterOperationNotSupportedReason = 1846 + ErrAlterOperationNotSupportedReasonCopy = 1847 + ErrAlterOperationNotSupportedReasonPartition = 1848 + ErrAlterOperationNotSupportedReasonFkRename = 1849 + ErrAlterOperationNotSupportedReasonColumnType = 1850 + ErrAlterOperationNotSupportedReasonFkCheck = 1851 + ErrAlterOperationNotSupportedReasonIgnore = 1852 + ErrAlterOperationNotSupportedReasonNopk = 1853 + ErrAlterOperationNotSupportedReasonAutoinc = 1854 + ErrAlterOperationNotSupportedReasonHiddenFts = 1855 + ErrAlterOperationNotSupportedReasonChangeFts = 1856 + ErrAlterOperationNotSupportedReasonFts = 1857 + ErrSQLSlaveSkipCounterNotSettableInGtidMode = 1858 + ErrDupUnknownInIndex = 1859 + ErrIdentCausesTooLongPath = 1860 + ErrAlterOperationNotSupportedReasonNotNull = 1861 + ErrMustChangePasswordLogin = 1862 + ErrRowInWrongPartition = 1863 + ErrErrorLast = 1863 + ErrBadGeneratedColumn = 3105 + ErrUnsupportedOnGeneratedColumn = 3106 + ErrGeneratedColumnNonPrior = 3107 + ErrDependentByGeneratedColumn = 3108 + ErrInvalidJSONText = 3140 + ErrInvalidJSONPath = 3143 + ErrInvalidJSONData = 3146 + ErrInvalidJSONPathWildcard = 3149 + ErrInvalidJSONContainsPathType = 3150 + ErrJSONUsedAsKey = 3152 + + // TiDB self-defined errors. + ErrMemExceedThreshold = 8001 + ErrForUpdateCantRetry = 8002 + ErrAdminCheckTable = 8003 + + // TiKV/PD errors. + ErrPDServerTimeout = 9001 + ErrTiKVServerTimeout = 9002 + ErrTiKVServerBusy = 9003 + ErrResolveLockTimeout = 9004 + ErrRegionUnavailable = 9005 + ErrGCTooEarly = 9006 + + ErrTxnTooLarge = 9500 +) diff --git a/mysql/errname.go b/mysql/errname.go new file mode 100644 index 000000000..3e99e9d30 --- /dev/null +++ b/mysql/errname.go @@ -0,0 +1,907 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQLErrName maps error code to MySQL error messages. +var MySQLErrName = map[uint16]string{ + ErrHashchk: "hashchk", + ErrNisamchk: "isamchk", + ErrNo: "NO", + ErrYes: "YES", + ErrCantCreateFile: "Can't create file '%-.200s' (errno: %d - %s)", + ErrCantCreateTable: "Can't create table '%-.200s' (errno: %d)", + ErrCantCreateDB: "Can't create database '%-.192s' (errno: %d)", + ErrDBCreateExists: "Can't create database '%-.192s'; database exists", + ErrDBDropExists: "Can't drop database '%-.192s'; database doesn't exist", + ErrDBDropDelete: "Error dropping database (can't delete '%-.192s', errno: %d)", + ErrDBDropRmdir: "Error dropping database (can't rmdir '%-.192s', errno: %d)", + ErrCantDeleteFile: "Error on delete of '%-.192s' (errno: %d - %s)", + ErrCantFindSystemRec: "Can't read record in system table", + ErrCantGetStat: "Can't get status of '%-.200s' (errno: %d - %s)", + ErrCantGetWd: "Can't get working directory (errno: %d - %s)", + ErrCantLock: "Can't lock file (errno: %d - %s)", + ErrCantOpenFile: "Can't open file: '%-.200s' (errno: %d - %s)", + ErrFileNotFound: "Can't find file: '%-.200s' (errno: %d - %s)", + ErrCantReadDir: "Can't read dir of '%-.192s' (errno: %d - %s)", + ErrCantSetWd: "Can't change dir to '%-.192s' (errno: %d - %s)", + ErrCheckread: "Record has changed since last read in table '%-.192s'", + ErrDiskFull: "Disk full (%s); waiting for someone to free some space... (errno: %d - %s)", + ErrDupKey: "Can't write; duplicate key in table '%-.192s'", + ErrErrorOnClose: "Error on close of '%-.192s' (errno: %d - %s)", + ErrErrorOnRead: "Error reading file '%-.200s' (errno: %d - %s)", + ErrErrorOnRename: "Error on rename of '%-.210s' to '%-.210s' (errno: %d - %s)", + ErrErrorOnWrite: "Error writing file '%-.200s' (errno: %d - %s)", + ErrFileUsed: "'%-.192s' is locked against change", + ErrFilsortAbort: "Sort aborted", + ErrFormNotFound: "View '%-.192s' doesn't exist for '%-.192s'", + ErrGetErrno: "Got error %d from storage engine", + ErrIllegalHa: "Table storage engine for '%-.192s' doesn't have this option", + ErrKeyNotFound: "Can't find record in '%-.192s'", + ErrNotFormFile: "Incorrect information in file: '%-.200s'", + ErrNotKeyFile: "Incorrect key file for table '%-.200s'; try to repair it", + ErrOldKeyFile: "Old key file for table '%-.192s'; repair it!", + ErrOpenAsReadonly: "Table '%-.192s' is read only", + ErrOutofMemory: "Out of memory; restart server and try again (needed %d bytes)", + ErrOutOfSortMemory: "Out of sort memory, consider increasing server sort buffer size", + ErrUnexpectedEOF: "Unexpected EOF found when reading file '%-.192s' (errno: %d - %s)", + ErrConCount: "Too many connections", + ErrOutOfResources: "Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space", + ErrBadHost: "Can't get hostname for your address", + ErrHandshake: "Bad handshake", + ErrDBaccessDenied: "Access denied for user '%-.48s'@'%-.64s' to database '%-.192s'", + ErrAccessDenied: "Access denied for user '%-.48s'@'%-.64s' (using password: %s)", + ErrNoDB: "No database selected", + ErrUnknownCom: "Unknown command", + ErrBadNull: "Column '%-.192s' cannot be null", + ErrBadDB: "Unknown database '%-.192s'", + ErrTableExists: "Table '%-.192s' already exists", + ErrBadTable: "Unknown table '%-.100s'", + ErrNonUniq: "Column '%-.192s' in %-.192s is ambiguous", + ErrServerShutdown: "Server shutdown in progress", + ErrBadField: "Unknown column '%-.192s' in '%-.192s'", + ErrFieldNotInGroupBy: "Expression #%d of %s is not in GROUP BY clause and contains nonaggregated column '%s' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by", + ErrWrongGroupField: "Can't group on '%-.192s'", + ErrWrongSumSelect: "Statement has sum functions and columns in same statement", + ErrWrongValueCount: "Column count doesn't match value count", + ErrTooLongIdent: "Identifier name '%-.100s' is too long", + ErrDupFieldName: "Duplicate column name '%-.192s'", + ErrDupKeyName: "Duplicate key name '%-.192s'", + ErrDupEntry: "Duplicate entry '%-.192s' for key %d", + ErrWrongFieldSpec: "Incorrect column specifier for column '%-.192s'", + ErrParse: "%s near '%-.80s' at line %d", + ErrEmptyQuery: "Query was empty", + ErrNonuniqTable: "Not unique table/alias: '%-.192s'", + ErrInvalidDefault: "Invalid default value for '%-.192s'", + ErrMultiplePriKey: "Multiple primary key defined", + ErrTooManyKeys: "Too many keys specified; max %d keys allowed", + ErrTooManyKeyParts: "Too many key parts specified; max %d parts allowed", + ErrTooLongKey: "Specified key was too long; max key length is %d bytes", + ErrKeyColumnDoesNotExits: "Key column '%-.192s' doesn't exist in table", + ErrBlobUsedAsKey: "BLOB column '%-.192s' can't be used in key specification with the used table type", + ErrTooBigFieldlength: "Column length too big for column '%-.192s' (max = %lu); use BLOB or TEXT instead", + ErrWrongAutoKey: "Incorrect table definition; there can be only one auto column and it must be defined as a key", + ErrReady: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d", + ErrNormalShutdown: "%s: Normal shutdown\n", + ErrGotSignal: "%s: Got signal %d. Aborting!\n", + ErrShutdownComplete: "%s: Shutdown complete\n", + ErrForcingClose: "%s: Forcing close of thread %d user: '%-.48s'\n", + ErrIpsock: "Can't create IP socket", + ErrNoSuchIndex: "Table '%-.192s' has no index like the one used in CREATE INDEX; recreate the table", + ErrWrongFieldTerminators: "Field separator argument is not what is expected; check the manual", + ErrBlobsAndNoTerminated: "You can't use fixed rowlength with BLOBs; please use 'fields terminated by'", + ErrTextFileNotReadable: "The file '%-.128s' must be in the database directory or be readable by all", + ErrFileExists: "File '%-.200s' already exists", + ErrLoadInfo: "Records: %d Deleted: %d Skipped: %d Warnings: %d", + ErrAlterInfo: "Records: %d Duplicates: %d", + ErrWrongSubKey: "Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys", + ErrCantRemoveAllFields: "You can't delete all columns with ALTER TABLE; use DROP TABLE instead", + ErrCantDropFieldOrKey: "Can't DROP '%-.192s'; check that column/key exists", + ErrInsertInfo: "Records: %d Duplicates: %d Warnings: %d", + ErrUpdateTableUsed: "You can't specify target table '%-.192s' for update in FROM clause", + ErrNoSuchThread: "Unknown thread id: %lu", + ErrKillDenied: "You are not owner of thread %lu", + ErrNoTablesUsed: "No tables used", + ErrTooBigSet: "Too many strings for column %-.192s and SET", + ErrNoUniqueLogFile: "Can't generate a unique log-filename %-.200s.(1-999)\n", + ErrTableNotLockedForWrite: "Table '%-.192s' was locked with a READ lock and can't be updated", + ErrTableNotLocked: "Table '%-.192s' was not locked with LOCK TABLES", + ErrBlobCantHaveDefault: "BLOB/TEXT/JSON column '%-.192s' can't have a default value", + ErrWrongDBName: "Incorrect database name '%-.100s'", + ErrWrongTableName: "Incorrect table name '%-.100s'", + ErrTooBigSelect: "The SELECT would examine more than MAXJOINSIZE rows; check your WHERE and use SET SQLBIGSELECTS=1 or SET MAXJOINSIZE=# if the SELECT is okay", + ErrUnknown: "Unknown error", + ErrUnknownProcedure: "Unknown procedure '%-.192s'", + ErrWrongParamcountToProcedure: "Incorrect parameter count to procedure '%-.192s'", + ErrWrongParametersToProcedure: "Incorrect parameters to procedure '%-.192s'", + ErrUnknownTable: "Unknown table '%-.192s' in %-.32s", + ErrFieldSpecifiedTwice: "Column '%-.192s' specified twice", + ErrInvalidGroupFuncUse: "Invalid use of group function", + ErrUnsupportedExtension: "Table '%-.192s' uses an extension that doesn't exist in this MySQL version", + ErrTableMustHaveColumns: "A table must have at least 1 column", + ErrRecordFileFull: "The table '%-.192s' is full", + ErrUnknownCharacterSet: "Unknown character set: '%-.64s'", + ErrTooManyTables: "Too many tables; MySQL can only use %d tables in a join", + ErrTooManyFields: "Too many columns", + ErrTooBigRowsize: "Row size too large. The maximum row size for the used table type, not counting BLOBs, is %d. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs", + ErrStackOverrun: "Thread stack overrun: Used: %d of a %d stack. Use 'mysqld --threadStack=#' to specify a bigger stack if needed", + ErrWrongOuterJoin: "Cross dependency found in OUTER JOIN; examine your ON conditions", + ErrNullColumnInIndex: "Table handler doesn't support NULL in given index. Please change column '%-.192s' to be NOT NULL or use another handler", + ErrCantFindUdf: "Can't load function '%-.192s'", + ErrCantInitializeUdf: "Can't initialize function '%-.192s'; %-.80s", + ErrUdfNoPaths: "No paths allowed for shared library", + ErrUdfExists: "Function '%-.192s' already exists", + ErrCantOpenLibrary: "Can't open shared library '%-.192s' (errno: %d %-.128s)", + ErrCantFindDlEntry: "Can't find symbol '%-.128s' in library", + ErrFunctionNotDefined: "Function '%-.192s' is not defined", + ErrHostIsBlocked: "Host '%-.64s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'", + ErrHostNotPrivileged: "Host '%-.64s' is not allowed to connect to this MySQL server", + ErrPasswordAnonymousUser: "You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords", + ErrPasswordNotAllowed: "You must have privileges to update tables in the mysql database to be able to change passwords for others", + ErrPasswordNoMatch: "Can't find any matching row in the user table", + ErrUpdateInfo: "Rows matched: %d Changed: %d Warnings: %d", + ErrCantCreateThread: "Can't create a new thread (errno %d); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug", + ErrWrongValueCountOnRow: "Column count doesn't match value count at row %d", + ErrCantReopenTable: "Can't reopen table: '%-.192s'", + ErrInvalidUseOfNull: "Invalid use of NULL value", + ErrRegexp: "Got error '%-.64s' from regexp", + ErrMixOfGroupFuncAndFields: "Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause", + ErrNonexistingGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s'", + ErrTableaccessDenied: "%-.128s command denied to user '%-.48s'@'%-.64s' for table '%-.64s'", + ErrColumnaccessDenied: "%-.16s command denied to user '%-.48s'@'%-.64s' for column '%-.192s' in table '%-.192s'", + ErrIllegalGrantForTable: "Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used", + ErrGrantWrongHostOrUser: "The host or user argument to GRANT is too long", + ErrNoSuchTable: "Table '%-.192s.%-.192s' doesn't exist", + ErrNonexistingTableGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s' on table '%-.192s'", + ErrNotAllowedCommand: "The used command is not allowed with this MySQL version", + ErrSyntax: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use", + ErrDelayedCantChangeLock: "Delayed insert thread couldn't get requested lock for table %-.192s", + ErrTooManyDelayedThreads: "Too many delayed threads in use", + ErrAbortingConnection: "Aborted connection %d to db: '%-.192s' user: '%-.48s' (%-.64s)", + ErrNetPacketTooLarge: "Got a packet bigger than 'maxAllowedPacket' bytes", + ErrNetReadErrorFromPipe: "Got a read error from the connection pipe", + ErrNetFcntl: "Got an error from fcntl()", + ErrNetPacketsOutOfOrder: "Got packets out of order", + ErrNetUncompress: "Couldn't uncompress communication packet", + ErrNetRead: "Got an error reading communication packets", + ErrNetReadInterrupted: "Got timeout reading communication packets", + ErrNetErrorOnWrite: "Got an error writing communication packets", + ErrNetWriteInterrupted: "Got timeout writing communication packets", + ErrTooLongString: "Result string is longer than 'maxAllowedPacket' bytes", + ErrTableCantHandleBlob: "The used table type doesn't support BLOB/TEXT columns", + ErrTableCantHandleAutoIncrement: "The used table type doesn't support AUTOINCREMENT columns", + ErrDelayedInsertTableLocked: "INSERT DELAYED can't be used with table '%-.192s' because it is locked with LOCK TABLES", + ErrWrongColumnName: "Incorrect column name '%-.100s'", + ErrWrongKeyColumn: "The used storage engine can't index column '%-.192s'", + ErrWrongMrgTable: "Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist", + ErrDupUnique: "Can't write, because of unique constraint, to table '%-.192s'", + ErrBlobKeyWithoutLength: "BLOB/TEXT column '%-.192s' used in key specification without a key length", + ErrPrimaryCantHaveNull: "All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead", + ErrTooManyRows: "Result consisted of more than one row", + ErrRequiresPrimaryKey: "This table type requires a primary key", + ErrNoRaidCompiled: "This version of MySQL is not compiled with RAID support", + ErrUpdateWithoutKeyInSafeMode: "You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", + ErrKeyDoesNotExist: "Key '%-.192s' doesn't exist in table '%-.192s'", + ErrCheckNoSuchTable: "Can't open table", + ErrCheckNotImplemented: "The storage engine for the table doesn't support %s", + ErrCantDoThisDuringAnTransaction: "You are not allowed to execute this command in a transaction", + ErrErrorDuringCommit: "Got error %d during COMMIT", + ErrErrorDuringRollback: "Got error %d during ROLLBACK", + ErrErrorDuringFlushLogs: "Got error %d during FLUSHLOGS", + ErrErrorDuringCheckpoint: "Got error %d during CHECKPOINT", + ErrNewAbortingConnection: "Aborted connection %d to db: '%-.192s' user: '%-.48s' host: '%-.64s' (%-.64s)", + ErrDumpNotImplemented: "The storage engine for the table does not support binary table dump", + ErrFlushMasterBinlogClosed: "Binlog closed, cannot RESET MASTER", + ErrIndexRebuild: "Failed rebuilding the index of dumped table '%-.192s'", + ErrMaster: "Error from master: '%-.64s'", + ErrMasterNetRead: "Net error reading from master", + ErrMasterNetWrite: "Net error writing to master", + ErrFtMatchingKeyNotFound: "Can't find FULLTEXT index matching the column list", + ErrLockOrActiveTransaction: "Can't execute the given command because you have active locked tables or an active transaction", + ErrUnknownSystemVariable: "Unknown system variable '%-.64s'", + ErrCrashedOnUsage: "Table '%-.192s' is marked as crashed and should be repaired", + ErrCrashedOnRepair: "Table '%-.192s' is marked as crashed and last (automatic?) repair failed", + ErrWarningNotCompleteRollback: "Some non-transactional changed tables couldn't be rolled back", + ErrTransCacheFull: "Multi-statement transaction required more than 'maxBinlogCacheSize' bytes of storage; increase this mysqld variable and try again", + ErrSlaveMustStop: "This operation cannot be performed with a running slave; run STOP SLAVE first", + ErrSlaveNotRunning: "This operation requires a running slave; configure slave and do START SLAVE", + ErrBadSlave: "The server is not configured as slave; fix in config file or with CHANGE MASTER TO", + ErrMasterInfo: "Could not initialize master info structure; more error messages can be found in the MySQL error log", + ErrSlaveThread: "Could not create slave thread; check system resources", + ErrTooManyUserConnections: "User %-.64s already has more than 'maxUserConnections' active connections", + ErrSetConstantsOnly: "You may only use constant expressions with SET", + ErrLockWaitTimeout: "Lock wait timeout exceeded; try restarting transaction", + ErrLockTableFull: "The total number of locks exceeds the lock table size", + ErrReadOnlyTransaction: "Update locks cannot be acquired during a READ UNCOMMITTED transaction", + ErrDropDBWithReadLock: "DROP DATABASE not allowed while thread is holding global read lock", + ErrCreateDBWithReadLock: "CREATE DATABASE not allowed while thread is holding global read lock", + ErrWrongArguments: "Incorrect arguments to %s", + ErrNoPermissionToCreateUser: "'%-.48s'@'%-.64s' is not allowed to create new users", + ErrUnionTablesInDifferentDir: "Incorrect table definition; all MERGE tables must be in the same database", + ErrLockDeadlock: "Deadlock found when trying to get lock; try restarting transaction", + ErrTableCantHandleFt: "The used table type doesn't support FULLTEXT indexes", + ErrCannotAddForeign: "Cannot add foreign key constraint", + ErrNoReferencedRow: "Cannot add or update a child row: a foreign key constraint fails", + ErrRowIsReferenced: "Cannot delete or update a parent row: a foreign key constraint fails", + ErrConnectToMaster: "Error connecting to master: %-.128s", + ErrQueryOnMaster: "Error running query on master: %-.128s", + ErrErrorWhenExecutingCommand: "Error when executing command %s: %-.128s", + ErrWrongUsage: "Incorrect usage of %s and %s", + ErrWrongNumberOfColumnsInSelect: "The used SELECT statements have a different number of columns", + ErrCantUpdateWithReadlock: "Can't execute the query because you have a conflicting read lock", + ErrMixingNotAllowed: "Mixing of transactional and non-transactional tables is disabled", + ErrDupArgument: "Option '%s' used twice in statement", + ErrUserLimitReached: "User '%-.64s' has exceeded the '%s' resource (current value: %d)", + ErrSpecificAccessDenied: "Access denied; you need (at least one of) the %-.128s privilege(s) for this operation", + ErrLocalVariable: "Variable '%-.64s' is a SESSION variable and can't be used with SET GLOBAL", + ErrGlobalVariable: "Variable '%-.64s' is a GLOBAL variable and should be set with SET GLOBAL", + ErrNoDefault: "Variable '%-.64s' doesn't have a default value", + ErrWrongValueForVar: "Variable '%-.64s' can't be set to the value of '%-.200s'", + ErrWrongTypeForVar: "Incorrect argument type to variable '%-.64s'", + ErrVarCantBeRead: "Variable '%-.64s' can only be set, not read", + ErrCantUseOptionHere: "Incorrect usage/placement of '%s'", + ErrNotSupportedYet: "This version of MySQL doesn't yet support '%s'", + ErrMasterFatalErrorReadingBinlog: "Got fatal error %d from master when reading data from binary log: '%-.320s'", + ErrSlaveIgnoredTable: "Slave SQL thread ignored the query because of replicate-*-table rules", + ErrIncorrectGlobalLocalVar: "Variable '%-.192s' is a %s variable", + ErrWrongFkDef: "Incorrect foreign key definition for '%-.192s': %s", + ErrKeyRefDoNotMatchTableRef: "Key reference and table reference don't match", + ErrOperandColumns: "Operand should contain %d column(s)", + ErrSubqueryNo1Row: "Subquery returns more than 1 row", + ErrUnknownStmtHandler: "Unknown prepared statement handler (%.*s) given to %s", + ErrCorruptHelpDB: "Help database is corrupt or does not exist", + ErrCyclicReference: "Cyclic reference on subqueries", + ErrAutoConvert: "Converting column '%s' from %s to %s", + ErrIllegalReference: "Reference '%-.64s' not supported (%s)", + ErrDerivedMustHaveAlias: "Every derived table must have its own alias", + ErrSelectReduced: "Select %d was reduced during optimization", + ErrTablenameNotAllowedHere: "Table '%-.192s' from one of the SELECTs cannot be used in %-.32s", + ErrNotSupportedAuthMode: "Client does not support authentication protocol requested by server; consider upgrading MySQL client", + ErrSpatialCantHaveNull: "All parts of a SPATIAL index must be NOT NULL", + ErrCollationCharsetMismatch: "COLLATION '%s' is not valid for CHARACTER SET '%s'", + ErrSlaveWasRunning: "Slave is already running", + ErrSlaveWasNotRunning: "Slave already has been stopped", + ErrTooBigForUncompress: "Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted)", + ErrZlibZMem: "ZLIB: Not enough memory", + ErrZlibZBuf: "ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted)", + ErrZlibZData: "ZLIB: Input data corrupted", + ErrCutValueGroupConcat: "Some rows were cut by GROUPCONCAT(%s)", + ErrWarnTooFewRecords: "Row %d doesn't contain data for all columns", + ErrWarnTooManyRecords: "Row %d was truncated; it contained more data than there were input columns", + ErrWarnNullToNotnull: "Column set to default value; NULL supplied to NOT NULL column '%s' at row %d", + ErrWarnDataOutOfRange: "Out of range value for column '%s' at row %d", + WarnDataTruncated: "Data truncated for column '%s' at row %d", + ErrWarnUsingOtherHandler: "Using storage engine %s for table '%s'", + ErrCantAggregate2collations: "Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'", + ErrDropUser: "Cannot drop one or more of the requested users", + ErrRevokeGrants: "Can't revoke all privileges for one or more of the requested users", + ErrCantAggregate3collations: "Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'", + ErrCantAggregateNcollations: "Illegal mix of collations for operation '%s'", + ErrVariableIsNotStruct: "Variable '%-.64s' is not a variable component (can't be used as XXXX.variableName)", + ErrUnknownCollation: "Unknown collation: '%-.64s'", + ErrSlaveIgnoredSslParams: "SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support; they can be used later if MySQL slave with SSL is started", + ErrServerIsInSecureAuthMode: "Server is running in --secure-auth mode, but '%s'@'%s' has a password in the old format; please change the password to the new format", + ErrWarnFieldResolved: "Field or reference '%-.192s%s%-.192s%s%-.192s' of SELECT #%d was resolved in SELECT #%d", + ErrBadSlaveUntilCond: "Incorrect parameter or combination of parameters for START SLAVE UNTIL", + ErrMissingSkipSlave: "It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart", + ErrUntilCondIgnored: "SQL thread is not to be started so UNTIL options are ignored", + ErrWrongNameForIndex: "Incorrect index name '%-.100s'", + ErrWrongNameForCatalog: "Incorrect catalog name '%-.100s'", + ErrWarnQcResize: "Query cache failed to set size %lu; new query cache size is %lu", + ErrBadFtColumn: "Column '%-.192s' cannot be part of FULLTEXT index", + ErrUnknownKeyCache: "Unknown key cache '%-.100s'", + ErrWarnHostnameWontWork: "MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work", + ErrUnknownStorageEngine: "Unknown storage engine '%s'", + ErrWarnDeprecatedSyntax: "'%s' is deprecated and will be removed in a future release. Please use %s instead", + ErrNonUpdatableTable: "The target table %-.100s of the %s is not updatable", + ErrFeatureDisabled: "The '%s' feature is disabled; you need MySQL built with '%s' to have it working", + ErrOptionPreventsStatement: "The MySQL server is running with the %s option so it cannot execute this statement", + ErrDuplicatedValueInType: "Column '%-.100s' has duplicated value '%-.64s' in %s", + ErrTruncatedWrongValue: "Truncated incorrect %-.32s value: '%-.128s'", + ErrTooMuchAutoTimestampCols: "Incorrect table definition; there can be only one TIMESTAMP column with CURRENTTIMESTAMP in DEFAULT or ON UPDATE clause", + ErrInvalidOnUpdate: "Invalid ON UPDATE clause for '%-.192s' column", + ErrUnsupportedPs: "This command is not supported in the prepared statement protocol yet", + ErrGetErrmsg: "Got error %d '%-.100s' from %s", + ErrGetTemporaryErrmsg: "Got temporary error %d '%-.100s' from %s", + ErrUnknownTimeZone: "Unknown or incorrect time zone: '%-.64s'", + ErrWarnInvalidTimestamp: "Invalid TIMESTAMP value in column '%s' at row %d", + ErrInvalidCharacterString: "Invalid %s character string: '%.64s'", + ErrWarnAllowedPacketOverflowed: "Result of %s() was larger than max_allowed_packet (%d) - truncated", + ErrConflictingDeclarations: "Conflicting declarations: '%s%s' and '%s%s'", + ErrSpNoRecursiveCreate: "Can't create a %s from within another stored routine", + ErrSpAlreadyExists: "%s %s already exists", + ErrSpDoesNotExist: "%s %s does not exist", + ErrSpDropFailed: "Failed to DROP %s %s", + ErrSpStoreFailed: "Failed to CREATE %s %s", + ErrSpLilabelMismatch: "%s with no matching label: %s", + ErrSpLabelRedefine: "Redefining label %s", + ErrSpLabelMismatch: "End-label %s without match", + ErrSpUninitVar: "Referring to uninitialized variable %s", + ErrSpBadselect: "PROCEDURE %s can't return a result set in the given context", + ErrSpBadreturn: "RETURN is only allowed in a FUNCTION", + ErrSpBadstatement: "%s is not allowed in stored procedures", + ErrUpdateLogDeprecatedIgnored: "The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been ignored.", + ErrUpdateLogDeprecatedTranslated: "The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been translated to SET SQLLOGBIN.", + ErrQueryInterrupted: "Query execution was interrupted", + ErrSpWrongNoOfArgs: "Incorrect number of arguments for %s %s; expected %d, got %d", + ErrSpCondMismatch: "Undefined CONDITION: %s", + ErrSpNoreturn: "No RETURN found in FUNCTION %s", + ErrSpNoreturnend: "FUNCTION %s ended without RETURN", + ErrSpBadCursorQuery: "Cursor statement must be a SELECT", + ErrSpBadCursorSelect: "Cursor SELECT must not have INTO", + ErrSpCursorMismatch: "Undefined CURSOR: %s", + ErrSpCursorAlreadyOpen: "Cursor is already open", + ErrSpCursorNotOpen: "Cursor is not open", + ErrSpUndeclaredVar: "Undeclared variable: %s", + ErrSpWrongNoOfFetchArgs: "Incorrect number of FETCH variables", + ErrSpFetchNoData: "No data - zero rows fetched, selected, or processed", + ErrSpDupParam: "Duplicate parameter: %s", + ErrSpDupVar: "Duplicate variable: %s", + ErrSpDupCond: "Duplicate condition: %s", + ErrSpDupCurs: "Duplicate cursor: %s", + ErrSpCantAlter: "Failed to ALTER %s %s", + ErrSpSubselectNyi: "Subquery value not supported", + ErrStmtNotAllowedInSfOrTrg: "%s is not allowed in stored function or trigger", + ErrSpVarcondAfterCurshndlr: "Variable or condition declaration after cursor or handler declaration", + ErrSpCursorAfterHandler: "Cursor declaration after handler declaration", + ErrSpCaseNotFound: "Case not found for CASE statement", + ErrFparserTooBigFile: "Configuration file '%-.192s' is too big", + ErrFparserBadHeader: "Malformed file type header in file '%-.192s'", + ErrFparserEOFInComment: "Unexpected end of file while parsing comment '%-.200s'", + ErrFparserErrorInParameter: "Error while parsing parameter '%-.192s' (line: '%-.192s')", + ErrFparserEOFInUnknownParameter: "Unexpected end of file while skipping unknown parameter '%-.192s'", + ErrViewNoExplain: "EXPLAIN/SHOW can not be issued; lacking privileges for underlying table", + ErrFrmUnknownType: "File '%-.192s' has unknown type '%-.64s' in its header", + ErrWrongObject: "'%-.192s.%-.192s' is not %s", + ErrNonupdateableColumn: "Column '%-.192s' is not updatable", + ErrViewSelectDerived: "View's SELECT contains a subquery in the FROM clause", + ErrViewSelectClause: "View's SELECT contains a '%s' clause", + ErrViewSelectVariable: "View's SELECT contains a variable or parameter", + ErrViewSelectTmptable: "View's SELECT refers to a temporary table '%-.192s'", + ErrViewWrongList: "View's SELECT and view's field list have different column counts", + ErrWarnViewMerge: "View merge algorithm can't be used here for now (assumed undefined algorithm)", + ErrWarnViewWithoutKey: "View being updated does not have complete key of underlying table in it", + ErrViewInvalid: "View '%-.192s.%-.192s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them", + ErrSpNoDropSp: "Can't drop or alter a %s from within another stored routine", + ErrSpGotoInHndlr: "GOTO is not allowed in a stored procedure handler", + ErrTrgAlreadyExists: "Trigger already exists", + ErrTrgDoesNotExist: "Trigger does not exist", + ErrTrgOnViewOrTempTable: "Trigger's '%-.192s' is view or temporary table", + ErrTrgCantChangeRow: "Updating of %s row is not allowed in %strigger", + ErrTrgNoSuchRowInTrg: "There is no %s row in %s trigger", + ErrNoDefaultForField: "Field '%-.192s' doesn't have a default value", + ErrDivisionByZero: "Division by 0", + ErrTruncatedWrongValueForField: "Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %d", + ErrIllegalValueForType: "Illegal %s '%-.192s' value found during parsing", + ErrViewNonupdCheck: "CHECK OPTION on non-updatable view '%-.192s.%-.192s'", + ErrViewCheckFailed: "CHECK OPTION failed '%-.192s.%-.192s'", + ErrProcaccessDenied: "%-.16s command denied to user '%-.48s'@'%-.64s' for routine '%-.192s'", + ErrRelayLogFail: "Failed purging old relay logs: %s", + ErrPasswdLength: "Password hash should be a %d-digit hexadecimal number", + ErrUnknownTargetBinlog: "Target log not found in binlog index", + ErrIoErrLogIndexRead: "I/O error reading log index file", + ErrBinlogPurgeProhibited: "Server configuration does not permit binlog purge", + ErrFseekFail: "Failed on fseek()", + ErrBinlogPurgeFatalErr: "Fatal error during log purge", + ErrLogInUse: "A purgeable log is in use, will not purge", + ErrLogPurgeUnknownErr: "Unknown error during log purge", + ErrRelayLogInit: "Failed initializing relay log position: %s", + ErrNoBinaryLogging: "You are not using binary logging", + ErrReservedSyntax: "The '%-.64s' syntax is reserved for purposes internal to the MySQL server", + ErrWsasFailed: "WSAStartup Failed", + ErrDiffGroupsProc: "Can't handle procedures with different groups yet", + ErrNoGroupForProc: "Select must have a group with this procedure", + ErrOrderWithProc: "Can't use ORDER clause with this procedure", + ErrLoggingProhibitChangingOf: "Binary logging and replication forbid changing the global server %s", + ErrNoFileMapping: "Can't map file: %-.200s, errno: %d", + ErrWrongMagic: "Wrong magic in %-.64s", + ErrPsManyParam: "Prepared statement contains too many placeholders", + ErrKeyPart0: "Key part '%-.192s' length cannot be 0", + ErrViewChecksum: "View text checksum failed", + ErrViewMultiupdate: "Can not modify more than one base table through a join view '%-.192s.%-.192s'", + ErrViewNoInsertFieldList: "Can not insert into join view '%-.192s.%-.192s' without fields list", + ErrViewDeleteMergeView: "Can not delete from join view '%-.192s.%-.192s'", + ErrCannotUser: "Operation %s failed for %.256s", + ErrXaerNota: "XAERNOTA: Unknown XID", + ErrXaerInval: "XAERINVAL: Invalid arguments (or unsupported command)", + ErrXaerRmfail: "XAERRMFAIL: The command cannot be executed when global transaction is in the %.64s state", + ErrXaerOutside: "XAEROUTSIDE: Some work is done outside global transaction", + ErrXaerRmerr: "XAERRMERR: Fatal error occurred in the transaction branch - check your data for consistency", + ErrXaRbrollback: "XARBROLLBACK: Transaction branch was rolled back", + ErrNonexistingProcGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s' on routine '%-.192s'", + ErrProcAutoGrantFail: "Failed to grant EXECUTE and ALTER ROUTINE privileges", + ErrProcAutoRevokeFail: "Failed to revoke all privileges to dropped routine", + ErrDataTooLong: "Data too long for column '%s' at row %d", + ErrSpBadSQLstate: "Bad SQLSTATE: '%s'", + ErrStartup: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d %s", + ErrLoadFromFixedSizeRowsToVar: "Can't load value from file with fixed size rows to variable", + ErrCantCreateUserWithGrant: "You are not allowed to create a user with GRANT", + ErrWrongValueForType: "Incorrect %-.32s value: '%-.128s' for function %-.32s", + ErrTableDefChanged: "Table definition has changed, please retry transaction", + ErrSpDupHandler: "Duplicate handler declared in the same block", + ErrSpNotVarArg: "OUT or INOUT argument %d for routine %s is not a variable or NEW pseudo-variable in BEFORE trigger", + ErrSpNoRetset: "Not allowed to return a result set from a %s", + ErrCantCreateGeometryObject: "Cannot get geometry object from data you send to the GEOMETRY field", + ErrFailedRoutineBreakBinlog: "A routine failed and has neither NO SQL nor READS SQL DATA in its declaration and binary logging is enabled; if non-transactional tables were updated, the binary log will miss their changes", + ErrBinlogUnsafeRoutine: "This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", + ErrBinlogCreateRoutineNeedSuper: "You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", + ErrExecStmtWithOpenCursor: "You can't execute a prepared statement which has an open cursor associated with it. Reset the statement to re-execute it.", + ErrStmtHasNoOpenCursor: "The statement (%lu) has no open cursor.", + ErrCommitNotAllowedInSfOrTrg: "Explicit or implicit commit is not allowed in stored function or trigger.", + ErrNoDefaultForViewField: "Field of view '%-.192s.%-.192s' underlying table doesn't have a default value", + ErrSpNoRecursion: "Recursive stored functions and triggers are not allowed.", + ErrTooBigScale: "Too big scale %d specified for column '%-.192s'. Maximum is %d.", + ErrTooBigPrecision: "Too big precision %d specified for column '%-.192s'. Maximum is %d.", + ErrMBiggerThanD: "For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%-.192s').", + ErrWrongLockOfSystemTable: "You can't combine write-locking of system tables with other tables or lock types", + ErrConnectToForeignDataSource: "Unable to connect to foreign data source: %.64s", + ErrQueryOnForeignDataSource: "There was a problem processing the query on the foreign data source. Data source : %-.64s", + ErrForeignDataSourceDoesntExist: "The foreign data source you are trying to reference does not exist. Data source : %-.64s", + ErrForeignDataStringInvalidCantCreate: "Can't create federated table. The data source connection string '%-.64s' is not in the correct format", + ErrForeignDataStringInvalid: "The data source connection string '%-.64s' is not in the correct format", + ErrCantCreateFederatedTable: "Can't create federated table. Foreign data src : %-.64s", + ErrTrgInWrongSchema: "Trigger in wrong schema", + ErrStackOverrunNeedMore: "Thread stack overrun: %d bytes used of a %d byte stack, and %d bytes needed. Use 'mysqld --threadStack=#' to specify a bigger stack.", + ErrTooLongBody: "Routine body for '%-.100s' is too long", + ErrWarnCantDropDefaultKeycache: "Cannot drop default keycache", + ErrTooBigDisplaywidth: "Display width out of range for column '%-.192s' (max = %lu)", + ErrXaerDupid: "XAERDUPID: The XID already exists", + ErrDatetimeFunctionOverflow: "Datetime function: %-.32s field overflow", + ErrCantUpdateUsedTableInSfOrTrg: "Can't update table '%-.192s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.", + ErrViewPreventUpdate: "The definition of table '%-.192s' prevents operation %.192s on table '%-.192s'.", + ErrPsNoRecursion: "The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner", + ErrSpCantSetAutocommit: "Not allowed to set autocommit from a stored function or trigger", + ErrMalformedDefiner: "Definer is not fully qualified", + ErrViewFrmNoUser: "View '%-.192s'.'%-.192s' has no definer information (old table format). Current user is used as definer. Please recreate the view!", + ErrViewOtherUser: "You need the SUPER privilege for creation view with '%-.192s'@'%-.192s' definer", + ErrNoSuchUser: "The user specified as a definer ('%-.64s'@'%-.64s') does not exist", + ErrForbidSchemaChange: "Changing schema from '%-.192s' to '%-.192s' is not allowed.", + ErrRowIsReferenced2: "Cannot delete or update a parent row: a foreign key constraint fails (%.192s)", + ErrNoReferencedRow2: "Cannot add or update a child row: a foreign key constraint fails (%.192s)", + ErrSpBadVarShadow: "Variable '%-.64s' must be quoted with `...`, or renamed", + ErrTrgNoDefiner: "No definer attribute for trigger '%-.192s'.'%-.192s'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.", + ErrOldFileFormat: "'%-.192s' has an old format, you should re-create the '%s' object(s)", + ErrSpRecursionLimit: "Recursive limit %d (as set by the maxSpRecursionDepth variable) was exceeded for routine %.192s", + ErrSpProcTableCorrupt: "Failed to load routine %-.192s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d)", + ErrSpWrongName: "Incorrect routine name '%-.192s'", + ErrTableNeedsUpgrade: "Table upgrade required. Please do \"REPAIR TABLE `%-.32s`\"", + ErrSpNoAggregate: "AGGREGATE is not supported for stored functions", + ErrMaxPreparedStmtCountReached: "Can't create more than maxPreparedStmtCount statements (current value: %lu)", + ErrViewRecursive: "`%-.192s`.`%-.192s` contains view recursion", + ErrNonGroupingFieldUsed: "Non-grouping field '%-.192s' is used in %-.64s clause", + ErrTableCantHandleSpkeys: "The used table type doesn't support SPATIAL indexes", + ErrNoTriggersOnSystemSchema: "Triggers can not be created on system tables", + ErrRemovedSpaces: "Leading spaces are removed from name '%s'", + ErrAutoincReadFailed: "Failed to read auto-increment value from storage engine", + ErrUsername: "user name", + ErrHostname: "host name", + ErrWrongStringLength: "String '%-.70s' is too long for %s (should be no longer than %d)", + ErrNonInsertableTable: "The target table %-.100s of the %s is not insertable-into", + ErrAdminWrongMrgTable: "Table '%-.64s' is differently defined or of non-MyISAM type or doesn't exist", + ErrTooHighLevelOfNestingForSelect: "Too high level of nesting for select", + ErrNameBecomesEmpty: "Name '%-.64s' has become ''", + ErrAmbiguousFieldTerm: "First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY", + ErrForeignServerExists: "The foreign server, %s, you are trying to create already exists.", + ErrForeignServerDoesntExist: "The foreign server name you are trying to reference does not exist. Data source : %-.64s", + ErrIllegalHaCreateOption: "Table storage engine '%-.64s' does not support the create option '%.64s'", + ErrPartitionRequiresValues: "Syntax : %-.64s PARTITIONING requires definition of VALUES %-.64s for each partition", + ErrPartitionWrongValues: "Only %-.64s PARTITIONING can use VALUES %-.64s in partition definition", + ErrPartitionMaxvalue: "MAXVALUE can only be used in last partition definition", + ErrPartitionSubpartition: "Subpartitions can only be hash partitions and by key", + ErrPartitionSubpartMix: "Must define subpartitions on all partitions if on one partition", + ErrPartitionWrongNoPart: "Wrong number of partitions defined, mismatch with previous setting", + ErrPartitionWrongNoSubpart: "Wrong number of subpartitions defined, mismatch with previous setting", + ErrWrongExprInPartitionFunc: "Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed", + ErrNoConstExprInRangeOrList: "Expression in RANGE/LIST VALUES must be constant", + ErrFieldNotFoundPart: "Field in list of fields for partition function not found in table", + ErrListOfFieldsOnlyInHash: "List of fields is only allowed in KEY partitions", + ErrInconsistentPartitionInfo: "The partition info in the frm file is not consistent with what can be written into the frm file", + ErrPartitionFuncNotAllowed: "The %-.192s function returns the wrong type", + ErrPartitionsMustBeDefined: "For %-.64s partitions each partition must be defined", + ErrRangeNotIncreasing: "VALUES LESS THAN value must be strictly increasing for each partition", + ErrInconsistentTypeOfFunctions: "VALUES value must be of same type as partition function", + ErrMultipleDefConstInListPart: "Multiple definition of same constant in list partitioning", + ErrPartitionEntry: "Partitioning can not be used stand-alone in query", + ErrMixHandler: "The mix of handlers in the partitions is not allowed in this version of MySQL", + ErrPartitionNotDefined: "For the partitioned engine it is necessary to define all %-.64s", + ErrTooManyPartitions: "Too many partitions (including subpartitions) were defined", + ErrSubpartition: "It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning", + ErrCantCreateHandlerFile: "Failed to create specific handler file", + ErrBlobFieldInPartFunc: "A BLOB field is not allowed in partition function", + ErrUniqueKeyNeedAllFieldsInPf: "A %-.192s must include all columns in the table's partitioning function", + ErrNoParts: "Number of %-.64s = 0 is not an allowed value", + ErrPartitionMgmtOnNonpartitioned: "Partition management on a not partitioned table is not possible", + ErrForeignKeyOnPartitioned: "Foreign key clause is not yet supported in conjunction with partitioning", + ErrDropPartitionNonExistent: "Error in list of partitions to %-.64s", + ErrDropLastPartition: "Cannot remove all partitions, use DROP TABLE instead", + ErrCoalesceOnlyOnHashPartition: "COALESCE PARTITION can only be used on HASH/KEY partitions", + ErrReorgHashOnlyOnSameNo: "REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers", + ErrReorgNoParam: "REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs", + ErrOnlyOnRangeListPartition: "%-.64s PARTITION can only be used on RANGE/LIST partitions", + ErrAddPartitionSubpart: "Trying to Add partition(s) with wrong number of subpartitions", + ErrAddPartitionNoNewPartition: "At least one partition must be added", + ErrCoalescePartitionNoPartition: "At least one partition must be coalesced", + ErrReorgPartitionNotExist: "More partitions to reorganize than there are partitions", + ErrSameNamePartition: "Duplicate partition name %-.192s", + ErrNoBinlog: "It is not allowed to shut off binlog on this command", + ErrConsecutiveReorgPartitions: "When reorganizing a set of partitions they must be in consecutive order", + ErrReorgOutsideRange: "Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range", + ErrPartitionFunctionFailure: "Partition function not supported in this version for this handler", + ErrPartState: "Partition state cannot be defined from CREATE/ALTER TABLE", + ErrLimitedPartRange: "The %-.64s handler only supports 32 bit integers in VALUES", + ErrPluginIsNotLoaded: "Plugin '%-.192s' is not loaded", + ErrWrongValue: "Incorrect %-.32s value: '%-.128s'", + ErrNoPartitionForGivenValue: "Table has no partition for value %-.64s", + ErrFilegroupOptionOnlyOnce: "It is not allowed to specify %s more than once", + ErrCreateFilegroupFailed: "Failed to create %s", + ErrDropFilegroupFailed: "Failed to drop %s", + ErrTablespaceAutoExtend: "The handler doesn't support autoextend of tablespaces", + ErrWrongSizeNumber: "A size parameter was incorrectly specified, either number or on the form 10M", + ErrSizeOverflow: "The size number was correct but we don't allow the digit part to be more than 2 billion", + ErrAlterFilegroupFailed: "Failed to alter: %s", + ErrBinlogRowLoggingFailed: "Writing one row to the row-based binary log failed", + ErrBinlogRowWrongTableDef: "Table definition on master and slave does not match: %s", + ErrBinlogRowRbrToSbr: "Slave running with --log-slave-updates must use row-based binary logging to be able to replicate row-based binary log events", + ErrEventAlreadyExists: "Event '%-.192s' already exists", + ErrEventStoreFailed: "Failed to store event %s. Error code %d from storage engine.", + ErrEventDoesNotExist: "Unknown event '%-.192s'", + ErrEventCantAlter: "Failed to alter event '%-.192s'", + ErrEventDropFailed: "Failed to drop %s", + ErrEventIntervalNotPositiveOrTooBig: "INTERVAL is either not positive or too big", + ErrEventEndsBeforeStarts: "ENDS is either invalid or before STARTS", + ErrEventExecTimeInThePast: "Event execution time is in the past. Event has been disabled", + ErrEventOpenTableFailed: "Failed to open mysql.event", + ErrEventNeitherMExprNorMAt: "No datetime expression provided", + ErrObsoleteColCountDoesntMatchCorrupted: "Column count of mysql.%s is wrong. Expected %d, found %d. The table is probably corrupted", + ErrObsoleteCannotLoadFromTable: "Cannot load from mysql.%s. The table is probably corrupted", + ErrEventCannotDelete: "Failed to delete the event from mysql.event", + ErrEventCompile: "Error during compilation of event's body", + ErrEventSameName: "Same old and new event name", + ErrEventDataTooLong: "Data for column '%s' too long", + ErrDropIndexFk: "Cannot drop index '%-.192s': needed in a foreign key constraint", + ErrWarnDeprecatedSyntaxWithVer: "The syntax '%s' is deprecated and will be removed in MySQL %s. Please use %s instead", + ErrCantWriteLockLogTable: "You can't write-lock a log table. Only read access is possible", + ErrCantLockLogTable: "You can't use locks with log tables.", + ErrForeignDuplicateKeyOldUnused: "Upholding foreign key constraints for table '%.192s', entry '%-.192s', key %d would lead to a duplicate entry", + ErrColCountDoesntMatchPleaseUpdate: "Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysqlUpgrade to fix this error.", + ErrTempTablePreventsSwitchOutOfRbr: "Cannot switch out of the row-based binary log format when the session has open temporary tables", + ErrStoredFunctionPreventsSwitchBinlogFormat: "Cannot change the binary logging format inside a stored function or trigger", + ErrNdbCantSwitchBinlogFormat: "The NDB cluster engine does not support changing the binlog format on the fly yet", + ErrPartitionNoTemporary: "Cannot create temporary table with partitions", + ErrPartitionConstDomain: "Partition constant is out of partition function domain", + ErrPartitionFunctionIsNotAllowed: "This partition function is not allowed", + ErrDdlLog: "Error in DDL log", + ErrNullInValuesLessThan: "Not allowed to use NULL value in VALUES LESS THAN", + ErrWrongPartitionName: "Incorrect partition name", + ErrCantChangeTxCharacteristics: "Transaction characteristics can't be changed while a transaction is in progress", + ErrDupEntryAutoincrementCase: "ALTER TABLE causes autoIncrement resequencing, resulting in duplicate entry '%-.192s' for key '%-.192s'", + ErrEventModifyQueue: "Internal scheduler error %d", + ErrEventSetVar: "Error during starting/stopping of the scheduler. Error code %d", + ErrPartitionMerge: "Engine cannot be used in partitioned tables", + ErrCantActivateLog: "Cannot activate '%-.64s' log", + ErrRbrNotAvailable: "The server was not built with row-based replication", + ErrBase64Decode: "Decoding of base64 string failed", + ErrEventRecursionForbidden: "Recursion of EVENT DDL statements is forbidden when body is present", + ErrEventsDB: "Cannot proceed because system tables used by Event Scheduler were found damaged at server start", + ErrOnlyIntegersAllowed: "Only integers allowed as number here", + ErrUnsuportedLogEngine: "This storage engine cannot be used for log tables\"", + ErrBadLogStatement: "You cannot '%s' a log table if logging is enabled", + ErrCantRenameLogTable: "Cannot rename '%s'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to '%s'", + ErrWrongParamcountToNativeFct: "Incorrect parameter count in the call to native function '%-.192s'", + ErrWrongParametersToNativeFct: "Incorrect parameters in the call to native function '%-.192s'", + ErrWrongParametersToStoredFct: "Incorrect parameters in the call to stored function '%-.192s'", + ErrNativeFctNameCollision: "This function '%-.192s' has the same name as a native function", + ErrDupEntryWithKeyName: "Duplicate entry '%-.64s' for key '%-.192s'", + ErrBinlogPurgeEmFile: "Too many files opened, please execute the command again", + ErrEventCannotCreateInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.", + ErrEventCannotAlterInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was not changed. Specify a time in the future.", + ErrSlaveIncident: "The incident %s occurred on the master. Message: %-.64s", + ErrNoPartitionForGivenValueSilent: "Table has no partition for some existing values", + ErrBinlogUnsafeStatement: "Unsafe statement written to the binary log using statement format since BINLOGFORMAT = STATEMENT. %s", + ErrSlaveFatal: "Fatal : %s", + ErrSlaveRelayLogReadFailure: "Relay log read failure: %s", + ErrSlaveRelayLogWriteFailure: "Relay log write failure: %s", + ErrSlaveCreateEventFailure: "Failed to create %s", + ErrSlaveMasterComFailure: "Master command %s failed: %s", + ErrBinlogLoggingImpossible: "Binary logging not possible. Message: %s", + ErrViewNoCreationCtx: "View `%-.64s`.`%-.64s` has no creation context", + ErrViewInvalidCreationCtx: "Creation context of view `%-.64s`.`%-.64s' is invalid", + ErrSrInvalidCreationCtx: "Creation context of stored routine `%-.64s`.`%-.64s` is invalid", + ErrTrgCorruptedFile: "Corrupted TRG file for table `%-.64s`.`%-.64s`", + ErrTrgNoCreationCtx: "Triggers for table `%-.64s`.`%-.64s` have no creation context", + ErrTrgInvalidCreationCtx: "Trigger creation context of table `%-.64s`.`%-.64s` is invalid", + ErrEventInvalidCreationCtx: "Creation context of event `%-.64s`.`%-.64s` is invalid", + ErrTrgCantOpenTable: "Cannot open table for trigger `%-.64s`.`%-.64s`", + ErrCantCreateSroutine: "Cannot create stored routine `%-.64s`. Check warnings", + ErrNeverUsed: "Ambiguous slave modes combination. %s", + ErrNoFormatDescriptionEventBeforeBinlogStatement: "The BINLOG statement of type `%s` was not preceded by a format description BINLOG statement.", + ErrSlaveCorruptEvent: "Corrupted replication event was detected", + ErrLoadDataInvalidColumn: "Invalid column reference (%-.64s) in LOAD DATA", + ErrLogPurgeNoFile: "Being purged log %s was not found", + ErrXaRbtimeout: "XARBTIMEOUT: Transaction branch was rolled back: took too long", + ErrXaRbdeadlock: "XARBDEADLOCK: Transaction branch was rolled back: deadlock was detected", + ErrNeedReprepare: "Prepared statement needs to be re-prepared", + ErrDelayedNotSupported: "DELAYED option not supported for table '%-.192s'", + WarnNoMasterInfo: "The master info structure does not exist", + WarnOptionIgnored: "<%-.64s> option ignored", + WarnPluginDeleteBuiltin: "Built-in plugins cannot be deleted", + WarnPluginBusy: "Plugin is busy and will be uninstalled on shutdown", + ErrVariableIsReadonly: "%s variable '%s' is read-only. Use SET %s to assign the value", + ErrWarnEngineTransactionRollback: "Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted", + ErrSlaveHeartbeatFailure: "Unexpected master's heartbeat data: %s", + ErrSlaveHeartbeatValueOutOfRange: "The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%s seconds).", + ErrNdbReplicationSchema: "Bad schema for mysql.ndbReplication table. Message: %-.64s", + ErrConflictFnParse: "Error in parsing conflict function. Message: %-.64s", + ErrExceptionsWrite: "Write to exceptions table failed. Message: %-.128s\"", + ErrTooLongTableComment: "Comment for table '%-.64s' is too long (max = %lu)", + ErrTooLongFieldComment: "Comment for field '%-.64s' is too long (max = %lu)", + ErrFuncInexistentNameCollision: "FUNCTION %s does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual", + ErrDatabaseName: "Database", + ErrTableName: "Table", + ErrPartitionName: "Partition", + ErrSubpartitionName: "Subpartition", + ErrTemporaryName: "Temporary", + ErrRenamedName: "Renamed", + ErrTooManyConcurrentTrxs: "Too many active concurrent transactions", + WarnNonASCIISeparatorNotImplemented: "Non-ASCII separator arguments are not fully supported", + ErrDebugSyncTimeout: "debug sync point wait timed out", + ErrDebugSyncHitLimit: "debug sync point hit limit reached", + ErrDupSignalSet: "Duplicate condition information item '%s'", + ErrSignalWarn: "Unhandled user-defined warning condition", + ErrSignalNotFound: "Unhandled user-defined not found condition", + ErrSignalException: "Unhandled user-defined exception condition", + ErrResignalWithoutActiveHandler: "RESIGNAL when handler not active", + ErrSignalBadConditionType: "SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE", + WarnCondItemTruncated: "Data truncated for condition item '%s'", + ErrCondItemTooLong: "Data too long for condition item '%s'", + ErrUnknownLocale: "Unknown locale: '%-.64s'", + ErrSlaveIgnoreServerIds: "The requested server id %d clashes with the slave startup option --replicate-same-server-id", + ErrQueryCacheDisabled: "Query cache is disabled; restart the server with queryCacheType=1 to enable it", + ErrSameNamePartitionField: "Duplicate partition field name '%-.192s'", + ErrPartitionColumnList: "Inconsistency in usage of column lists for partitioning", + ErrWrongTypeColumnValue: "Partition column values of incorrect type", + ErrTooManyPartitionFuncFields: "Too many fields in '%-.192s'", + ErrMaxvalueInValuesIn: "Cannot use MAXVALUE as value in VALUES IN", + ErrTooManyValues: "Cannot have more than one value for this type of %-.64s partitioning", + ErrRowSinglePartitionField: "Row expressions in VALUES IN only allowed for multi-field column partitioning", + ErrFieldTypeNotAllowedAsPartitionField: "Field '%-.192s' is of a not allowed type for this type of partitioning", + ErrPartitionFieldsTooLong: "The total length of the partitioning fields is too large", + ErrBinlogRowEngineAndStmtEngine: "Cannot execute statement: impossible to write to binary log since both row-incapable engines and statement-incapable engines are involved.", + ErrBinlogRowModeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = ROW and at least one table uses a storage engine limited to statement-based logging.", + ErrBinlogUnsafeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is unsafe, storage engine is limited to statement-based logging, and BINLOGFORMAT = MIXED. %s", + ErrBinlogRowInjectionAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is in row format and at least one table uses a storage engine limited to statement-based logging.", + ErrBinlogStmtModeAndRowEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.%s", + ErrBinlogRowInjectionAndStmtMode: "Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOGFORMAT = STATEMENT.", + ErrBinlogMultipleEnginesAndSelfLoggingEngine: "Cannot execute statement: impossible to write to binary log since more than one engine is involved and at least one engine is self-logging.", + ErrBinlogUnsafeLimit: "The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted.", + ErrBinlogUnsafeInsertDelayed: "The statement is unsafe because it uses INSERT DELAYED. This is unsafe because the times when rows are inserted cannot be predicted.", + ErrBinlogUnsafeSystemTable: "The statement is unsafe because it uses the general log, slow query log, or performanceSchema table(s). This is unsafe because system tables may differ on slaves.", + ErrBinlogUnsafeAutoincColumns: "Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTOINCREMENT column. Inserted values cannot be logged correctly.", + ErrBinlogUnsafeUdf: "Statement is unsafe because it uses a UDF which may not return the same value on the slave.", + ErrBinlogUnsafeSystemVariable: "Statement is unsafe because it uses a system variable that may have a different value on the slave.", + ErrBinlogUnsafeSystemFunction: "Statement is unsafe because it uses a system function that may return a different value on the slave.", + ErrBinlogUnsafeNontransAfterTrans: "Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction.", + ErrMessageAndStatement: "%s Statement: %s", + ErrSlaveConversionFailed: "Column %d of table '%-.192s.%-.192s' cannot be converted from type '%-.32s' to type '%-.32s'", + ErrSlaveCantCreateConversion: "Can't create conversion table for table '%-.192s.%-.192s'", + ErrInsideTransactionPreventsSwitchBinlogFormat: "Cannot modify @@session.binlogFormat inside a transaction", + ErrPathLength: "The path specified for %.64s is too long.", + ErrWarnDeprecatedSyntaxNoReplacement: "'%s' is deprecated and will be removed in a future release.", + ErrWrongNativeTableStructure: "Native table '%-.64s'.'%-.64s' has the wrong structure", + ErrWrongPerfSchemaUsage: "Invalid performanceSchema usage.", + ErrWarnISSkippedTable: "Table '%s'.'%s' was skipped since its definition is being modified by concurrent DDL statement", + ErrInsideTransactionPreventsSwitchBinlogDirect: "Cannot modify @@session.binlogDirectNonTransactionalUpdates inside a transaction", + ErrStoredFunctionPreventsSwitchBinlogDirect: "Cannot change the binlog direct flag inside a stored function or trigger", + ErrSpatialMustHaveGeomCol: "A SPATIAL index may only contain a geometrical type column", + ErrTooLongIndexComment: "Comment for index '%-.64s' is too long (max = %d)", + ErrLockAborted: "Wait on a lock was aborted due to a pending exclusive lock", + ErrDataOutOfRange: "%s value is out of range in '%s'", + ErrWrongSpvarTypeInLimit: "A variable of a non-integer based type in LIMIT clause", + ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine: "Mixing self-logging and non-self-logging engines in a statement is unsafe.", + ErrBinlogUnsafeMixedStatement: "Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.", + ErrInsideTransactionPreventsSwitchSQLLogBin: "Cannot modify @@session.sqlLogBin inside a transaction", + ErrStoredFunctionPreventsSwitchSQLLogBin: "Cannot change the sqlLogBin inside a stored function or trigger", + ErrFailedReadFromParFile: "Failed to read from the .par file", + ErrValuesIsNotIntType: "VALUES value for partition '%-.64s' must have type INT", + ErrAccessDeniedNoPassword: "Access denied for user '%-.48s'@'%-.64s'", + ErrSetPasswordAuthPlugin: "SET PASSWORD has no significance for users authenticating via plugins", + ErrGrantPluginUserExists: "GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists", + ErrTruncateIllegalFk: "Cannot truncate a table referenced in a foreign key constraint (%.192s)", + ErrPluginIsPermanent: "Plugin '%s' is forcePlusPermanent and can not be unloaded", + ErrSlaveHeartbeatValueOutOfRangeMin: "The requested value for the heartbeat period is less than 1 millisecond. The value is reset to 0, meaning that heartbeating will effectively be disabled.", + ErrSlaveHeartbeatValueOutOfRangeMax: "The requested value for the heartbeat period exceeds the value of `slaveNetTimeout' seconds. A sensible value for the period should be less than the timeout.", + ErrStmtCacheFull: "Multi-row statements required more than 'maxBinlogStmtCacheSize' bytes of storage; increase this mysqld variable and try again", + ErrMultiUpdateKeyConflict: "Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'.", + ErrTableNeedsRebuild: "Table rebuild required. Please do \"ALTER TABLE `%-.32s` FORCE\" or dump/reload to fix it!", + WarnOptionBelowLimit: "The value of '%s' should be no less than the value of '%s'", + ErrIndexColumnTooLong: "Index column size too large. The maximum column size is %lu bytes.", + ErrErrorInTriggerBody: "Trigger '%-.64s' has an error in its body: '%-.256s'", + ErrErrorInUnknownTriggerBody: "Unknown trigger has an error in its body: '%-.256s'", + ErrIndexCorrupt: "Index %s is corrupted", + ErrUndoRecordTooBig: "Undo log record is too big.", + ErrBinlogUnsafeInsertIgnoreSelect: "INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeInsertSelectUpdate: "INSERT... SELECT... ON DUPLICATE KEY UPDATE is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are updated. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeReplaceSelect: "REPLACE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateIgnoreSelect: "CREATE... IGNORE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateReplaceSelect: "CREATE... REPLACE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeUpdateIgnore: "UPDATE IGNORE is unsafe because the order in which rows are updated determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrPluginNoUninstall: "Plugin '%s' is marked as not dynamically uninstallable. You have to stop the server to uninstall it.", + ErrPluginNoInstall: "Plugin '%s' is marked as not dynamically installable. You have to stop the server to install it.", + ErrBinlogUnsafeWriteAutoincSelect: "Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateSelectAutoinc: "CREATE TABLE... SELECT... on a table with an auto-increment column is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are inserted. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeInsertTwoKeys: "INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe", + ErrTableInFkCheck: "Table is being used in foreign key check.", + ErrUnsupportedEngine: "Storage engine '%s' does not support system tables. [%s.%s]", + ErrBinlogUnsafeAutoincNotFirst: "INSERT into autoincrement field which is not the first part in the composed primary key is unsafe.", + ErrCannotLoadFromTableV2: "Cannot load from %s.%s. The table is probably corrupted", + ErrMasterDelayValueOutOfRange: "The requested value %d for the master delay exceeds the maximum %d", + ErrOnlyFdAndRbrEventsAllowedInBinlogStatement: "Only FormatDescriptionLogEvent and row events are allowed in BINLOG statements (but %s was provided)", + ErrPartitionExchangeDifferentOption: "Non matching attribute '%-.64s' between partition and table", + ErrPartitionExchangePartTable: "Table to exchange with partition is partitioned: '%-.64s'", + ErrPartitionExchangeTempTable: "Table to exchange with partition is temporary: '%-.64s'", + ErrPartitionInsteadOfSubpartition: "Subpartitioned table, use subpartition instead of partition", + ErrUnknownPartition: "Unknown partition '%-.64s' in table '%-.64s'", + ErrTablesDifferentMetadata: "Tables have different definitions", + ErrRowDoesNotMatchPartition: "Found a row that does not match the partition", + ErrBinlogCacheSizeGreaterThanMax: "Option binlogCacheSize (%lu) is greater than maxBinlogCacheSize (%lu); setting binlogCacheSize equal to maxBinlogCacheSize.", + ErrWarnIndexNotApplicable: "Cannot use %-.64s access on index '%-.64s' due to type or collation conversion on field '%-.64s'", + ErrPartitionExchangeForeignKey: "Table to exchange with partition has foreign key references: '%-.64s'", + ErrNoSuchKeyValue: "Key value '%-.192s' was not found in table '%-.192s.%-.192s'", + ErrRplInfoDataTooLong: "Data for column '%s' too long", + ErrNetworkReadEventChecksumFailure: "Replication event checksum verification failed while reading from network.", + ErrBinlogReadEventChecksumFailure: "Replication event checksum verification failed while reading from a log file.", + ErrBinlogStmtCacheSizeGreaterThanMax: "Option binlogStmtCacheSize (%lu) is greater than maxBinlogStmtCacheSize (%lu); setting binlogStmtCacheSize equal to maxBinlogStmtCacheSize.", + ErrCantUpdateTableInCreateTableSelect: "Can't update table '%-.192s' while '%-.192s' is being created.", + ErrPartitionClauseOnNonpartitioned: "PARTITION () clause on non partitioned table", + ErrRowDoesNotMatchGivenPartitionSet: "Found a row not matching the given partition set", + ErrNoSuchPartitionunused: "partition '%-.64s' doesn't exist", + ErrChangeRplInfoRepositoryFailure: "Failure while changing the type of replication repository: %s.", + ErrWarningNotCompleteRollbackWithCreatedTempTable: "The creation of some temporary tables could not be rolled back.", + ErrWarningNotCompleteRollbackWithDroppedTempTable: "Some temporary tables were dropped, but these operations could not be rolled back.", + ErrMtsFeatureIsNotSupported: "%s is not supported in multi-threaded slave mode. %s", + ErrMtsUpdatedDBsGreaterMax: "The number of modified databases exceeds the maximum %d; the database names will not be included in the replication event metadata.", + ErrMtsCantParallel: "Cannot execute the current event group in the parallel mode. Encountered event %s, relay-log name %s, position %s which prevents execution of this event group in parallel mode. Reason: %s.", + ErrMtsInconsistentData: "%s", + ErrFulltextNotSupportedWithPartitioning: "FULLTEXT index is not supported for partitioned tables.", + ErrDaInvalidConditionNumber: "Invalid condition number", + ErrInsecurePlainText: "Sending passwords in plain text without SSL/TLS is extremely insecure.", + ErrInsecureChangeMaster: "Storing MySQL user name or password information in the master.info repository is not secure and is therefore not recommended. Please see the MySQL Manual for more about this issue and possible alternatives.", + ErrForeignDuplicateKeyWithChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in table '%.192s', key '%.192s'", + ErrForeignDuplicateKeyWithoutChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in a child table", + ErrSQLthreadWithSecureSlave: "Setting authentication options is not possible when only the Slave SQL Thread is being started.", + ErrTableHasNoFt: "The table does not have FULLTEXT index to support this query", + ErrVariableNotSettableInSfOrTrigger: "The system variable %.200s cannot be set in stored functions or triggers.", + ErrVariableNotSettableInTransaction: "The system variable %.200s cannot be set when there is an ongoing transaction.", + ErrGtidNextIsNotInGtidNextList: "The system variable @@SESSION.GTIDNEXT has the value %.200s, which is not listed in @@SESSION.GTIDNEXTLIST.", + ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull: "When @@SESSION.GTIDNEXTLIST == NULL, the system variable @@SESSION.GTIDNEXT cannot change inside a transaction.", + ErrSetStatementCannotInvokeFunction: "The statement 'SET %.200s' cannot invoke a stored function.", + ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull: "The system variable @@SESSION.GTIDNEXT cannot be 'AUTOMATIC' when @@SESSION.GTIDNEXTLIST is non-NULL.", + ErrSkippingLoggedTransaction: "Skipping transaction %.200s because it has already been executed and logged.", + ErrMalformedGtidSetSpecification: "Malformed GTID set specification '%.200s'.", + ErrMalformedGtidSetEncoding: "Malformed GTID set encoding.", + ErrMalformedGtidSpecification: "Malformed GTID specification '%.200s'.", + ErrGnoExhausted: "Impossible to generate Global Transaction Identifier: the integer component reached the maximal value. Restart the server with a new serverUuid.", + ErrBadSlaveAutoPosition: "Parameters MASTERLOGFILE, MASTERLOGPOS, RELAYLOGFILE and RELAYLOGPOS cannot be set when MASTERAUTOPOSITION is active.", + ErrAutoPositionRequiresGtidModeOn: "CHANGE MASTER TO MASTERAUTOPOSITION = 1 can only be executed when @@GLOBAL.GTIDMODE = ON.", + ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet: "Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTIDNEXT != AUTOMATIC or @@SESSION.GTIDNEXTLIST != NULL.", + ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn: "@@GLOBAL.GTIDMODE = ON or UPGRADESTEP2 requires @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", + ErrGtidModeRequiresBinlog: "@@GLOBAL.GTIDMODE = ON or UPGRADESTEP1 or UPGRADESTEP2 requires --log-bin and --log-slave-updates.", + ErrCantSetGtidNextToGtidWhenGtidModeIsOff: "@@SESSION.GTIDNEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTIDMODE = OFF.", + ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn: "@@SESSION.GTIDNEXT cannot be set to ANONYMOUS when @@GLOBAL.GTIDMODE = ON.", + ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff: "@@SESSION.GTIDNEXTLIST cannot be set to a non-NULL value when @@GLOBAL.GTIDMODE = OFF.", + ErrFoundGtidEventWhenGtidModeIsOff: "Found a GtidLogEvent or PreviousGtidsLogEvent when @@GLOBAL.GTIDMODE = OFF.", + ErrGtidUnsafeNonTransactionalTable: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.", + ErrGtidUnsafeCreateSelect: "CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", + ErrGtidUnsafeCreateDropTemporaryTableInTransaction: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.", + ErrGtidModeCanOnlyChangeOneStepAtATime: "The value of @@GLOBAL.GTIDMODE can only change one step at a time: OFF <-> UPGRADESTEP1 <-> UPGRADESTEP2 <-> ON. Also note that this value must be stepped up or down simultaneously on all servers; see the Manual for instructions.", + ErrMasterHasPurgedRequiredGtids: "The slave is connecting using CHANGE MASTER TO MASTERAUTOPOSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.", + ErrCantSetGtidNextWhenOwningGtid: "@@SESSION.GTIDNEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK.", + ErrUnknownExplainFormat: "Unknown EXPLAIN format name: '%s'", + ErrCantExecuteInReadOnlyTransaction: "Cannot execute statement in a READ ONLY transaction.", + ErrTooLongTablePartitionComment: "Comment for table partition '%-.64s' is too long (max = %lu)", + ErrSlaveConfiguration: "Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.", + ErrInnodbFtLimit: "InnoDB presently supports one FULLTEXT index creation at a time", + ErrInnodbNoFtTempTable: "Cannot create FULLTEXT index on temporary InnoDB table", + ErrInnodbFtWrongDocidColumn: "Column '%-.192s' is of wrong type for an InnoDB FULLTEXT index", + ErrInnodbFtWrongDocidIndex: "Index '%-.192s' is of wrong type for an InnoDB FULLTEXT index", + ErrInnodbOnlineLogTooBig: "Creating index '%-.192s' required more than 'innodbOnlineAlterLogMaxSize' bytes of modification log. Please try again.", + ErrUnknownAlterAlgorithm: "Unknown ALGORITHM '%s'", + ErrUnknownAlterLock: "Unknown LOCK type '%s'", + ErrMtsChangeMasterCantRunWithGaps: "CHANGE MASTER cannot be executed when the slave was stopped with an error or killed in MTS mode. Consider using RESET SLAVE or START SLAVE UNTIL.", + ErrMtsRecoveryFailure: "Cannot recover after SLAVE errored out in parallel execution mode. Additional error messages can be found in the MySQL error log.", + ErrMtsResetWorkers: "Cannot clean up worker info tables. Additional error messages can be found in the MySQL error log.", + ErrColCountDoesntMatchCorruptedV2: "Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted", + ErrSlaveSilentRetryTransaction: "Slave must silently retry current transaction", + ErrDiscardFkChecksRunning: "There is a foreign key check running on table '%-.192s'. Cannot discard the table.", + ErrTableSchemaMismatch: "Schema mismatch (%s)", + ErrTableInSystemTablespace: "Table '%-.192s' in system tablespace", + ErrIoRead: "IO Read : (%lu, %s) %s", + ErrIoWrite: "IO Write : (%lu, %s) %s", + ErrTablespaceMissing: "Tablespace is missing for table '%-.192s'", + ErrTablespaceExists: "Tablespace for table '%-.192s' exists. Please DISCARD the tablespace before IMPORT.", + ErrTablespaceDiscarded: "Tablespace has been discarded for table '%-.192s'", + ErrInternal: "Internal : %s", + ErrInnodbImport: "ALTER TABLE '%-.192s' IMPORT TABLESPACE failed with error %lu : '%s'", + ErrInnodbIndexCorrupt: "Index corrupt: %s", + ErrInvalidYearColumnLength: "YEAR(%lu) column type is deprecated. Creating YEAR(4) column instead.", + ErrNotValidPassword: "Your password does not satisfy the current policy requirements", + ErrMustChangePassword: "You must SET PASSWORD before executing this statement", + ErrFkNoIndexChild: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the foreign table '%s'", + ErrFkNoIndexParent: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the referenced table '%s'", + ErrFkFailAddSystem: "Failed to add the foreign key constraint '%s' to system tables", + ErrFkCannotOpenParent: "Failed to open the referenced table '%s'", + ErrFkIncorrectOption: "Failed to add the foreign key constraint on table '%s'. Incorrect options in FOREIGN KEY constraint '%s'", + ErrFkDupName: "Duplicate foreign key constraint name '%s'", + ErrPasswordFormat: "The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.", + ErrFkColumnCannotDrop: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s'", + ErrFkColumnCannotDropChild: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrFkColumnNotNull: "Column '%-.192s' cannot be NOT NULL: needed in a foreign key constraint '%-.192s' SET NULL", + ErrDupIndex: "Duplicate index '%-.64s' defined on the table '%-.64s.%-.64s'. This is deprecated and will be disallowed in a future release.", + ErrFkColumnCannotChange: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s'", + ErrFkColumnCannotChangeChild: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrFkCannotDeleteParent: "Cannot delete rows from table which is parent in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrMalformedPacket: "Malformed communication packet.", + ErrReadOnlyMode: "Running in read-only mode", + ErrGtidNextTypeUndefinedGroup: "When @@SESSION.GTIDNEXT is set to a GTID, you must explicitly set it again after a COMMIT or ROLLBACK. If you see this error message in the slave SQL thread, it means that a table in the current transaction is transactional on the master and non-transactional on the slave. In a client connection, it means that you executed SET @@SESSION.GTIDNEXT before a transaction and forgot to set @@SESSION.GTIDNEXT to a different identifier or to 'AUTOMATIC' after COMMIT or ROLLBACK. Current @@SESSION.GTIDNEXT is '%s'.", + ErrVariableNotSettableInSp: "The system variable %.200s cannot be set in stored procedures.", + ErrCantSetGtidPurgedWhenGtidModeIsOff: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDMODE = ON.", + ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDEXECUTED is empty.", + ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when there are no ongoing transactions (not even in other clients).", + ErrGtidPurgedWasChanged: "@@GLOBAL.GTIDPURGED was changed from '%s' to '%s'.", + ErrGtidExecutedWasChanged: "@@GLOBAL.GTIDEXECUTED was changed from '%s' to '%s'.", + ErrBinlogStmtModeAndNoReplTables: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT, and both replicated and non replicated tables are written to.", + ErrAlterOperationNotSupported: "%s is not supported for this operation. Try %s.", + ErrAlterOperationNotSupportedReason: "%s is not supported. Reason: %s. Try %s.", + ErrAlterOperationNotSupportedReasonCopy: "COPY algorithm requires a lock", + ErrAlterOperationNotSupportedReasonPartition: "Partition specific operations do not yet support LOCK/ALGORITHM", + ErrAlterOperationNotSupportedReasonFkRename: "Columns participating in a foreign key are renamed", + ErrAlterOperationNotSupportedReasonColumnType: "Cannot change column type INPLACE", + ErrAlterOperationNotSupportedReasonFkCheck: "Adding foreign keys needs foreignKeyChecks=OFF", + ErrAlterOperationNotSupportedReasonIgnore: "Creating unique indexes with IGNORE requires COPY algorithm to remove duplicate rows", + ErrAlterOperationNotSupportedReasonNopk: "Dropping a primary key is not allowed without also adding a new primary key", + ErrAlterOperationNotSupportedReasonAutoinc: "Adding an auto-increment column requires a lock", + ErrAlterOperationNotSupportedReasonHiddenFts: "Cannot replace hidden FTSDOCID with a user-visible one", + ErrAlterOperationNotSupportedReasonChangeFts: "Cannot drop or rename FTSDOCID", + ErrAlterOperationNotSupportedReasonFts: "Fulltext index creation requires a lock", + ErrSQLSlaveSkipCounterNotSettableInGtidMode: "sqlSlaveSkipCounter can not be set when the server is running with @@GLOBAL.GTIDMODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction", + ErrDupUnknownInIndex: "Duplicate entry for key '%-.192s'", + ErrIdentCausesTooLongPath: "Long database name and identifier for object resulted in path length exceeding %d characters. Path: '%s'.", + ErrAlterOperationNotSupportedReasonNotNull: "cannot silently convert NULL values, as required in this SQLMODE", + ErrMustChangePasswordLogin: "Your password has expired. To log in you must change it using a client that supports expired passwords.", + ErrRowInWrongPartition: "Found a row in wrong partition %s", + ErrBadGeneratedColumn: "The value specified for generated column '%s' in table '%s' is not allowed.", + ErrUnsupportedOnGeneratedColumn: "'%s' is not supported for generated columns.", + ErrGeneratedColumnNonPrior: "Generated column can refer only to generated columns defined prior to it.", + ErrDependentByGeneratedColumn: "Column '%s' has a generated column dependency.", + ErrInvalidJSONText: "Invalid JSON text: %-.192s", + ErrInvalidJSONPath: "Invalid JSON path expression %s.", + ErrInvalidJSONData: "Invalid data type for JSON data", + ErrInvalidJSONPathWildcard: "In this situation, path expressions may not contain the * and ** tokens.", + ErrInvalidJSONContainsPathType: "The second argument can only be either 'one' or 'all'.", + ErrJSONUsedAsKey: "JSON column '%-.192s' cannot be used in key specification.", + + // TiDB errors. + ErrMemExceedThreshold: "%s holds %dB memory, exceeds threshold %dB.%s", + ErrForUpdateCantRetry: "[%d] can not retry select for update statement", + ErrAdminCheckTable: "TiDB admin check table failed.", + + // TiKV/PD errors. + ErrPDServerTimeout: "PD server timeout", + ErrTiKVServerTimeout: "TiKV server timeout", + ErrTiKVServerBusy: "TiKV server is busy", + ErrResolveLockTimeout: "Resolve lock timeout", + ErrRegionUnavailable: "Region is unavailable", + ErrGCTooEarly: "GC life time is shorter than transaction duration, transaction starts at %v, GC safe point is %v", + + ErrTxnTooLarge: "Transaction is too large", +} diff --git a/mysql/error.go b/mysql/error.go new file mode 100644 index 000000000..fd6316ca2 --- /dev/null +++ b/mysql/error.go @@ -0,0 +1,71 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "errors" + "fmt" +) + +// Portable analogs of some common call errors. +var ( + ErrBadConn = errors.New("connection was bad") + ErrMalformPacket = errors.New("malform packet error") +) + +// SQLError records an error information, from executing SQL. +type SQLError struct { + Code uint16 + Message string + State string +} + +// Error prints errors, with a formatted string. +func (e *SQLError) Error() string { + return fmt.Sprintf("ERROR %d (%s): %s", e.Code, e.State, e.Message) +} + +// NewErr generates a SQL error, with an error code and default format specifier defined in MySQLErrName. +func NewErr(errCode uint16, args ...interface{}) *SQLError { + e := &SQLError{Code: errCode} + + if s, ok := MySQLState[errCode]; ok { + e.State = s + } else { + e.State = DefaultMySQLState + } + + if format, ok := MySQLErrName[errCode]; ok { + e.Message = fmt.Sprintf(format, args...) + } else { + e.Message = fmt.Sprint(args...) + } + + return e +} + +// NewErrf creates a SQL error, with an error code and a format specifier. +func NewErrf(errCode uint16, format string, args ...interface{}) *SQLError { + e := &SQLError{Code: errCode} + + if s, ok := MySQLState[errCode]; ok { + e.State = s + } else { + e.State = DefaultMySQLState + } + + e.Message = fmt.Sprintf(format, args...) + + return e +} diff --git a/mysql/error_test.go b/mysql/error_test.go new file mode 100644 index 000000000..a57c54835 --- /dev/null +++ b/mysql/error_test.go @@ -0,0 +1,37 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + . "github.com/pingcap/check" +) + +var _ = Suite(&testSQLErrorSuite{}) + +type testSQLErrorSuite struct { +} + +func (s *testSQLErrorSuite) TestSQLError(c *C) { + e := NewErrf(ErrNoDB, "no db error") + c.Assert(len(e.Error()), Greater, 0) + + e = NewErrf(0, "customized error") + c.Assert(len(e.Error()), Greater, 0) + + e = NewErr(ErrNoDB) + c.Assert(len(e.Error()), Greater, 0) + + e = NewErr(0, "customized error") + c.Assert(len(e.Error()), Greater, 0) +} diff --git a/mysql/locale_format.go b/mysql/locale_format.go new file mode 100644 index 000000000..b483f94fc --- /dev/null +++ b/mysql/locale_format.go @@ -0,0 +1,98 @@ +package mysql + +import ( + "bytes" + "strconv" + "strings" + "unicode" + + "github.com/pingcap/errors" +) + +func formatENUS(number string, precision string) (string, error) { + var buffer bytes.Buffer + if unicode.IsDigit(rune(precision[0])) { + for i, v := range precision { + if unicode.IsDigit(v) { + continue + } + precision = precision[:i] + break + } + } else { + precision = "0" + } + if number[0] == '-' && number[1] == '.' { + number = strings.Replace(number, "-", "-0", 1) + } else if number[0] == '.' { + number = strings.Replace(number, ".", "0.", 1) + } + + if (number[:1] == "-" && !unicode.IsDigit(rune(number[1]))) || + (!unicode.IsDigit(rune(number[0])) && number[:1] != "-") { + buffer.Write([]byte{'0'}) + position, err := strconv.ParseUint(precision, 10, 64) + if err == nil && position > 0 { + buffer.Write([]byte{'.'}) + buffer.WriteString(strings.Repeat("0", int(position))) + } + return buffer.String(), nil + } else if number[:1] == "-" { + buffer.Write([]byte{'-'}) + number = number[1:] + } + + for i, v := range number { + if unicode.IsDigit(v) { + continue + } else if i == 1 && number[1] == '.' { + continue + } else if v == '.' && number[1] != '.' { + continue + } else { + number = number[:i] + break + } + } + + comma := []byte{','} + parts := strings.Split(number, ".") + pos := 0 + if len(parts[0])%3 != 0 { + pos += len(parts[0]) % 3 + buffer.WriteString(parts[0][:pos]) + buffer.Write(comma) + } + for ; pos < len(parts[0]); pos += 3 { + buffer.WriteString(parts[0][pos : pos+3]) + buffer.Write(comma) + } + buffer.Truncate(buffer.Len() - 1) + + position, err := strconv.ParseUint(precision, 10, 64) + if err == nil { + if position > 0 { + buffer.Write([]byte{'.'}) + if len(parts) == 2 { + if uint64(len(parts[1])) >= position { + buffer.WriteString(parts[1][:position]) + } else { + buffer.WriteString(parts[1]) + buffer.WriteString(strings.Repeat("0", int(position)-len(parts[1]))) + } + } else { + buffer.WriteString(strings.Repeat("0", int(position))) + } + } + } + + return buffer.String(), nil +} + +func formatZHCN(number string, precision string) (string, error) { + return "", errors.New("not implemented") +} + +func formatNotSupport(number string, precision string) (string, error) { + return "", errors.New("not support for the specific locale") +} diff --git a/mysql/state.go b/mysql/state.go new file mode 100644 index 000000000..a31f61c01 --- /dev/null +++ b/mysql/state.go @@ -0,0 +1,258 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +const ( + // DefaultMySQLState is default state of the mySQL + DefaultMySQLState = "HY000" +) + +// MySQLState maps error code to MySQL SQLSTATE value. +// The values are taken from ANSI SQL and ODBC and are more standardized. +var MySQLState = map[uint16]string{ + ErrDupKey: "23000", + ErrOutofMemory: "HY001", + ErrOutOfSortMemory: "HY001", + ErrConCount: "08004", + ErrBadHost: "08S01", + ErrHandshake: "08S01", + ErrDBaccessDenied: "42000", + ErrAccessDenied: "28000", + ErrNoDB: "3D000", + ErrUnknownCom: "08S01", + ErrBadNull: "23000", + ErrBadDB: "42000", + ErrTableExists: "42S01", + ErrBadTable: "42S02", + ErrNonUniq: "23000", + ErrServerShutdown: "08S01", + ErrBadField: "42S22", + ErrFieldNotInGroupBy: "42000", + ErrWrongSumSelect: "42000", + ErrWrongGroupField: "42000", + ErrWrongValueCount: "21S01", + ErrTooLongIdent: "42000", + ErrDupFieldName: "42S21", + ErrDupKeyName: "42000", + ErrDupEntry: "23000", + ErrWrongFieldSpec: "42000", + ErrParse: "42000", + ErrEmptyQuery: "42000", + ErrNonuniqTable: "42000", + ErrInvalidDefault: "42000", + ErrMultiplePriKey: "42000", + ErrTooManyKeys: "42000", + ErrTooManyKeyParts: "42000", + ErrTooLongKey: "42000", + ErrKeyColumnDoesNotExits: "42000", + ErrBlobUsedAsKey: "42000", + ErrTooBigFieldlength: "42000", + ErrWrongAutoKey: "42000", + ErrForcingClose: "08S01", + ErrIpsock: "08S01", + ErrNoSuchIndex: "42S12", + ErrWrongFieldTerminators: "42000", + ErrBlobsAndNoTerminated: "42000", + ErrCantRemoveAllFields: "42000", + ErrCantDropFieldOrKey: "42000", + ErrBlobCantHaveDefault: "42000", + ErrWrongDBName: "42000", + ErrWrongTableName: "42000", + ErrTooBigSelect: "42000", + ErrUnknownProcedure: "42000", + ErrWrongParamcountToProcedure: "42000", + ErrUnknownTable: "42S02", + ErrFieldSpecifiedTwice: "42000", + ErrUnsupportedExtension: "42000", + ErrTableMustHaveColumns: "42000", + ErrUnknownCharacterSet: "42000", + ErrTooBigRowsize: "42000", + ErrWrongOuterJoin: "42000", + ErrNullColumnInIndex: "42000", + ErrPasswordAnonymousUser: "42000", + ErrPasswordNotAllowed: "42000", + ErrPasswordNoMatch: "42000", + ErrWrongValueCountOnRow: "21S01", + ErrInvalidUseOfNull: "22004", + ErrRegexp: "42000", + ErrMixOfGroupFuncAndFields: "42000", + ErrNonexistingGrant: "42000", + ErrTableaccessDenied: "42000", + ErrColumnaccessDenied: "42000", + ErrIllegalGrantForTable: "42000", + ErrGrantWrongHostOrUser: "42000", + ErrNoSuchTable: "42S02", + ErrNonexistingTableGrant: "42000", + ErrNotAllowedCommand: "42000", + ErrSyntax: "42000", + ErrAbortingConnection: "08S01", + ErrNetPacketTooLarge: "08S01", + ErrNetReadErrorFromPipe: "08S01", + ErrNetFcntl: "08S01", + ErrNetPacketsOutOfOrder: "08S01", + ErrNetUncompress: "08S01", + ErrNetRead: "08S01", + ErrNetReadInterrupted: "08S01", + ErrNetErrorOnWrite: "08S01", + ErrNetWriteInterrupted: "08S01", + ErrTooLongString: "42000", + ErrTableCantHandleBlob: "42000", + ErrTableCantHandleAutoIncrement: "42000", + ErrWrongColumnName: "42000", + ErrWrongKeyColumn: "42000", + ErrDupUnique: "23000", + ErrBlobKeyWithoutLength: "42000", + ErrPrimaryCantHaveNull: "42000", + ErrTooManyRows: "42000", + ErrRequiresPrimaryKey: "42000", + ErrKeyDoesNotExist: "42000", + ErrCheckNoSuchTable: "42000", + ErrCheckNotImplemented: "42000", + ErrCantDoThisDuringAnTransaction: "25000", + ErrNewAbortingConnection: "08S01", + ErrMasterNetRead: "08S01", + ErrMasterNetWrite: "08S01", + ErrTooManyUserConnections: "42000", + ErrReadOnlyTransaction: "25000", + ErrNoPermissionToCreateUser: "42000", + ErrLockDeadlock: "40001", + ErrNoReferencedRow: "23000", + ErrRowIsReferenced: "23000", + ErrConnectToMaster: "08S01", + ErrWrongNumberOfColumnsInSelect: "21000", + ErrUserLimitReached: "42000", + ErrSpecificAccessDenied: "42000", + ErrNoDefault: "42000", + ErrWrongValueForVar: "42000", + ErrWrongTypeForVar: "42000", + ErrCantUseOptionHere: "42000", + ErrNotSupportedYet: "42000", + ErrWrongFkDef: "42000", + ErrOperandColumns: "21000", + ErrSubqueryNo1Row: "21000", + ErrIllegalReference: "42S22", + ErrDerivedMustHaveAlias: "42000", + ErrSelectReduced: "01000", + ErrTablenameNotAllowedHere: "42000", + ErrNotSupportedAuthMode: "08004", + ErrSpatialCantHaveNull: "42000", + ErrCollationCharsetMismatch: "42000", + ErrWarnTooFewRecords: "01000", + ErrWarnTooManyRecords: "01000", + ErrWarnNullToNotnull: "22004", + ErrWarnDataOutOfRange: "22003", + WarnDataTruncated: "01000", + ErrWrongNameForIndex: "42000", + ErrWrongNameForCatalog: "42000", + ErrUnknownStorageEngine: "42000", + ErrTruncatedWrongValue: "22007", + ErrSpNoRecursiveCreate: "2F003", + ErrSpAlreadyExists: "42000", + ErrSpDoesNotExist: "42000", + ErrSpLilabelMismatch: "42000", + ErrSpLabelRedefine: "42000", + ErrSpLabelMismatch: "42000", + ErrSpUninitVar: "01000", + ErrSpBadselect: "0A000", + ErrSpBadreturn: "42000", + ErrSpBadstatement: "0A000", + ErrUpdateLogDeprecatedIgnored: "42000", + ErrUpdateLogDeprecatedTranslated: "42000", + ErrQueryInterrupted: "70100", + ErrSpWrongNoOfArgs: "42000", + ErrSpCondMismatch: "42000", + ErrSpNoreturn: "42000", + ErrSpNoreturnend: "2F005", + ErrSpBadCursorQuery: "42000", + ErrSpBadCursorSelect: "42000", + ErrSpCursorMismatch: "42000", + ErrSpCursorAlreadyOpen: "24000", + ErrSpCursorNotOpen: "24000", + ErrSpUndeclaredVar: "42000", + ErrSpFetchNoData: "02000", + ErrSpDupParam: "42000", + ErrSpDupVar: "42000", + ErrSpDupCond: "42000", + ErrSpDupCurs: "42000", + ErrSpSubselectNyi: "0A000", + ErrStmtNotAllowedInSfOrTrg: "0A000", + ErrSpVarcondAfterCurshndlr: "42000", + ErrSpCursorAfterHandler: "42000", + ErrSpCaseNotFound: "20000", + ErrDivisionByZero: "22012", + ErrIllegalValueForType: "22007", + ErrProcaccessDenied: "42000", + ErrXaerNota: "XAE04", + ErrXaerInval: "XAE05", + ErrXaerRmfail: "XAE07", + ErrXaerOutside: "XAE09", + ErrXaerRmerr: "XAE03", + ErrXaRbrollback: "XA100", + ErrNonexistingProcGrant: "42000", + ErrDataTooLong: "22001", + ErrSpBadSQLstate: "42000", + ErrCantCreateUserWithGrant: "42000", + ErrSpDupHandler: "42000", + ErrSpNotVarArg: "42000", + ErrSpNoRetset: "0A000", + ErrCantCreateGeometryObject: "22003", + ErrTooBigScale: "42000", + ErrTooBigPrecision: "42000", + ErrMBiggerThanD: "42000", + ErrTooLongBody: "42000", + ErrTooBigDisplaywidth: "42000", + ErrXaerDupid: "XAE08", + ErrDatetimeFunctionOverflow: "22008", + ErrRowIsReferenced2: "23000", + ErrNoReferencedRow2: "23000", + ErrSpBadVarShadow: "42000", + ErrSpWrongName: "42000", + ErrSpNoAggregate: "42000", + ErrMaxPreparedStmtCountReached: "42000", + ErrNonGroupingFieldUsed: "42000", + ErrForeignDuplicateKeyOldUnused: "23000", + ErrCantChangeTxCharacteristics: "25001", + ErrWrongParamcountToNativeFct: "42000", + ErrWrongParametersToNativeFct: "42000", + ErrWrongParametersToStoredFct: "42000", + ErrDupEntryWithKeyName: "23000", + ErrXaRbtimeout: "XA106", + ErrXaRbdeadlock: "XA102", + ErrFuncInexistentNameCollision: "42000", + ErrDupSignalSet: "42000", + ErrSignalWarn: "01000", + ErrSignalNotFound: "02000", + ErrSignalException: "HY000", + ErrResignalWithoutActiveHandler: "0K000", + ErrSpatialMustHaveGeomCol: "42000", + ErrDataOutOfRange: "22003", + ErrAccessDeniedNoPassword: "28000", + ErrTruncateIllegalFk: "42000", + ErrDaInvalidConditionNumber: "35000", + ErrForeignDuplicateKeyWithChildInfo: "23000", + ErrForeignDuplicateKeyWithoutChildInfo: "23000", + ErrCantExecuteInReadOnlyTransaction: "25006", + ErrAlterOperationNotSupported: "0A000", + ErrAlterOperationNotSupportedReason: "0A000", + ErrDupUnknownInIndex: "23000", + ErrBadGeneratedColumn: "HY000", + ErrUnsupportedOnGeneratedColumn: "HY000", + ErrGeneratedColumnNonPrior: "HY000", + ErrDependentByGeneratedColumn: "HY000", + ErrInvalidJSONText: "22032", + ErrInvalidJSONPath: "42000", + ErrInvalidJSONData: "22032", + ErrInvalidJSONPathWildcard: "42000", + ErrJSONUsedAsKey: "42000", +} diff --git a/mysql/type.go b/mysql/type.go new file mode 100644 index 000000000..9ea32f90d --- /dev/null +++ b/mysql/type.go @@ -0,0 +1,155 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQL type information. +const ( + TypeDecimal byte = 0 + TypeTiny byte = 1 + TypeShort byte = 2 + TypeLong byte = 3 + TypeFloat byte = 4 + TypeDouble byte = 5 + TypeNull byte = 6 + TypeTimestamp byte = 7 + TypeLonglong byte = 8 + TypeInt24 byte = 9 + TypeDate byte = 10 + /* TypeDuration original name was TypeTime, renamed to TypeDuration to resolve the conflict with Go type Time.*/ + TypeDuration byte = 11 + TypeDatetime byte = 12 + TypeYear byte = 13 + TypeNewDate byte = 14 + TypeVarchar byte = 15 + TypeBit byte = 16 + + TypeJSON byte = 0xf5 + TypeNewDecimal byte = 0xf6 + TypeEnum byte = 0xf7 + TypeSet byte = 0xf8 + TypeTinyBlob byte = 0xf9 + TypeMediumBlob byte = 0xfa + TypeLongBlob byte = 0xfb + TypeBlob byte = 0xfc + TypeVarString byte = 0xfd + TypeString byte = 0xfe + TypeGeometry byte = 0xff +) + +// TypeUnspecified is an uninitialized type. TypeDecimal is not used in MySQL. +const TypeUnspecified = TypeDecimal + +// Flag information. +const ( + NotNullFlag uint = 1 << 0 /* Field can't be NULL */ + PriKeyFlag uint = 1 << 1 /* Field is part of a primary key */ + UniqueKeyFlag uint = 1 << 2 /* Field is part of a unique key */ + MultipleKeyFlag uint = 1 << 3 /* Field is part of a key */ + BlobFlag uint = 1 << 4 /* Field is a blob */ + UnsignedFlag uint = 1 << 5 /* Field is unsigned */ + ZerofillFlag uint = 1 << 6 /* Field is zerofill */ + BinaryFlag uint = 1 << 7 /* Field is binary */ + EnumFlag uint = 1 << 8 /* Field is an enum */ + AutoIncrementFlag uint = 1 << 9 /* Field is an auto increment field */ + TimestampFlag uint = 1 << 10 /* Field is a timestamp */ + SetFlag uint = 1 << 11 /* Field is a set */ + NoDefaultValueFlag uint = 1 << 12 /* Field doesn't have a default value */ + OnUpdateNowFlag uint = 1 << 13 /* Field is set to NOW on UPDATE */ + PartKeyFlag uint = 1 << 14 /* Intern: Part of some keys */ + NumFlag uint = 1 << 15 /* Field is a num (for clients) */ + + GroupFlag uint = 1 << 15 /* Internal: Group field */ + UniqueFlag uint = 1 << 16 /* Internal: Used by sql_yacc */ + BinCmpFlag uint = 1 << 17 /* Internal: Used by sql_yacc */ + ParseToJSONFlag uint = 1 << 18 /* Internal: Used when we want to parse string to JSON in CAST */ + IsBooleanFlag uint = 1 << 19 /* Internal: Used for telling boolean literal from integer */ + PreventNullInsertFlag uint = 1 << 20 /* Prevent this Field from inserting NULL values */ +) + +// TypeInt24 bounds. +const ( + MaxUint24 = 1<<24 - 1 + MaxInt24 = 1<<23 - 1 + MinInt24 = -1 << 23 +) + +// HasNotNullFlag checks if NotNullFlag is set. +func HasNotNullFlag(flag uint) bool { + return (flag & NotNullFlag) > 0 +} + +// HasNoDefaultValueFlag checks if NoDefaultValueFlag is set. +func HasNoDefaultValueFlag(flag uint) bool { + return (flag & NoDefaultValueFlag) > 0 +} + +// HasAutoIncrementFlag checks if AutoIncrementFlag is set. +func HasAutoIncrementFlag(flag uint) bool { + return (flag & AutoIncrementFlag) > 0 +} + +// HasUnsignedFlag checks if UnsignedFlag is set. +func HasUnsignedFlag(flag uint) bool { + return (flag & UnsignedFlag) > 0 +} + +// HasZerofillFlag checks if ZerofillFlag is set. +func HasZerofillFlag(flag uint) bool { + return (flag & ZerofillFlag) > 0 +} + +// HasBinaryFlag checks if BinaryFlag is set. +func HasBinaryFlag(flag uint) bool { + return (flag & BinaryFlag) > 0 +} + +// HasPriKeyFlag checks if PriKeyFlag is set. +func HasPriKeyFlag(flag uint) bool { + return (flag & PriKeyFlag) > 0 +} + +// HasUniKeyFlag checks if UniqueKeyFlag is set. +func HasUniKeyFlag(flag uint) bool { + return (flag & UniqueKeyFlag) > 0 +} + +// HasMultipleKeyFlag checks if MultipleKeyFlag is set. +func HasMultipleKeyFlag(flag uint) bool { + return (flag & MultipleKeyFlag) > 0 +} + +// HasTimestampFlag checks if HasTimestampFlag is set. +func HasTimestampFlag(flag uint) bool { + return (flag & TimestampFlag) > 0 +} + +// HasOnUpdateNowFlag checks if OnUpdateNowFlag is set. +func HasOnUpdateNowFlag(flag uint) bool { + return (flag & OnUpdateNowFlag) > 0 +} + +// HasParseToJSONFlag checks if ParseToJSONFlag is set. +func HasParseToJSONFlag(flag uint) bool { + return (flag & ParseToJSONFlag) > 0 +} + +// HasIsBooleanFlag checks if IsBooleanFlag is set. +func HasIsBooleanFlag(flag uint) bool { + return (flag & IsBooleanFlag) > 0 +} + +// HasPreventNullInsertFlag checks if PreventNullInsertFlag is set. +func HasPreventNullInsertFlag(flag uint) bool { + return (flag & PreventNullInsertFlag) > 0 +} diff --git a/mysql/type_test.go b/mysql/type_test.go new file mode 100644 index 000000000..a5139b168 --- /dev/null +++ b/mysql/type_test.go @@ -0,0 +1,37 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + . "github.com/pingcap/check" +) + +var _ = Suite(&testTypeSuite{}) + +type testTypeSuite struct{} + +func (s *testTypeSuite) TestFlags(c *C) { + c.Assert(HasNotNullFlag(NotNullFlag), IsTrue) + c.Assert(HasUniKeyFlag(UniqueKeyFlag), IsTrue) + c.Assert(HasNotNullFlag(NotNullFlag), IsTrue) + c.Assert(HasNoDefaultValueFlag(NoDefaultValueFlag), IsTrue) + c.Assert(HasAutoIncrementFlag(AutoIncrementFlag), IsTrue) + c.Assert(HasUnsignedFlag(UnsignedFlag), IsTrue) + c.Assert(HasZerofillFlag(ZerofillFlag), IsTrue) + c.Assert(HasBinaryFlag(BinaryFlag), IsTrue) + c.Assert(HasPriKeyFlag(PriKeyFlag), IsTrue) + c.Assert(HasMultipleKeyFlag(MultipleKeyFlag), IsTrue) + c.Assert(HasTimestampFlag(TimestampFlag), IsTrue) + c.Assert(HasOnUpdateNowFlag(OnUpdateNowFlag), IsTrue) +} diff --git a/mysql/util.go b/mysql/util.go new file mode 100644 index 000000000..312161c4c --- /dev/null +++ b/mysql/util.go @@ -0,0 +1,93 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +type lengthAndDecimal struct { + length int + decimal int +} + +// defaultLengthAndDecimal provides default Flen and Decimal for fields +// from CREATE TABLE when they are unspecified. +var defaultLengthAndDecimal = map[byte]lengthAndDecimal{ + TypeBit: {1, 0}, + TypeTiny: {4, 0}, + TypeShort: {6, 0}, + TypeInt24: {9, 0}, + TypeLong: {11, 0}, + TypeLonglong: {20, 0}, + TypeDouble: {22, -1}, + TypeFloat: {12, -1}, + TypeNewDecimal: {11, 0}, + TypeDuration: {10, 0}, + TypeDate: {10, 0}, + TypeTimestamp: {19, 0}, + TypeDatetime: {19, 0}, + TypeYear: {4, 0}, + TypeString: {1, 0}, + TypeVarchar: {5, 0}, + TypeVarString: {5, 0}, + TypeTinyBlob: {255, 0}, + TypeBlob: {65535, 0}, + TypeMediumBlob: {16777215, 0}, + TypeLongBlob: {4294967295, 0}, + TypeJSON: {4294967295, 0}, + TypeNull: {0, 0}, + TypeSet: {-1, 0}, + TypeEnum: {-1, 0}, +} + +// IsIntegerType indicate whether tp is an integer type. +func IsIntegerType(tp byte) bool { + switch tp { + case TypeTiny, TypeShort, TypeInt24, TypeLong, TypeLonglong: + return true + } + return false +} + +// GetDefaultFieldLengthAndDecimal returns the default display length (flen) and decimal length for column. +// Call this when no Flen assigned in ddl. +// or column value is calculated from an expression. +// For example: "select count(*) from t;", the column type is int64 and Flen in ResultField will be 21. +// See https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html +func GetDefaultFieldLengthAndDecimal(tp byte) (flen int, decimal int) { + val, ok := defaultLengthAndDecimal[tp] + if ok { + return val.length, val.decimal + } + return -1, -1 +} + +// defaultLengthAndDecimal provides default Flen and Decimal for fields +// from CAST when they are unspecified. +var defaultLengthAndDecimalForCast = map[byte]lengthAndDecimal{ + TypeString: {0, -1}, // Flen & Decimal differs. + TypeDate: {10, 0}, + TypeDatetime: {19, 0}, + TypeNewDecimal: {11, 0}, + TypeDuration: {10, 0}, + TypeLonglong: {22, 0}, + TypeJSON: {4194304, 0}, // Flen differs. +} + +// GetDefaultFieldLengthAndDecimalForCast returns the default display length (flen) and decimal length for casted column +// when flen or decimal is not specified. +func GetDefaultFieldLengthAndDecimalForCast(tp byte) (flen int, decimal int) { + val, ok := defaultLengthAndDecimalForCast[tp] + if ok { + return val.length, val.decimal + } + return -1, -1 +} diff --git a/opcode/opcode.go b/opcode/opcode.go new file mode 100644 index 000000000..670fb2b88 --- /dev/null +++ b/opcode/opcode.go @@ -0,0 +1,138 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package opcode + +import ( + "fmt" + "io" +) + +// Op is opcode type. +type Op int + +// List operators. +const ( + LogicAnd Op = iota + 1 + LeftShift + RightShift + LogicOr + GE + LE + EQ + NE + LT + GT + Plus + Minus + And + Or + Mod + Xor + Div + Mul + Not + BitNeg + IntDiv + LogicXor + NullEQ + In + Like + Case + Regexp + IsNull + IsTruth + IsFalsity +) + +// Ops maps opcode to string. +var Ops = map[Op]string{ + LogicAnd: "and", + LogicOr: "or", + LogicXor: "xor", + LeftShift: "leftshift", + RightShift: "rightshift", + GE: "ge", + LE: "le", + EQ: "eq", + NE: "ne", + LT: "lt", + GT: "gt", + Plus: "plus", + Minus: "minus", + And: "bitand", + Or: "bitor", + Mod: "mod", + Xor: "bitxor", + Div: "div", + Mul: "mul", + Not: "not", + BitNeg: "bitneg", + IntDiv: "intdiv", + NullEQ: "nulleq", + In: "in", + Like: "like", + Case: "case", + Regexp: "regexp", + IsNull: "isnull", + IsTruth: "istrue", + IsFalsity: "isfalse", +} + +// String implements Stringer interface. +func (o Op) String() string { + str, ok := Ops[o] + if !ok { + panic(fmt.Sprintf("%d", o)) + } + + return str +} + +var opsLiteral = map[Op]string{ + LogicAnd: "&&", + LogicOr: "||", + LogicXor: "^", + LeftShift: "<<", + RightShift: ">>", + GE: ">=", + LE: "<=", + EQ: "==", + NE: "!=", + LT: "<", + GT: ">", + Plus: "+", + Minus: "-", + And: "&", + Or: "|", + Mod: "%", + Xor: "^", + Div: "/", + Mul: "*", + Not: "!", + BitNeg: "~", + IntDiv: "DIV", + NullEQ: "<=>", + In: "IN", + Like: "LIKE", + Case: "CASE", + Regexp: "REGEXP", + IsNull: "IS NULL", + IsTruth: "IS TRUE", + IsFalsity: "IS FALSE", +} + +// Format the ExprNode into a Writer. +func (o Op) Format(w io.Writer) { + fmt.Fprintf(w, "%s", opsLiteral[o]) +} diff --git a/opcode/opcode_test.go b/opcode/opcode_test.go new file mode 100644 index 000000000..a4c2821b2 --- /dev/null +++ b/opcode/opcode_test.go @@ -0,0 +1,49 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package opcode + +import ( + "bytes" + "testing" +) + +func TestT(t *testing.T) { + op := Plus + if op.String() != "plus" { + t.Fatalf("invalid op code") + } + + if len(Ops) != len(opsLiteral) { + t.Error("inconsistent count ops and opsliteral") + } + var buf bytes.Buffer + for op := range Ops { + op.Format(&buf) + if buf.String() != opsLiteral[op] { + t.Error("format op fail", op) + } + buf.Reset() + } + + // Test invalid opcode + defer func() { + recover() + }() + + op = 0 + s := op.String() + if len(s) > 0 { + t.Fail() + } +} diff --git a/parser.go b/parser.go new file mode 100644 index 000000000..560f39ccd --- /dev/null +++ b/parser.go @@ -0,0 +1,11728 @@ +// Code generated by goyacc +// CAUTION: Generated file - DO NOT EDIT. + +// Copyright 2013 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Initial yacc source generated by ebnf2y[1] +// at 2013-10-04 23:10:47.861401015 +0200 CEST +// +// $ ebnf2y -o ql.y -oe ql.ebnf -start StatementList -pkg ql -p _ +// +// [1]: http://github.com/cznic/ebnf2y + +package parser + +import __yyfmt__ "fmt" + +import ( + "strings" + + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/types" +) + +type yySymType struct { + yys int + offset int // offset + item interface{} + ident string + expr ast.ExprNode + statement ast.StmtNode +} + +type yyXError struct { + state, xsym int +} + +const ( + yyDefault = 57799 + yyEOFCode = 57344 + action = 57538 + add = 57359 + addDate = 57697 + admin = 57725 + after = 57539 + algorithm = 57541 + all = 57360 + alter = 57361 + always = 57540 + analyze = 57362 + and = 57363 + andand = 57354 + andnot = 57770 + any = 57542 + as = 57364 + asc = 57365 + ascii = 57543 + assignmentEq = 57771 + autoIncrement = 57544 + avg = 57546 + avgRowLength = 57545 + begin = 57547 + between = 57366 + bigIntType = 57367 + binaryType = 57368 + binlog = 57548 + bitAnd = 57698 + bitLit = 57769 + bitOr = 57699 + bitType = 57549 + bitXor = 57700 + blobType = 57369 + boolType = 57551 + booleanType = 57550 + both = 57370 + btree = 57552 + buckets = 57726 + builtinAddDate = 57740 + builtinBitAnd = 57741 + builtinBitOr = 57742 + builtinBitXor = 57743 + builtinCast = 57744 + builtinCount = 57745 + builtinCurDate = 57746 + builtinCurTime = 57747 + builtinDateAdd = 57748 + builtinDateSub = 57749 + builtinExtract = 57750 + builtinGroupConcat = 57751 + builtinMax = 57752 + builtinMin = 57753 + builtinNow = 57754 + builtinPosition = 57755 + builtinStddevPop = 57756 + builtinSubDate = 57757 + builtinSubstring = 57758 + builtinSum = 57759 + builtinSysDate = 57760 + builtinTrim = 57761 + builtinUser = 57762 + builtinVarPop = 57763 + builtinVarSamp = 57764 + by = 57371 + byteType = 57553 + cancel = 57727 + cascade = 57372 + cascaded = 57554 + caseKwd = 57373 + cast = 57701 + change = 57374 + charType = 57376 + character = 57375 + charsetKwd = 57555 + check = 57377 + checksum = 57556 + cleanup = 57557 + client = 57558 + coalesce = 57559 + collate = 57378 + collation = 57560 + column = 57379 + columns = 57561 + comment = 57562 + commit = 57563 + committed = 57564 + compact = 57565 + compressed = 57566 + compression = 57567 + connection = 57568 + consistent = 57569 + constraint = 57380 + convert = 57381 + copyKwd = 57702 + count = 57703 + create = 57382 + createTableSelect = 57791 + cross = 57383 + curTime = 57704 + currentDate = 57384 + currentTime = 57385 + currentTs = 57386 + currentUser = 57387 + data = 57571 + database = 57388 + databases = 57389 + dateAdd = 57705 + dateSub = 57706 + dateType = 57572 + datetimeType = 57573 + day = 57570 + dayHour = 57390 + dayMicrosecond = 57391 + dayMinute = 57392 + daySecond = 57393 + ddl = 57728 + deallocate = 57574 + decLit = 57766 + decimalType = 57394 + defaultKwd = 57395 + definer = 57575 + delayKeyWrite = 57576 + delayed = 57396 + deleteKwd = 57397 + desc = 57398 + describe = 57399 + disable = 57577 + distinct = 57400 + distinctRow = 57401 + div = 57402 + do = 57578 + doubleAtIdentifier = 57350 + doubleType = 57403 + drop = 57404 + dual = 57405 + duplicate = 57579 + dynamic = 57580 + elseKwd = 57406 + empty = 57784 + enable = 57581 + enclosed = 57407 + end = 57582 + engine = 57583 + engines = 57584 + enum = 57585 + eq = 57772 + yyErrCode = 57345 + escape = 57588 + escaped = 57408 + event = 57586 + events = 57587 + exclusive = 57589 + execute = 57590 + exists = 57409 + explain = 57410 + extract = 57707 + falseKwd = 57411 + fields = 57591 + first = 57592 + fixed = 57593 + floatLit = 57765 + floatType = 57412 + flush = 57594 + forKwd = 57413 + force = 57414 + foreign = 57415 + format = 57595 + from = 57416 + full = 57596 + fulltext = 57417 + function = 57597 + ge = 57773 + generated = 57418 + getFormat = 57708 + global = 57673 + grant = 57419 + grants = 57598 + group = 57420 + groupConcat = 57709 + hash = 57599 + having = 57421 + hexLit = 57768 + highPriority = 57422 + higherThanComma = 57798 + hintBegin = 57352 + hintEnd = 57353 + hour = 57600 + hourMicrosecond = 57423 + hourMinute = 57424 + hourSecond = 57425 + identSQLErrors = 57694 + identified = 57601 + identifier = 57346 + ifKwd = 57426 + ignore = 57427 + in = 57428 + index = 57429 + indexes = 57603 + infile = 57430 + inner = 57431 + inplace = 57710 + insert = 57436 + insertValues = 57789 + int1Type = 57438 + int2Type = 57439 + int3Type = 57440 + int4Type = 57441 + int8Type = 57442 + intLit = 57767 + intType = 57437 + integerType = 57432 + internal = 57711 + interval = 57433 + into = 57434 + invalid = 57351 + invoker = 57604 + is = 57435 + isolation = 57602 + job = 57730 + jobs = 57729 + join = 57443 + jsonType = 57605 + jss = 57775 + juss = 57776 + key = 57444 + keyBlockSize = 57606 + keys = 57445 + kill = 57446 + le = 57774 + leading = 57447 + left = 57448 + less = 57608 + level = 57609 + like = 57449 + limit = 57450 + lines = 57451 + load = 57452 + local = 57607 + localTime = 57453 + localTs = 57454 + lock = 57455 + long = 57526 + longblobType = 57456 + longtextType = 57457 + lowPriority = 57458 + lowerThanComma = 57797 + lowerThanCreateTableSelect = 57790 + lowerThanEq = 57795 + lowerThanInsertValues = 57788 + lowerThanIntervalKeyword = 57785 + lowerThanKey = 57792 + lowerThanOn = 57794 + lowerThanSetKeyword = 57787 + lowerThanStringLitToken = 57786 + lsh = 57777 + master = 57610 + max = 57713 + maxConnectionsPerHour = 57617 + maxExecutionTime = 57714 + maxQueriesPerHour = 57618 + maxRows = 57616 + maxUpdatesPerHour = 57619 + maxUserConnections = 57620 + maxValue = 57459 + mediumIntType = 57461 + mediumblobType = 57460 + mediumtextType = 57462 + merge = 57621 + microsecond = 57611 + min = 57712 + minRows = 57622 + minute = 57612 + minuteMicrosecond = 57463 + minuteSecond = 57464 + mod = 57465 + mode = 57613 + modify = 57614 + month = 57615 + names = 57623 + national = 57624 + natural = 57537 + neg = 57796 + neq = 57778 + neqSynonym = 57779 + no = 57625 + noWriteToBinLog = 57467 + none = 57626 + not = 57466 + not2 = 57783 + now = 57715 + null = 57468 + nulleq = 57780 + numericType = 57469 + nvarcharType = 57470 + odbcDateType = 57356 + odbcTimeType = 57357 + odbcTimestampType = 57358 + offset = 57627 + on = 57471 + only = 57628 + option = 57472 + or = 57473 + order = 57474 + outer = 57475 + packKeys = 57476 + paramMarker = 57781 + partition = 57477 + partitions = 57630 + password = 57629 + pipes = 57355 + pipesAsOr = 57631 + plugins = 57632 + position = 57716 + precisionType = 57478 + prepare = 57633 + primary = 57479 + privileges = 57634 + procedure = 57480 + process = 57635 + processlist = 57636 + profiles = 57637 + quarter = 57638 + queries = 57640 + query = 57639 + quick = 57641 + rangeKwd = 57482 + read = 57483 + realType = 57484 + recent = 57717 + recover = 57642 + redundant = 57643 + references = 57485 + regexpKwd = 57486 + reload = 57644 + rename = 57487 + repeat = 57488 + repeatable = 57645 + replace = 57489 + replication = 57646 + restrict = 57490 + reverse = 57647 + revoke = 57491 + right = 57492 + rlike = 57493 + rollback = 57648 + routine = 57649 + row = 57650 + rowCount = 57651 + rowFormat = 57652 + rsh = 57782 + second = 57653 + secondMicrosecond = 57494 + security = 57654 + selectKwd = 57495 + separator = 57655 + serializable = 57656 + session = 57657 + set = 57496 + shardRowIDBits = 57481 + share = 57658 + shared = 57659 + show = 57497 + signed = 57660 + singleAtIdentifier = 57349 + slave = 57661 + slow = 57662 + smallIntType = 57498 + snapshot = 57663 + some = 57672 + sql = 57499 + sqlCache = 57664 + sqlCalcFoundRows = 57500 + sqlNoCache = 57665 + start = 57666 + starting = 57501 + stats = 57731 + statsBuckets = 57734 + statsHealthy = 57735 + statsHistograms = 57733 + statsMeta = 57732 + statsPersistent = 57667 + status = 57668 + stored = 57504 + straightJoin = 57502 + stringLit = 57348 + subDate = 57718 + subpartition = 57669 + subpartitions = 57670 + substring = 57720 + sum = 57719 + super = 57671 + tableKwd = 57503 + tableRefPriority = 57793 + tables = 57674 + tablespace = 57675 + temporary = 57676 + temptable = 57677 + terminated = 57505 + textType = 57678 + than = 57679 + then = 57506 + tidb = 57736 + tidbHJ = 57737 + tidbINLJ = 57739 + tidbSMJ = 57738 + timeType = 57680 + timestampAdd = 57721 + timestampDiff = 57722 + timestampType = 57681 + tinyIntType = 57508 + tinyblobType = 57507 + tinytextType = 57509 + to = 57510 + top = 57723 + trace = 57682 + trailing = 57511 + transaction = 57683 + trigger = 57512 + triggers = 57684 + trim = 57724 + trueKwd = 57513 + truncate = 57685 + uncommitted = 57686 + undefined = 57689 + underscoreCS = 57347 + union = 57515 + unique = 57514 + unknown = 57687 + unlock = 57516 + unsigned = 57517 + update = 57518 + usage = 57519 + use = 57520 + user = 57688 + using = 57521 + utcDate = 57522 + utcTime = 57524 + utcTimestamp = 57523 + value = 57690 + values = 57525 + varbinaryType = 57528 + varcharType = 57527 + variables = 57691 + view = 57692 + virtual = 57529 + warnings = 57693 + week = 57695 + when = 57530 + where = 57531 + with = 57533 + write = 57532 + xor = 57534 + yearMonth = 57535 + yearType = 57696 + zerofill = 57536 + + yyMaxDepth = 200 + yyTabOfs = -1353 +) + +var ( + yyXLAT = map[int]int{ + 57344: 0, // $end (1158x) + 59: 1, // ';' (1157x) + 57562: 2, // comment (1050x) + 57544: 3, // autoIncrement (1024x) + 57539: 4, // after (988x) + 57592: 5, // first (988x) + 44: 6, // ',' (978x) + 57555: 7, // charsetKwd (913x) + 57606: 8, // keyBlockSize (899x) + 57583: 9, // engine (893x) + 57568: 10, // connection (886x) + 57629: 11, // password (886x) + 57660: 12, // signed (885x) + 57556: 13, // checksum (884x) + 57545: 14, // avgRowLength (883x) + 57567: 15, // compression (883x) + 57576: 16, // delayKeyWrite (883x) + 57616: 17, // maxRows (883x) + 57622: 18, // minRows (883x) + 57652: 19, // rowFormat (883x) + 57667: 20, // statsPersistent (883x) + 41: 21, // ')' (869x) + 57692: 22, // view (861x) + 57655: 23, // separator (853x) + 57668: 24, // status (853x) + 57674: 25, // tables (853x) + 57675: 26, // tablespace (851x) + 57561: 27, // columns (850x) + 57575: 28, // definer (849x) + 57591: 29, // fields (849x) + 57601: 30, // identified (849x) + 57714: 31, // maxExecutionTime (849x) + 57737: 32, // tidbHJ (849x) + 57739: 33, // tidbINLJ (849x) + 57738: 34, // tidbSMJ (849x) + 57696: 35, // yearType (849x) + 57570: 36, // day (848x) + 57600: 37, // hour (848x) + 57611: 38, // microsecond (848x) + 57612: 39, // minute (848x) + 57615: 40, // month (848x) + 57638: 41, // quarter (848x) + 57653: 42, // second (848x) + 57695: 43, // week (848x) + 57582: 44, // end (847x) + 57634: 45, // privileges (847x) + 57541: 46, // algorithm (846x) + 57590: 47, // execute (846x) + 57627: 48, // offset (846x) + 57633: 49, // prepare (846x) + 57573: 50, // datetimeType (845x) + 57572: 51, // dateType (845x) + 57602: 52, // isolation (845x) + 57607: 53, // local (845x) + 57630: 54, // partitions (845x) + 57669: 55, // subpartition (845x) + 57680: 56, // timeType (845x) + 57688: 57, // user (845x) + 57691: 58, // variables (845x) + 57586: 59, // event (844x) + 57599: 60, // hash (844x) + 57605: 61, // jsonType (844x) + 57635: 62, // process (844x) + 57636: 63, // processlist (844x) + 57639: 64, // query (844x) + 57644: 65, // reload (844x) + 57646: 66, // replication (844x) + 57671: 67, // super (844x) + 57687: 68, // unknown (844x) + 57690: 69, // value (844x) + 57725: 70, // admin (843x) + 57547: 71, // begin (843x) + 57548: 72, // binlog (843x) + 57726: 73, // buckets (843x) + 57563: 74, // commit (843x) + 57565: 75, // compact (843x) + 57566: 76, // compressed (843x) + 57702: 77, // copyKwd (843x) + 57728: 78, // ddl (843x) + 57574: 79, // deallocate (843x) + 57577: 80, // disable (843x) + 57578: 81, // do (843x) + 57580: 82, // dynamic (843x) + 57581: 83, // enable (843x) + 57593: 84, // fixed (843x) + 57594: 85, // flush (843x) + 57710: 86, // inplace (843x) + 57729: 87, // jobs (843x) + 57614: 88, // modify (843x) + 57625: 89, // no (843x) + 57643: 90, // redundant (843x) + 57648: 91, // rollback (843x) + 57649: 92, // routine (843x) + 57666: 93, // start (843x) + 57731: 94, // stats (843x) + 57670: 95, // subpartitions (843x) + 57681: 96, // timestampType (843x) + 57682: 97, // trace (843x) + 57685: 98, // truncate (843x) + 57538: 99, // action (842x) + 57540: 100, // always (842x) + 57549: 101, // bitType (842x) + 57550: 102, // booleanType (842x) + 57551: 103, // boolType (842x) + 57552: 104, // btree (842x) + 57727: 105, // cancel (842x) + 57554: 106, // cascaded (842x) + 57557: 107, // cleanup (842x) + 57558: 108, // client (842x) + 57560: 109, // collation (842x) + 57564: 110, // committed (842x) + 57569: 111, // consistent (842x) + 57571: 112, // data (842x) + 57579: 113, // duplicate (842x) + 57584: 114, // engines (842x) + 57585: 115, // enum (842x) + 57587: 116, // events (842x) + 57589: 117, // exclusive (842x) + 57596: 118, // full (842x) + 57597: 119, // function (842x) + 57673: 120, // global (842x) + 57598: 121, // grants (842x) + 57694: 122, // identSQLErrors (842x) + 57603: 123, // indexes (842x) + 57711: 124, // internal (842x) + 57604: 125, // invoker (842x) + 57730: 126, // job (842x) + 57608: 127, // less (842x) + 57609: 128, // level (842x) + 57610: 129, // master (842x) + 57617: 130, // maxConnectionsPerHour (842x) + 57618: 131, // maxQueriesPerHour (842x) + 57619: 132, // maxUpdatesPerHour (842x) + 57620: 133, // maxUserConnections (842x) + 57621: 134, // merge (842x) + 57613: 135, // mode (842x) + 57624: 136, // national (842x) + 57626: 137, // none (842x) + 57628: 138, // only (842x) + 57632: 139, // plugins (842x) + 57637: 140, // profiles (842x) + 57640: 141, // queries (842x) + 57717: 142, // recent (842x) + 57642: 143, // recover (842x) + 57645: 144, // repeatable (842x) + 57654: 145, // security (842x) + 57656: 146, // serializable (842x) + 57657: 147, // session (842x) + 57658: 148, // share (842x) + 57659: 149, // shared (842x) + 57661: 150, // slave (842x) + 57662: 151, // slow (842x) + 57663: 152, // snapshot (842x) + 57734: 153, // statsBuckets (842x) + 57735: 154, // statsHealthy (842x) + 57733: 155, // statsHistograms (842x) + 57732: 156, // statsMeta (842x) + 57676: 157, // temporary (842x) + 57677: 158, // temptable (842x) + 57678: 159, // textType (842x) + 57679: 160, // than (842x) + 57736: 161, // tidb (842x) + 57723: 162, // top (842x) + 57683: 163, // transaction (842x) + 57684: 164, // triggers (842x) + 57686: 165, // uncommitted (842x) + 57689: 166, // undefined (842x) + 57693: 167, // warnings (842x) + 57697: 168, // addDate (841x) + 57542: 169, // any (841x) + 57543: 170, // ascii (841x) + 57546: 171, // avg (841x) + 57698: 172, // bitAnd (841x) + 57699: 173, // bitOr (841x) + 57700: 174, // bitXor (841x) + 57553: 175, // byteType (841x) + 57701: 176, // cast (841x) + 57559: 177, // coalesce (841x) + 57703: 178, // count (841x) + 57704: 179, // curTime (841x) + 57705: 180, // dateAdd (841x) + 57706: 181, // dateSub (841x) + 57588: 182, // escape (841x) + 57707: 183, // extract (841x) + 57595: 184, // format (841x) + 57708: 185, // getFormat (841x) + 57709: 186, // groupConcat (841x) + 57346: 187, // identifier (841x) + 57713: 188, // max (841x) + 57712: 189, // min (841x) + 57623: 190, // names (841x) + 57715: 191, // now (841x) + 57716: 192, // position (841x) + 57641: 193, // quick (841x) + 57647: 194, // reverse (841x) + 57650: 195, // row (841x) + 57651: 196, // rowCount (841x) + 57672: 197, // some (841x) + 57664: 198, // sqlCache (841x) + 57665: 199, // sqlNoCache (841x) + 57718: 200, // subDate (841x) + 57720: 201, // substring (841x) + 57719: 202, // sum (841x) + 57721: 203, // timestampAdd (841x) + 57722: 204, // timestampDiff (841x) + 57724: 205, // trim (841x) + 40: 206, // '(' (738x) + 57471: 207, // on (719x) + 57348: 208, // stringLit (674x) + 57466: 209, // not (665x) + 57364: 210, // as (632x) + 57448: 211, // left (614x) + 57492: 212, // right (614x) + 57395: 213, // defaultKwd (598x) + 43: 214, // '+' (571x) + 45: 215, // '-' (571x) + 57465: 216, // mod (569x) + 57468: 217, // null (543x) + 57533: 218, // with (540x) + 57515: 219, // union (530x) + 57455: 220, // lock (518x) + 57413: 221, // forKwd (511x) + 57450: 222, // limit (501x) + 57474: 223, // order (493x) + 57531: 224, // where (488x) + 57363: 225, // and (482x) + 57473: 226, // or (482x) + 57354: 227, // andand (481x) + 57631: 228, // pipesAsOr (481x) + 57534: 229, // xor (481x) + 57416: 230, // from (474x) + 57521: 231, // using (474x) + 57772: 232, // eq (463x) + 57502: 233, // straightJoin (457x) + 57496: 234, // set (454x) + 57421: 235, // having (453x) + 57489: 236, // replace (453x) + 57443: 237, // join (450x) + 57420: 238, // group (445x) + 57378: 239, // collate (443x) + 57767: 240, // intLit (441x) + 57383: 241, // cross (439x) + 57431: 242, // inner (439x) + 57537: 243, // natural (439x) + 125: 244, // '}' (438x) + 57449: 245, // like (432x) + 42: 246, // '*' (427x) + 46: 247, // '.' (423x) + 57368: 248, // binaryType (419x) + 57398: 249, // desc (419x) + 57365: 250, // asc (417x) + 57530: 251, // when (416x) + 57390: 252, // dayHour (414x) + 57391: 253, // dayMicrosecond (414x) + 57392: 254, // dayMinute (414x) + 57393: 255, // daySecond (414x) + 57423: 256, // hourMicrosecond (414x) + 57424: 257, // hourMinute (414x) + 57425: 258, // hourSecond (414x) + 57463: 259, // minuteMicrosecond (414x) + 57464: 260, // minuteSecond (414x) + 57494: 261, // secondMicrosecond (414x) + 57535: 262, // yearMonth (414x) + 57406: 263, // elseKwd (413x) + 57428: 264, // in (410x) + 57506: 265, // then (410x) + 60: 266, // '<' (404x) + 62: 267, // '>' (404x) + 57773: 268, // ge (404x) + 57435: 269, // is (404x) + 57774: 270, // le (404x) + 57778: 271, // neq (404x) + 57779: 272, // neqSynonym (404x) + 57780: 273, // nulleq (404x) + 37: 274, // '%' (395x) + 38: 275, // '&' (395x) + 47: 276, // '/' (395x) + 94: 277, // '^' (395x) + 124: 278, // '|' (395x) + 57402: 279, // div (395x) + 57777: 280, // lsh (395x) + 57782: 281, // rsh (395x) + 57387: 282, // currentUser (394x) + 57366: 283, // between (392x) + 57486: 284, // regexpKwd (392x) + 57493: 285, // rlike (392x) + 57426: 286, // ifKwd (391x) + 57436: 287, // insert (391x) + 123: 288, // '{' (390x) + 57349: 289, // singleAtIdentifier (388x) + 57376: 290, // charType (387x) + 57444: 291, // key (385x) + 57525: 292, // values (385x) + 57409: 293, // exists (384x) + 57411: 294, // falseKwd (384x) + 57513: 295, // trueKwd (384x) + 57381: 296, // convert (383x) + 57766: 297, // decLit (383x) + 57765: 298, // floatLit (383x) + 57781: 299, // paramMarker (383x) + 57388: 300, // database (382x) + 57769: 301, // bitLit (381x) + 57754: 302, // builtinNow (381x) + 57386: 303, // currentTs (381x) + 57350: 304, // doubleAtIdentifier (381x) + 57768: 305, // hexLit (381x) + 57453: 306, // localTime (381x) + 57454: 307, // localTs (381x) + 57347: 308, // underscoreCS (381x) + 57433: 309, // interval (380x) + 33: 310, // '!' (379x) + 126: 311, // '~' (379x) + 57740: 312, // builtinAddDate (379x) + 57741: 313, // builtinBitAnd (379x) + 57742: 314, // builtinBitOr (379x) + 57743: 315, // builtinBitXor (379x) + 57744: 316, // builtinCast (379x) + 57745: 317, // builtinCount (379x) + 57746: 318, // builtinCurDate (379x) + 57747: 319, // builtinCurTime (379x) + 57748: 320, // builtinDateAdd (379x) + 57749: 321, // builtinDateSub (379x) + 57750: 322, // builtinExtract (379x) + 57751: 323, // builtinGroupConcat (379x) + 57752: 324, // builtinMax (379x) + 57753: 325, // builtinMin (379x) + 57755: 326, // builtinPosition (379x) + 57757: 327, // builtinSubDate (379x) + 57758: 328, // builtinSubstring (379x) + 57759: 329, // builtinSum (379x) + 57760: 330, // builtinSysDate (379x) + 57761: 331, // builtinTrim (379x) + 57762: 332, // builtinUser (379x) + 57373: 333, // caseKwd (379x) + 57384: 334, // currentDate (379x) + 57385: 335, // currentTime (379x) + 57783: 336, // not2 (379x) + 57488: 337, // repeat (379x) + 57522: 338, // utcDate (379x) + 57524: 339, // utcTime (379x) + 57523: 340, // utcTimestamp (379x) + 57479: 341, // primary (370x) + 57514: 342, // unique (370x) + 57377: 343, // check (367x) + 57485: 344, // references (366x) + 57418: 345, // generated (362x) + 57355: 346, // pipes (359x) + 57427: 347, // ignore (313x) + 57936: 348, // Identifier (312x) + 57989: 349, // NotKeywordToken (312x) + 58111: 350, // TiDBKeyword (312x) + 58121: 351, // UnReservedKeyword (312x) + 57495: 352, // selectKwd (309x) + 57375: 353, // character (285x) + 57477: 354, // partition (254x) + 57476: 355, // packKeys (251x) + 57481: 356, // shardRowIDBits (251x) + 57775: 357, // jss (242x) + 57776: 358, // juss (242x) + 57429: 359, // index (237x) + 57451: 360, // lines (226x) + 57499: 361, // sql (222x) + 57371: 362, // by (221x) + 57414: 363, // force (219x) + 57520: 364, // use (219x) + 57404: 365, // drop (218x) + 57372: 366, // cascade (217x) + 57490: 367, // restrict (217x) + 57510: 368, // to (217x) + 57483: 369, // read (215x) + 57361: 370, // alter (214x) + 57362: 371, // analyze (214x) + 57415: 372, // foreign (213x) + 57417: 373, // fulltext (212x) + 57394: 374, // decimalType (211x) + 57432: 375, // integerType (211x) + 57437: 376, // intType (211x) + 57487: 377, // rename (211x) + 57527: 378, // varcharType (211x) + 64: 379, // '@' (209x) + 57359: 380, // add (209x) + 57367: 381, // bigIntType (209x) + 57369: 382, // blobType (209x) + 57374: 383, // change (209x) + 57403: 384, // doubleType (209x) + 57412: 385, // floatType (209x) + 57438: 386, // int1Type (209x) + 57439: 387, // int2Type (209x) + 57440: 388, // int3Type (209x) + 57441: 389, // int4Type (209x) + 57442: 390, // int8Type (209x) + 57526: 391, // long (209x) + 57456: 392, // longblobType (209x) + 57457: 393, // longtextType (209x) + 57460: 394, // mediumblobType (209x) + 57461: 395, // mediumIntType (209x) + 57462: 396, // mediumtextType (209x) + 57469: 397, // numericType (209x) + 57470: 398, // nvarcharType (209x) + 57484: 399, // realType (209x) + 57498: 400, // smallIntType (209x) + 57507: 401, // tinyblobType (209x) + 57508: 402, // tinyIntType (209x) + 57509: 403, // tinytextType (209x) + 57528: 404, // varbinaryType (209x) + 57532: 405, // write (209x) + 58083: 406, // SubSelect (129x) + 58131: 407, // UserVariable (126x) + 57975: 408, // Literal (125x) + 58071: 409, // SimpleIdent (125x) + 58078: 410, // StringLiteral (125x) + 57918: 411, // FunctionCallGeneric (123x) + 57919: 412, // FunctionCallKeyword (123x) + 57920: 413, // FunctionCallNonKeyword (123x) + 57921: 414, // FunctionNameConflict (123x) + 57922: 415, // FunctionNameDateArith (123x) + 57923: 416, // FunctionNameDateArithMultiForms (123x) + 57924: 417, // FunctionNameDatetimePrecision (123x) + 57925: 418, // FunctionNameOptionalBraces (123x) + 58070: 419, // SimpleExpr (123x) + 58084: 420, // SumExpr (123x) + 58086: 421, // SystemVariable (123x) + 58140: 422, // Variable (123x) + 57819: 423, // BitExpr (113x) + 58028: 424, // PredicateExpr (97x) + 57822: 425, // BoolPri (94x) + 57894: 426, // Expression (94x) + 58156: 427, // logAnd (74x) + 58157: 428, // logOr (74x) + 58095: 429, // TableName (51x) + 57517: 430, // unsigned (44x) + 57536: 431, // zerofill (42x) + 57986: 432, // NUM (41x) + 57835: 433, // ColumnName (35x) + 58079: 434, // StringName (30x) + 57360: 435, // all (29x) + 57886: 436, // EqOpt (24x) + 58050: 437, // SelectStmt (23x) + 58051: 438, // SelectStmtBasic (23x) + 58054: 439, // SelectStmtFromDual (23x) + 58055: 440, // SelectStmtFromTable (23x) + 57901: 441, // FieldLen (21x) + 57503: 442, // tableKwd (21x) + 57967: 443, // LengthNum (18x) + 58124: 444, // UnionSelect (18x) + 58122: 445, // UnionClauseList (17x) + 58125: 446, // UnionStmt (17x) + 57500: 447, // sqlCalcFoundRows (16x) + 57518: 448, // update (16x) + 57828: 449, // CharsetKw (15x) + 57396: 450, // delayed (15x) + 57422: 451, // highPriority (15x) + 57458: 452, // lowPriority (15x) + 58005: 453, // OptFieldLen (14x) + 57397: 454, // deleteKwd (13x) + 57895: 455, // ExpressionList (13x) + 57961: 456, // JoinTable (13x) + 58092: 457, // TableFactor (13x) + 58104: 458, // TableRef (13x) + 58133: 459, // Username (11x) + 57400: 460, // distinct (10x) + 57401: 461, // distinctRow (10x) + 57914: 462, // FromOrIn (10x) + 57434: 463, // into (10x) + 57953: 464, // IndexType (9x) + 57962: 465, // JoinType (9x) + 58013: 466, // OrderBy (9x) + 58014: 467, // OrderByOptional (9x) + 58096: 468, // TableNameList (9x) + 57829: 469, // CharsetName (8x) + 57836: 470, // ColumnNameList (8x) + 57859: 471, // CrossOpt (8x) + 57869: 472, // DefaultKwdOpt (8x) + 57873: 473, // DistinctKwd (8x) + 57942: 474, // IndexColName (8x) + 57963: 475, // KeyOrIndex (8x) + 58004: 476, // OptCollate (8x) + 57831: 477, // ColumnDef (7x) + 57874: 478, // DistinctOpt (7x) + 57408: 479, // escaped (7x) + 57888: 480, // EscapedTableRef (7x) + 57353: 481, // hintEnd (7x) + 57943: 482, // IndexColNameList (7x) + 58057: 483, // SelectStmtLimit (7x) + 58152: 484, // WhereClause (7x) + 58153: 485, // WhereClauseOptional (7x) + 57382: 486, // create (6x) + 57868: 487, // DefaultFalseDistinctOpt (6x) + 57872: 488, // DeleteFromStmt (6x) + 57893: 489, // ExprOrDefault (6x) + 57419: 490, // grant (6x) + 57955: 491, // InsertIntoStmt (6x) + 57983: 492, // MaxNumBuckets (6x) + 58002: 493, // OptBinary (6x) + 58043: 494, // ReplaceIntoStmt (6x) + 58047: 495, // RowFormat (6x) + 58049: 496, // SelectLockOpt (6x) + 57497: 497, // show (6x) + 58063: 498, // ShowDatabaseNameOpt (6x) + 58101: 499, // TableOption (6x) + 58105: 500, // TableRefs (6x) + 57505: 501, // terminated (6x) + 58127: 502, // UpdateStmt (6x) + 57824: 503, // BuggyDefaultFalseDistinctOpt (5x) + 57379: 504, // column (5x) + 57833: 505, // ColumnKeywordOpt (5x) + 57860: 506, // DBName (5x) + 57407: 507, // enclosed (5x) + 57896: 508, // ExpressionListOpt (5x) + 57903: 509, // FieldOpt (5x) + 57904: 510, // FieldOpts (5x) + 57949: 511, // IndexName (5x) + 57951: 512, // IndexOption (5x) + 57952: 513, // IndexOptionList (5x) + 58022: 514, // PartitionDefinitionListOpt (5x) + 58032: 515, // PriorityOpt (5x) + 58065: 516, // ShowLikeOrWhereOpt (5x) + 58112: 517, // TimeUnit (5x) + 58129: 518, // UserSpec (5x) + 57811: 519, // Assignment (4x) + 57815: 520, // AuthString (4x) + 57940: 521, // IgnoreOptional (4x) + 57950: 522, // IndexNameList (4x) + 57954: 523, // IndexTypeOpt (4x) + 57972: 524, // LimitOption (4x) + 57472: 525, // option (4x) + 57475: 526, // outer (4x) + 58024: 527, // PartitionNumOpt (4x) + 58061: 528, // SetExpr (4x) + 58087: 529, // TableAsName (4x) + 58116: 530, // TransactionChar (4x) + 58130: 531, // UserSpecList (4x) + 57771: 532, // assignmentEq (3x) + 57812: 533, // AssignmentList (3x) + 57825: 534, // ByItem (3x) + 57842: 535, // ColumnPosition (3x) + 57848: 536, // Constraint (3x) + 57380: 537, // constraint (3x) + 57850: 538, // ConstraintKeywordOpt (3x) + 57892: 539, // ExplainableStmt (3x) + 57909: 540, // FloatOpt (3x) + 57352: 541, // hintBegin (3x) + 57935: 542, // HintTableList (3x) + 57937: 543, // IfExists (3x) + 57938: 544, // IfNotExists (3x) + 57944: 545, // IndexHint (3x) + 57948: 546, // IndexHintType (3x) + 57430: 547, // infile (3x) + 57445: 548, // keys (3x) + 57979: 549, // LockClause (3x) + 57459: 550, // maxValue (3x) + 58003: 551, // OptCharset (3x) + 58027: 552, // Precision (3x) + 58033: 553, // PrivElem (3x) + 58036: 554, // PrivType (3x) + 58038: 555, // ReferDef (3x) + 58044: 556, // RestrictOrCascadeOpt (3x) + 58048: 557, // RowValue (3x) + 58100: 558, // TableOptimizerHints (3x) + 58102: 559, // TableOptionList (3x) + 58117: 560, // TransactionChars (3x) + 57512: 561, // trigger (3x) + 57519: 562, // usage (3x) + 58135: 563, // ValueSym (3x) + 57801: 564, // AdminStmt (2x) + 57803: 565, // AlterTableOptionListOpt (2x) + 57804: 566, // AlterTableSpec (2x) + 57806: 567, // AlterTableStmt (2x) + 57807: 568, // AlterUserStmt (2x) + 57808: 569, // AnalyzeTableStmt (2x) + 57816: 570, // BeginTransactionStmt (2x) + 57818: 571, // BinlogStmt (2x) + 57826: 572, // ByList (2x) + 57827: 573, // CastType (2x) + 57837: 574, // ColumnNameListOpt (2x) + 57839: 575, // ColumnOption (2x) + 57843: 576, // ColumnSetValue (2x) + 57846: 577, // CommitStmt (2x) + 57851: 578, // CreateDatabaseStmt (2x) + 57852: 579, // CreateIndexStmt (2x) + 57856: 580, // CreateTableStmt (2x) + 57857: 581, // CreateUserStmt (2x) + 57858: 582, // CreateViewStmt (2x) + 57861: 583, // DatabaseOption (2x) + 57389: 584, // databases (2x) + 57864: 585, // DatabaseSym (2x) + 57866: 586, // DeallocateStmt (2x) + 57867: 587, // DeallocateSym (2x) + 57399: 588, // describe (2x) + 57875: 589, // DoStmt (2x) + 57876: 590, // DropDatabaseStmt (2x) + 57877: 591, // DropIndexStmt (2x) + 57878: 592, // DropStatsStmt (2x) + 57879: 593, // DropTableStmt (2x) + 57880: 594, // DropUserStmt (2x) + 57881: 595, // DropViewStmt (2x) + 57884: 596, // EmptyStmt (2x) + 57889: 597, // ExecuteStmt (2x) + 57410: 598, // explain (2x) + 57890: 599, // ExplainStmt (2x) + 57891: 600, // ExplainSym (2x) + 57898: 601, // Field (2x) + 57899: 602, // FieldAsName (2x) + 57900: 603, // FieldAsNameOpt (2x) + 57912: 604, // FlushStmt (2x) + 57913: 605, // FromDual (2x) + 57916: 606, // FuncDatetimePrecList (2x) + 57917: 607, // FuncDatetimePrecListOpt (2x) + 57926: 608, // GeneratedAlways (2x) + 57929: 609, // GrantStmt (2x) + 57931: 610, // HandleRange (2x) + 57933: 611, // HashString (2x) + 57945: 612, // IndexHintList (2x) + 57946: 613, // IndexHintListOpt (2x) + 57956: 614, // InsertValues (2x) + 57958: 615, // IntoOpt (2x) + 57446: 616, // kill (2x) + 57965: 617, // KillOrKillTiDB (2x) + 57966: 618, // KillStmt (2x) + 57971: 619, // LimitClause (2x) + 57452: 620, // load (2x) + 57976: 621, // LoadDataStmt (2x) + 57977: 622, // LoadStatsStmt (2x) + 57981: 623, // LockTablesStmt (2x) + 57984: 624, // MaxValueOrExpression (2x) + 57990: 625, // NowSym (2x) + 57991: 626, // NowSymFunc (2x) + 57992: 627, // NowSymOptionFraction (2x) + 57993: 628, // NumList (2x) + 57994: 629, // NumLiteral (2x) + 57997: 630, // ObjectType (2x) + 57996: 631, // ODBCDateTimeType (2x) + 57356: 632, // odbcDateType (2x) + 57358: 633, // odbcTimestampType (2x) + 57357: 634, // odbcTimeType (2x) + 58008: 635, // OptInteger (2x) + 58010: 636, // OptionalBraces (2x) + 58012: 637, // Order (2x) + 58015: 638, // OuterOpt (2x) + 58016: 639, // PartDefOption (2x) + 58020: 640, // PartitionDefinition (2x) + 58023: 641, // PartitionNameList (2x) + 58026: 642, // PasswordOpt (2x) + 58030: 643, // PreparedStmt (2x) + 58031: 644, // PrimaryOpt (2x) + 58034: 645, // PrivElemList (2x) + 58035: 646, // PrivLevel (2x) + 58039: 647, // ReferOpt (2x) + 58041: 648, // RegexpSym (2x) + 58042: 649, // RenameTableStmt (2x) + 57491: 650, // revoke (2x) + 58045: 651, // RevokeStmt (2x) + 58046: 652, // RollbackStmt (2x) + 58062: 653, // SetStmt (2x) + 58066: 654, // ShowStmt (2x) + 58067: 655, // ShowTableAliasOpt (2x) + 58069: 656, // SignedLiteral (2x) + 58074: 657, // Statement (2x) + 58076: 658, // StatsPersistentVal (2x) + 58077: 659, // StringList (2x) + 58081: 660, // SubPartitionNumOpt (2x) + 58085: 661, // Symbol (2x) + 58089: 662, // TableElement (2x) + 58093: 663, // TableLock (2x) + 58099: 664, // TableOptimizerHintOpt (2x) + 58103: 665, // TableOrTables (2x) + 58109: 666, // TablesTerminalSym (2x) + 58107: 667, // TableToTable (2x) + 58113: 668, // TimestampUnit (2x) + 58114: 669, // TraceStmt (2x) + 58119: 670, // TruncateTableStmt (2x) + 57516: 671, // unlock (2x) + 58126: 672, // UnlockTablesStmt (2x) + 58134: 673, // UsernameList (2x) + 58128: 674, // UseStmt (2x) + 58137: 675, // ValuesList (2x) + 58141: 676, // VariableAssignment (2x) + 58150: 677, // WhenClause (2x) + 57800: 678, // AdminShowSlow (1x) + 57802: 679, // AlterAlgorithm (1x) + 57805: 680, // AlterTableSpecList (1x) + 57809: 681, // AnyOrAll (1x) + 57810: 682, // AsOpt (1x) + 57814: 683, // AuthOption (1x) + 57817: 684, // BetweenOrNotOp (1x) + 57820: 685, // BitValueType (1x) + 57821: 686, // BlobType (1x) + 57823: 687, // BooleanType (1x) + 57370: 688, // both (1x) + 57830: 689, // CharsetOpt (1x) + 57832: 690, // ColumnDefList (1x) + 57834: 691, // ColumnList (1x) + 57838: 692, // ColumnNameListOptWithBrackets (1x) + 57840: 693, // ColumnOptionList (1x) + 57841: 694, // ColumnOptionListOpt (1x) + 57844: 695, // ColumnSetValueList (1x) + 57847: 696, // CompareOp (1x) + 57849: 697, // ConstraintElem (1x) + 57853: 698, // CreateIndexStmtUnique (1x) + 57854: 699, // CreateTableOptionListOpt (1x) + 57855: 700, // CreateTableSelectOpt (1x) + 57862: 701, // DatabaseOptionList (1x) + 57863: 702, // DatabaseOptionListOpt (1x) + 57865: 703, // DateAndTimeType (1x) + 57870: 704, // DefaultTrueDistinctOpt (1x) + 57871: 705, // DefaultValueExpr (1x) + 57405: 706, // dual (1x) + 57882: 707, // DuplicateOpt (1x) + 57883: 708, // ElseOpt (1x) + 57885: 709, // Enclosed (1x) + 57887: 710, // Escaped (1x) + 57897: 711, // ExpressionOpt (1x) + 57902: 712, // FieldList (1x) + 57905: 713, // Fields (1x) + 57906: 714, // FieldsOrColumns (1x) + 57907: 715, // FieldsTerminated (1x) + 57908: 716, // FixedPointType (1x) + 57910: 717, // FloatingPointType (1x) + 57911: 718, // FlushOption (1x) + 57915: 719, // FuncDatetimePrec (1x) + 57927: 720, // GetFormatSelector (1x) + 57928: 721, // GlobalScope (1x) + 57930: 722, // GroupByClause (1x) + 57932: 723, // HandleRangeList (1x) + 57934: 724, // HavingClause (1x) + 57939: 725, // IgnoreLines (1x) + 57947: 726, // IndexHintScope (1x) + 57941: 727, // InOrNotOp (1x) + 57957: 728, // IntegerType (1x) + 57960: 729, // IsolationLevel (1x) + 57959: 730, // IsOrNotOp (1x) + 57964: 731, // KeyOrIndexOpt (1x) + 57447: 732, // leading (1x) + 57968: 733, // LikeEscapeOpt (1x) + 57969: 734, // LikeOrNotOp (1x) + 57970: 735, // LikeTableWithOrWithoutParen (1x) + 57973: 736, // Lines (1x) + 57974: 737, // LinesTerminated (1x) + 57978: 738, // LocalOpt (1x) + 57980: 739, // LockClauseOpt (1x) + 57982: 740, // LockType (1x) + 57985: 741, // MaxValueOrExpressionList (1x) + 57987: 742, // NationalOpt (1x) + 57467: 743, // noWriteToBinLog (1x) + 57988: 744, // NoWriteToBinLogAliasOpt (1x) + 57995: 745, // NumericType (1x) + 57998: 746, // OnDeleteOpt (1x) + 57999: 747, // OnDuplicateKeyUpdate (1x) + 58000: 748, // OnUpdateOpt (1x) + 58001: 749, // OptBinMod (1x) + 58006: 750, // OptFull (1x) + 58007: 751, // OptGConcatSeparator (1x) + 58009: 752, // OptTable (1x) + 58011: 753, // OrReplace (1x) + 58017: 754, // PartDefOptionList (1x) + 58018: 755, // PartDefOptionsOpt (1x) + 58019: 756, // PartDefValuesOpt (1x) + 58021: 757, // PartitionDefinitionList (1x) + 58025: 758, // PartitionOpt (1x) + 57478: 759, // precisionType (1x) + 58029: 760, // PrepareSQL (1x) + 57480: 761, // procedure (1x) + 58037: 762, // QuickOptional (1x) + 57482: 763, // rangeKwd (1x) + 58040: 764, // RegexpOrNotOp (1x) + 58052: 765, // SelectStmtCalcFoundRows (1x) + 58053: 766, // SelectStmtFieldList (1x) + 58056: 767, // SelectStmtGroup (1x) + 58058: 768, // SelectStmtOpts (1x) + 58059: 769, // SelectStmtSQLCache (1x) + 58060: 770, // SelectStmtStraightJoin (1x) + 58064: 771, // ShowIndexKwd (1x) + 58068: 772, // ShowTargetFilterable (1x) + 58072: 773, // Start (1x) + 58073: 774, // Starting (1x) + 57501: 775, // starting (1x) + 58075: 776, // StatementList (1x) + 57504: 777, // stored (1x) + 58080: 778, // StringType (1x) + 58082: 779, // SubPartitionOpt (1x) + 58088: 780, // TableAsNameOpt (1x) + 58090: 781, // TableElementList (1x) + 58091: 782, // TableElementListOpt (1x) + 58094: 783, // TableLockList (1x) + 58097: 784, // TableNameListOpt (1x) + 58098: 785, // TableOptimizerHintList (1x) + 58106: 786, // TableRefsClause (1x) + 58108: 787, // TableToTableList (1x) + 58110: 788, // TextType (1x) + 58115: 789, // TraceableStmt (1x) + 57511: 790, // trailing (1x) + 58118: 791, // TrimDirection (1x) + 58120: 792, // Type (1x) + 58123: 793, // UnionOpt (1x) + 58132: 794, // UserVariableList (1x) + 58136: 795, // Values (1x) + 58138: 796, // ValuesOpt (1x) + 58139: 797, // Varchar (1x) + 58142: 798, // VariableAssignmentList (1x) + 58143: 799, // ViewAlgorithm (1x) + 58144: 800, // ViewCheckOption (1x) + 58145: 801, // ViewDefiner (1x) + 58146: 802, // ViewFieldList (1x) + 58147: 803, // ViewName (1x) + 58148: 804, // ViewSQLSecurity (1x) + 57529: 805, // virtual (1x) + 58149: 806, // VirtualOrStored (1x) + 58151: 807, // WhenClauseList (1x) + 58154: 808, // WithGrantOptionOpt (1x) + 58155: 809, // WithReadLockOpt (1x) + 57799: 810, // $default (0x) + 57770: 811, // andnot (0x) + 57813: 812, // AssignmentListOpt (0x) + 57756: 813, // builtinStddevPop (0x) + 57763: 814, // builtinVarPop (0x) + 57764: 815, // builtinVarSamp (0x) + 57845: 816, // CommaOpt (0x) + 57791: 817, // createTableSelect (0x) + 57784: 818, // empty (0x) + 57345: 819, // error (0x) + 57798: 820, // higherThanComma (0x) + 57789: 821, // insertValues (0x) + 57351: 822, // invalid (0x) + 57797: 823, // lowerThanComma (0x) + 57790: 824, // lowerThanCreateTableSelect (0x) + 57795: 825, // lowerThanEq (0x) + 57788: 826, // lowerThanInsertValues (0x) + 57785: 827, // lowerThanIntervalKeyword (0x) + 57792: 828, // lowerThanKey (0x) + 57794: 829, // lowerThanOn (0x) + 57787: 830, // lowerThanSetKeyword (0x) + 57786: 831, // lowerThanStringLitToken (0x) + 57796: 832, // neg (0x) + 57793: 833, // tableRefPriority (0x) + } + + yySymNames = []string{ + "$end", + "';'", + "comment", + "autoIncrement", + "after", + "first", + "','", + "charsetKwd", + "keyBlockSize", + "engine", + "connection", + "password", + "signed", + "checksum", + "avgRowLength", + "compression", + "delayKeyWrite", + "maxRows", + "minRows", + "rowFormat", + "statsPersistent", + "')'", + "view", + "separator", + "status", + "tables", + "tablespace", + "columns", + "definer", + "fields", + "identified", + "maxExecutionTime", + "tidbHJ", + "tidbINLJ", + "tidbSMJ", + "yearType", + "day", + "hour", + "microsecond", + "minute", + "month", + "quarter", + "second", + "week", + "end", + "privileges", + "algorithm", + "execute", + "offset", + "prepare", + "datetimeType", + "dateType", + "isolation", + "local", + "partitions", + "subpartition", + "timeType", + "user", + "variables", + "event", + "hash", + "jsonType", + "process", + "processlist", + "query", + "reload", + "replication", + "super", + "unknown", + "value", + "admin", + "begin", + "binlog", + "buckets", + "commit", + "compact", + "compressed", + "copyKwd", + "ddl", + "deallocate", + "disable", + "do", + "dynamic", + "enable", + "fixed", + "flush", + "inplace", + "jobs", + "modify", + "no", + "redundant", + "rollback", + "routine", + "start", + "stats", + "subpartitions", + "timestampType", + "trace", + "truncate", + "action", + "always", + "bitType", + "booleanType", + "boolType", + "btree", + "cancel", + "cascaded", + "cleanup", + "client", + "collation", + "committed", + "consistent", + "data", + "duplicate", + "engines", + "enum", + "events", + "exclusive", + "full", + "function", + "global", + "grants", + "identSQLErrors", + "indexes", + "internal", + "invoker", + "job", + "less", + "level", + "master", + "maxConnectionsPerHour", + "maxQueriesPerHour", + "maxUpdatesPerHour", + "maxUserConnections", + "merge", + "mode", + "national", + "none", + "only", + "plugins", + "profiles", + "queries", + "recent", + "recover", + "repeatable", + "security", + "serializable", + "session", + "share", + "shared", + "slave", + "slow", + "snapshot", + "statsBuckets", + "statsHealthy", + "statsHistograms", + "statsMeta", + "temporary", + "temptable", + "textType", + "than", + "tidb", + "top", + "transaction", + "triggers", + "uncommitted", + "undefined", + "warnings", + "addDate", + "any", + "ascii", + "avg", + "bitAnd", + "bitOr", + "bitXor", + "byteType", + "cast", + "coalesce", + "count", + "curTime", + "dateAdd", + "dateSub", + "escape", + "extract", + "format", + "getFormat", + "groupConcat", + "identifier", + "max", + "min", + "names", + "now", + "position", + "quick", + "reverse", + "row", + "rowCount", + "some", + "sqlCache", + "sqlNoCache", + "subDate", + "substring", + "sum", + "timestampAdd", + "timestampDiff", + "trim", + "'('", + "on", + "stringLit", + "not", + "as", + "left", + "right", + "defaultKwd", + "'+'", + "'-'", + "mod", + "null", + "with", + "union", + "lock", + "forKwd", + "limit", + "order", + "where", + "and", + "or", + "andand", + "pipesAsOr", + "xor", + "from", + "using", + "eq", + "straightJoin", + "set", + "having", + "replace", + "join", + "group", + "collate", + "intLit", + "cross", + "inner", + "natural", + "'}'", + "like", + "'*'", + "'.'", + "binaryType", + "desc", + "asc", + "when", + "dayHour", + "dayMicrosecond", + "dayMinute", + "daySecond", + "hourMicrosecond", + "hourMinute", + "hourSecond", + "minuteMicrosecond", + "minuteSecond", + "secondMicrosecond", + "yearMonth", + "elseKwd", + "in", + "then", + "'<'", + "'>'", + "ge", + "is", + "le", + "neq", + "neqSynonym", + "nulleq", + "'%'", + "'&'", + "'/'", + "'^'", + "'|'", + "div", + "lsh", + "rsh", + "currentUser", + "between", + "regexpKwd", + "rlike", + "ifKwd", + "insert", + "'{'", + "singleAtIdentifier", + "charType", + "key", + "values", + "exists", + "falseKwd", + "trueKwd", + "convert", + "decLit", + "floatLit", + "paramMarker", + "database", + "bitLit", + "builtinNow", + "currentTs", + "doubleAtIdentifier", + "hexLit", + "localTime", + "localTs", + "underscoreCS", + "interval", + "'!'", + "'~'", + "builtinAddDate", + "builtinBitAnd", + "builtinBitOr", + "builtinBitXor", + "builtinCast", + "builtinCount", + "builtinCurDate", + "builtinCurTime", + "builtinDateAdd", + "builtinDateSub", + "builtinExtract", + "builtinGroupConcat", + "builtinMax", + "builtinMin", + "builtinPosition", + "builtinSubDate", + "builtinSubstring", + "builtinSum", + "builtinSysDate", + "builtinTrim", + "builtinUser", + "caseKwd", + "currentDate", + "currentTime", + "not2", + "repeat", + "utcDate", + "utcTime", + "utcTimestamp", + "primary", + "unique", + "check", + "references", + "generated", + "pipes", + "ignore", + "Identifier", + "NotKeywordToken", + "TiDBKeyword", + "UnReservedKeyword", + "selectKwd", + "character", + "partition", + "packKeys", + "shardRowIDBits", + "jss", + "juss", + "index", + "lines", + "sql", + "by", + "force", + "use", + "drop", + "cascade", + "restrict", + "to", + "read", + "alter", + "analyze", + "foreign", + "fulltext", + "decimalType", + "integerType", + "intType", + "rename", + "varcharType", + "'@'", + "add", + "bigIntType", + "blobType", + "change", + "doubleType", + "floatType", + "int1Type", + "int2Type", + "int3Type", + "int4Type", + "int8Type", + "long", + "longblobType", + "longtextType", + "mediumblobType", + "mediumIntType", + "mediumtextType", + "numericType", + "nvarcharType", + "realType", + "smallIntType", + "tinyblobType", + "tinyIntType", + "tinytextType", + "varbinaryType", + "write", + "SubSelect", + "UserVariable", + "Literal", + "SimpleIdent", + "StringLiteral", + "FunctionCallGeneric", + "FunctionCallKeyword", + "FunctionCallNonKeyword", + "FunctionNameConflict", + "FunctionNameDateArith", + "FunctionNameDateArithMultiForms", + "FunctionNameDatetimePrecision", + "FunctionNameOptionalBraces", + "SimpleExpr", + "SumExpr", + "SystemVariable", + "Variable", + "BitExpr", + "PredicateExpr", + "BoolPri", + "Expression", + "logAnd", + "logOr", + "TableName", + "unsigned", + "zerofill", + "NUM", + "ColumnName", + "StringName", + "all", + "EqOpt", + "SelectStmt", + "SelectStmtBasic", + "SelectStmtFromDual", + "SelectStmtFromTable", + "FieldLen", + "tableKwd", + "LengthNum", + "UnionSelect", + "UnionClauseList", + "UnionStmt", + "sqlCalcFoundRows", + "update", + "CharsetKw", + "delayed", + "highPriority", + "lowPriority", + "OptFieldLen", + "deleteKwd", + "ExpressionList", + "JoinTable", + "TableFactor", + "TableRef", + "Username", + "distinct", + "distinctRow", + "FromOrIn", + "into", + "IndexType", + "JoinType", + "OrderBy", + "OrderByOptional", + "TableNameList", + "CharsetName", + "ColumnNameList", + "CrossOpt", + "DefaultKwdOpt", + "DistinctKwd", + "IndexColName", + "KeyOrIndex", + "OptCollate", + "ColumnDef", + "DistinctOpt", + "escaped", + "EscapedTableRef", + "hintEnd", + "IndexColNameList", + "SelectStmtLimit", + "WhereClause", + "WhereClauseOptional", + "create", + "DefaultFalseDistinctOpt", + "DeleteFromStmt", + "ExprOrDefault", + "grant", + "InsertIntoStmt", + "MaxNumBuckets", + "OptBinary", + "ReplaceIntoStmt", + "RowFormat", + "SelectLockOpt", + "show", + "ShowDatabaseNameOpt", + "TableOption", + "TableRefs", + "terminated", + "UpdateStmt", + "BuggyDefaultFalseDistinctOpt", + "column", + "ColumnKeywordOpt", + "DBName", + "enclosed", + "ExpressionListOpt", + "FieldOpt", + "FieldOpts", + "IndexName", + "IndexOption", + "IndexOptionList", + "PartitionDefinitionListOpt", + "PriorityOpt", + "ShowLikeOrWhereOpt", + "TimeUnit", + "UserSpec", + "Assignment", + "AuthString", + "IgnoreOptional", + "IndexNameList", + "IndexTypeOpt", + "LimitOption", + "option", + "outer", + "PartitionNumOpt", + "SetExpr", + "TableAsName", + "TransactionChar", + "UserSpecList", + "assignmentEq", + "AssignmentList", + "ByItem", + "ColumnPosition", + "Constraint", + "constraint", + "ConstraintKeywordOpt", + "ExplainableStmt", + "FloatOpt", + "hintBegin", + "HintTableList", + "IfExists", + "IfNotExists", + "IndexHint", + "IndexHintType", + "infile", + "keys", + "LockClause", + "maxValue", + "OptCharset", + "Precision", + "PrivElem", + "PrivType", + "ReferDef", + "RestrictOrCascadeOpt", + "RowValue", + "TableOptimizerHints", + "TableOptionList", + "TransactionChars", + "trigger", + "usage", + "ValueSym", + "AdminStmt", + "AlterTableOptionListOpt", + "AlterTableSpec", + "AlterTableStmt", + "AlterUserStmt", + "AnalyzeTableStmt", + "BeginTransactionStmt", + "BinlogStmt", + "ByList", + "CastType", + "ColumnNameListOpt", + "ColumnOption", + "ColumnSetValue", + "CommitStmt", + "CreateDatabaseStmt", + "CreateIndexStmt", + "CreateTableStmt", + "CreateUserStmt", + "CreateViewStmt", + "DatabaseOption", + "databases", + "DatabaseSym", + "DeallocateStmt", + "DeallocateSym", + "describe", + "DoStmt", + "DropDatabaseStmt", + "DropIndexStmt", + "DropStatsStmt", + "DropTableStmt", + "DropUserStmt", + "DropViewStmt", + "EmptyStmt", + "ExecuteStmt", + "explain", + "ExplainStmt", + "ExplainSym", + "Field", + "FieldAsName", + "FieldAsNameOpt", + "FlushStmt", + "FromDual", + "FuncDatetimePrecList", + "FuncDatetimePrecListOpt", + "GeneratedAlways", + "GrantStmt", + "HandleRange", + "HashString", + "IndexHintList", + "IndexHintListOpt", + "InsertValues", + "IntoOpt", + "kill", + "KillOrKillTiDB", + "KillStmt", + "LimitClause", + "load", + "LoadDataStmt", + "LoadStatsStmt", + "LockTablesStmt", + "MaxValueOrExpression", + "NowSym", + "NowSymFunc", + "NowSymOptionFraction", + "NumList", + "NumLiteral", + "ObjectType", + "ODBCDateTimeType", + "odbcDateType", + "odbcTimestampType", + "odbcTimeType", + "OptInteger", + "OptionalBraces", + "Order", + "OuterOpt", + "PartDefOption", + "PartitionDefinition", + "PartitionNameList", + "PasswordOpt", + "PreparedStmt", + "PrimaryOpt", + "PrivElemList", + "PrivLevel", + "ReferOpt", + "RegexpSym", + "RenameTableStmt", + "revoke", + "RevokeStmt", + "RollbackStmt", + "SetStmt", + "ShowStmt", + "ShowTableAliasOpt", + "SignedLiteral", + "Statement", + "StatsPersistentVal", + "StringList", + "SubPartitionNumOpt", + "Symbol", + "TableElement", + "TableLock", + "TableOptimizerHintOpt", + "TableOrTables", + "TablesTerminalSym", + "TableToTable", + "TimestampUnit", + "TraceStmt", + "TruncateTableStmt", + "unlock", + "UnlockTablesStmt", + "UsernameList", + "UseStmt", + "ValuesList", + "VariableAssignment", + "WhenClause", + "AdminShowSlow", + "AlterAlgorithm", + "AlterTableSpecList", + "AnyOrAll", + "AsOpt", + "AuthOption", + "BetweenOrNotOp", + "BitValueType", + "BlobType", + "BooleanType", + "both", + "CharsetOpt", + "ColumnDefList", + "ColumnList", + "ColumnNameListOptWithBrackets", + "ColumnOptionList", + "ColumnOptionListOpt", + "ColumnSetValueList", + "CompareOp", + "ConstraintElem", + "CreateIndexStmtUnique", + "CreateTableOptionListOpt", + "CreateTableSelectOpt", + "DatabaseOptionList", + "DatabaseOptionListOpt", + "DateAndTimeType", + "DefaultTrueDistinctOpt", + "DefaultValueExpr", + "dual", + "DuplicateOpt", + "ElseOpt", + "Enclosed", + "Escaped", + "ExpressionOpt", + "FieldList", + "Fields", + "FieldsOrColumns", + "FieldsTerminated", + "FixedPointType", + "FloatingPointType", + "FlushOption", + "FuncDatetimePrec", + "GetFormatSelector", + "GlobalScope", + "GroupByClause", + "HandleRangeList", + "HavingClause", + "IgnoreLines", + "IndexHintScope", + "InOrNotOp", + "IntegerType", + "IsolationLevel", + "IsOrNotOp", + "KeyOrIndexOpt", + "leading", + "LikeEscapeOpt", + "LikeOrNotOp", + "LikeTableWithOrWithoutParen", + "Lines", + "LinesTerminated", + "LocalOpt", + "LockClauseOpt", + "LockType", + "MaxValueOrExpressionList", + "NationalOpt", + "noWriteToBinLog", + "NoWriteToBinLogAliasOpt", + "NumericType", + "OnDeleteOpt", + "OnDuplicateKeyUpdate", + "OnUpdateOpt", + "OptBinMod", + "OptFull", + "OptGConcatSeparator", + "OptTable", + "OrReplace", + "PartDefOptionList", + "PartDefOptionsOpt", + "PartDefValuesOpt", + "PartitionDefinitionList", + "PartitionOpt", + "precisionType", + "PrepareSQL", + "procedure", + "QuickOptional", + "rangeKwd", + "RegexpOrNotOp", + "SelectStmtCalcFoundRows", + "SelectStmtFieldList", + "SelectStmtGroup", + "SelectStmtOpts", + "SelectStmtSQLCache", + "SelectStmtStraightJoin", + "ShowIndexKwd", + "ShowTargetFilterable", + "Start", + "Starting", + "starting", + "StatementList", + "stored", + "StringType", + "SubPartitionOpt", + "TableAsNameOpt", + "TableElementList", + "TableElementListOpt", + "TableLockList", + "TableNameListOpt", + "TableOptimizerHintList", + "TableRefsClause", + "TableToTableList", + "TextType", + "TraceableStmt", + "trailing", + "TrimDirection", + "Type", + "UnionOpt", + "UserVariableList", + "Values", + "ValuesOpt", + "Varchar", + "VariableAssignmentList", + "ViewAlgorithm", + "ViewCheckOption", + "ViewDefiner", + "ViewFieldList", + "ViewName", + "ViewSQLSecurity", + "virtual", + "VirtualOrStored", + "WhenClauseList", + "WithGrantOptionOpt", + "WithReadLockOpt", + "$default", + "andnot", + "AssignmentListOpt", + "builtinStddevPop", + "builtinVarPop", + "builtinVarSamp", + "CommaOpt", + "createTableSelect", + "empty", + "error", + "higherThanComma", + "insertValues", + "invalid", + "lowerThanComma", + "lowerThanCreateTableSelect", + "lowerThanEq", + "lowerThanInsertValues", + "lowerThanIntervalKeyword", + "lowerThanKey", + "lowerThanOn", + "lowerThanSetKeyword", + "lowerThanStringLitToken", + "neg", + "tableRefPriority", + } + + yyReductions = []struct{ xsym, components int }{ + {0, 1}, + {773, 1}, + {567, 5}, + {567, 8}, + {567, 10}, + {566, 1}, + {566, 5}, + {566, 4}, + {566, 5}, + {566, 2}, + {566, 3}, + {566, 4}, + {566, 3}, + {566, 3}, + {566, 3}, + {566, 4}, + {566, 2}, + {566, 2}, + {566, 4}, + {566, 5}, + {566, 6}, + {566, 5}, + {566, 3}, + {566, 2}, + {566, 3}, + {566, 5}, + {566, 1}, + {566, 3}, + {566, 1}, + {679, 1}, + {679, 1}, + {679, 1}, + {739, 0}, + {739, 1}, + {549, 3}, + {549, 3}, + {549, 3}, + {549, 3}, + {475, 1}, + {475, 1}, + {731, 0}, + {731, 1}, + {505, 0}, + {505, 1}, + {535, 0}, + {535, 1}, + {535, 2}, + {680, 1}, + {680, 3}, + {641, 1}, + {641, 3}, + {538, 0}, + {538, 1}, + {538, 2}, + {661, 1}, + {649, 3}, + {787, 1}, + {787, 3}, + {667, 3}, + {569, 4}, + {569, 6}, + {569, 6}, + {569, 8}, + {492, 0}, + {492, 3}, + {519, 3}, + {533, 1}, + {533, 3}, + {812, 0}, + {812, 1}, + {570, 1}, + {570, 2}, + {570, 5}, + {571, 2}, + {690, 1}, + {690, 3}, + {477, 3}, + {433, 1}, + {433, 3}, + {433, 5}, + {470, 1}, + {470, 3}, + {574, 0}, + {574, 1}, + {692, 0}, + {692, 3}, + {577, 1}, + {644, 0}, + {644, 1}, + {575, 2}, + {575, 1}, + {575, 1}, + {575, 2}, + {575, 1}, + {575, 2}, + {575, 2}, + {575, 3}, + {575, 2}, + {575, 4}, + {575, 6}, + {575, 1}, + {608, 0}, + {608, 2}, + {806, 0}, + {806, 1}, + {806, 1}, + {693, 1}, + {693, 2}, + {694, 0}, + {694, 1}, + {697, 8}, + {697, 7}, + {697, 7}, + {697, 8}, + {697, 7}, + {555, 7}, + {746, 0}, + {746, 3}, + {748, 0}, + {748, 3}, + {647, 1}, + {647, 1}, + {647, 2}, + {647, 2}, + {705, 1}, + {705, 1}, + {627, 1}, + {627, 3}, + {627, 4}, + {626, 1}, + {626, 1}, + {626, 1}, + {626, 1}, + {625, 1}, + {625, 1}, + {625, 1}, + {656, 1}, + {656, 2}, + {656, 2}, + {629, 1}, + {629, 1}, + {629, 1}, + {579, 12}, + {698, 0}, + {698, 1}, + {474, 3}, + {482, 1}, + {482, 3}, + {578, 5}, + {506, 1}, + {583, 4}, + {583, 4}, + {702, 0}, + {702, 1}, + {701, 1}, + {701, 2}, + {580, 10}, + {580, 5}, + {472, 0}, + {472, 1}, + {758, 0}, + {758, 8}, + {758, 8}, + {758, 9}, + {758, 9}, + {779, 0}, + {779, 7}, + {779, 7}, + {660, 0}, + {660, 2}, + {527, 0}, + {527, 2}, + {514, 0}, + {514, 3}, + {757, 1}, + {757, 3}, + {640, 4}, + {755, 0}, + {755, 1}, + {754, 1}, + {754, 2}, + {639, 3}, + {639, 3}, + {639, 3}, + {756, 0}, + {756, 4}, + {756, 6}, + {707, 0}, + {707, 1}, + {707, 1}, + {682, 0}, + {682, 1}, + {700, 0}, + {700, 1}, + {700, 1}, + {700, 1}, + {735, 2}, + {735, 4}, + {582, 11}, + {753, 0}, + {753, 2}, + {799, 0}, + {799, 3}, + {799, 3}, + {799, 3}, + {801, 0}, + {801, 3}, + {804, 0}, + {804, 3}, + {804, 3}, + {803, 1}, + {802, 0}, + {802, 3}, + {691, 1}, + {691, 3}, + {800, 0}, + {800, 4}, + {800, 4}, + {589, 2}, + {488, 11}, + {488, 9}, + {488, 10}, + {585, 1}, + {590, 4}, + {591, 6}, + {593, 4}, + {593, 6}, + {595, 5}, + {594, 3}, + {594, 5}, + {592, 3}, + {556, 0}, + {556, 1}, + {556, 1}, + {665, 1}, + {665, 1}, + {436, 0}, + {436, 1}, + {596, 0}, + {669, 2}, + {600, 1}, + {600, 1}, + {600, 1}, + {599, 2}, + {599, 3}, + {599, 2}, + {599, 5}, + {599, 3}, + {443, 1}, + {432, 1}, + {426, 3}, + {426, 3}, + {426, 3}, + {426, 3}, + {426, 2}, + {426, 3}, + {426, 3}, + {426, 3}, + {426, 1}, + {624, 1}, + {624, 1}, + {428, 1}, + {428, 1}, + {427, 1}, + {427, 1}, + {455, 1}, + {455, 3}, + {741, 1}, + {741, 3}, + {508, 0}, + {508, 1}, + {607, 0}, + {607, 1}, + {606, 1}, + {425, 3}, + {425, 3}, + {425, 4}, + {425, 5}, + {425, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {684, 1}, + {684, 2}, + {730, 1}, + {730, 2}, + {727, 1}, + {727, 2}, + {734, 1}, + {734, 2}, + {764, 1}, + {764, 2}, + {681, 1}, + {681, 1}, + {681, 1}, + {424, 5}, + {424, 3}, + {424, 5}, + {424, 4}, + {424, 3}, + {424, 1}, + {648, 1}, + {648, 1}, + {733, 0}, + {733, 2}, + {601, 1}, + {601, 3}, + {601, 5}, + {601, 2}, + {601, 5}, + {603, 0}, + {603, 1}, + {602, 1}, + {602, 2}, + {602, 1}, + {602, 2}, + {712, 1}, + {712, 3}, + {722, 3}, + {724, 0}, + {724, 2}, + {543, 0}, + {543, 2}, + {544, 0}, + {544, 3}, + {521, 0}, + {521, 1}, + {511, 0}, + {511, 1}, + {513, 0}, + {513, 2}, + {512, 3}, + {512, 1}, + {512, 2}, + {464, 2}, + {464, 2}, + {523, 0}, + {523, 1}, + {348, 1}, + {348, 1}, + {348, 1}, + {348, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {491, 7}, + {615, 0}, + {615, 1}, + {614, 5}, + {614, 4}, + {614, 6}, + {614, 4}, + {614, 2}, + {614, 3}, + {614, 1}, + {614, 1}, + {614, 2}, + {563, 1}, + {563, 1}, + {675, 1}, + {675, 3}, + {557, 3}, + {796, 0}, + {796, 1}, + {795, 3}, + {795, 1}, + {489, 1}, + {489, 1}, + {576, 3}, + {695, 0}, + {695, 1}, + {695, 3}, + {747, 0}, + {747, 5}, + {494, 5}, + {631, 1}, + {631, 1}, + {631, 1}, + {408, 1}, + {408, 1}, + {408, 1}, + {408, 1}, + {408, 1}, + {408, 1}, + {408, 1}, + {408, 2}, + {408, 1}, + {408, 1}, + {410, 1}, + {410, 2}, + {466, 3}, + {572, 1}, + {572, 3}, + {534, 2}, + {637, 0}, + {637, 1}, + {637, 1}, + {467, 0}, + {467, 1}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 5}, + {423, 5}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 1}, + {409, 1}, + {409, 3}, + {409, 4}, + {409, 5}, + {419, 1}, + {419, 1}, + {419, 1}, + {419, 1}, + {419, 3}, + {419, 1}, + {419, 1}, + {419, 1}, + {419, 1}, + {419, 2}, + {419, 2}, + {419, 2}, + {419, 2}, + {419, 3}, + {419, 2}, + {419, 1}, + {419, 3}, + {419, 5}, + {419, 6}, + {419, 2}, + {419, 2}, + {419, 6}, + {419, 5}, + {419, 6}, + {419, 6}, + {419, 4}, + {419, 4}, + {419, 3}, + {419, 3}, + {473, 1}, + {473, 1}, + {478, 1}, + {478, 1}, + {487, 0}, + {487, 1}, + {704, 0}, + {704, 1}, + {503, 1}, + {503, 2}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {636, 0}, + {636, 2}, + {418, 1}, + {418, 1}, + {418, 1}, + {417, 1}, + {417, 1}, + {417, 1}, + {417, 1}, + {417, 1}, + {417, 1}, + {412, 4}, + {412, 4}, + {412, 2}, + {412, 3}, + {412, 2}, + {412, 4}, + {412, 6}, + {412, 2}, + {412, 2}, + {412, 2}, + {412, 4}, + {412, 6}, + {412, 4}, + {412, 4}, + {413, 4}, + {413, 4}, + {413, 6}, + {413, 8}, + {413, 8}, + {413, 6}, + {413, 6}, + {413, 6}, + {413, 6}, + {413, 6}, + {413, 8}, + {413, 8}, + {413, 8}, + {413, 8}, + {413, 4}, + {413, 6}, + {413, 6}, + {413, 7}, + {720, 1}, + {720, 1}, + {720, 1}, + {720, 1}, + {415, 1}, + {415, 1}, + {416, 1}, + {416, 1}, + {791, 1}, + {791, 1}, + {791, 1}, + {420, 5}, + {420, 4}, + {420, 5}, + {420, 4}, + {420, 5}, + {420, 4}, + {420, 5}, + {420, 5}, + {420, 5}, + {420, 4}, + {420, 4}, + {420, 7}, + {420, 5}, + {420, 5}, + {420, 5}, + {751, 0}, + {751, 2}, + {411, 4}, + {719, 0}, + {719, 2}, + {719, 3}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {711, 0}, + {711, 1}, + {807, 1}, + {807, 2}, + {677, 4}, + {708, 0}, + {708, 2}, + {573, 2}, + {573, 3}, + {573, 1}, + {573, 2}, + {573, 2}, + {573, 2}, + {573, 2}, + {573, 2}, + {573, 1}, + {515, 0}, + {515, 1}, + {515, 1}, + {515, 1}, + {429, 1}, + {429, 3}, + {468, 1}, + {468, 3}, + {762, 0}, + {762, 1}, + {643, 4}, + {760, 1}, + {760, 1}, + {597, 2}, + {597, 4}, + {794, 1}, + {794, 3}, + {586, 3}, + {587, 1}, + {587, 1}, + {652, 1}, + {438, 3}, + {439, 4}, + {440, 6}, + {437, 4}, + {437, 3}, + {437, 4}, + {605, 2}, + {786, 1}, + {500, 1}, + {500, 3}, + {480, 1}, + {480, 4}, + {458, 1}, + {458, 1}, + {457, 3}, + {457, 4}, + {457, 4}, + {457, 3}, + {780, 0}, + {780, 1}, + {529, 1}, + {529, 2}, + {546, 2}, + {546, 2}, + {546, 2}, + {726, 0}, + {726, 2}, + {726, 3}, + {726, 3}, + {545, 5}, + {522, 0}, + {522, 1}, + {522, 3}, + {612, 1}, + {612, 2}, + {613, 0}, + {613, 1}, + {456, 3}, + {456, 5}, + {456, 7}, + {456, 7}, + {456, 9}, + {456, 4}, + {456, 6}, + {456, 3}, + {456, 5}, + {465, 1}, + {465, 1}, + {638, 0}, + {638, 1}, + {471, 1}, + {471, 2}, + {471, 2}, + {619, 0}, + {619, 2}, + {524, 1}, + {524, 1}, + {483, 0}, + {483, 2}, + {483, 4}, + {483, 4}, + {768, 6}, + {558, 0}, + {558, 3}, + {542, 1}, + {542, 3}, + {785, 1}, + {785, 2}, + {664, 4}, + {664, 4}, + {664, 4}, + {664, 4}, + {765, 0}, + {765, 1}, + {769, 0}, + {769, 1}, + {769, 1}, + {770, 0}, + {770, 1}, + {766, 1}, + {767, 0}, + {767, 1}, + {406, 3}, + {406, 3}, + {496, 0}, + {496, 2}, + {496, 4}, + {446, 7}, + {446, 6}, + {446, 7}, + {446, 8}, + {445, 1}, + {445, 4}, + {444, 1}, + {444, 3}, + {793, 1}, + {653, 2}, + {653, 4}, + {653, 6}, + {653, 4}, + {653, 4}, + {653, 3}, + {560, 1}, + {560, 3}, + {530, 3}, + {530, 2}, + {530, 2}, + {729, 2}, + {729, 2}, + {729, 2}, + {729, 1}, + {528, 1}, + {528, 1}, + {676, 3}, + {676, 4}, + {676, 4}, + {676, 4}, + {676, 3}, + {676, 3}, + {676, 3}, + {676, 2}, + {676, 4}, + {676, 4}, + {676, 2}, + {469, 1}, + {469, 1}, + {798, 0}, + {798, 1}, + {798, 3}, + {422, 1}, + {422, 1}, + {421, 1}, + {407, 1}, + {459, 1}, + {459, 3}, + {459, 2}, + {459, 2}, + {673, 1}, + {673, 3}, + {642, 1}, + {642, 4}, + {520, 1}, + {564, 3}, + {564, 4}, + {564, 5}, + {564, 4}, + {564, 5}, + {564, 5}, + {564, 5}, + {564, 6}, + {564, 4}, + {564, 5}, + {564, 6}, + {564, 4}, + {678, 2}, + {678, 2}, + {678, 3}, + {678, 3}, + {723, 1}, + {723, 3}, + {610, 5}, + {628, 1}, + {628, 3}, + {654, 3}, + {654, 4}, + {654, 4}, + {654, 2}, + {654, 4}, + {654, 3}, + {654, 3}, + {654, 3}, + {654, 3}, + {654, 3}, + {654, 3}, + {654, 2}, + {654, 2}, + {771, 1}, + {771, 1}, + {771, 1}, + {462, 1}, + {462, 1}, + {772, 1}, + {772, 1}, + {772, 1}, + {772, 3}, + {772, 3}, + {772, 3}, + {772, 5}, + {772, 4}, + {772, 4}, + {772, 1}, + {772, 1}, + {772, 2}, + {772, 2}, + {772, 1}, + {772, 2}, + {772, 2}, + {772, 2}, + {772, 2}, + {772, 1}, + {516, 0}, + {516, 2}, + {516, 2}, + {721, 0}, + {721, 1}, + {721, 1}, + {750, 0}, + {750, 1}, + {498, 0}, + {498, 2}, + {655, 2}, + {604, 3}, + {718, 1}, + {718, 1}, + {718, 3}, + {744, 0}, + {744, 1}, + {744, 1}, + {784, 0}, + {784, 1}, + {809, 0}, + {809, 3}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {789, 1}, + {789, 1}, + {789, 1}, + {789, 1}, + {789, 1}, + {789, 1}, + {539, 1}, + {539, 1}, + {539, 1}, + {539, 1}, + {539, 1}, + {539, 1}, + {776, 1}, + {776, 3}, + {536, 2}, + {662, 1}, + {662, 1}, + {662, 4}, + {781, 1}, + {781, 3}, + {782, 0}, + {782, 3}, + {499, 2}, + {499, 3}, + {499, 4}, + {499, 4}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 1}, + {499, 3}, + {499, 3}, + {499, 3}, + {658, 1}, + {658, 1}, + {565, 0}, + {565, 1}, + {699, 0}, + {699, 1}, + {559, 1}, + {559, 2}, + {559, 3}, + {752, 0}, + {752, 1}, + {670, 3}, + {495, 3}, + {495, 3}, + {495, 3}, + {495, 3}, + {495, 3}, + {495, 3}, + {792, 1}, + {792, 1}, + {792, 1}, + {745, 3}, + {745, 2}, + {745, 3}, + {745, 3}, + {745, 2}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {687, 1}, + {687, 1}, + {635, 0}, + {635, 1}, + {635, 1}, + {716, 1}, + {716, 1}, + {717, 1}, + {717, 1}, + {717, 1}, + {717, 2}, + {685, 1}, + {778, 5}, + {778, 4}, + {778, 5}, + {778, 4}, + {778, 2}, + {778, 2}, + {778, 1}, + {778, 3}, + {778, 6}, + {778, 6}, + {778, 1}, + {742, 0}, + {742, 1}, + {797, 2}, + {797, 1}, + {797, 1}, + {686, 1}, + {686, 2}, + {686, 1}, + {686, 1}, + {788, 1}, + {788, 2}, + {788, 1}, + {788, 1}, + {788, 2}, + {703, 1}, + {703, 2}, + {703, 2}, + {703, 2}, + {703, 3}, + {441, 3}, + {453, 0}, + {453, 1}, + {509, 1}, + {509, 1}, + {509, 1}, + {510, 0}, + {510, 2}, + {540, 0}, + {540, 1}, + {540, 1}, + {552, 5}, + {749, 0}, + {749, 1}, + {493, 0}, + {493, 2}, + {493, 3}, + {551, 0}, + {551, 2}, + {449, 2}, + {449, 1}, + {476, 0}, + {476, 2}, + {659, 1}, + {659, 3}, + {434, 1}, + {434, 1}, + {502, 10}, + {502, 8}, + {674, 2}, + {484, 2}, + {485, 0}, + {485, 1}, + {816, 0}, + {816, 1}, + {581, 4}, + {568, 4}, + {568, 9}, + {518, 2}, + {531, 1}, + {531, 3}, + {683, 0}, + {683, 3}, + {683, 3}, + {683, 5}, + {683, 5}, + {683, 4}, + {611, 1}, + {609, 8}, + {808, 0}, + {808, 3}, + {808, 3}, + {808, 3}, + {808, 3}, + {808, 3}, + {553, 1}, + {553, 4}, + {645, 1}, + {645, 3}, + {554, 1}, + {554, 2}, + {554, 1}, + {554, 1}, + {554, 2}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 2}, + {554, 1}, + {554, 2}, + {554, 1}, + {554, 2}, + {554, 2}, + {554, 1}, + {554, 1}, + {554, 3}, + {554, 2}, + {554, 2}, + {554, 2}, + {554, 2}, + {554, 2}, + {554, 1}, + {630, 0}, + {630, 1}, + {646, 1}, + {646, 3}, + {646, 3}, + {646, 3}, + {646, 1}, + {651, 7}, + {621, 13}, + {725, 0}, + {725, 3}, + {689, 0}, + {689, 3}, + {738, 0}, + {738, 1}, + {713, 0}, + {713, 4}, + {714, 1}, + {714, 1}, + {715, 0}, + {715, 3}, + {709, 0}, + {709, 3}, + {710, 0}, + {710, 3}, + {736, 0}, + {736, 3}, + {774, 0}, + {774, 3}, + {737, 0}, + {737, 3}, + {672, 2}, + {623, 3}, + {666, 1}, + {666, 1}, + {663, 2}, + {740, 1}, + {740, 2}, + {740, 1}, + {783, 1}, + {783, 3}, + {618, 2}, + {618, 3}, + {618, 3}, + {617, 1}, + {617, 2}, + {622, 3}, + } + + yyXErrors = map[yyXError]string{} + + yyParseTab = [2289][]uint16{ + // 0 + {1115, 1115, 47: 1375, 49: 1374, 70: 1388, 1359, 1361, 74: 1362, 79: 1377, 81: 1364, 85: 1390, 91: 1378, 93: 1360, 97: 1367, 1437, 206: 1383, 220: 1444, 234: 1387, 236: 1373, 249: 1370, 287: 1372, 352: 1379, 364: 1439, 1366, 370: 1356, 1358, 377: 1357, 406: 1429, 437: 1386, 1380, 1381, 1382, 444: 1385, 1384, 1426, 448: 1438, 454: 1365, 486: 1363, 488: 1400, 490: 1440, 1417, 494: 1424, 497: 1389, 502: 1432, 564: 1392, 567: 1393, 1394, 1395, 1396, 1397, 577: 1398, 1403, 1404, 1405, 1407, 1406, 586: 1399, 1376, 1369, 1408, 1409, 1410, 1414, 1411, 1413, 1412, 1391, 1401, 1368, 1402, 1371, 604: 1415, 609: 1416, 616: 1446, 1445, 1418, 620: 1442, 1419, 1420, 1435, 643: 1421, 649: 1423, 1441, 1425, 1422, 1427, 1428, 657: 1436, 669: 1430, 1431, 1443, 1434, 674: 1433, 773: 1354, 776: 1355}, + {1353}, + {1352, 3640}, + {57: 3542, 347: 1843, 442: 1023, 521: 3541}, + {442: 3533}, + // 5 + {442: 3514}, + {1283, 1283}, + {163: 3510}, + {208: 3509}, + {1267, 1267}, + // 10 + {22: 1154, 28: 1154, 46: 1154, 57: 3013, 226: 3012, 300: 2953, 342: 3008, 359: 1210, 361: 1154, 442: 3010, 585: 3009, 698: 3007, 753: 3011}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 3006}, + {2: 461, 461, 461, 461, 7: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 22: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 230: 461, 347: 461, 450: 461, 461, 461, 541: 1837, 558: 2987}, + {22: 2957, 25: 2558, 49: 525, 57: 2958, 94: 2959, 300: 2953, 359: 2955, 442: 2557, 585: 2954, 665: 2956}, + {206: 2313, 236: 1373, 287: 1372, 352: 1379, 437: 2947, 1380, 1381, 1382, 444: 1385, 1384, 2952, 448: 1438, 454: 1365, 488: 2948, 491: 2950, 494: 2951, 502: 2949, 789: 2946}, + // 15 + {2: 1113, 1113, 1113, 1113, 7: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 22: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 236: 1113, 287: 1113, 352: 1113, 371: 1113, 448: 1113, 454: 1113}, + {2: 1112, 1112, 1112, 1112, 7: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 22: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 236: 1112, 287: 1112, 352: 1112, 371: 1112, 448: 1112, 454: 1112}, + {2: 1111, 1111, 1111, 1111, 7: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 22: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 236: 1111, 287: 1111, 352: 1111, 371: 1111, 448: 1111, 454: 1111}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 2933, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 2313, 236: 1373, 287: 1372, 348: 1662, 1459, 1460, 1458, 1379, 371: 2934, 429: 2931, 437: 2935, 1380, 1381, 1382, 444: 1385, 1384, 2940, 448: 1438, 454: 1365, 488: 2936, 491: 2938, 494: 2939, 502: 2937, 539: 2932}, + {2: 544, 544, 544, 544, 7: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 22: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 347: 544, 450: 1841, 1840, 1839, 463: 544, 515: 2920}, + // 20 + {2: 544, 544, 544, 544, 7: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 22: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 450: 1841, 1840, 1839, 463: 544, 515: 2879}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2874, 1459, 1460, 1458}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2868, 1459, 1460, 1458}, + {49: 2866}, + {49: 526}, + // 25 + {524, 524}, + {2: 461, 461, 461, 461, 7: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 22: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 208: 461, 461, 211: 461, 461, 461, 461, 461, 461, 461, 233: 461, 236: 461, 240: 461, 246: 461, 461, 461, 282: 461, 286: 461, 461, 461, 461, 461, 292: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 435: 461, 447: 461, 450: 461, 461, 461, 460: 461, 461, 541: 1837, 558: 2831, 768: 2830}, + {753, 753, 21: 753, 207: 753, 218: 753, 753, 753, 753, 753, 2033, 230: 2804, 466: 2034, 2827, 605: 2803}, + {466, 466, 21: 466, 207: 466, 218: 466, 466, 466, 466, 2785, 483: 2825}, + {753, 753, 21: 753, 207: 753, 218: 753, 753, 753, 753, 753, 2033, 466: 2034, 2822}, + // 30 + {206: 2313, 352: 1379, 437: 2321, 1380, 1381, 1382, 444: 1385, 1384, 2312}, + {219: 2771}, + {219: 432}, + {266, 266, 219: 430}, + {397, 397, 1540, 1463, 1464, 1496, 397, 2697, 1545, 1489, 1542, 2701, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 2699, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 2698, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 2702, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 2703, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 2700, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 289: 2707, 304: 2706, 348: 2705, 1459, 1460, 1458, 353: 2275, 449: 2708, 676: 2709, 798: 2704}, + // 35 + {13: 2651, 105: 2652, 107: 2650, 143: 2649, 343: 2648, 497: 2647}, + {7: 2276, 24: 320, 317, 27: 317, 29: 317, 45: 2582, 58: 320, 63: 317, 109: 2594, 114: 2586, 116: 2598, 118: 2602, 2597, 2600, 2574, 2592, 2584, 129: 2575, 139: 2599, 2581, 147: 2601, 153: 2579, 2580, 2578, 2577, 164: 2595, 167: 2591, 353: 2275, 359: 2583, 442: 2589, 449: 2588, 486: 2573, 548: 2585, 584: 2587, 721: 2593, 750: 2576, 761: 2596, 771: 2590, 2572}, + {24: 308, 308, 45: 308, 53: 2556, 442: 308, 743: 2555, 2554}, + {301, 301}, + {300, 300}, + // 40 + {299, 299}, + {298, 298}, + {297, 297}, + {296, 296}, + {295, 295}, + // 45 + {294, 294}, + {293, 293}, + {292, 292}, + {291, 291}, + {290, 290}, + // 50 + {289, 289}, + {288, 288}, + {287, 287}, + {286, 286}, + {285, 285}, + // 55 + {284, 284}, + {283, 283}, + {282, 282}, + {281, 281}, + {280, 280}, + // 60 + {279, 279}, + {278, 278}, + {277, 277}, + {276, 276}, + {275, 275}, + // 65 + {274, 274}, + {273, 273}, + {272, 272}, + {271, 271}, + {270, 270}, + // 70 + {269, 269}, + {268, 268}, + {267, 267}, + {265, 265}, + {264, 264}, + // 75 + {263, 263}, + {262, 262}, + {261, 261}, + {260, 260}, + {259, 259}, + // 80 + {258, 258}, + {257, 257}, + {256, 256}, + {243, 243}, + {2: 205, 205, 205, 205, 7: 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 22: 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 442: 2551, 752: 2552}, + // 85 + {2: 461, 461, 461, 461, 7: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 22: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 288: 461, 347: 461, 450: 461, 461, 461, 541: 1837, 558: 1838}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1835, 1459, 1460, 1458, 506: 1836}, + {47: 1746, 59: 1759, 62: 1745, 65: 1757, 1755, 1750, 220: 1758, 287: 1748, 344: 1754, 352: 1749, 359: 1747, 365: 1744, 370: 1740, 435: 1739, 448: 1752, 454: 1743, 486: 1741, 490: 1753, 497: 1751, 553: 1737, 1736, 561: 1742, 1756, 645: 1817}, + {47: 1746, 59: 1759, 62: 1745, 65: 1757, 1755, 1750, 220: 1758, 287: 1748, 344: 1754, 352: 1749, 359: 1747, 365: 1744, 370: 1740, 435: 1739, 448: 1752, 454: 1743, 486: 1741, 490: 1753, 497: 1751, 553: 1737, 1736, 561: 1742, 1756, 645: 1738}, + {94: 1676, 112: 1675}, + // 90 + {25: 1455, 442: 1456, 666: 1674}, + {25: 1455, 442: 1456, 666: 1454}, + {10: 1450, 64: 1451, 240: 1448, 432: 1449}, + {10: 3, 64: 3, 161: 1447, 240: 3}, + {10: 2, 64: 2, 240: 2}, + // 95 + {1104, 1104, 1104, 1104, 6: 1104, 1104, 1104, 1104, 1104, 1104, 13: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 48: 1104, 55: 1104, 73: 1104, 206: 1104, 1104, 210: 1104, 213: 1104, 218: 1104, 1104, 1104, 1104, 231: 1104, 236: 1104, 239: 1104, 347: 1104, 352: 1104, 1104, 1104, 1104, 1104, 360: 1104}, + {6, 6}, + {240: 1448, 432: 1453}, + {240: 1448, 432: 1452}, + {4, 4}, + // 100 + {5, 5}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 1664, 663: 1665, 783: 1663}, + {14, 14, 14, 14, 14, 14, 7: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {13, 13, 13, 13, 13, 13, 7: 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 22: 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, + {1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 352: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010}, + // 105 + {1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 352: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009}, + {1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 352: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008}, + {1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 352: 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007}, + {1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 352: 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006}, + {1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 352: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005}, + // 110 + {1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 352: 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004}, + {1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 352: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003}, + {1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 352: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002}, + {1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 352: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001}, + {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 352: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}, + // 115 + {999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 352: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999}, + {998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 352: 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998}, + {997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 352: 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 352: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996}, + {995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 352: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995}, + // 120 + {994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 352: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994}, + {993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 352: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993}, + {992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 352: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992}, + {991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 352: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991}, + {990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 352: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990}, + // 125 + {989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 352: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989}, + {988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 352: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988}, + {987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 352: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987}, + {986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 352: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986}, + {985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 352: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985}, + // 130 + {984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 352: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984}, + {983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 352: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983}, + {982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 352: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982}, + {981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 352: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981}, + {980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 352: 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980}, + // 135 + {979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 352: 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979}, + {978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 352: 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978}, + {977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 352: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977}, + {976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 352: 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976}, + {975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 352: 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975}, + // 140 + {974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 352: 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974}, + {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 352: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973}, + {972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 352: 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972}, + {971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 352: 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971}, + {970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 352: 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970}, + // 145 + {969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 352: 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969}, + {968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 352: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968}, + {967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 352: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967}, + {966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 352: 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966}, + {965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 352: 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965}, + // 150 + {964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 352: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964}, + {963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 352: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963}, + {962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 352: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962}, + {961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 352: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961}, + {960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 352: 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960}, + // 155 + {959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 352: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959}, + {958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 352: 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958}, + {957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 352: 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957}, + {956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 352: 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956}, + {955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 352: 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955}, + // 160 + {954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 352: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954}, + {953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 352: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953}, + {952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 352: 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952}, + {951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 352: 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 352: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950}, + // 165 + {949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 352: 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949}, + {948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 352: 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948}, + {947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 352: 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947}, + {946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 352: 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946}, + {945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 352: 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945}, + // 170 + {944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 352: 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944}, + {943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 352: 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943}, + {942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 352: 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942}, + {941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 352: 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941}, + {940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 352: 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940}, + // 175 + {939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 352: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939}, + {938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 352: 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938}, + {937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 352: 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937}, + {936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 352: 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936}, + {935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 352: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935}, + // 180 + {934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 352: 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934}, + {933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 352: 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933}, + {932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 352: 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932}, + {931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 352: 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931}, + {930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 352: 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930}, + // 185 + {929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 352: 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929}, + {928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 352: 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928}, + {927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 352: 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 352: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926}, + {925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 352: 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925}, + // 190 + {924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 352: 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924}, + {923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 352: 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923}, + {922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 352: 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922}, + {921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 352: 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921}, + {920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 352: 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920}, + // 195 + {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 352: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919}, + {918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 352: 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918}, + {917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 352: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917}, + {916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 352: 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916}, + {915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 352: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915}, + // 200 + {914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 352: 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914}, + {913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 352: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913}, + {912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 352: 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912}, + {911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 352: 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911}, + {910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 352: 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910}, + // 205 + {909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 352: 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909}, + {908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 352: 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908}, + {907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 352: 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907}, + {906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 352: 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906}, + {905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 352: 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905}, + // 210 + {904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 352: 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904}, + {903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 352: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903}, + {902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 352: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902}, + {901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 352: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901}, + {900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 352: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900}, + // 215 + {899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 352: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899}, + {898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 352: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898}, + {897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 352: 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897}, + {896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 352: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896}, + {895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 352: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895}, + // 220 + {894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 352: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894}, + {893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 352: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893}, + {892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 352: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892}, + {891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 352: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891}, + {890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 352: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890}, + // 225 + {889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 352: 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889}, + {888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 352: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888}, + {887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 352: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887}, + {886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 352: 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886}, + {885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 352: 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885}, + // 230 + {884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 352: 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884}, + {883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 352: 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883}, + {882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 352: 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882}, + {881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 352: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881}, + {880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 352: 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880}, + // 235 + {879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 352: 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879}, + {878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 352: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878}, + {877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 352: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877}, + {876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 352: 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876}, + {875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 352: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875}, + // 240 + {874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 352: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874}, + {873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 352: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873}, + {872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 352: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872}, + {871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 352: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871}, + {870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 352: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870}, + // 245 + {869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 352: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869}, + {868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 352: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 352: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867}, + {866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 352: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866}, + {865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 352: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865}, + // 250 + {864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 352: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864}, + {863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 352: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863}, + {862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 352: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862}, + {861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 352: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861}, + {860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 352: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860}, + // 255 + {859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 352: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859}, + {858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 352: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858}, + {857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 352: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857}, + {856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 352: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856}, + {855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 352: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855}, + // 260 + {854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 352: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854}, + {853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 352: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853}, + {852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 352: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852}, + {851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 352: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851}, + {850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 352: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850}, + // 265 + {849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 352: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849}, + {848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 352: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848}, + {847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 352: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847}, + {846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 352: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846}, + {845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 352: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845}, + // 270 + {844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 352: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844}, + {843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 352: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843}, + {842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 352: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842}, + {841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 352: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841}, + {840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 352: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840}, + // 275 + {839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 352: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839}, + {838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 352: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838}, + {837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 352: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837}, + {836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 352: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836}, + {835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 352: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835}, + // 280 + {834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 352: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834}, + {833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 352: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833}, + {832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 352: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832}, + {831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 352: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831}, + {830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 352: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830}, + // 285 + {829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 352: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829}, + {828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 352: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828}, + {827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 352: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827}, + {826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 352: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826}, + {825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 352: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825}, + // 290 + {824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 352: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824}, + {823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 352: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823}, + {822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 352: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822}, + {821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 352: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821}, + {820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 352: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820}, + // 295 + {819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 352: 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819}, + {818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 352: 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818}, + {817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 352: 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817}, + {816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 352: 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816}, + {815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 352: 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815}, + // 300 + {814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 352: 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814}, + {813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 352: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813}, + {812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 352: 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812}, + {811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 352: 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811}, + {810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 352: 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810}, + // 305 + {809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 352: 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809}, + {808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 352: 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808}, + {807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 352: 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807}, + {806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 352: 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806}, + {540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 210: 540, 540, 540, 540, 218: 540, 540, 540, 540, 540, 540, 540, 230: 540, 540, 233: 540, 540, 540, 540, 540, 540, 540, 241: 540, 540, 540, 540, 540, 247: 1672, 264: 540, 292: 540, 296: 540, 347: 540, 352: 540, 540, 540, 540, 540, 359: 540, 540, 363: 540, 540, 540, 540, 540, 540, 540, 540, 540, 377: 540, 380: 540, 383: 540, 405: 540}, + // 310 + {15, 15, 6: 1670}, + {369: 1667, 405: 1668, 740: 1666}, + {8, 8, 6: 8}, + {12, 12, 6: 12}, + {11, 11, 6: 11, 53: 1669}, + // 315 + {9, 9, 6: 9}, + {10, 10, 6: 10}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 1664, 663: 1671}, + {7, 7, 6: 7}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1673, 1459, 1460, 1458}, + // 320 + {539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 210: 539, 539, 539, 539, 218: 539, 539, 539, 539, 539, 539, 539, 230: 539, 539, 233: 539, 539, 539, 539, 539, 539, 539, 241: 539, 539, 539, 539, 539, 264: 539, 292: 539, 296: 539, 347: 539, 352: 539, 539, 539, 539, 539, 359: 539, 539, 363: 539, 539, 539, 539, 539, 539, 539, 539, 539, 377: 539, 380: 539, 383: 539, 405: 539}, + {16, 16}, + {53: 1679, 547: 34, 738: 1678}, + {208: 1677}, + {1, 1}, + // 325 + {547: 1680}, + {547: 33}, + {208: 1681}, + {463: 1682}, + {442: 1683}, + // 330 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 1684}, + {36, 36, 27: 36, 29: 36, 206: 36, 347: 36, 353: 1686, 360: 36, 689: 1685}, + {32, 32, 27: 1696, 29: 1695, 206: 32, 347: 32, 360: 32, 713: 1693, 1694}, + {234: 1687}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 1692}, + // 335 + {399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 13: 399, 399, 399, 399, 399, 399, 399, 399, 399, 27: 399, 29: 399, 206: 399, 399, 209: 399, 399, 213: 399, 217: 399, 236: 399, 239: 399, 248: 399, 291: 399, 341: 399, 399, 399, 399, 399, 347: 399, 352: 399, 399, 399, 399, 399, 360: 399}, + {398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 13: 398, 398, 398, 398, 398, 398, 398, 398, 398, 27: 398, 29: 398, 206: 398, 398, 209: 398, 398, 213: 398, 217: 398, 236: 398, 239: 398, 248: 398, 291: 398, 341: 398, 398, 398, 398, 398, 347: 398, 352: 398, 398, 398, 398, 398, 360: 398}, + {110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 241: 110, 110, 110, 110, 110, 110, 248: 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 283: 110, 110, 110, 289: 110, 291: 110, 341: 110, 110, 110, 110, 110, 110, 110, 352: 110, 110, 110, 110, 110, 360: 110, 110, 110, 379: 110}, + {109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 241: 109, 109, 109, 109, 109, 109, 248: 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 283: 109, 109, 109, 289: 109, 291: 109, 341: 109, 109, 109, 109, 109, 109, 109, 352: 109, 109, 109, 109, 109, 360: 109, 109, 109, 379: 109}, + {35, 35, 27: 35, 29: 35, 206: 35, 347: 35, 360: 35}, + // 340 + {22, 22, 206: 22, 347: 22, 360: 1710, 736: 1709}, + {28, 28, 206: 28, 347: 28, 360: 28, 479: 28, 501: 1698, 507: 28, 715: 1697}, + {30, 30, 206: 30, 347: 30, 360: 30, 479: 30, 501: 30, 507: 30}, + {29, 29, 206: 29, 347: 29, 360: 29, 479: 29, 501: 29, 507: 29}, + {26, 26, 206: 26, 347: 26, 360: 26, 479: 26, 507: 1702, 709: 1701}, + // 345 + {362: 1699}, + {208: 1700}, + {27, 27, 206: 27, 347: 27, 360: 27, 479: 27, 507: 27}, + {24, 24, 206: 24, 347: 24, 360: 24, 479: 1706, 710: 1705}, + {362: 1703}, + // 350 + {208: 1704}, + {25, 25, 206: 25, 347: 25, 360: 25, 479: 25}, + {31, 31, 206: 31, 347: 31, 360: 31}, + {362: 1707}, + {208: 1708}, + // 355 + {23, 23, 206: 23, 347: 23, 360: 23}, + {38, 38, 206: 38, 347: 1720, 725: 1719}, + {20, 20, 206: 20, 347: 20, 501: 20, 774: 1711, 1712}, + {18, 18, 206: 18, 347: 18, 501: 1716, 737: 1715}, + {362: 1713}, + // 360 + {208: 1714}, + {19, 19, 206: 19, 347: 19, 501: 19}, + {21, 21, 206: 21, 347: 21}, + {362: 1717}, + {208: 1718}, + // 365 + {17, 17, 206: 17, 347: 17}, + {1269, 1269, 206: 1723, 692: 1724}, + {240: 1448, 432: 1721}, + {360: 1722}, + {37, 37, 206: 37}, + // 370 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1271, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 1727, 574: 1728}, + {39, 39}, + {1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 232: 1276, 234: 1276, 247: 1732, 1276, 1276, 1276, 290: 1276, 365: 1276, 1276, 1276, 374: 1276, 1276, 1276, 378: 1276, 381: 1276, 1276, 384: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276}, + {6: 1273, 21: 1273}, + {6: 1730, 21: 1270}, + // 375 + {21: 1729}, + {1268, 1268}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1731}, + {6: 1272, 21: 1272}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1733, 1459, 1460, 1458}, + // 380 + {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 232: 1275, 234: 1275, 247: 1734, 1275, 1275, 1275, 290: 1275, 365: 1275, 1275, 1275, 374: 1275, 1275, 1275, 378: 1275, 381: 1275, 1275, 384: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1735, 1459, 1460, 1458}, + {1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 232: 1274, 234: 1274, 248: 1274, 1274, 1274, 290: 1274, 365: 1274, 1274, 1274, 374: 1274, 1274, 1274, 378: 1274, 381: 1274, 1274, 384: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274}, + {6: 80, 206: 1814, 80}, + {6: 78, 207: 78}, + // 385 + {6: 1773, 207: 1774}, + {6: 76, 45: 1772, 206: 76, 76}, + {6: 74, 92: 1771, 206: 74, 74}, + {6: 73, 22: 1768, 57: 1766, 92: 1769, 157: 1767, 206: 73, 73}, + {6: 71, 206: 71, 71}, + // 390 + {6: 70, 206: 70, 70}, + {6: 69, 206: 69, 69}, + {6: 68, 206: 68, 68}, + {6: 67, 206: 67, 67}, + {6: 66, 206: 66, 66}, + // 395 + {6: 65, 206: 65, 65}, + {6: 64, 206: 64, 64}, + {6: 63, 206: 63, 63}, + {22: 1765, 584: 1764}, + {6: 61, 206: 61, 61}, + // 400 + {525: 1763}, + {6: 59, 206: 59, 59}, + {108: 1762, 150: 1761}, + {6: 56, 206: 56, 56}, + {6: 55, 206: 55, 55}, + // 405 + {25: 1760}, + {6: 48, 206: 48, 48}, + {6: 53, 206: 53, 53}, + {6: 58, 206: 58, 58}, + {6: 57, 206: 57, 57}, + // 410 + {6: 60, 206: 60, 60}, + {6: 62, 206: 62, 62}, + {6: 51, 206: 51, 51}, + {6: 72, 206: 72, 72}, + {25: 1770}, + // 415 + {6: 52, 206: 52, 52}, + {6: 50, 206: 50, 50}, + {6: 54, 206: 54, 54}, + {6: 49, 206: 49, 49}, + {6: 75, 206: 75, 75}, + // 420 + {47: 1746, 59: 1759, 62: 1745, 65: 1757, 1755, 1750, 220: 1758, 287: 1748, 344: 1754, 352: 1749, 359: 1747, 365: 1744, 370: 1740, 435: 1739, 448: 1752, 454: 1743, 486: 1741, 490: 1753, 497: 1751, 553: 1813, 1736, 561: 1742, 1756}, + {2: 47, 47, 47, 47, 7: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 22: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 246: 47, 442: 1775, 630: 1776}, + {2: 46, 46, 46, 46, 7: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 22: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 246: 46}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 246: 1777, 348: 1778, 1459, 1460, 1458, 646: 1779}, + {230: 45, 247: 1811, 368: 45}, + // 425 + {230: 41, 247: 1808, 368: 41}, + {230: 1780}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 1783, 518: 1784, 531: 1785}, + {390, 390, 6: 390, 22: 390, 30: 390, 218: 390, 232: 390, 289: 1806, 361: 390, 379: 1805}, + {664, 664, 6: 664, 22: 664, 30: 664, 206: 1802, 218: 664, 232: 664, 361: 664, 636: 1803}, + // 430 + {94, 94, 6: 94, 30: 1789, 218: 94, 683: 1788}, + {96, 96, 6: 96, 218: 96}, + {40, 40, 6: 1786}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 1783, 518: 1787}, + {95, 95, 6: 95, 218: 95}, + // 435 + {97, 97, 6: 97, 218: 97}, + {218: 1791, 362: 1790}, + {11: 1800, 208: 1797, 520: 1799}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 1792}, + {92, 92, 6: 92, 210: 1794, 218: 92, 362: 1793}, + // 440 + {208: 1797, 520: 1798}, + {208: 1796, 611: 1795}, + {90, 90, 6: 90, 218: 90}, + {88, 88, 6: 88, 218: 88}, + {382, 382, 6: 382, 21: 382, 218: 382}, + // 445 + {91, 91, 6: 91, 218: 91}, + {93, 93, 6: 93, 218: 93}, + {208: 1796, 611: 1801}, + {89, 89, 6: 89, 218: 89}, + {21: 1804}, + // 450 + {387, 387, 6: 387, 22: 387, 30: 387, 218: 387, 232: 387, 361: 387}, + {663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 207: 663, 663, 663, 663, 663, 663, 214: 663, 663, 663, 218: 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 237: 663, 663, 663, 241: 663, 663, 663, 663, 663, 663, 249: 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 283: 663, 663, 663, 346: 663, 361: 663}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 1807}, + {388, 388, 6: 388, 22: 388, 30: 388, 218: 388, 232: 388, 361: 388}, + {389, 389, 6: 389, 22: 389, 30: 389, 218: 389, 232: 389, 361: 389}, + // 455 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 246: 1809, 348: 1810, 1459, 1460, 1458}, + {230: 43, 368: 43}, + {230: 42, 368: 42}, + {246: 1812}, + {230: 44, 368: 44}, + // 460 + {6: 77, 207: 77}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 1815}, + {6: 1730, 21: 1816}, + {6: 79, 207: 79}, + {6: 1773, 207: 1818}, + // 465 + {2: 47, 47, 47, 47, 7: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 22: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 246: 47, 442: 1775, 630: 1819}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 246: 1777, 348: 1778, 1459, 1460, 1458, 646: 1820}, + {368: 1821}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 1783, 518: 1784, 531: 1822}, + {86, 86, 6: 1786, 218: 1824, 808: 1823}, + // 470 + {87, 87}, + {130: 1828, 1826, 1827, 1829, 490: 1825}, + {525: 1834}, + {240: 1448, 432: 1833}, + {240: 1448, 432: 1832}, + // 475 + {240: 1448, 432: 1831}, + {240: 1448, 432: 1830}, + {81, 81}, + {82, 82}, + {83, 83}, + // 480 + {84, 84}, + {85, 85}, + {1204, 1204, 7: 1204, 213: 1204, 224: 1204, 239: 1204, 245: 1204, 353: 1204}, + {106, 106}, + {31: 2533, 2532, 2531, 2530, 664: 2529, 785: 2528}, + // 485 + {2: 544, 544, 544, 544, 7: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 22: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 288: 544, 347: 544, 450: 1841, 1840, 1839, 515: 1842}, + {2: 543, 543, 543, 543, 7: 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 22: 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 208: 543, 543, 211: 543, 543, 543, 543, 543, 543, 543, 230: 543, 233: 543, 236: 543, 240: 543, 246: 543, 543, 543, 282: 543, 286: 543, 543, 543, 543, 543, 292: 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 347: 543, 447: 543, 463: 543}, + {2: 542, 542, 542, 542, 7: 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 22: 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 208: 542, 542, 211: 542, 542, 542, 542, 542, 542, 542, 230: 542, 233: 542, 236: 542, 240: 542, 246: 542, 542, 542, 282: 542, 286: 542, 542, 542, 542, 542, 292: 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 347: 542, 447: 542, 463: 542}, + {2: 541, 541, 541, 541, 7: 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 22: 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 208: 541, 541, 211: 541, 541, 541, 541, 541, 541, 541, 230: 541, 233: 541, 236: 541, 240: 541, 246: 541, 541, 541, 282: 541, 286: 541, 541, 541, 541, 541, 292: 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 347: 541, 447: 541, 463: 541}, + {2: 1023, 1023, 1023, 1023, 7: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 22: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 288: 1023, 347: 1843, 521: 1844}, + // 490 + {2: 1022, 1022, 1022, 1022, 7: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 22: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 230: 1022, 288: 1022, 442: 1022, 463: 1022}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 288: 1848, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1847, 480: 1845, 500: 1846}, + {515, 515, 6: 515, 21: 515, 207: 515, 218: 515, 515, 515, 515, 515, 515, 515, 234: 515, 515, 238: 515}, + {6: 2473, 234: 2525}, + {6: 513, 211: 1871, 1872, 233: 1870, 2507, 237: 1873, 241: 1874, 1875, 1869, 465: 1868, 471: 1867}, + // 495 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2504, 1459, 1460, 1458}, + {511, 511, 6: 511, 21: 511, 207: 511, 211: 511, 511, 218: 511, 511, 511, 511, 511, 511, 511, 231: 511, 233: 511, 511, 511, 237: 511, 511, 241: 511, 511, 511, 511}, + {510, 510, 6: 510, 21: 510, 207: 510, 211: 510, 510, 218: 510, 510, 510, 510, 510, 510, 510, 231: 510, 233: 510, 510, 510, 237: 510, 510, 241: 510, 510, 510, 510}, + {505, 505, 1540, 1463, 1464, 1496, 505, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 505, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 207: 505, 210: 1861, 505, 505, 218: 505, 505, 505, 505, 505, 505, 505, 231: 505, 233: 505, 505, 505, 237: 505, 505, 241: 505, 505, 505, 505, 347: 505, 1860, 1459, 1460, 1458, 363: 505, 505, 529: 2477, 780: 2476}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1855, 288: 1848, 348: 1662, 1459, 1460, 1458, 1379, 429: 1851, 437: 1856, 1380, 1381, 1382, 444: 1385, 1384, 1857, 456: 1850, 1849, 1854, 480: 1845, 500: 1853}, + // 500 + {6: 2473, 21: 2474}, + {513, 513, 6: 513, 21: 513, 207: 513, 211: 1871, 1872, 218: 513, 513, 513, 513, 513, 513, 513, 233: 1870, 513, 513, 237: 1873, 513, 241: 1874, 1875, 1869, 465: 1868, 471: 1867}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1855, 288: 1848, 348: 1662, 1459, 1460, 1458, 1379, 429: 1851, 437: 1865, 1380, 1381, 1382, 444: 1385, 1384, 1857, 456: 1850, 1849, 1854, 480: 1845, 500: 1853}, + {21: 1863, 219: 430}, + {21: 1858}, + // 505 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 210: 1861, 348: 1860, 1459, 1460, 1458, 529: 1859}, + {507, 507, 6: 507, 21: 507, 207: 507, 211: 507, 507, 218: 507, 507, 507, 507, 507, 507, 507, 231: 507, 233: 507, 507, 507, 237: 507, 507, 241: 507, 507, 507, 507}, + {503, 503, 6: 503, 21: 503, 207: 503, 211: 503, 503, 218: 503, 503, 503, 503, 503, 503, 503, 231: 503, 233: 503, 503, 503, 237: 503, 503, 241: 503, 503, 503, 503, 347: 503, 363: 503, 503}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1862, 1459, 1460, 1458}, + {502, 502, 6: 502, 21: 502, 207: 502, 211: 502, 502, 218: 502, 502, 502, 502, 502, 502, 502, 231: 502, 233: 502, 502, 502, 237: 502, 502, 241: 502, 502, 502, 502, 347: 502, 363: 502, 502}, + // 510 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 210: 1861, 348: 1860, 1459, 1460, 1458, 529: 1864}, + {508, 508, 6: 508, 21: 508, 207: 508, 211: 508, 508, 218: 508, 508, 508, 508, 508, 508, 508, 231: 508, 233: 508, 508, 508, 237: 508, 508, 241: 508, 508, 508, 508}, + {21: 1866, 219: 430}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 210: 1861, 219: 429, 348: 1860, 1459, 1460, 1458, 529: 1864}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 2466}, + // 515 + {237: 475, 526: 2453, 638: 2457}, + {211: 1871, 1872, 237: 2450, 465: 2451}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1878}, + {237: 477, 526: 477}, + {237: 476, 526: 476}, + // 520 + {2: 473, 473, 473, 473, 7: 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 22: 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473}, + {237: 1877}, + {237: 1876}, + {2: 471, 471, 471, 471, 7: 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 22: 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471}, + {2: 472, 472, 472, 472, 7: 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 22: 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472}, + // 525 + {479, 479, 6: 479, 21: 479, 207: 1879, 211: 479, 479, 218: 479, 479, 479, 479, 479, 479, 479, 231: 479, 233: 479, 479, 479, 237: 479, 479, 241: 479, 479, 479, 479, 465: 1868, 471: 1867}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 1881}, + {391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 207: 391, 391, 391, 391, 391, 391, 214: 391, 391, 391, 218: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 237: 391, 391, 391, 241: 391, 391, 391, 391, 391, 391, 249: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 283: 391, 391, 391, 346: 391, 532: 2448}, + {478, 478, 6: 478, 21: 478, 207: 478, 211: 478, 478, 218: 478, 478, 478, 478, 478, 478, 478, 2014, 2012, 2013, 2011, 2009, 231: 478, 233: 478, 478, 478, 237: 478, 478, 241: 478, 478, 478, 478, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2447}, + // 530 + {1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 207: 1095, 1095, 210: 1095, 1095, 1095, 218: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 2430, 1095, 1095, 1095, 237: 1095, 1095, 241: 1095, 1095, 1095, 1095, 249: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 265: 1095, 2427, 2425, 2424, 2432, 2426, 2428, 2429, 2431, 696: 2423, 730: 2422}, + {1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 207: 1075, 1075, 210: 1075, 1075, 1075, 218: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 237: 1075, 1075, 241: 1075, 1075, 1075, 1075, 249: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 265: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075}, + {1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 207: 1048, 1048, 2396, 1048, 1048, 1048, 214: 2117, 2118, 2123, 218: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 237: 1048, 1048, 241: 1048, 1048, 1048, 1048, 2398, 2119, 249: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 2397, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 2121, 2114, 2120, 2124, 2113, 2122, 2115, 2116, 283: 2395, 2404, 2405, 648: 2399, 684: 2401, 727: 2400, 734: 2402, 764: 2403}, + {1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 2392, 1010, 1010, 1010, 1010, 1010, 1010, 214: 1010, 1010, 1010, 218: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 237: 1010, 1010, 1010, 241: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 249: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 283: 1010, 1010, 1010, 346: 1010, 357: 1010, 1010}, + {1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 693, 1005, 1005, 1005, 1005, 1005, 1005, 214: 1005, 1005, 1005, 218: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 237: 1005, 1005, 1005, 241: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 249: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 283: 1005, 1005, 1005, 346: 1005, 357: 1005, 1005}, + // 535 + {1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 2388, 1001, 1001, 1001, 1001, 1001, 1001, 214: 1001, 1001, 1001, 218: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 237: 1001, 1001, 1001, 241: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 249: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 283: 1001, 1001, 1001, 346: 1001, 357: 1001, 1001}, + {993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 692, 993, 993, 993, 993, 993, 993, 214: 993, 993, 993, 218: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 237: 993, 993, 993, 241: 993, 993, 993, 993, 993, 993, 993, 249: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 283: 993, 993, 993, 346: 993, 357: 993, 993}, + {986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 689, 986, 2387, 986, 986, 986, 986, 214: 986, 986, 986, 218: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 237: 986, 986, 986, 241: 986, 986, 986, 986, 986, 986, 986, 249: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 283: 986, 986, 986, 346: 986, 357: 986, 986}, + {984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 687, 984, 984, 984, 984, 984, 984, 214: 984, 984, 984, 218: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 237: 984, 984, 984, 241: 984, 984, 984, 984, 984, 984, 984, 249: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 283: 984, 984, 984, 346: 984, 357: 984, 984}, + {968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 683, 968, 968, 968, 968, 968, 968, 214: 968, 968, 968, 218: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 237: 968, 968, 968, 241: 968, 968, 968, 968, 968, 968, 968, 249: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 283: 968, 968, 968, 346: 968, 357: 968, 968}, + // 540 + {964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 686, 964, 964, 964, 964, 964, 964, 214: 964, 964, 964, 218: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 237: 964, 964, 964, 241: 964, 964, 964, 964, 964, 964, 964, 249: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 283: 964, 964, 964, 346: 964, 357: 964, 964}, + {959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 2384, 959, 959, 959, 959, 959, 959, 214: 959, 959, 959, 218: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 237: 959, 959, 959, 241: 959, 959, 959, 959, 959, 959, 959, 249: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 283: 959, 959, 959, 346: 959, 357: 959, 959}, + {943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 670, 943, 2383, 943, 943, 943, 943, 214: 943, 943, 943, 218: 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 237: 943, 943, 943, 241: 943, 943, 943, 943, 943, 943, 943, 249: 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 283: 943, 943, 943, 346: 943, 357: 943, 943}, + {942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 669, 942, 2382, 942, 942, 942, 942, 214: 942, 942, 942, 218: 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 237: 942, 942, 942, 241: 942, 942, 942, 942, 942, 942, 942, 249: 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 283: 942, 942, 942, 346: 942, 357: 942, 942}, + {939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 668, 939, 939, 939, 939, 939, 939, 214: 939, 939, 939, 218: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 237: 939, 939, 939, 241: 939, 939, 939, 939, 939, 939, 939, 249: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 283: 939, 939, 939, 346: 939, 357: 939, 939}, + // 545 + {935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 665, 935, 935, 935, 935, 935, 935, 214: 935, 935, 935, 218: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 237: 935, 935, 935, 241: 935, 935, 935, 935, 935, 935, 935, 249: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 283: 935, 935, 935, 346: 935, 357: 935, 935}, + {933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 666, 933, 933, 933, 933, 933, 933, 214: 933, 933, 933, 218: 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 237: 933, 933, 933, 241: 933, 933, 933, 933, 933, 933, 933, 249: 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 283: 933, 933, 933, 346: 933, 357: 933, 933}, + {930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 667, 930, 930, 930, 930, 930, 930, 214: 930, 930, 930, 218: 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 237: 930, 930, 930, 241: 930, 930, 930, 930, 930, 930, 930, 249: 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 283: 930, 930, 930, 346: 930, 357: 930, 930}, + {928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 690, 928, 928, 928, 928, 928, 928, 214: 928, 928, 928, 218: 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 237: 928, 928, 928, 241: 928, 928, 928, 928, 928, 928, 928, 249: 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 283: 928, 928, 928, 346: 928, 357: 928, 928}, + {917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 2377, 917, 917, 917, 917, 917, 917, 214: 917, 917, 917, 218: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 237: 917, 917, 917, 241: 917, 917, 917, 917, 917, 917, 917, 249: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 283: 917, 917, 917, 346: 917, 357: 917, 917}, + // 550 + {915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 677, 915, 915, 915, 915, 915, 915, 214: 915, 915, 915, 218: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 237: 915, 915, 915, 241: 915, 915, 915, 915, 915, 915, 915, 249: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 283: 915, 915, 915, 346: 915, 357: 915, 915}, + {896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 674, 896, 896, 896, 896, 896, 896, 214: 896, 896, 896, 218: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 237: 896, 896, 896, 241: 896, 896, 896, 896, 896, 896, 896, 249: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 283: 896, 896, 896, 346: 896, 357: 896, 896}, + {883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 672, 883, 883, 883, 883, 883, 883, 214: 883, 883, 883, 218: 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 237: 883, 883, 883, 241: 883, 883, 883, 883, 883, 883, 883, 249: 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 283: 883, 883, 883, 346: 883, 357: 883, 883}, + {882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 691, 882, 882, 882, 882, 882, 882, 214: 882, 882, 882, 218: 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 237: 882, 882, 882, 241: 882, 882, 882, 882, 882, 882, 882, 249: 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 283: 882, 882, 882, 346: 882, 357: 882, 882}, + {881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 679, 881, 881, 881, 881, 881, 881, 214: 881, 881, 881, 218: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 237: 881, 881, 881, 241: 881, 881, 881, 881, 881, 881, 881, 249: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 283: 881, 881, 881, 346: 881, 357: 881, 881}, + // 555 + {878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 681, 878, 878, 878, 878, 878, 878, 214: 878, 878, 878, 218: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 237: 878, 878, 878, 241: 878, 878, 878, 878, 878, 878, 878, 249: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 283: 878, 878, 878, 346: 878, 357: 878, 878}, + {877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 680, 877, 877, 877, 877, 877, 877, 214: 877, 877, 877, 218: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 237: 877, 877, 877, 241: 877, 877, 877, 877, 877, 877, 877, 249: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 283: 877, 877, 877, 346: 877, 357: 877, 877}, + {873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 671, 873, 873, 873, 873, 873, 873, 214: 873, 873, 873, 218: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 237: 873, 873, 873, 241: 873, 873, 873, 873, 873, 873, 873, 249: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 283: 873, 873, 873, 346: 873, 357: 873, 873}, + {822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 2368, 822, 822, 822, 822, 822, 822, 214: 822, 822, 822, 218: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 237: 822, 822, 822, 241: 822, 822, 822, 822, 822, 822, 822, 249: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 283: 822, 822, 822, 346: 822, 357: 822, 822}, + {809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 2361, 809, 809, 809, 809, 809, 809, 214: 809, 809, 809, 218: 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 237: 809, 809, 809, 241: 809, 809, 809, 809, 809, 809, 809, 249: 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 283: 809, 809, 809, 346: 809, 357: 809, 809}, + // 560 + {808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 2345, 808, 808, 808, 808, 808, 808, 214: 808, 808, 808, 218: 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 237: 808, 808, 808, 241: 808, 808, 808, 808, 808, 808, 808, 249: 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 283: 808, 808, 808, 346: 808, 357: 808, 808}, + {772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 207: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 237: 772, 772, 772, 241: 772, 772, 772, 772, 772, 772, 249: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 283: 772, 772, 772, 291: 772, 341: 772, 772, 772, 772, 772, 772}, + {771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 207: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 237: 771, 771, 771, 241: 771, 771, 771, 771, 771, 771, 249: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 283: 771, 771, 771, 291: 771, 341: 771, 771, 771, 771, 771, 771}, + {770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 207: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 237: 770, 770, 770, 241: 770, 770, 770, 770, 770, 770, 249: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 283: 770, 770, 770, 291: 770, 341: 770, 770, 770, 770, 770, 770}, + {769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 207: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 237: 769, 769, 769, 241: 769, 769, 769, 769, 769, 769, 249: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 283: 769, 769, 769, 291: 769, 341: 769, 769, 769, 769, 769, 769}, + // 565 + {768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 207: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 237: 768, 768, 768, 241: 768, 768, 768, 768, 768, 768, 249: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 283: 768, 768, 768, 291: 768, 341: 768, 768, 768, 768, 768, 768}, + {767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 207: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 237: 767, 767, 767, 241: 767, 767, 767, 767, 767, 767, 249: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 283: 767, 767, 767, 291: 767, 341: 767, 767, 767, 767, 767, 767}, + {766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 207: 766, 2344, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 237: 766, 766, 766, 241: 766, 766, 766, 766, 766, 766, 249: 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 283: 766, 766, 766, 291: 766, 341: 766, 766, 766, 766, 766, 766}, + {208: 2343}, + {764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 207: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 237: 764, 764, 764, 241: 764, 764, 764, 764, 764, 764, 249: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 283: 764, 764, 764, 291: 764, 341: 764, 764, 764, 764, 764, 764}, + // 570 + {763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 207: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 237: 763, 763, 763, 241: 763, 763, 763, 763, 763, 763, 249: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 283: 763, 763, 763, 291: 763, 341: 763, 763, 763, 763, 763, 763}, + {762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 207: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 237: 762, 762, 762, 241: 762, 762, 762, 762, 762, 762, 249: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 283: 762, 762, 762, 291: 762, 341: 762, 762, 762, 762, 762, 762}, + {737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 207: 737, 737, 737, 737, 737, 737, 214: 737, 737, 737, 218: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 237: 737, 737, 2305, 241: 737, 737, 737, 737, 737, 737, 249: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 283: 737, 737, 737, 346: 2306}, + {736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 207: 736, 736, 736, 736, 736, 736, 214: 736, 736, 736, 218: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 237: 736, 736, 736, 241: 736, 736, 736, 736, 736, 736, 2339, 249: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 283: 736, 736, 736, 346: 736, 357: 736, 736}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2336, 1459, 1460, 1458}, + // 575 + {732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 207: 732, 732, 732, 732, 732, 732, 214: 732, 732, 732, 218: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 237: 732, 732, 732, 241: 732, 732, 732, 732, 732, 732, 249: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 283: 732, 732, 732, 346: 732, 357: 2332, 2333}, + {731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 207: 731, 731, 731, 731, 731, 731, 214: 731, 731, 731, 218: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 237: 731, 731, 731, 241: 731, 731, 731, 731, 731, 731, 249: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 283: 731, 731, 731, 346: 731}, + {730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 207: 730, 730, 730, 730, 730, 730, 214: 730, 730, 730, 218: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 237: 730, 730, 730, 241: 730, 730, 730, 730, 730, 730, 249: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 283: 730, 730, 730, 346: 730}, + {729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 207: 729, 729, 729, 729, 729, 729, 214: 729, 729, 729, 218: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 237: 729, 729, 729, 241: 729, 729, 729, 729, 729, 729, 249: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 283: 729, 729, 729, 346: 729}, + {727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 207: 727, 727, 727, 727, 727, 727, 214: 727, 727, 727, 218: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 237: 727, 727, 727, 241: 727, 727, 727, 727, 727, 727, 249: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 283: 727, 727, 727, 346: 727}, + // 580 + {726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 207: 726, 726, 726, 726, 726, 726, 214: 726, 726, 726, 218: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 237: 726, 726, 726, 241: 726, 726, 726, 726, 726, 726, 249: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 283: 726, 726, 726, 346: 726}, + {725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 207: 725, 725, 725, 725, 725, 725, 214: 725, 725, 725, 218: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 237: 725, 725, 725, 241: 725, 725, 725, 725, 725, 725, 249: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 283: 725, 725, 725, 346: 725}, + {724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 207: 724, 724, 724, 724, 724, 724, 214: 724, 724, 724, 218: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 237: 724, 724, 724, 241: 724, 724, 724, 724, 724, 724, 249: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 283: 724, 724, 724, 346: 724}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2331, 1935, 1996, 1934}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2330, 1935, 1996, 1934}, + // 585 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2329, 1935, 1996, 1934}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2328, 1935, 1996, 1934}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2327, 1935, 1996, 1934}, + {717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 207: 717, 717, 717, 717, 717, 717, 214: 717, 717, 717, 218: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 237: 717, 717, 717, 241: 717, 717, 717, 717, 717, 717, 249: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 283: 717, 717, 717, 346: 717}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 2320, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 1379, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2318, 437: 2311, 1380, 1381, 1382, 444: 1385, 1384, 2312, 455: 2319}, + // 590 + {206: 2310, 406: 2309}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2304, 1935, 1996, 1934}, + {206: 2299}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 251: 560, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2286, 711: 2287}, + {206: 2236}, + // 595 + {206: 2233}, + {206: 2230}, + {206: 688}, + {206: 685}, + {206: 684}, + // 600 + {206: 682}, + {206: 678}, + {206: 676}, + {206: 675}, + {206: 673}, + // 605 + {662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 214: 662, 662, 662, 218: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 237: 662, 662, 662, 241: 662, 662, 662, 662, 662, 662, 249: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 283: 662, 662, 662, 346: 662}, + {661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 214: 661, 661, 661, 218: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 237: 661, 661, 661, 241: 661, 661, 661, 661, 661, 661, 249: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 283: 661, 661, 661, 346: 661}, + {660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 214: 660, 660, 660, 218: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 237: 660, 660, 660, 241: 660, 660, 660, 660, 660, 660, 249: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 283: 660, 660, 660, 346: 660}, + {659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 214: 659, 659, 659, 218: 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 237: 659, 659, 659, 241: 659, 659, 659, 659, 659, 659, 249: 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 283: 659, 659, 659, 346: 659}, + {658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 214: 658, 658, 658, 218: 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 237: 658, 658, 658, 241: 658, 658, 658, 658, 658, 658, 249: 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 283: 658, 658, 658, 346: 658}, + // 610 + {657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 214: 657, 657, 657, 218: 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 237: 657, 657, 657, 241: 657, 657, 657, 657, 657, 657, 249: 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 283: 657, 657, 657, 346: 657}, + {656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 214: 656, 656, 656, 218: 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 237: 656, 656, 656, 241: 656, 656, 656, 656, 656, 656, 249: 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 283: 656, 656, 656, 346: 656}, + {655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 214: 655, 655, 655, 218: 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 237: 655, 655, 655, 241: 655, 655, 655, 655, 655, 655, 249: 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 283: 655, 655, 655, 346: 655}, + {654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 214: 654, 654, 654, 218: 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 237: 654, 654, 654, 241: 654, 654, 654, 654, 654, 654, 249: 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 283: 654, 654, 654, 346: 654}, + {206: 2227}, + // 615 + {206: 2224}, + {664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 1802, 664, 664, 664, 664, 664, 664, 214: 664, 664, 664, 218: 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 237: 664, 664, 664, 241: 664, 664, 664, 664, 664, 664, 249: 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 283: 664, 664, 664, 346: 664, 636: 2223}, + {206: 2221}, + {592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 2217, 592, 592, 592, 592, 592, 592, 214: 592, 592, 592, 218: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 237: 592, 592, 592, 241: 592, 592, 592, 592, 592, 592, 249: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 283: 592, 592, 592, 346: 592, 719: 2216}, + {206: 2210}, + // 620 + {206: 2206}, + {206: 2201}, + {631: 2198, 2195, 2197, 2196}, + {206: 2192}, + {206: 2187}, + // 625 + {206: 2178}, + {206: 2171}, + {206: 2166}, + {206: 2110}, + {206: 2096}, + // 630 + {206: 2079}, + {206: 617}, + {206: 616}, + {206: 615}, + {206: 614}, + // 635 + {206: 2073}, + {206: 2067}, + {206: 2061}, + {206: 2050}, + {206: 2028}, + // 640 + {206: 2024}, + {206: 2020}, + {206: 1999}, + {394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 207: 394, 394, 394, 394, 394, 394, 214: 394, 394, 394, 218: 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 237: 394, 394, 394, 241: 394, 394, 394, 394, 394, 394, 249: 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 283: 394, 394, 394, 346: 394}, + {393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 207: 393, 393, 393, 393, 393, 393, 214: 393, 393, 393, 218: 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 237: 393, 393, 393, 241: 393, 393, 393, 393, 393, 393, 249: 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 283: 393, 393, 393, 346: 393}, + // 645 + {392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 207: 392, 392, 392, 392, 392, 392, 214: 392, 392, 392, 218: 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 237: 392, 392, 392, 241: 392, 392, 392, 392, 392, 392, 249: 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 283: 392, 392, 392, 346: 392}, + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 236: 699, 240: 699, 247: 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 460: 2000, 2001, 473: 2003, 478: 2004, 487: 2005, 503: 2006}, + {2: 703, 703, 703, 703, 7: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 22: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 208: 703, 703, 211: 703, 703, 703, 703, 703, 703, 703, 233: 703, 236: 703, 240: 703, 246: 703, 703, 703, 282: 703, 286: 703, 703, 703, 703, 703, 292: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 352: 703, 435: 703, 447: 703, 450: 703, 703, 703}, + {2: 702, 702, 702, 702, 7: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 22: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 208: 702, 702, 211: 702, 702, 702, 702, 702, 702, 702, 233: 702, 236: 702, 240: 702, 246: 702, 702, 702, 282: 702, 286: 702, 702, 702, 702, 702, 292: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 352: 702, 435: 702, 447: 702, 450: 702, 702, 702}, + {2: 701, 701, 701, 701, 7: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 22: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 208: 701, 701, 211: 701, 701, 701, 701, 701, 701, 701, 233: 701, 236: 701, 240: 701, 246: 701, 701, 701, 282: 701, 286: 701, 701, 701, 701, 701, 292: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 352: 701, 447: 701, 450: 701, 701, 701}, + // 650 + {2: 700, 700, 700, 700, 7: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 22: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 208: 700, 700, 211: 700, 700, 700, 700, 700, 700, 700, 236: 700, 240: 700, 247: 700, 700, 282: 700, 286: 700, 700, 700, 700, 700, 292: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 435: 2019}, + {2: 698, 698, 698, 698, 7: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 22: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 208: 698, 698, 211: 698, 698, 698, 698, 698, 698, 698, 233: 698, 236: 698, 240: 698, 246: 698, 698, 698, 282: 698, 286: 698, 698, 698, 698, 698, 292: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 447: 698, 450: 698, 698, 698}, + {2: 695, 695, 695, 695, 7: 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 22: 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 208: 695, 695, 211: 695, 695, 695, 695, 695, 695, 695, 236: 695, 240: 695, 247: 695, 695, 282: 695, 286: 695, 695, 695, 695, 695, 292: 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2007}, + {21: 2015, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 655 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2018}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2017}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2016}, + {2: 1092, 1092, 1092, 1092, 7: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 22: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 208: 1092, 1092, 211: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 236: 1092, 240: 1092, 247: 1092, 1092, 282: 1092, 286: 1092, 1092, 1092, 1092, 1092, 292: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092}, + {2: 1091, 1091, 1091, 1091, 7: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 22: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 208: 1091, 1091, 211: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 236: 1091, 240: 1091, 247: 1091, 1091, 282: 1091, 286: 1091, 1091, 1091, 1091, 1091, 292: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091}, + // 660 + {2: 1090, 1090, 1090, 1090, 7: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 22: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 208: 1090, 1090, 211: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 236: 1090, 240: 1090, 247: 1090, 1090, 282: 1090, 286: 1090, 1090, 1090, 1090, 1090, 292: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090}, + {2: 1089, 1089, 1089, 1089, 7: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 22: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 208: 1089, 1089, 211: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 236: 1089, 240: 1089, 247: 1089, 1089, 282: 1089, 286: 1089, 1089, 1089, 1089, 1089, 292: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089}, + {596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 207: 596, 596, 596, 596, 596, 596, 214: 596, 596, 596, 218: 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 237: 596, 596, 596, 241: 596, 596, 596, 596, 596, 596, 249: 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 283: 596, 596, 596, 346: 596}, + {1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 207: 1100, 1100, 210: 1100, 1100, 1100, 218: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 233: 1100, 1100, 1100, 237: 1100, 1100, 241: 1100, 1100, 1100, 1100, 249: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 265: 1100, 427: 2010, 2008}, + {1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 207: 1101, 1101, 210: 1101, 1101, 1101, 218: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 2014, 1101, 2013, 1101, 1101, 1101, 1101, 233: 1101, 1101, 1101, 237: 1101, 1101, 241: 1101, 1101, 1101, 1101, 249: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 265: 1101, 427: 2010, 2008}, + // 665 + {1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 207: 1102, 1102, 210: 1102, 1102, 1102, 218: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 2014, 1102, 2013, 1102, 2009, 1102, 1102, 233: 1102, 1102, 1102, 237: 1102, 1102, 241: 1102, 1102, 1102, 1102, 249: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 265: 1102, 427: 2010, 2008}, + {2: 694, 694, 694, 694, 7: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 22: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 208: 694, 694, 211: 694, 694, 694, 694, 694, 694, 694, 236: 694, 240: 694, 247: 694, 694, 282: 694, 286: 694, 694, 694, 694, 694, 292: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694}, + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 236: 699, 240: 699, 247: 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 460: 2000, 2001, 473: 2003, 478: 2004, 487: 2005, 503: 2021}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2022}, + {21: 2023, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 670 + {597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 207: 597, 597, 597, 597, 597, 597, 214: 597, 597, 597, 218: 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 237: 597, 597, 597, 241: 597, 597, 597, 597, 597, 597, 249: 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 283: 597, 597, 597, 346: 597}, + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 236: 699, 240: 699, 247: 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 460: 2000, 2001, 473: 2003, 478: 2004, 487: 2005, 503: 2025}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2026}, + {21: 2027, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 207: 598, 598, 598, 598, 598, 598, 214: 598, 598, 598, 218: 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 237: 598, 598, 598, 241: 598, 598, 598, 598, 598, 598, 249: 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 283: 598, 598, 598, 346: 598}, + // 675 + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 236: 699, 240: 699, 247: 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 460: 2000, 2001, 473: 2003, 478: 2004, 487: 2005, 503: 2029}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2031}, + {1088, 1088, 6: 1088, 21: 1088, 23: 1088, 223: 1088, 225: 2014, 2012, 2013, 2011, 2009, 231: 1088, 427: 2010, 2008}, + {6: 2032, 21: 753, 23: 753, 223: 2033, 466: 2034, 2035}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2049}, + // 680 + {362: 2040}, + {752, 752, 21: 752, 23: 752, 207: 752, 218: 752, 752, 752, 752, 752}, + {21: 595, 23: 2037, 751: 2036}, + {21: 2039}, + {208: 2038}, + // 685 + {21: 594}, + {599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 207: 599, 599, 599, 599, 599, 599, 214: 599, 599, 599, 218: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 237: 599, 599, 599, 241: 599, 599, 599, 599, 599, 599, 249: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 283: 599, 599, 599, 346: 599}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2041, 534: 2043, 572: 2042}, + {756, 756, 6: 756, 21: 756, 23: 756, 207: 756, 218: 756, 756, 756, 756, 756, 756, 225: 2014, 2012, 2013, 2011, 2009, 235: 756, 249: 2048, 2047, 427: 2010, 2008, 637: 2046}, + {760, 760, 6: 2044, 21: 760, 23: 760, 207: 760, 218: 760, 760, 760, 760, 760}, + // 690 + {759, 759, 6: 759, 21: 759, 23: 759, 207: 759, 218: 759, 759, 759, 759, 759, 759, 235: 759}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2041, 534: 2045}, + {758, 758, 6: 758, 21: 758, 23: 758, 207: 758, 218: 758, 758, 758, 758, 758, 758, 235: 758}, + {757, 757, 6: 757, 21: 757, 23: 757, 207: 757, 218: 757, 757, 757, 757, 757, 757, 235: 757}, + {755, 755, 6: 755, 21: 755, 23: 755, 207: 755, 218: 755, 755, 755, 755, 755, 755, 235: 755}, + // 695 + {754, 754, 6: 754, 21: 754, 23: 754, 207: 754, 218: 754, 754, 754, 754, 754, 754, 235: 754}, + {1087, 1087, 6: 1087, 21: 1087, 23: 1087, 223: 1087, 225: 2014, 2012, 2013, 2011, 2009, 231: 1087, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 246: 2054, 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2051, 435: 2053, 460: 2000, 2001, 473: 2052}, + {21: 2060, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2058}, + // 700 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2056}, + {21: 2055}, + {600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 207: 600, 600, 600, 600, 600, 600, 214: 600, 600, 600, 218: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 237: 600, 600, 600, 241: 600, 600, 600, 600, 600, 600, 249: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 283: 600, 600, 600, 346: 600}, + {21: 2057, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 207: 602, 602, 602, 602, 602, 602, 214: 602, 602, 602, 218: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 237: 602, 602, 602, 241: 602, 602, 602, 602, 602, 602, 249: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 283: 602, 602, 602, 346: 602}, + // 705 + {6: 2032, 21: 2059}, + {603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 207: 603, 603, 603, 603, 603, 603, 214: 603, 603, 603, 218: 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 237: 603, 603, 603, 241: 603, 603, 603, 603, 603, 603, 249: 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 283: 603, 603, 603, 346: 603}, + {601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 207: 601, 601, 601, 601, 601, 601, 214: 601, 601, 601, 218: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 237: 601, 601, 601, 241: 601, 601, 601, 601, 601, 601, 249: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 283: 601, 601, 601, 346: 601}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2062, 435: 2063}, + {21: 2066, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 710 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2064}, + {21: 2065, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 207: 604, 604, 604, 604, 604, 604, 214: 604, 604, 604, 218: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 237: 604, 604, 604, 241: 604, 604, 604, 604, 604, 604, 249: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 283: 604, 604, 604, 346: 604}, + {605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 207: 605, 605, 605, 605, 605, 605, 214: 605, 605, 605, 218: 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 237: 605, 605, 605, 241: 605, 605, 605, 605, 605, 605, 249: 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 283: 605, 605, 605, 346: 605}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2068, 435: 2069}, + // 715 + {21: 2072, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2070}, + {21: 2071, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 207: 606, 606, 606, 606, 606, 606, 214: 606, 606, 606, 218: 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 237: 606, 606, 606, 241: 606, 606, 606, 606, 606, 606, 249: 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 283: 606, 606, 606, 346: 606}, + {607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 207: 607, 607, 607, 607, 607, 607, 214: 607, 607, 607, 218: 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 237: 607, 607, 607, 241: 607, 607, 607, 607, 607, 607, 249: 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 283: 607, 607, 607, 346: 607}, + // 720 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2074, 435: 2075}, + {21: 2078, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2076}, + {21: 2077, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 207: 608, 608, 608, 608, 608, 608, 214: 608, 608, 608, 218: 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 237: 608, 608, 608, 241: 608, 608, 608, 608, 608, 608, 249: 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 283: 608, 608, 608, 346: 608}, + // 725 + {609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 207: 609, 609, 609, 609, 609, 609, 214: 609, 609, 609, 218: 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 237: 609, 609, 609, 241: 609, 609, 609, 609, 609, 609, 249: 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 283: 609, 609, 609, 346: 609}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2080, 688: 2082, 732: 2083, 790: 2084, 2081}, + {21: 2092, 225: 2014, 2012, 2013, 2011, 2009, 2093, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 230: 2086, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2085}, + {2: 613, 613, 613, 613, 7: 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 22: 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 208: 613, 613, 211: 613, 613, 613, 613, 613, 613, 613, 230: 613, 236: 613, 240: 613, 247: 613, 613, 282: 613, 286: 613, 613, 613, 613, 613, 292: 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613}, + // 730 + {2: 612, 612, 612, 612, 7: 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 22: 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 208: 612, 612, 211: 612, 612, 612, 612, 612, 612, 612, 230: 612, 236: 612, 240: 612, 247: 612, 612, 282: 612, 286: 612, 612, 612, 612, 612, 292: 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612}, + {2: 611, 611, 611, 611, 7: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 22: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 208: 611, 611, 211: 611, 611, 611, 611, 611, 611, 611, 230: 611, 236: 611, 240: 611, 247: 611, 611, 282: 611, 286: 611, 611, 611, 611, 611, 292: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611}, + {225: 2014, 2012, 2013, 2011, 2009, 2089, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2087}, + {21: 2088, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 735 + {623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 207: 623, 623, 623, 623, 623, 623, 214: 623, 623, 623, 218: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 237: 623, 623, 623, 241: 623, 623, 623, 623, 623, 623, 249: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 283: 623, 623, 623, 346: 623}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2090}, + {21: 2091, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 207: 622, 622, 622, 622, 622, 622, 214: 622, 622, 622, 218: 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 237: 622, 622, 622, 241: 622, 622, 622, 622, 622, 622, 249: 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 283: 622, 622, 622, 346: 622}, + {625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 207: 625, 625, 625, 625, 625, 625, 214: 625, 625, 625, 218: 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 237: 625, 625, 625, 241: 625, 625, 625, 625, 625, 625, 249: 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 283: 625, 625, 625, 346: 625}, + // 740 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2094}, + {21: 2095, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 207: 624, 624, 624, 624, 624, 624, 214: 624, 624, 624, 218: 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 237: 624, 624, 624, 241: 624, 624, 624, 624, 624, 624, 249: 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 283: 624, 624, 624, 346: 624}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2097}, + {6: 2098, 225: 2014, 2012, 2013, 2011, 2009, 2099, 427: 2010, 2008}, + // 745 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2105}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2100}, + {21: 2101, 221: 2102, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 207: 630, 630, 630, 630, 630, 630, 214: 630, 630, 630, 218: 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 237: 630, 630, 630, 241: 630, 630, 630, 630, 630, 630, 249: 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 283: 630, 630, 630, 346: 630}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2103}, + // 750 + {21: 2104, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 207: 628, 628, 628, 628, 628, 628, 214: 628, 628, 628, 218: 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 237: 628, 628, 628, 241: 628, 628, 628, 628, 628, 628, 249: 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 283: 628, 628, 628, 346: 628}, + {6: 2107, 21: 2106, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 207: 631, 631, 631, 631, 631, 631, 214: 631, 631, 631, 218: 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 237: 631, 631, 631, 241: 631, 631, 631, 631, 631, 631, 249: 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 283: 631, 631, 631, 346: 631}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2108}, + // 755 + {21: 2109, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 207: 629, 629, 629, 629, 629, 629, 214: 629, 629, 629, 218: 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 237: 629, 629, 629, 241: 629, 629, 629, 629, 629, 629, 249: 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 283: 629, 629, 629, 346: 629}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2111}, + {214: 2117, 2118, 2123, 246: 2119, 264: 2125, 274: 2121, 2114, 2120, 2124, 2113, 2122, 2115, 2116}, + {391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 207: 391, 391, 391, 391, 391, 391, 214: 391, 391, 391, 218: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 237: 391, 391, 391, 241: 391, 391, 391, 391, 391, 391, 249: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 283: 391, 391, 391, 346: 391}, + // 760 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2165}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2164}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2163}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2162}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 2159, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2158}, + // 765 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 2135, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2134}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2133}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2132}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2131}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2130}, + // 770 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2129}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2128}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2126}, + {21: 2127, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 207: 632, 632, 632, 632, 632, 632, 214: 632, 632, 632, 218: 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 237: 632, 632, 632, 241: 632, 632, 632, 632, 632, 632, 249: 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 283: 632, 632, 632, 346: 632}, + // 775 + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 207: 738, 738, 738, 738, 738, 738, 214: 738, 738, 738, 218: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 237: 738, 738, 241: 738, 738, 738, 738, 738, 738, 249: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 283: 738, 738, 738}, + {739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 207: 739, 739, 739, 739, 739, 739, 214: 739, 739, 739, 218: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 237: 739, 739, 241: 739, 739, 739, 739, 739, 739, 249: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 2124, 739, 739, 739, 739, 283: 739, 739, 739}, + {740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 207: 740, 740, 740, 740, 740, 740, 214: 740, 740, 740, 218: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 237: 740, 740, 241: 740, 740, 740, 740, 740, 740, 249: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 2124, 740, 740, 740, 740, 283: 740, 740, 740}, + {741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 207: 741, 741, 741, 741, 741, 741, 214: 741, 741, 741, 218: 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 237: 741, 741, 241: 741, 741, 741, 741, 741, 741, 249: 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 2124, 741, 741, 741, 741, 283: 741, 741, 741}, + {742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 207: 742, 742, 742, 742, 742, 742, 214: 742, 742, 742, 218: 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 237: 742, 742, 241: 742, 742, 742, 742, 742, 742, 249: 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 2124, 742, 742, 742, 742, 283: 742, 742, 742}, + // 780 + {743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 207: 743, 743, 743, 743, 743, 743, 214: 743, 743, 743, 218: 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 237: 743, 743, 241: 743, 743, 743, 743, 743, 743, 249: 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 2124, 743, 743, 743, 743, 283: 743, 743, 743}, + {746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 207: 746, 746, 746, 746, 746, 746, 214: 746, 746, 2123, 218: 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 237: 746, 746, 241: 746, 746, 746, 746, 746, 2119, 249: 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 2121, 746, 2120, 2124, 746, 2122, 746, 746, 283: 746, 746, 746}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2136}, + {35: 2146, 2142, 2141, 2138, 2140, 2144, 2145, 2139, 2143, 225: 2014, 2012, 2013, 2011, 2009, 252: 2156, 2153, 2155, 2154, 2150, 2152, 2151, 2148, 2149, 2147, 2157, 427: 2010, 2008, 517: 2137}, + {744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 207: 744, 744, 744, 744, 744, 744, 214: 744, 744, 744, 218: 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 237: 744, 744, 241: 744, 744, 744, 744, 744, 744, 249: 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 283: 744, 744, 744}, + // 785 + {589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 207: 589, 589, 589, 589, 589, 589, 214: 589, 589, 589, 218: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 237: 589, 589, 241: 589, 589, 589, 589, 589, 589, 249: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 283: 589, 589, 589}, + {588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 207: 588, 588, 588, 588, 588, 588, 214: 588, 588, 588, 218: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 237: 588, 588, 241: 588, 588, 588, 588, 588, 588, 249: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 283: 588, 588, 588}, + {587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 207: 587, 587, 587, 587, 587, 587, 214: 587, 587, 587, 218: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 237: 587, 587, 241: 587, 587, 587, 587, 587, 587, 249: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 283: 587, 587, 587}, + {586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 207: 586, 586, 586, 586, 586, 586, 214: 586, 586, 586, 218: 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 237: 586, 586, 241: 586, 586, 586, 586, 586, 586, 249: 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 283: 586, 586, 586}, + {585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 207: 585, 585, 585, 585, 585, 585, 214: 585, 585, 585, 218: 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 237: 585, 585, 241: 585, 585, 585, 585, 585, 585, 249: 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 283: 585, 585, 585}, + // 790 + {584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 207: 584, 584, 584, 584, 584, 584, 214: 584, 584, 584, 218: 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 237: 584, 584, 241: 584, 584, 584, 584, 584, 584, 249: 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 283: 584, 584, 584}, + {583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 207: 583, 583, 583, 583, 583, 583, 214: 583, 583, 583, 218: 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 237: 583, 583, 241: 583, 583, 583, 583, 583, 583, 249: 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 283: 583, 583, 583}, + {582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 207: 582, 582, 582, 582, 582, 582, 214: 582, 582, 582, 218: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 237: 582, 582, 241: 582, 582, 582, 582, 582, 582, 249: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 283: 582, 582, 582}, + {581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 207: 581, 581, 581, 581, 581, 581, 214: 581, 581, 581, 218: 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 237: 581, 581, 241: 581, 581, 581, 581, 581, 581, 249: 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 283: 581, 581, 581}, + {580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 207: 580, 580, 580, 580, 580, 580, 214: 580, 580, 580, 218: 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 237: 580, 580, 241: 580, 580, 580, 580, 580, 580, 249: 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 283: 580, 580, 580}, + // 795 + {579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 207: 579, 579, 579, 579, 579, 579, 214: 579, 579, 579, 218: 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 237: 579, 579, 241: 579, 579, 579, 579, 579, 579, 249: 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 283: 579, 579, 579}, + {578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 207: 578, 578, 578, 578, 578, 578, 214: 578, 578, 578, 218: 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 237: 578, 578, 241: 578, 578, 578, 578, 578, 578, 249: 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 283: 578, 578, 578}, + {577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 207: 577, 577, 577, 577, 577, 577, 214: 577, 577, 577, 218: 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 237: 577, 577, 241: 577, 577, 577, 577, 577, 577, 249: 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 283: 577, 577, 577}, + {576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 207: 576, 576, 576, 576, 576, 576, 214: 576, 576, 576, 218: 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 237: 576, 576, 241: 576, 576, 576, 576, 576, 576, 249: 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 283: 576, 576, 576}, + {575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 207: 575, 575, 575, 575, 575, 575, 214: 575, 575, 575, 218: 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 237: 575, 575, 241: 575, 575, 575, 575, 575, 575, 249: 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 283: 575, 575, 575}, + // 800 + {574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 207: 574, 574, 574, 574, 574, 574, 214: 574, 574, 574, 218: 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 237: 574, 574, 241: 574, 574, 574, 574, 574, 574, 249: 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 283: 574, 574, 574}, + {573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 207: 573, 573, 573, 573, 573, 573, 214: 573, 573, 573, 218: 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 237: 573, 573, 241: 573, 573, 573, 573, 573, 573, 249: 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 283: 573, 573, 573}, + {572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 207: 572, 572, 572, 572, 572, 572, 214: 572, 572, 572, 218: 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 237: 572, 572, 241: 572, 572, 572, 572, 572, 572, 249: 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 283: 572, 572, 572}, + {571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 207: 571, 571, 571, 571, 571, 571, 214: 571, 571, 571, 218: 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 237: 571, 571, 241: 571, 571, 571, 571, 571, 571, 249: 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 283: 571, 571, 571}, + {570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 207: 570, 570, 570, 570, 570, 570, 214: 570, 570, 570, 218: 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 237: 570, 570, 241: 570, 570, 570, 570, 570, 570, 249: 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 283: 570, 570, 570}, + // 805 + {747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 207: 747, 747, 747, 747, 747, 747, 214: 747, 747, 2123, 218: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 237: 747, 747, 241: 747, 747, 747, 747, 747, 2119, 249: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 2121, 747, 2120, 2124, 747, 2122, 747, 747, 283: 747, 747, 747}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2160}, + {35: 2146, 2142, 2141, 2138, 2140, 2144, 2145, 2139, 2143, 225: 2014, 2012, 2013, 2011, 2009, 252: 2156, 2153, 2155, 2154, 2150, 2152, 2151, 2148, 2149, 2147, 2157, 427: 2010, 2008, 517: 2161}, + {745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 207: 745, 745, 745, 745, 745, 745, 214: 745, 745, 745, 218: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 237: 745, 745, 241: 745, 745, 745, 745, 745, 745, 249: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 283: 745, 745, 745}, + {748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 207: 748, 748, 748, 748, 748, 748, 214: 2117, 2118, 2123, 218: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 237: 748, 748, 241: 748, 748, 748, 748, 748, 2119, 249: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 2121, 748, 2120, 2124, 748, 2122, 748, 748, 283: 748, 748, 748}, + // 810 + {749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 207: 749, 749, 749, 749, 749, 749, 214: 2117, 2118, 2123, 218: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 237: 749, 749, 241: 749, 749, 749, 749, 749, 2119, 249: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 2121, 749, 2120, 2124, 749, 2122, 749, 749, 283: 749, 749, 749}, + {750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 207: 750, 750, 750, 750, 750, 750, 214: 2117, 2118, 2123, 218: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 237: 750, 750, 241: 750, 750, 750, 750, 750, 2119, 249: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 2121, 750, 2120, 2124, 750, 2122, 2115, 2116, 283: 750, 750, 750}, + {751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 207: 751, 751, 751, 751, 751, 751, 214: 2117, 2118, 2123, 218: 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 237: 751, 751, 241: 751, 751, 751, 751, 751, 2119, 249: 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 2121, 2114, 2120, 2124, 751, 2122, 2115, 2116, 283: 751, 751, 751}, + {35: 2146, 2142, 2141, 2138, 2140, 2144, 2145, 2139, 2143, 252: 2156, 2153, 2155, 2154, 2150, 2152, 2151, 2148, 2149, 2147, 2157, 517: 2167}, + {230: 2168}, + // 815 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2169}, + {21: 2170, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 207: 634, 634, 634, 634, 634, 634, 214: 634, 634, 634, 218: 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 237: 634, 634, 634, 241: 634, 634, 634, 634, 634, 634, 249: 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 283: 634, 634, 634, 346: 634}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2172}, + {6: 2173, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 820 + {309: 2174}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2175}, + {35: 2146, 2142, 2141, 2138, 2140, 2144, 2145, 2139, 2143, 225: 2014, 2012, 2013, 2011, 2009, 252: 2156, 2153, 2155, 2154, 2150, 2152, 2151, 2148, 2149, 2147, 2157, 427: 2010, 2008, 517: 2176}, + {21: 2177}, + {635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 207: 635, 635, 635, 635, 635, 635, 214: 635, 635, 635, 218: 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 237: 635, 635, 635, 241: 635, 635, 635, 635, 635, 635, 249: 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 283: 635, 635, 635, 346: 635}, + // 825 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2179}, + {6: 2180, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 2182, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2181}, + {21: 2186, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2183}, + // 830 + {35: 2146, 2142, 2141, 2138, 2140, 2144, 2145, 2139, 2143, 225: 2014, 2012, 2013, 2011, 2009, 252: 2156, 2153, 2155, 2154, 2150, 2152, 2151, 2148, 2149, 2147, 2157, 427: 2010, 2008, 517: 2184}, + {21: 2185}, + {636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 207: 636, 636, 636, 636, 636, 636, 214: 636, 636, 636, 218: 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 237: 636, 636, 636, 241: 636, 636, 636, 636, 636, 636, 249: 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 283: 636, 636, 636, 346: 636}, + {637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 207: 637, 637, 637, 637, 637, 637, 214: 637, 637, 637, 218: 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 237: 637, 637, 637, 241: 637, 637, 637, 637, 637, 637, 249: 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 283: 637, 637, 637, 346: 637}, + {21: 1082, 240: 2189, 606: 2188, 2190}, + // 835 + {21: 1081}, + {21: 1080}, + {21: 2191}, + {638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 207: 638, 638, 638, 638, 638, 638, 214: 638, 638, 638, 218: 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 237: 638, 638, 638, 241: 638, 638, 638, 638, 638, 638, 249: 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 283: 638, 638, 638, 346: 638}, + {21: 1082, 240: 2189, 606: 2188, 2193}, + // 840 + {21: 2194}, + {639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 207: 639, 639, 639, 639, 639, 639, 214: 639, 639, 639, 218: 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 237: 639, 639, 639, 241: 639, 639, 639, 639, 639, 639, 249: 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 283: 639, 639, 639, 346: 639}, + {208: 775}, + {208: 774}, + {208: 773}, + // 845 + {208: 2199}, + {244: 2200}, + {640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 207: 640, 640, 640, 640, 640, 640, 214: 640, 640, 640, 218: 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 237: 640, 640, 640, 241: 640, 640, 640, 640, 640, 640, 249: 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 283: 640, 640, 640, 346: 640}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2202}, + {6: 2203, 214: 2117, 2118, 2123, 246: 2119, 274: 2121, 2114, 2120, 2124, 2113, 2122, 2115, 2116}, + // 850 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2204}, + {21: 2205, 214: 2117, 2118, 2123, 246: 2119, 274: 2121, 2114, 2120, 2124, 2113, 2122, 2115, 2116}, + {642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 207: 642, 642, 642, 642, 642, 642, 214: 642, 642, 642, 218: 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 237: 642, 642, 642, 241: 642, 642, 642, 642, 642, 642, 249: 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 283: 642, 642, 642, 346: 642}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1084, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2207, 508: 2208}, + {6: 2032, 21: 1083}, + // 855 + {21: 2209}, + {643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 207: 643, 643, 643, 643, 643, 643, 214: 643, 643, 643, 218: 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 237: 643, 643, 643, 241: 643, 643, 643, 643, 643, 643, 249: 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 283: 643, 643, 643, 346: 643}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2211}, + {6: 2032, 21: 2212, 231: 2213}, + {648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 207: 648, 648, 648, 648, 648, 648, 214: 648, 648, 648, 218: 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 237: 648, 648, 648, 241: 648, 648, 648, 648, 648, 648, 249: 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 283: 648, 648, 648, 346: 648}, + // 860 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 2214}, + {21: 2215}, + {647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 207: 647, 647, 647, 647, 647, 647, 214: 647, 647, 647, 218: 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 237: 647, 647, 647, 241: 647, 647, 647, 647, 647, 647, 249: 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 283: 647, 647, 647, 346: 647}, + {649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 207: 649, 649, 649, 649, 649, 649, 214: 649, 649, 649, 218: 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 237: 649, 649, 649, 241: 649, 649, 649, 649, 649, 649, 249: 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 283: 649, 649, 649, 346: 649}, + {21: 2218, 240: 2219}, + // 865 + {591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 207: 591, 591, 591, 591, 591, 591, 214: 591, 591, 591, 218: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 237: 591, 591, 591, 241: 591, 591, 591, 591, 591, 591, 249: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 283: 591, 591, 591, 346: 591}, + {21: 2220}, + {590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 207: 590, 590, 590, 590, 590, 590, 214: 590, 590, 590, 218: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 237: 590, 590, 590, 241: 590, 590, 590, 590, 590, 590, 249: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 283: 590, 590, 590, 346: 590}, + {21: 2222}, + {650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 207: 650, 650, 650, 650, 650, 650, 214: 650, 650, 650, 218: 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 237: 650, 650, 650, 241: 650, 650, 650, 650, 650, 650, 249: 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 283: 650, 650, 650, 346: 650}, + // 870 + {651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 207: 651, 651, 651, 651, 651, 651, 214: 651, 651, 651, 218: 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 237: 651, 651, 651, 241: 651, 651, 651, 651, 651, 651, 249: 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 283: 651, 651, 651, 346: 651}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1084, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2207, 508: 2225}, + {21: 2226}, + {652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 207: 652, 652, 652, 652, 652, 652, 214: 652, 652, 652, 218: 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 237: 652, 652, 652, 241: 652, 652, 652, 652, 652, 652, 249: 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 283: 652, 652, 652, 346: 652}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1084, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2207, 508: 2228}, + // 875 + {21: 2229}, + {653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 207: 653, 653, 653, 653, 653, 653, 214: 653, 653, 653, 218: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 237: 653, 653, 653, 241: 653, 653, 653, 653, 653, 653, 249: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 283: 653, 653, 653, 346: 653}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 247: 1927, 348: 1926, 1459, 1460, 1458, 409: 2231}, + {21: 2232}, + {706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 207: 706, 706, 706, 706, 706, 706, 214: 706, 706, 706, 218: 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 237: 706, 706, 706, 241: 706, 706, 706, 706, 706, 706, 249: 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 283: 706, 706, 706, 346: 706}, + // 880 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 247: 1927, 348: 1926, 1459, 1460, 1458, 409: 2234}, + {21: 2235}, + {707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 207: 707, 707, 707, 707, 707, 707, 214: 707, 707, 707, 218: 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 237: 707, 707, 707, 241: 707, 707, 707, 707, 707, 707, 249: 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 283: 707, 707, 707, 346: 707}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2237}, + {6: 2238, 225: 2014, 2012, 2013, 2011, 2009, 231: 2239, 427: 2010, 2008}, + // 885 + {12: 2249, 50: 2246, 2245, 56: 2248, 61: 2251, 248: 2243, 290: 2244, 374: 2247, 430: 2250, 573: 2242}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 2240}, + {21: 2241}, + {708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 207: 708, 708, 708, 708, 708, 708, 214: 708, 708, 708, 218: 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 237: 708, 708, 708, 241: 708, 708, 708, 708, 708, 708, 249: 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 283: 708, 708, 708, 346: 708}, + {21: 2285}, + // 890 + {21: 134, 206: 2257, 441: 2258, 453: 2284}, + {7: 134, 21: 134, 206: 2257, 248: 134, 353: 134, 441: 2258, 453: 2271}, + {21: 551}, + {21: 134, 206: 2257, 441: 2258, 453: 2270}, + {21: 127, 206: 2263, 441: 2264, 540: 2262, 552: 2265}, + // 895 + {21: 134, 206: 2257, 441: 2258, 453: 2256}, + {21: 175, 375: 2253, 2254, 635: 2255}, + {21: 175, 375: 2253, 2254, 635: 2252}, + {21: 545}, + {21: 546}, + // 900 + {21: 174}, + {21: 173}, + {21: 547}, + {21: 548}, + {240: 1448, 432: 2259, 443: 2260}, + // 905 + {133, 133, 133, 133, 133, 133, 133, 133, 12: 133, 21: 133, 207: 133, 209: 133, 133, 213: 133, 217: 133, 239: 133, 248: 133, 133, 133, 291: 133, 341: 133, 133, 133, 133, 133, 353: 133, 430: 133, 133}, + {1105, 1105, 1105, 1105, 6: 1105, 1105, 1105, 1105, 1105, 1105, 13: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 48: 1105, 206: 1105, 1105, 210: 1105, 213: 1105, 218: 1105, 1105, 1105, 1105, 231: 1105, 236: 1105, 239: 1105, 347: 1105, 352: 1105, 1105, 1105, 1105, 1105}, + {21: 2261}, + {135, 135, 135, 135, 135, 135, 135, 135, 12: 135, 21: 135, 207: 135, 209: 135, 135, 213: 135, 217: 135, 239: 135, 248: 135, 135, 135, 291: 135, 341: 135, 135, 135, 135, 135, 353: 135, 430: 135, 135}, + {21: 549}, + // 910 + {240: 1448, 432: 2259, 443: 2266}, + {126, 126, 126, 126, 126, 126, 126, 12: 126, 21: 126, 207: 126, 209: 126, 126, 213: 126, 217: 126, 291: 126, 341: 126, 126, 126, 126, 126, 430: 126, 126}, + {125, 125, 125, 125, 125, 125, 125, 12: 125, 21: 125, 207: 125, 209: 125, 125, 213: 125, 217: 125, 291: 125, 341: 125, 125, 125, 125, 125, 430: 125, 125}, + {6: 2267, 21: 2261}, + {240: 1448, 432: 2259, 443: 2268}, + // 915 + {21: 2269}, + {124, 124, 124, 124, 124, 124, 124, 12: 124, 21: 124, 207: 124, 209: 124, 124, 213: 124, 217: 124, 291: 124, 341: 124, 124, 124, 124, 124, 430: 124, 124}, + {21: 550}, + {7: 2276, 21: 121, 248: 2273, 353: 2275, 449: 2274, 493: 2272}, + {21: 552}, + // 920 + {118, 118, 118, 118, 118, 118, 118, 2276, 21: 118, 207: 118, 209: 118, 118, 213: 118, 217: 118, 239: 118, 291: 118, 341: 118, 118, 118, 118, 118, 353: 2275, 449: 2282, 551: 2281}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 2278}, + {234: 2277}, + {115, 115, 115, 115, 115, 115, 7: 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 22: 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 208: 115, 224: 115, 232: 115, 245: 115, 248: 115}, + {116, 116, 116, 116, 116, 116, 7: 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 22: 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 208: 116, 224: 116, 232: 116, 245: 116, 248: 116}, + // 925 + {123, 123, 123, 123, 123, 123, 123, 21: 123, 207: 123, 209: 123, 123, 213: 123, 217: 123, 239: 123, 248: 2279, 291: 123, 341: 123, 123, 123, 123, 123, 749: 2280}, + {122, 122, 122, 122, 122, 122, 122, 21: 122, 207: 122, 209: 122, 122, 213: 122, 217: 122, 239: 122, 291: 122, 341: 122, 122, 122, 122, 122}, + {119, 119, 119, 119, 119, 119, 119, 21: 119, 207: 119, 209: 119, 119, 213: 119, 217: 119, 239: 119, 291: 119, 341: 119, 119, 119, 119, 119}, + {120, 120, 120, 120, 120, 120, 120, 21: 120, 207: 120, 209: 120, 120, 213: 120, 217: 120, 239: 120, 291: 120, 341: 120, 120, 120, 120, 120}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 2283}, + // 930 + {117, 117, 117, 117, 117, 117, 117, 21: 117, 207: 117, 209: 117, 117, 213: 117, 217: 117, 239: 117, 291: 117, 341: 117, 117, 117, 117, 117}, + {21: 553}, + {709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 207: 709, 709, 709, 709, 709, 709, 214: 709, 709, 709, 218: 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 237: 709, 709, 709, 241: 709, 709, 709, 709, 709, 709, 249: 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 283: 709, 709, 709, 346: 709}, + {225: 2014, 2012, 2013, 2011, 2009, 251: 559, 427: 2010, 2008}, + {251: 2290, 677: 2289, 807: 2288}, + // 935 + {44: 555, 251: 2290, 263: 2296, 677: 2295, 708: 2294}, + {44: 558, 251: 558, 263: 558}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2291}, + {225: 2014, 2012, 2013, 2011, 2009, 265: 2292, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2293}, + // 940 + {44: 556, 225: 2014, 2012, 2013, 2011, 2009, 251: 556, 263: 556, 427: 2010, 2008}, + {44: 2298}, + {44: 557, 251: 557, 263: 557}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2297}, + {44: 554, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 945 + {710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 207: 710, 710, 710, 710, 710, 710, 214: 710, 710, 710, 218: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 237: 710, 710, 710, 241: 710, 710, 710, 710, 710, 710, 249: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 283: 710, 710, 710, 346: 710}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2300}, + {210: 2301, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {12: 2249, 50: 2246, 2245, 56: 2248, 61: 2251, 248: 2243, 290: 2244, 374: 2247, 430: 2250, 573: 2302}, + {21: 2303}, + // 950 + {711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 207: 711, 711, 711, 711, 711, 711, 214: 711, 711, 711, 218: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 237: 711, 711, 711, 241: 711, 711, 711, 711, 711, 711, 249: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 283: 711, 711, 711, 346: 711}, + {712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 207: 712, 712, 712, 712, 712, 712, 214: 712, 712, 712, 218: 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 237: 712, 712, 2305, 241: 712, 712, 712, 712, 712, 712, 249: 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 283: 712, 712, 712, 346: 712}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 2308}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2307, 1935, 1996, 1934}, + {719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 207: 719, 719, 719, 719, 719, 719, 214: 719, 719, 719, 218: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 237: 719, 719, 2305, 241: 719, 719, 719, 719, 719, 719, 249: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 283: 719, 719, 719, 346: 719}, + // 955 + {728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 207: 728, 728, 728, 728, 728, 728, 214: 728, 728, 728, 218: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 237: 728, 728, 728, 241: 728, 728, 728, 728, 728, 728, 249: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 283: 728, 728, 728, 346: 728}, + {713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 207: 713, 713, 713, 713, 713, 713, 214: 713, 713, 713, 218: 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 237: 713, 713, 713, 241: 713, 713, 713, 713, 713, 713, 249: 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 283: 713, 713, 713, 346: 713}, + {206: 2313, 352: 1379, 437: 2311, 1380, 1381, 1382, 444: 1385, 1384, 2312}, + {21: 2317, 219: 430}, + {21: 2316}, + // 960 + {352: 1379, 437: 2314, 1380, 1381, 1382}, + {21: 2315}, + {219: 429}, + {440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 207: 440, 440, 440, 440, 440, 440, 214: 440, 440, 440, 218: 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 237: 440, 440, 440, 241: 440, 440, 440, 440, 440, 440, 249: 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 283: 440, 440, 440, 346: 440}, + {441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 207: 441, 441, 441, 441, 441, 441, 214: 441, 441, 441, 218: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 237: 441, 441, 441, 241: 441, 441, 441, 441, 441, 441, 249: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 283: 441, 441, 441, 346: 441}, + // 965 + {6: 1088, 21: 2326, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {6: 2323}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 2320, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 1379, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2318, 437: 2321, 1380, 1381, 1382, 444: 1385, 1384, 2312, 455: 2319}, + {21: 2322, 219: 430}, + {441, 441, 6: 441, 21: 441, 209: 441, 214: 441, 441, 441, 219: 429, 225: 441, 441, 441, 441, 441, 232: 441, 239: 441, 245: 441, 441, 264: 441, 266: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 283: 441, 441, 441, 346: 441}, + // 970 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2324}, + {6: 1087, 21: 2325, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 207: 715, 715, 715, 715, 715, 715, 214: 715, 715, 715, 218: 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 237: 715, 715, 715, 241: 715, 715, 715, 715, 715, 715, 249: 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 283: 715, 715, 715, 346: 715}, + {716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 207: 716, 716, 716, 716, 716, 716, 214: 716, 716, 716, 218: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 237: 716, 716, 716, 241: 716, 716, 716, 716, 716, 716, 249: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 283: 716, 716, 716, 346: 716}, + {718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 207: 718, 718, 718, 718, 718, 718, 214: 718, 718, 718, 218: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 237: 718, 718, 2305, 241: 718, 718, 718, 718, 718, 718, 249: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 283: 718, 718, 718, 346: 718}, + // 975 + {720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 207: 720, 720, 720, 720, 720, 720, 214: 720, 720, 720, 218: 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 237: 720, 720, 2305, 241: 720, 720, 720, 720, 720, 720, 249: 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 283: 720, 720, 720, 346: 720}, + {721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 207: 721, 721, 721, 721, 721, 721, 214: 721, 721, 721, 218: 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 237: 721, 721, 2305, 241: 721, 721, 721, 721, 721, 721, 249: 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 283: 721, 721, 721, 346: 721}, + {722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 207: 722, 722, 722, 722, 722, 722, 214: 722, 722, 722, 218: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 237: 722, 722, 2305, 241: 722, 722, 722, 722, 722, 722, 249: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 283: 722, 722, 722, 346: 722}, + {723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 207: 723, 723, 723, 723, 723, 723, 214: 723, 723, 723, 218: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 237: 723, 723, 2305, 241: 723, 723, 723, 723, 723, 723, 249: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 283: 723, 723, 723, 346: 723}, + {208: 2335}, + // 980 + {208: 2334}, + {704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 207: 704, 704, 704, 704, 704, 704, 214: 704, 704, 704, 218: 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 237: 704, 704, 704, 241: 704, 704, 704, 704, 704, 704, 249: 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 283: 704, 704, 704, 346: 704}, + {705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 207: 705, 705, 705, 705, 705, 705, 214: 705, 705, 705, 218: 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 237: 705, 705, 705, 241: 705, 705, 705, 705, 705, 705, 249: 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 283: 705, 705, 705, 346: 705}, + {247: 2337}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2338, 1459, 1460, 1458}, + // 985 + {734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 207: 734, 734, 734, 734, 734, 734, 214: 734, 734, 734, 218: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 237: 734, 734, 734, 241: 734, 734, 734, 734, 734, 734, 249: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 283: 734, 734, 734, 346: 734, 357: 734, 734}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2340, 1459, 1460, 1458}, + {735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 207: 735, 735, 735, 735, 735, 735, 214: 735, 735, 735, 218: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 237: 735, 735, 735, 241: 735, 735, 735, 735, 735, 735, 2341, 249: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 283: 735, 735, 735, 346: 735, 357: 735, 735}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2342, 1459, 1460, 1458}, + {733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 207: 733, 733, 733, 733, 733, 733, 214: 733, 733, 733, 218: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 237: 733, 733, 733, 241: 733, 733, 733, 733, 733, 733, 249: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 283: 733, 733, 733, 346: 733, 357: 733, 733}, + // 990 + {765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 207: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 237: 765, 765, 765, 241: 765, 765, 765, 765, 765, 765, 249: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 283: 765, 765, 765, 291: 765, 341: 765, 765, 765, 765, 765, 765}, + {761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 207: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 237: 761, 761, 761, 241: 761, 761, 761, 761, 761, 761, 249: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 283: 761, 761, 761, 291: 761, 341: 761, 761, 761, 761, 761, 761}, + {35: 2355, 2351, 2350, 2347, 2349, 2353, 2354, 2348, 2352, 668: 2346}, + {6: 2356}, + {6: 569}, + // 995 + {6: 568}, + {6: 567}, + {6: 566}, + {6: 565}, + {6: 564}, + // 1000 + {6: 563}, + {6: 562}, + {6: 561}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2357}, + {6: 2358, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 1005 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2359}, + {21: 2360, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 207: 626, 626, 626, 626, 626, 626, 214: 626, 626, 626, 218: 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 237: 626, 626, 626, 241: 626, 626, 626, 626, 626, 626, 249: 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 283: 626, 626, 626, 346: 626}, + {35: 2355, 2351, 2350, 2347, 2349, 2353, 2354, 2348, 2352, 668: 2362}, + {6: 2363}, + // 1010 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2364}, + {6: 2365, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2366}, + {21: 2367, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 207: 627, 627, 627, 627, 627, 627, 214: 627, 627, 627, 218: 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 237: 627, 627, 627, 241: 627, 627, 627, 627, 627, 627, 249: 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 283: 627, 627, 627, 346: 627}, + // 1015 + {50: 2371, 2370, 56: 2372, 96: 2373, 720: 2369}, + {6: 2374}, + {6: 621}, + {6: 620}, + {6: 619}, + // 1020 + {6: 618}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2375}, + {21: 2376, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 207: 633, 633, 633, 633, 633, 633, 214: 633, 633, 633, 218: 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 237: 633, 633, 633, 241: 633, 633, 633, 633, 633, 633, 249: 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 283: 633, 633, 633, 346: 633}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2378}, + // 1025 + {6: 2379}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2380}, + {6: 1087, 21: 2381, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 207: 714, 714, 714, 714, 714, 714, 214: 714, 714, 714, 218: 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 237: 714, 714, 714, 241: 714, 714, 714, 714, 714, 714, 249: 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 283: 714, 714, 714, 346: 714}, + {644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 207: 644, 644, 644, 644, 644, 644, 214: 644, 644, 644, 218: 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 237: 644, 644, 644, 241: 644, 644, 644, 644, 644, 644, 249: 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 283: 644, 644, 644, 346: 644}, + // 1030 + {645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 207: 645, 645, 645, 645, 645, 645, 214: 645, 645, 645, 218: 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 237: 645, 645, 645, 241: 645, 645, 645, 645, 645, 645, 249: 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 283: 645, 645, 645, 346: 645}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1084, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2207, 508: 2385}, + {21: 2386}, + {641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 207: 641, 641, 641, 641, 641, 641, 214: 641, 641, 641, 218: 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 237: 641, 641, 641, 241: 641, 641, 641, 641, 641, 641, 249: 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 283: 641, 641, 641, 346: 641}, + {646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 207: 646, 646, 646, 646, 646, 646, 214: 646, 646, 646, 218: 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 237: 646, 646, 646, 241: 646, 646, 646, 646, 646, 646, 249: 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 283: 646, 646, 646, 346: 646}, + // 1035 + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 236: 699, 240: 699, 247: 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 460: 2000, 2001, 473: 2003, 478: 2004, 487: 2005, 503: 2389}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2390}, + {21: 2391, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 207: 610, 610, 610, 610, 610, 610, 214: 610, 610, 610, 218: 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 237: 610, 610, 610, 241: 610, 610, 610, 610, 610, 610, 249: 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 283: 610, 610, 610, 346: 610}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1084, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2207, 508: 2393}, + // 1040 + {21: 2394}, + {593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 207: 593, 593, 593, 593, 593, 593, 214: 593, 593, 593, 218: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 237: 593, 593, 593, 241: 593, 593, 593, 593, 593, 593, 249: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 283: 593, 593, 593, 346: 593}, + {2: 1066, 1066, 1066, 1066, 7: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 22: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 208: 1066, 211: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 236: 1066, 240: 1066, 247: 1066, 1066, 282: 1066, 286: 1066, 1066, 1066, 1066, 1066, 292: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066}, + {245: 2420, 264: 2419, 283: 2418, 2404, 2405, 648: 2421}, + {206: 1062}, + // 1045 + {2: 1060, 1060, 1060, 1060, 7: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 22: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 208: 1060, 211: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 236: 1060, 240: 1060, 247: 1060, 1060, 282: 1060, 286: 1060, 1060, 1060, 1060, 1060, 292: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060}, + {2: 1058, 1058, 1058, 1058, 7: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 22: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 208: 1058, 211: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 236: 1058, 240: 1058, 247: 1058, 1058, 282: 1058, 286: 1058, 1058, 1058, 1058, 1058, 292: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058}, + {206: 2414, 406: 2415}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2411}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2407, 1935, 1996, 1934}, + // 1050 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2406, 1935, 1996, 1934}, + {2: 1047, 1047, 1047, 1047, 7: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 22: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 208: 1047, 211: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 236: 1047, 240: 1047, 247: 1047, 1047, 282: 1047, 286: 1047, 1047, 1047, 1047, 1047, 292: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047}, + {2: 1046, 1046, 1046, 1046, 7: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 22: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 208: 1046, 211: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 236: 1046, 240: 1046, 247: 1046, 1046, 282: 1046, 286: 1046, 1046, 1046, 1046, 1046, 292: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046}, + {1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 207: 1049, 1049, 210: 1049, 1049, 1049, 218: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 237: 1049, 1049, 2305, 241: 1049, 1049, 1049, 1049, 249: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 265: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 346: 2306}, + {1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 2409, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 207: 1045, 1045, 210: 1045, 1045, 1045, 218: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 237: 1045, 1045, 2305, 241: 1045, 1045, 1045, 1045, 249: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 265: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 346: 2306, 733: 2408}, + // 1055 + {1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 207: 1050, 1050, 210: 1050, 1050, 1050, 218: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 237: 1050, 1050, 241: 1050, 1050, 1050, 1050, 249: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 265: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050}, + {208: 2410}, + {1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 207: 1044, 1044, 210: 1044, 1044, 1044, 218: 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 237: 1044, 1044, 241: 1044, 1044, 1044, 1044, 249: 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 265: 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044}, + {214: 2117, 2118, 2123, 225: 2412, 246: 2119, 274: 2121, 2114, 2120, 2124, 2113, 2122, 2115, 2116}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 2413}, + // 1060 + {1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 207: 1051, 1051, 210: 1051, 1051, 1051, 218: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 237: 1051, 1051, 241: 1051, 1051, 1051, 1051, 249: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 265: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 2320, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 1379, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 437: 2311, 1380, 1381, 1382, 444: 1385, 1384, 2312, 455: 2416}, + {1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 207: 1052, 1052, 210: 1052, 1052, 1052, 218: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 237: 1052, 1052, 241: 1052, 1052, 1052, 1052, 249: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 265: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052}, + {6: 2032, 21: 2417}, + {1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 207: 1053, 1053, 210: 1053, 1053, 1053, 218: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 237: 1053, 1053, 241: 1053, 1053, 1053, 1053, 249: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 265: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053}, + // 1065 + {2: 1065, 1065, 1065, 1065, 7: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 22: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 208: 1065, 211: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 236: 1065, 240: 1065, 247: 1065, 1065, 282: 1065, 286: 1065, 1065, 1065, 1065, 1065, 292: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065}, + {206: 1061}, + {2: 1059, 1059, 1059, 1059, 7: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 22: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 208: 1059, 211: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 236: 1059, 240: 1059, 247: 1059, 1059, 282: 1059, 286: 1059, 1059, 1059, 1059, 1059, 292: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059}, + {2: 1057, 1057, 1057, 1057, 7: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 22: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 208: 1057, 211: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 236: 1057, 240: 1057, 247: 1057, 1057, 282: 1057, 286: 1057, 1057, 1057, 1057, 1057, 292: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057}, + {68: 2445, 217: 2446, 294: 2444, 2443}, + // 1070 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 2437, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 2438, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2436, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 2434, 435: 2439, 681: 2435}, + {2: 1074, 1074, 1074, 1074, 7: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 22: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 208: 1074, 211: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 236: 1074, 240: 1074, 247: 1074, 1074, 282: 1074, 286: 1074, 1074, 1074, 1074, 1074, 292: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 435: 1074}, + {2: 1073, 1073, 1073, 1073, 7: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 22: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 208: 1073, 211: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 236: 1073, 240: 1073, 247: 1073, 1073, 282: 1073, 286: 1073, 1073, 1073, 1073, 1073, 292: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 435: 1073}, + {2: 1072, 1072, 1072, 1072, 7: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 22: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 208: 1072, 211: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 236: 1072, 240: 1072, 247: 1072, 1072, 282: 1072, 286: 1072, 1072, 1072, 1072, 1072, 292: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 435: 1072}, + {2: 1071, 1071, 1071, 1071, 7: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 22: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 208: 1071, 211: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 236: 1071, 240: 1071, 247: 1071, 1071, 282: 1071, 286: 1071, 1071, 1071, 1071, 1071, 292: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 435: 1071}, + // 1075 + {2: 1070, 1070, 1070, 1070, 7: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 22: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 208: 1070, 211: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 236: 1070, 240: 1070, 247: 1070, 1070, 282: 1070, 286: 1070, 1070, 1070, 1070, 1070, 292: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 435: 1070}, + {2: 1069, 1069, 1069, 1069, 7: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 22: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 208: 1069, 211: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 236: 1069, 240: 1069, 247: 1069, 1069, 282: 1069, 286: 1069, 1069, 1069, 1069, 1069, 292: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 435: 1069}, + {2: 1068, 1068, 1068, 1068, 7: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 22: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 208: 1068, 211: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 236: 1068, 240: 1068, 247: 1068, 1068, 282: 1068, 286: 1068, 1068, 1068, 1068, 1068, 292: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 435: 1068}, + {2: 1067, 1067, 1067, 1067, 7: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 22: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 208: 1067, 211: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 236: 1067, 240: 1067, 247: 1067, 1067, 282: 1067, 286: 1067, 1067, 1067, 1067, 1067, 292: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 435: 1067}, + {68: 1064, 209: 2433, 217: 1064, 294: 1064, 1064}, + // 1080 + {68: 1063, 217: 1063, 294: 1063, 1063}, + {1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 207: 1078, 1078, 210: 1078, 1078, 1078, 218: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 237: 1078, 1078, 241: 1078, 1078, 1078, 1078, 249: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 265: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078}, + {206: 2310, 406: 2442}, + {391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 207: 391, 391, 391, 391, 391, 391, 214: 391, 391, 391, 218: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 237: 391, 391, 391, 241: 391, 391, 391, 391, 391, 391, 249: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 283: 391, 391, 391, 346: 391, 532: 2440}, + {932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 1056, 932, 932, 932, 932, 932, 932, 214: 932, 932, 932, 218: 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 237: 932, 932, 932, 241: 932, 932, 932, 932, 932, 932, 932, 249: 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 283: 932, 932, 932, 346: 932, 357: 932, 932}, + // 1085 + {931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 1055, 931, 931, 931, 931, 931, 931, 214: 931, 931, 931, 218: 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 237: 931, 931, 931, 241: 931, 931, 931, 931, 931, 931, 931, 249: 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 283: 931, 931, 931, 346: 931, 357: 931, 931}, + {206: 1054}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 2441}, + {1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 207: 1076, 1076, 210: 1076, 1076, 1076, 218: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 237: 1076, 1076, 241: 1076, 1076, 1076, 1076, 249: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 265: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076}, + {1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 207: 1077, 1077, 210: 1077, 1077, 1077, 218: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 237: 1077, 1077, 241: 1077, 1077, 1077, 1077, 249: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 265: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077}, + // 1090 + {1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 207: 1098, 1098, 210: 1098, 1098, 1098, 218: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 233: 1098, 1098, 1098, 237: 1098, 1098, 241: 1098, 1098, 1098, 1098, 249: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 265: 1098}, + {1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 207: 1097, 1097, 210: 1097, 1097, 1097, 218: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 233: 1097, 1097, 1097, 237: 1097, 1097, 241: 1097, 1097, 1097, 1097, 249: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 265: 1097}, + {1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 207: 1096, 1096, 210: 1096, 1096, 1096, 218: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 233: 1096, 1096, 1096, 237: 1096, 1096, 241: 1096, 1096, 1096, 1096, 249: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 265: 1096}, + {1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 207: 1079, 1079, 210: 1079, 1079, 1079, 218: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 237: 1079, 1079, 241: 1079, 1079, 1079, 1079, 249: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 265: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079}, + {1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 207: 1099, 1099, 210: 1099, 1099, 1099, 218: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 233: 1099, 1099, 1099, 237: 1099, 1099, 241: 1099, 1099, 1099, 1099, 249: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 265: 1099, 427: 2010, 2008}, + // 1095 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2449}, + {1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 207: 1103, 1103, 210: 1103, 1103, 1103, 218: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 2014, 2012, 2013, 2011, 2009, 1103, 1103, 233: 1103, 1103, 1103, 237: 1103, 1103, 241: 1103, 1103, 1103, 1103, 249: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 265: 1103, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 2456}, + {237: 475, 526: 2453, 638: 2452}, + {237: 2454}, + // 1100 + {237: 474}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 2455}, + {480, 480, 6: 480, 21: 480, 207: 480, 211: 480, 480, 218: 480, 480, 480, 480, 480, 480, 480, 231: 480, 233: 480, 480, 480, 237: 480, 480, 241: 480, 480, 480, 480, 465: 1868, 471: 1867}, + {481, 481, 6: 481, 21: 481, 207: 481, 211: 481, 481, 218: 481, 481, 481, 481, 481, 481, 481, 231: 481, 233: 481, 481, 481, 237: 481, 481, 241: 481, 481, 481, 481, 465: 1868, 471: 1867}, + {237: 2458}, + // 1105 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 2459}, + {207: 2460, 211: 1871, 1872, 231: 2461, 233: 1870, 237: 1873, 241: 1874, 1875, 1869, 465: 1868, 471: 1867}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2465}, + {206: 2462}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 2463}, + // 1110 + {6: 1730, 21: 2464}, + {482, 482, 6: 482, 21: 482, 207: 482, 211: 482, 482, 218: 482, 482, 482, 482, 482, 482, 482, 231: 482, 233: 482, 482, 482, 237: 482, 482, 241: 482, 482, 482, 482}, + {483, 483, 6: 483, 21: 483, 207: 483, 211: 483, 483, 218: 483, 483, 483, 483, 483, 483, 483, 2014, 2012, 2013, 2011, 2009, 231: 483, 233: 483, 483, 483, 237: 483, 483, 241: 483, 483, 483, 483, 427: 2010, 2008}, + {486, 486, 6: 486, 21: 486, 207: 2467, 211: 486, 486, 218: 486, 486, 486, 486, 486, 486, 486, 231: 2468, 233: 486, 486, 486, 237: 486, 486, 241: 486, 486, 486, 486, 465: 1868, 471: 1867}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2472}, + // 1115 + {206: 2469}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 2470}, + {6: 1730, 21: 2471}, + {484, 484, 6: 484, 21: 484, 207: 484, 211: 484, 484, 218: 484, 484, 484, 484, 484, 484, 484, 231: 484, 233: 484, 484, 484, 237: 484, 484, 241: 484, 484, 484, 484}, + {485, 485, 6: 485, 21: 485, 207: 485, 211: 485, 485, 218: 485, 485, 485, 485, 485, 485, 485, 2014, 2012, 2013, 2011, 2009, 231: 485, 233: 485, 485, 485, 237: 485, 485, 241: 485, 485, 485, 485, 427: 2010, 2008}, + // 1120 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 288: 1848, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1854, 480: 2475}, + {506, 506, 6: 506, 21: 506, 207: 506, 211: 506, 506, 218: 506, 506, 506, 506, 506, 506, 506, 231: 506, 233: 506, 506, 506, 237: 506, 506, 241: 506, 506, 506, 506}, + {514, 514, 6: 514, 21: 514, 207: 514, 218: 514, 514, 514, 514, 514, 514, 514, 234: 514, 514, 238: 514}, + {488, 488, 6: 488, 21: 488, 207: 488, 211: 488, 488, 218: 488, 488, 488, 488, 488, 488, 488, 231: 488, 233: 488, 488, 488, 237: 488, 488, 241: 488, 488, 488, 488, 347: 2480, 363: 2481, 2479, 545: 2483, 2482, 612: 2484, 2478}, + {504, 504, 6: 504, 21: 504, 207: 504, 211: 504, 504, 218: 504, 504, 504, 504, 504, 504, 504, 231: 504, 233: 504, 504, 504, 237: 504, 504, 241: 504, 504, 504, 504, 347: 504, 363: 504, 504}, + // 1125 + {509, 509, 6: 509, 21: 509, 207: 509, 211: 509, 509, 218: 509, 509, 509, 509, 509, 509, 509, 231: 509, 233: 509, 509, 509, 237: 509, 509, 241: 509, 509, 509, 509}, + {291: 2499, 359: 2500, 475: 2503}, + {291: 2499, 359: 2500, 475: 2502}, + {291: 2499, 359: 2500, 475: 2501}, + {206: 498, 221: 2486, 726: 2487}, + // 1130 + {490, 490, 6: 490, 21: 490, 207: 490, 211: 490, 490, 218: 490, 490, 490, 490, 490, 490, 490, 231: 490, 233: 490, 490, 490, 237: 490, 490, 241: 490, 490, 490, 490, 347: 490, 363: 490, 490}, + {487, 487, 6: 487, 21: 487, 207: 487, 211: 487, 487, 218: 487, 487, 487, 487, 487, 487, 487, 231: 487, 233: 487, 487, 487, 237: 487, 487, 241: 487, 487, 487, 487, 347: 2480, 363: 2481, 2479, 545: 2485, 2482}, + {489, 489, 6: 489, 21: 489, 207: 489, 211: 489, 489, 218: 489, 489, 489, 489, 489, 489, 489, 231: 489, 233: 489, 489, 489, 237: 489, 489, 241: 489, 489, 489, 489, 347: 489, 363: 489, 489}, + {223: 2495, 237: 2494, 2496}, + {206: 2488}, + // 1135 + {2: 1540, 1463, 1464, 1496, 493, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 493, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2490, 1459, 1460, 1458, 522: 2489}, + {6: 2492, 21: 2491}, + {492, 492, 6: 492, 21: 492, 218: 492}, + {494, 494, 6: 494, 21: 494, 207: 494, 211: 494, 494, 218: 494, 494, 494, 494, 494, 494, 494, 231: 494, 233: 494, 494, 494, 237: 494, 494, 241: 494, 494, 494, 494, 347: 494, 363: 494, 494}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2493, 1459, 1460, 1458}, + // 1140 + {491, 491, 6: 491, 21: 491, 218: 491}, + {206: 497}, + {362: 2498}, + {362: 2497}, + {206: 495}, + // 1145 + {206: 496}, + {2: 1315, 1315, 1315, 1315, 7: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 22: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 221: 1315, 231: 1315}, + {2: 1314, 1314, 1314, 1314, 7: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 22: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 221: 1314, 231: 1314}, + {206: 499, 221: 499}, + {206: 500, 221: 500}, + // 1150 + {206: 501, 221: 501}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 2505}, + {211: 1871, 1872, 233: 1870, 237: 1873, 241: 1874, 1875, 1869, 2506, 465: 1868, 471: 1867}, + {512, 512, 6: 512, 21: 512, 207: 512, 218: 512, 512, 512, 512, 512, 512, 512, 234: 512, 512, 238: 512}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2508, 519: 2509, 533: 2510}, + // 1155 + {232: 2523}, + {1287, 1287, 6: 1287, 222: 1287, 1287, 1287}, + {104, 104, 6: 2511, 222: 104, 104, 2513, 484: 2514, 2512}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2508, 519: 2522}, + {753, 753, 222: 753, 2033, 466: 2034, 2516}, + // 1160 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2515}, + {103, 103, 21: 103, 207: 103, 218: 103, 103, 103, 103, 103, 103, 235: 103, 238: 103}, + {105, 105, 21: 105, 207: 105, 218: 105, 105, 105, 105, 105, 105, 225: 2014, 2012, 2013, 2011, 2009, 235: 105, 238: 105, 427: 2010, 2008}, + {470, 470, 222: 2517, 619: 2518}, + {240: 1448, 299: 2521, 432: 2259, 443: 2520, 524: 2519}, + // 1165 + {108, 108}, + {469, 469}, + {468, 468, 6: 468, 21: 468, 48: 468, 207: 468, 218: 468, 468, 468, 468}, + {467, 467, 6: 467, 21: 467, 48: 467, 207: 467, 218: 467, 467, 467, 467}, + {1286, 1286, 6: 1286, 222: 1286, 1286, 1286}, + // 1170 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2524}, + {1288, 1288, 6: 1288, 222: 1288, 1288, 1288, 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2508, 519: 2509, 533: 2526}, + {104, 104, 6: 2511, 224: 2513, 484: 2514, 2527}, + {107, 107}, + // 1175 + {31: 2533, 2532, 2531, 2530, 481: 2549, 664: 2550}, + {31: 457, 457, 457, 457, 481: 457}, + {206: 2546}, + {206: 2543}, + {206: 2537}, + // 1180 + {206: 2534}, + {240: 1448, 432: 2535}, + {21: 2536}, + {31: 452, 452, 452, 452, 481: 452}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2538, 1459, 1460, 1458, 542: 2539}, + // 1185 + {6: 459, 21: 459}, + {6: 2540, 21: 2541}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2542, 1459, 1460, 1458}, + {31: 453, 453, 453, 453, 481: 453}, + {6: 458, 21: 458}, + // 1190 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2538, 1459, 1460, 1458, 542: 2544}, + {6: 2540, 21: 2545}, + {31: 454, 454, 454, 454, 481: 454}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2538, 1459, 1460, 1458, 542: 2547}, + {6: 2540, 21: 2548}, + // 1195 + {31: 455, 455, 455, 455, 481: 455}, + {2: 460, 460, 460, 460, 7: 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 22: 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 208: 460, 460, 211: 460, 460, 460, 460, 460, 460, 460, 230: 460, 233: 460, 236: 460, 240: 460, 246: 460, 460, 460, 282: 460, 286: 460, 460, 460, 460, 460, 292: 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 347: 460, 435: 460, 447: 460, 450: 460, 460, 460, 460: 460, 460}, + {31: 456, 456, 456, 456, 481: 456}, + {2: 204, 204, 204, 204, 7: 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 22: 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2553}, + // 1200 + {203, 203}, + {24: 2561, 2558, 45: 2560, 442: 2557, 665: 2562, 718: 2559}, + {24: 307, 307, 45: 307, 442: 307}, + {24: 306, 306, 45: 306, 442: 306}, + {1119, 1119, 1119, 1119, 1119, 1119, 7: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 22: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 218: 1119, 286: 1119}, + // 1205 + {1118, 1118, 1118, 1118, 1118, 1118, 7: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 22: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 218: 1118, 286: 1118}, + {312, 312}, + {311, 311}, + {310, 310}, + {305, 305, 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 218: 305, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2564, 784: 2565}, + // 1210 + {538, 538, 6: 538, 218: 538, 230: 538, 366: 538, 538}, + {304, 304, 6: 2570, 218: 304}, + {303, 303, 218: 2567, 809: 2566}, + {309, 309}, + {369: 2568}, + // 1215 + {220: 2569}, + {302, 302}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2571}, + {537, 537, 6: 537, 218: 537, 230: 537, 537, 366: 537, 537}, + {323, 323, 224: 2622, 245: 2621, 516: 2646}, + // 1220 + {300: 2643, 442: 2642}, + {357, 357, 221: 2640}, + {24: 2639}, + {25: 2629, 27: 2630, 29: 2631, 63: 2628}, + {323, 323, 224: 2622, 245: 2621, 516: 2627}, + // 1225 + {323, 323, 224: 2622, 245: 2621, 516: 2626}, + {323, 323, 224: 2622, 245: 2621, 516: 2625}, + {323, 323, 224: 2622, 245: 2621, 516: 2620}, + {349, 349}, + {348, 348}, + // 1230 + {230: 347, 264: 347}, + {230: 346, 264: 346}, + {230: 345, 264: 345}, + {342, 342, 224: 342, 245: 342}, + {341, 341, 224: 341, 245: 341}, + // 1235 + {340, 340, 224: 340, 245: 340}, + {24: 2618}, + {230: 2603, 264: 2604, 462: 2613}, + {333, 333, 224: 333, 245: 333}, + {332, 332, 224: 332, 245: 332}, + // 1240 + {24: 2612, 58: 2611}, + {329, 329, 224: 329, 245: 329}, + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2610}, + {24: 2609}, + {24: 2608}, + // 1245 + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2605}, + {324, 324, 224: 324, 245: 324}, + {24: 319, 58: 319}, + {24: 318, 58: 318}, + {25: 316, 27: 316, 29: 316, 63: 316}, + // 1250 + {2: 344, 344, 344, 344, 7: 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 22: 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344}, + {2: 343, 343, 343, 343, 7: 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 22: 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343}, + {325, 325, 224: 325, 245: 325}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1835, 1459, 1460, 1458, 506: 2607}, + {314, 314, 224: 314, 245: 314}, + // 1255 + {326, 326, 224: 326, 245: 326}, + {327, 327, 224: 327, 245: 327}, + {328, 328, 224: 328, 245: 328}, + {331, 331, 224: 331, 245: 331}, + {330, 330, 224: 330, 245: 330}, + // 1260 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2614, 1459, 1460, 1458, 429: 2615}, + {540, 540, 224: 540, 230: 2603, 245: 540, 247: 1672, 264: 2604, 462: 2616}, + {337, 337, 224: 337, 245: 337}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2617, 1459, 1460, 1458}, + {336, 336, 224: 336, 245: 336}, + // 1265 + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2619}, + {338, 338, 224: 338, 245: 338}, + {350, 350}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2624, 1935, 1996, 1934}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2623}, + // 1270 + {321, 321, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {322, 322, 239: 2305, 346: 2306}, + {351, 351}, + {352, 352}, + {353, 353}, + // 1275 + {354, 354}, + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2638}, + {230: 2603, 264: 2604, 462: 2633, 655: 2636}, + {230: 2603, 264: 2604, 462: 2633, 655: 2632}, + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2635}, + // 1280 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2634}, + {313, 313, 224: 313, 230: 313, 245: 313, 264: 313}, + {334, 334, 224: 334, 245: 334}, + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2637}, + {335, 335, 224: 335, 245: 335}, + // 1285 + {339, 339, 224: 339, 245: 339}, + {355, 355}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 2641}, + {356, 356}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2645}, + // 1290 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1835, 1459, 1460, 1458, 506: 2644}, + {358, 358}, + {359, 359}, + {360, 360}, + {78: 2681, 151: 2682}, + // 1295 + {359: 2668, 442: 2667}, + {359: 2664}, + {359: 2661}, + {442: 2659}, + {78: 2653}, + // 1300 + {87: 2654}, + {240: 1448, 432: 2656, 628: 2655}, + {372, 372, 6: 2657}, + {362, 362, 6: 362}, + {240: 1448, 432: 2658}, + // 1305 + {361, 361, 6: 361}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2660}, + {373, 373, 6: 2570}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2662}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2663, 1459, 1460, 1458}, + // 1310 + {375, 375}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2665}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2666, 1459, 1460, 1458}, + {376, 376}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2680}, + // 1315 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2669}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2670, 1459, 1460, 1458}, + {377, 377, 206: 2673, 610: 2672, 723: 2671}, + {374, 374, 6: 2678}, + {365, 365, 6: 365}, + // 1320 + {240: 1448, 432: 2674}, + {6: 2675}, + {240: 1448, 432: 2676}, + {21: 2677}, + {363, 363, 6: 363}, + // 1325 + {206: 2673, 610: 2679}, + {364, 364, 6: 364}, + {378, 378, 6: 2570}, + {381, 381, 87: 2692, 126: 2693}, + {142: 2684, 162: 2685, 678: 2683}, + // 1330 + {370, 370}, + {240: 1448, 432: 2691}, + {124: 2687, 240: 1448, 432: 2686, 435: 2688}, + {368, 368}, + {240: 1448, 432: 2690}, + // 1335 + {240: 1448, 432: 2689}, + {366, 366}, + {367, 367}, + {369, 369}, + {380, 380, 240: 1448, 432: 2696}, + // 1340 + {141: 2694}, + {240: 1448, 432: 2656, 628: 2695}, + {371, 371, 6: 2657}, + {379, 379}, + {2: 115, 115, 115, 115, 7: 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 22: 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 208: 115, 232: 993, 248: 115}, + // 1345 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 2769, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 232: 966, 348: 2730, 1459, 1460, 1458}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 232: 962, 348: 2766, 1459, 1460, 1458}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 232: 961, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 2762}, + {221: 2752, 232: 2751}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 2749, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 232: 954, 348: 2727, 1459, 1460, 1458}, + // 1350 + {52: 2735, 232: 940, 369: 2736, 530: 2734, 560: 2733}, + {427, 427, 6: 2723}, + {232: 2721}, + {232: 2715}, + {232: 2711, 532: 2712}, + // 1355 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 2710}, + {396, 396, 6: 396}, + {400, 400, 6: 400}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2714}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2713}, + // 1360 + {404, 404, 6: 404, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {405, 405, 6: 405, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 2718, 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2719, 528: 2720}, + {784, 784, 6: 784, 21: 784, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {783, 783, 6: 783, 21: 783, 206: 2233}, + // 1365 + {412, 412, 6: 412}, + {411, 411, 6: 411}, + {406, 406, 6: 406}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 2718, 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2719, 528: 2722}, + {410, 410, 6: 410}, + // 1370 + {2: 1540, 1463, 1464, 1496, 7: 2697, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 2699, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 2724, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 2725, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 2700, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 289: 2707, 304: 2706, 348: 2705, 1459, 1460, 1458, 353: 2275, 449: 2708, 676: 2726}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 232: 966, 348: 2730, 1459, 1460, 1458}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 232: 954, 348: 2727, 1459, 1460, 1458}, + {395, 395, 6: 395}, + {232: 2728}, + // 1375 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 2718, 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2719, 528: 2729}, + {408, 408, 6: 408}, + {232: 2731}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 2718, 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2719, 528: 2732}, + {409, 409, 6: 409}, + // 1380 + {422, 422, 6: 2747}, + {421, 421, 6: 421}, + {128: 2739}, + {138: 2738, 405: 2737}, + {418, 418, 6: 418}, + // 1385 + {417, 417, 6: 417}, + {144: 2741, 146: 2743, 369: 2742, 729: 2740}, + {419, 419, 6: 419}, + {369: 2746}, + {110: 2744, 165: 2745}, + // 1390 + {413, 413, 6: 413}, + {415, 415, 6: 415}, + {414, 414, 6: 414}, + {416, 416, 6: 416}, + {52: 2735, 369: 2736, 530: 2748}, + // 1395 + {420, 420, 6: 420}, + {52: 2735, 232: 940, 369: 2736, 530: 2734, 560: 2750}, + {423, 423, 6: 2747}, + {11: 2757, 208: 2756, 642: 2761}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 2753}, + // 1400 + {232: 2754}, + {11: 2757, 208: 2756, 642: 2755}, + {425, 425}, + {384, 384}, + {206: 2758}, + // 1405 + {208: 1797, 520: 2759}, + {21: 2760}, + {383, 383}, + {426, 426}, + {403, 403, 6: 403, 239: 2763}, + // 1410 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 213: 2764, 348: 1691, 1459, 1460, 1458, 434: 2765}, + {402, 402, 6: 402}, + {401, 401, 6: 401}, + {232: 2767}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2768}, + // 1415 + {407, 407, 6: 407, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {52: 2735, 232: 940, 369: 2736, 530: 2734, 560: 2770}, + {424, 424, 6: 2747}, + {206: 697, 352: 697, 435: 2002, 460: 2000, 2001, 473: 2772, 478: 2773, 704: 2775, 793: 2774}, + {2: 700, 700, 700, 700, 7: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 22: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 208: 700, 700, 211: 700, 700, 700, 700, 700, 700, 700, 233: 700, 236: 700, 240: 700, 246: 700, 700, 700, 282: 700, 286: 700, 700, 700, 700, 700, 292: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 352: 700, 447: 700, 450: 700, 700, 700}, + // 1420 + {206: 696, 352: 696}, + {206: 2779, 352: 1379, 437: 2781, 2776, 2777, 2778, 444: 2780}, + {206: 428, 352: 428}, + {753, 753, 21: 753, 207: 753, 219: 753, 753, 753, 753, 2033, 230: 2804, 466: 2034, 2805, 605: 2803}, + {466, 466, 21: 466, 207: 466, 219: 466, 466, 466, 2785, 483: 2801}, + // 1425 + {753, 753, 21: 753, 207: 753, 219: 753, 753, 753, 753, 2033, 466: 2034, 2792}, + {352: 1379, 437: 2782, 1380, 1381, 1382}, + {219: 431}, + {219: 430}, + {21: 2783}, + // 1430 + {753, 753, 21: 753, 207: 753, 219: 429, 222: 753, 2033, 466: 2034, 2784}, + {466, 466, 21: 466, 207: 466, 222: 2785, 483: 2786}, + {240: 1448, 299: 2521, 432: 2259, 443: 2520, 524: 2787}, + {433, 433, 21: 433, 207: 433}, + {465, 465, 6: 2788, 21: 465, 48: 2789, 207: 465, 218: 465, 465, 465, 465}, + // 1435 + {240: 1448, 299: 2521, 432: 2259, 443: 2520, 524: 2791}, + {240: 1448, 299: 2521, 432: 2259, 443: 2520, 524: 2790}, + {463, 463, 21: 463, 207: 463, 218: 463, 463, 463, 463}, + {464, 464, 21: 464, 207: 464, 218: 464, 464, 464, 464}, + {466, 466, 21: 466, 207: 466, 219: 466, 466, 466, 2785, 483: 2793}, + // 1440 + {439, 439, 21: 439, 207: 439, 219: 439, 2796, 2795, 496: 2794}, + {434, 434, 21: 434, 207: 434, 219: 518}, + {448: 2800}, + {264: 2797}, + {148: 2798}, + // 1445 + {135: 2799}, + {437, 437, 21: 437, 207: 437, 218: 437, 437}, + {438, 438, 21: 438, 207: 438, 218: 438, 438}, + {439, 439, 21: 439, 207: 439, 219: 439, 2796, 2795, 496: 2802}, + {435, 435, 21: 435, 207: 435, 219: 519}, + // 1450 + {104, 104, 21: 104, 207: 104, 218: 104, 104, 104, 104, 104, 104, 2513, 484: 2514, 2820}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 288: 1848, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1854, 480: 1845, 500: 2810, 706: 2809, 786: 2808}, + {466, 466, 21: 466, 207: 466, 219: 466, 466, 466, 2785, 483: 2806}, + {439, 439, 21: 439, 207: 439, 219: 439, 2796, 2795, 496: 2807}, + {436, 436, 21: 436, 207: 436, 219: 520}, + // 1455 + {104, 104, 21: 104, 207: 104, 218: 104, 104, 104, 104, 104, 104, 2513, 235: 104, 238: 104, 484: 2514, 2811}, + {517, 517, 21: 517, 207: 517, 218: 517, 517, 517, 517, 517, 517, 517}, + {516, 516, 6: 2473, 21: 516, 207: 516, 218: 516, 516, 516, 516, 516, 516, 516, 235: 516, 238: 516}, + {443, 443, 21: 443, 207: 443, 218: 443, 443, 443, 443, 443, 443, 235: 443, 238: 2812, 722: 2814, 767: 2813}, + {362: 2818}, + // 1460 + {1029, 1029, 21: 1029, 207: 1029, 218: 1029, 1029, 1029, 1029, 1029, 1029, 235: 2815, 724: 2816}, + {442, 442, 21: 442, 207: 442, 218: 442, 442, 442, 442, 442, 442, 235: 442}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2817}, + {521, 521, 21: 521, 207: 521, 218: 521, 521, 521, 521, 521, 521}, + {1028, 1028, 21: 1028, 207: 1028, 218: 1028, 1028, 1028, 1028, 1028, 1028, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 1465 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2041, 534: 2043, 572: 2819}, + {1030, 1030, 6: 2044, 21: 1030, 207: 1030, 218: 1030, 1030, 1030, 1030, 1030, 1030, 235: 1030}, + {753, 753, 21: 753, 207: 753, 218: 753, 753, 753, 753, 753, 2033, 466: 2034, 2821}, + {522, 522, 21: 522, 207: 522, 218: 522, 522, 522, 522, 522}, + {466, 466, 21: 466, 207: 466, 218: 466, 466, 466, 466, 2785, 483: 2823}, + // 1470 + {439, 439, 21: 439, 207: 439, 218: 439, 439, 2796, 2795, 496: 2824}, + {518, 518, 21: 518, 207: 518, 218: 518, 518}, + {439, 439, 21: 439, 207: 439, 218: 439, 439, 2796, 2795, 496: 2826}, + {519, 519, 21: 519, 207: 519, 218: 519, 519}, + {466, 466, 21: 466, 207: 466, 218: 466, 466, 466, 466, 2785, 483: 2828}, + // 1475 + {439, 439, 21: 439, 207: 439, 218: 439, 439, 2796, 2795, 496: 2829}, + {520, 520, 21: 520, 207: 520, 218: 520, 520}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 246: 2842, 1927, 1944, 282: 1958, 286: 1951, 1973, 2844, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 2843, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2841, 601: 2845, 712: 2846, 766: 2847}, + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 233: 699, 236: 699, 240: 699, 246: 699, 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 447: 699, 450: 699, 699, 699, 460: 2000, 2001, 473: 2772, 478: 2004, 487: 2832}, + {2: 544, 544, 544, 544, 7: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 22: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 208: 544, 544, 211: 544, 544, 544, 544, 544, 544, 544, 233: 544, 236: 544, 240: 544, 246: 544, 544, 544, 282: 544, 286: 544, 544, 544, 544, 544, 292: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 447: 544, 450: 1841, 1840, 1839, 515: 2833}, + // 1480 + {2: 449, 449, 449, 449, 7: 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 22: 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 2835, 2836, 449, 449, 449, 449, 449, 449, 449, 208: 449, 449, 211: 449, 449, 449, 449, 449, 449, 449, 233: 449, 236: 449, 240: 449, 246: 449, 449, 449, 282: 449, 286: 449, 449, 449, 449, 449, 292: 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 447: 449, 769: 2834}, + {2: 451, 451, 451, 451, 7: 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 22: 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 208: 451, 451, 211: 451, 451, 451, 451, 451, 451, 451, 233: 451, 236: 451, 240: 451, 246: 451, 451, 451, 282: 451, 286: 451, 451, 451, 451, 451, 292: 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 447: 2838, 765: 2837}, + {2: 448, 448, 448, 448, 7: 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 22: 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 208: 448, 448, 211: 448, 448, 448, 448, 448, 448, 448, 233: 448, 236: 448, 240: 448, 246: 448, 448, 448, 282: 448, 286: 448, 448, 448, 448, 448, 292: 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 447: 448}, + {2: 447, 447, 447, 447, 7: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 22: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 208: 447, 447, 211: 447, 447, 447, 447, 447, 447, 447, 233: 447, 236: 447, 240: 447, 246: 447, 447, 447, 282: 447, 286: 447, 447, 447, 447, 447, 292: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447: 447}, + {2: 446, 446, 446, 446, 7: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 22: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 208: 446, 446, 211: 446, 446, 446, 446, 446, 446, 446, 233: 2840, 236: 446, 240: 446, 246: 446, 446, 446, 282: 446, 286: 446, 446, 446, 446, 446, 292: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 770: 2839}, + // 1485 + {2: 450, 450, 450, 450, 7: 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 22: 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 208: 450, 450, 211: 450, 450, 450, 450, 450, 450, 450, 233: 450, 236: 450, 240: 450, 246: 450, 450, 450, 282: 450, 286: 450, 450, 450, 450, 450, 292: 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450}, + {2: 462, 462, 462, 462, 7: 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 22: 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 208: 462, 462, 211: 462, 462, 462, 462, 462, 462, 462, 236: 462, 240: 462, 246: 462, 462, 462, 282: 462, 286: 462, 462, 462, 462, 462, 292: 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462}, + {2: 445, 445, 445, 445, 7: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 22: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 208: 445, 445, 211: 445, 445, 445, 445, 445, 445, 445, 236: 445, 240: 445, 246: 445, 445, 445, 282: 445, 286: 445, 445, 445, 445, 445, 292: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445}, + {1038, 1038, 1540, 1463, 1464, 1496, 1038, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1038, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 207: 1038, 2857, 210: 2856, 218: 1038, 1038, 1038, 1038, 1038, 1038, 225: 2014, 2012, 2013, 2011, 2009, 1038, 348: 2855, 1459, 1460, 1458, 427: 2010, 2008, 602: 2854, 2865}, + {1043, 1043, 6: 1043, 21: 1043, 207: 1043, 218: 1043, 1043, 1043, 1043, 1043, 1043, 230: 1043}, + // 1490 + {736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 207: 736, 736, 736, 736, 214: 736, 736, 736, 218: 736, 736, 736, 736, 736, 736, 225: 736, 736, 736, 736, 736, 736, 232: 736, 239: 736, 245: 736, 736, 2860, 264: 736, 266: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 283: 736, 736, 736, 346: 736, 357: 736, 736}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2850, 1459, 1460, 1458, 631: 2198, 2195, 2197, 2196}, + {1032, 1032, 6: 1032, 21: 1032, 207: 1032, 218: 1032, 1032, 1032, 1032, 1032, 1032, 230: 1032}, + {444, 444, 6: 2848, 21: 444, 207: 444, 218: 444, 444, 444, 444, 444, 444, 230: 444}, + {523, 523, 21: 523, 207: 523, 218: 523, 523, 523, 523, 523, 523, 230: 523}, + // 1495 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 246: 2842, 1927, 1944, 282: 1958, 286: 1951, 1973, 2844, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 2843, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2841, 601: 2849}, + {1031, 1031, 6: 1031, 21: 1031, 207: 1031, 218: 1031, 1031, 1031, 1031, 1031, 1031, 230: 1031}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2851}, + {225: 2014, 2012, 2013, 2011, 2009, 244: 2852, 427: 2010, 2008}, + {1038, 1038, 1540, 1463, 1464, 1496, 1038, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1038, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 207: 1038, 2857, 210: 2856, 218: 1038, 1038, 1038, 1038, 1038, 1038, 230: 1038, 348: 2855, 1459, 1460, 1458, 602: 2854, 2853}, + // 1500 + {1039, 1039, 6: 1039, 21: 1039, 207: 1039, 218: 1039, 1039, 1039, 1039, 1039, 1039, 230: 1039}, + {1037, 1037, 6: 1037, 21: 1037, 207: 1037, 218: 1037, 1037, 1037, 1037, 1037, 1037, 230: 1037}, + {1036, 1036, 6: 1036, 21: 1036, 207: 1036, 218: 1036, 1036, 1036, 1036, 1036, 1036, 230: 1036}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 2859, 348: 2858, 1459, 1460, 1458}, + {1034, 1034, 6: 1034, 21: 1034, 207: 1034, 218: 1034, 1034, 1034, 1034, 1034, 1034, 230: 1034}, + // 1505 + {1035, 1035, 6: 1035, 21: 1035, 207: 1035, 218: 1035, 1035, 1035, 1035, 1035, 1035, 230: 1035}, + {1033, 1033, 6: 1033, 21: 1033, 207: 1033, 218: 1033, 1033, 1033, 1033, 1033, 1033, 230: 1033}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 246: 2861, 348: 2862, 1459, 1460, 1458}, + {1042, 1042, 6: 1042, 21: 1042, 207: 1042, 218: 1042, 1042, 1042, 1042, 1042, 1042, 230: 1042}, + {735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 207: 735, 735, 735, 735, 214: 735, 735, 735, 218: 735, 735, 735, 735, 735, 735, 225: 735, 735, 735, 735, 735, 735, 232: 735, 239: 735, 245: 735, 735, 2863, 264: 735, 266: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 283: 735, 735, 735, 346: 735, 357: 735, 735}, + // 1510 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 246: 2864, 348: 2342, 1459, 1460, 1458}, + {1041, 1041, 6: 1041, 21: 1041, 207: 1041, 218: 1041, 1041, 1041, 1041, 1041, 1041, 230: 1041}, + {1040, 1040, 6: 1040, 21: 1040, 207: 1040, 218: 1040, 1040, 1040, 1040, 1040, 1040, 230: 1040}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2867, 1459, 1460, 1458}, + {527, 527}, + // 1515 + {531, 531, 231: 2869}, + {289: 2112, 407: 2871, 794: 2870}, + {530, 530, 6: 2872}, + {529, 529, 6: 529}, + {289: 2112, 407: 2873}, + // 1520 + {528, 528, 6: 528}, + {230: 2875}, + {208: 2877, 289: 2112, 407: 2878, 760: 2876}, + {534, 534}, + {533, 533}, + // 1525 + {532, 532}, + {2: 804, 804, 804, 804, 7: 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 22: 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 463: 2880, 615: 2881}, + {2: 803, 803, 803, 803, 7: 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 22: 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2882}, + {69: 2888, 206: 2883, 234: 2887, 292: 2889, 352: 1379, 437: 2885, 1380, 1381, 1382, 444: 1385, 1384, 2886, 563: 2884, 614: 2890}, + // 1530 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1271, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 1379, 433: 1726, 437: 2910, 1380, 1381, 1382, 470: 1727, 574: 2909}, + {206: 2900, 557: 2899, 675: 2898}, + {796, 796, 207: 796, 219: 430}, + {795, 795, 207: 795}, + {781, 781, 1540, 1463, 1464, 1496, 781, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 207: 781, 348: 1725, 1459, 1460, 1458, 433: 2892, 576: 2893, 695: 2891}, + // 1535 + {206: 793}, + {206: 792}, + {776, 776}, + {794, 794, 6: 2896, 207: 794}, + {232: 2894}, + // 1540 + {780, 780, 6: 780, 207: 780}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2895}, + {782, 782, 6: 782, 207: 782, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2892, 576: 2897}, + {779, 779, 6: 779, 207: 779}, + // 1545 + {798, 798, 6: 2907, 207: 798}, + {791, 791, 6: 791, 207: 791}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 788, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2903, 795: 2902, 2901}, + {21: 2906}, + {6: 2904, 21: 787}, + // 1550 + {6: 785, 21: 785}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2905}, + {6: 786, 21: 786}, + {789, 789, 6: 789, 207: 789}, + {206: 2900, 557: 2908}, + // 1555 + {790, 790, 6: 790, 207: 790}, + {21: 2912}, + {21: 2911}, + {797, 797, 207: 797, 219: 429}, + {69: 2888, 206: 2915, 292: 2889, 352: 1379, 437: 2914, 1380, 1381, 1382, 444: 1385, 1384, 2916, 563: 2913}, + // 1560 + {206: 2900, 557: 2899, 675: 2919}, + {801, 801, 207: 801, 219: 430}, + {352: 1379, 437: 2917, 1380, 1381, 1382}, + {799, 799, 207: 799}, + {21: 2918}, + // 1565 + {800, 800, 207: 800, 219: 429}, + {802, 802, 6: 2907, 207: 802}, + {2: 1023, 1023, 1023, 1023, 7: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 22: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 347: 1843, 463: 1023, 521: 2921}, + {2: 804, 804, 804, 804, 7: 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 22: 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 463: 2880, 615: 2922}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2923}, + // 1570 + {69: 2888, 206: 2883, 234: 2887, 292: 2889, 352: 1379, 437: 2885, 1380, 1381, 1382, 444: 1385, 1384, 2886, 563: 2884, 614: 2924}, + {778, 778, 207: 2926, 747: 2925}, + {805, 805}, + {113: 2927}, + {291: 2928}, + // 1575 + {448: 2929}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2508, 519: 2509, 533: 2930}, + {777, 777, 6: 2511}, + {1110, 1110, 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2945}, + {1108, 1108}, + // 1580 + {968, 968, 968, 968, 968, 968, 7: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 22: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 232: 2942, 247: 968}, + {206: 2313, 236: 1373, 287: 1372, 352: 1379, 437: 2935, 1380, 1381, 1382, 444: 1385, 1384, 2940, 448: 1438, 454: 1365, 488: 2936, 491: 2938, 494: 2939, 502: 2937, 539: 2941}, + {249, 249, 219: 430}, + {248, 248}, + {247, 247}, + // 1585 + {246, 246}, + {245, 245}, + {244, 244}, + {1106, 1106}, + {208: 2943}, + // 1590 + {206: 2313, 236: 1373, 287: 1372, 352: 1379, 437: 2935, 1380, 1381, 1382, 444: 1385, 1384, 2940, 448: 1438, 454: 1365, 488: 2936, 491: 2938, 494: 2939, 502: 2937, 539: 2944}, + {1107, 1107}, + {1109, 1109}, + {1114, 1114}, + {255, 255, 219: 430}, + // 1595 + {254, 254}, + {253, 253}, + {252, 252}, + {251, 251}, + {250, 250}, + // 1600 + {2: 1131, 1131, 1131, 1131, 7: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 22: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 286: 1131}, + {2: 1027, 1027, 1027, 1027, 7: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 22: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 286: 2980, 543: 2985}, + {2: 1027, 1027, 1027, 1027, 7: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 22: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 286: 2980, 543: 2979}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 286: 2972, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2971}, + {286: 2968}, + // 1605 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 286: 2962, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 2963, 673: 2961}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2960}, + {1123, 1123}, + {1125, 1125, 6: 2966}, + {293: 2964}, + // 1610 + {386, 386, 6: 386}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 2963, 673: 2965}, + {1124, 1124, 6: 2966}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 2967}, + {385, 385, 6: 385}, + // 1615 + {293: 2969}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2970}, + {1126, 1126, 6: 2570}, + {1122, 1122, 6: 2570, 366: 2977, 2976, 556: 2978}, + {293: 2973}, + // 1620 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2974}, + {1122, 1122, 6: 2570, 366: 2977, 2976, 556: 2975}, + {1127, 1127}, + {1121, 1121, 6: 1121}, + {1120, 1120, 6: 1120}, + // 1625 + {1128, 1128}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2982, 1459, 1460, 1458}, + {293: 2981}, + {2: 1026, 1026, 1026, 1026, 7: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 22: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 208: 1026, 282: 1026}, + {207: 2983}, + // 1630 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2984}, + {1129, 1129}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1835, 1459, 1460, 1458, 506: 2986}, + {1130, 1130}, + {2: 544, 544, 544, 544, 7: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 22: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 230: 544, 347: 544, 450: 1841, 1840, 1839, 515: 2988}, + // 1635 + {2: 536, 536, 536, 536, 7: 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 22: 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 2990, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 230: 536, 347: 536, 762: 2989}, + {2: 1023, 1023, 1023, 1023, 7: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 22: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 230: 1023, 347: 1843, 521: 2991}, + {2: 535, 535, 535, 535, 7: 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 22: 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 230: 535, 347: 535}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 230: 2992, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2993}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2997, 468: 2998}, + // 1640 + {6: 2570, 230: 2994}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 288: 1848, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1854, 480: 1845, 500: 2995}, + {104, 104, 6: 2473, 224: 2513, 484: 2514, 2996}, + {1133, 1133}, + {488, 488, 6: 538, 222: 488, 488, 488, 231: 538, 347: 2480, 363: 2481, 2479, 545: 2483, 2482, 612: 2484, 3002}, + // 1645 + {6: 2570, 231: 2999}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 288: 1848, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1854, 480: 1845, 500: 3000}, + {104, 104, 6: 2473, 224: 2513, 484: 2514, 3001}, + {1132, 1132}, + {104, 104, 222: 104, 104, 2513, 484: 2514, 3003}, + // 1650 + {753, 753, 222: 753, 2033, 466: 2034, 3004}, + {470, 470, 222: 2517, 619: 3005}, + {1134, 1134}, + {1135, 1135, 6: 2032}, + {359: 3492}, + // 1655 + {359: 1209}, + {2: 1025, 1025, 1025, 1025, 7: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 22: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 286: 3014, 544: 3479}, + {2: 1025, 1025, 1025, 1025, 7: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 22: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 286: 3014, 544: 3055}, + {22: 1152, 28: 1152, 46: 3021, 361: 1152, 799: 3020}, + {236: 3019}, + // 1660 + {2: 1025, 1025, 1025, 1025, 7: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 22: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 208: 1025, 282: 1025, 286: 3014, 544: 3015}, + {209: 3017}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 1783, 518: 1784, 531: 3016}, + {100, 100, 6: 1786}, + {293: 3018}, + // 1665 + {2: 1024, 1024, 1024, 1024, 7: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 22: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 208: 1024, 282: 1024}, + {22: 1153, 28: 1153, 46: 1153, 361: 1153}, + {22: 1148, 28: 3027, 361: 1148, 801: 3026}, + {232: 3022}, + {134: 3024, 158: 3025, 166: 3023}, + // 1670 + {22: 1151, 28: 1151, 361: 1151}, + {22: 1150, 28: 1150, 361: 1150}, + {22: 1149, 28: 1149, 361: 1149}, + {22: 1146, 361: 3031, 804: 3030}, + {232: 3028}, + // 1675 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 3029}, + {22: 1147, 361: 1147}, + {22: 3035}, + {145: 3032}, + {28: 3033, 125: 3034}, + // 1680 + {22: 1145}, + {22: 1144}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3037, 803: 3036}, + {206: 3039, 210: 1142, 802: 3038}, + {206: 1143, 210: 1143}, + // 1685 + {210: 3045}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3041, 1459, 1460, 1458, 691: 3040}, + {6: 3043, 21: 3042}, + {6: 1140, 21: 1140}, + {210: 1141}, + // 1690 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3044, 1459, 1460, 1458}, + {6: 1139, 21: 1139}, + {352: 1379, 437: 3046, 1380, 1381, 1382}, + {1138, 1138, 218: 3048, 800: 3047}, + {1155, 1155}, + // 1695 + {53: 3050, 106: 3049}, + {343: 3053}, + {343: 3051}, + {525: 3052}, + {1136, 1136}, + // 1700 + {525: 3054}, + {1137, 1137}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3056}, + {235, 235, 235, 235, 7: 235, 235, 235, 235, 235, 13: 235, 235, 235, 235, 235, 235, 235, 235, 206: 3060, 210: 235, 213: 235, 236: 235, 239: 235, 245: 3059, 347: 235, 352: 235, 235, 235, 235, 235, 735: 3058, 782: 3057}, + {210, 210, 3326, 3325, 7: 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 206: 210, 210: 210, 213: 3322, 236: 210, 239: 1195, 347: 210, 352: 210, 1195, 210, 3339, 3338, 472: 3324, 495: 3336, 499: 3341, 559: 3340, 699: 3321}, + // 1705 + {1196, 1196}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3320}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 245: 3063, 291: 1302, 341: 1302, 1302, 3067, 348: 1725, 1459, 1460, 1458, 359: 1302, 372: 1302, 1302, 433: 3062, 477: 3065, 536: 3066, 3061, 3064, 662: 3068, 781: 3069}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 291: 1301, 341: 1301, 1301, 348: 3319, 1459, 1460, 1458, 359: 1301, 372: 1301, 1301, 661: 3318}, + {35: 3208, 50: 3205, 3204, 56: 3207, 61: 3192, 96: 3206, 101: 3182, 3176, 3175, 115: 3190, 136: 3184, 159: 3200, 234: 3191, 248: 3186, 290: 154, 374: 3177, 3173, 3167, 378: 3193, 381: 3174, 3196, 384: 3181, 3179, 3168, 3169, 3170, 3171, 3172, 3203, 3198, 3202, 3197, 3166, 3201, 3178, 3194, 3180, 3165, 3195, 3164, 3199, 3187, 685: 3163, 3188, 3160, 703: 3158, 716: 3161, 3162, 728: 3159, 742: 3183, 745: 3156, 778: 3157, 788: 3189, 792: 3155, 797: 3185}, + // 1710 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3153}, + {291: 2499, 341: 3076, 3079, 359: 2500, 372: 3080, 3077, 475: 3078, 697: 3081}, + {6: 240, 21: 240}, + {6: 239, 21: 239}, + {206: 3073}, + // 1715 + {6: 237, 21: 237}, + {6: 3070, 21: 3071}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 291: 1302, 341: 1302, 1302, 3067, 348: 1725, 1459, 1460, 1458, 359: 1302, 372: 1302, 1302, 433: 3062, 477: 3065, 536: 3066, 3061, 3064, 662: 3072}, + {234, 234, 234, 234, 7: 234, 234, 234, 234, 234, 13: 234, 234, 234, 234, 234, 234, 234, 234, 206: 234, 210: 234, 213: 234, 236: 234, 239: 234, 347: 234, 352: 234, 234, 234, 234, 234}, + {6: 236, 21: 236}, + // 1720 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3074}, + {21: 3075, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {6: 238, 21: 238}, + {291: 3146}, + {291: 2499, 359: 2500, 475: 3140}, + // 1725 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1021, 231: 1021, 348: 3084, 1459, 1460, 1458, 511: 3134}, + {2: 1313, 1313, 1313, 1313, 7: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 22: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 231: 1313, 291: 2499, 359: 2500, 475: 3114, 731: 3115}, + {291: 3082}, + {241, 241, 6: 241, 21: 241}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1021, 348: 3084, 1459, 1460, 1458, 511: 3083}, + // 1730 + {206: 3085}, + {206: 1020, 231: 1020}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3086}, + {6: 3092, 21: 3091}, + {6: 134, 21: 134, 206: 2257, 249: 134, 134, 441: 2258, 453: 3089}, + // 1735 + {6: 1207, 21: 1207}, + {6: 756, 21: 756, 249: 2048, 2047, 637: 3090}, + {6: 1208, 21: 1208}, + {344: 3095, 555: 3094}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3093}, + // 1740 + {6: 1206, 21: 1206}, + {1239, 1239, 6: 1239, 21: 1239}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3096}, + {206: 3097}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3098}, + // 1745 + {6: 3092, 21: 3099}, + {1237, 1237, 1237, 1237, 1237, 1237, 1237, 21: 1237, 207: 3101, 209: 1237, 1237, 213: 1237, 217: 1237, 291: 1237, 341: 1237, 1237, 1237, 1237, 1237, 746: 3100}, + {1235, 1235, 1235, 1235, 1235, 1235, 1235, 21: 1235, 207: 3111, 209: 1235, 1235, 213: 1235, 217: 1235, 291: 1235, 341: 1235, 1235, 1235, 1235, 1235, 748: 3110}, + {454: 3102}, + {89: 3107, 234: 3106, 366: 3105, 3104, 647: 3103}, + // 1750 + {1236, 1236, 1236, 1236, 1236, 1236, 1236, 21: 1236, 207: 1236, 209: 1236, 1236, 213: 1236, 217: 1236, 291: 1236, 341: 1236, 1236, 1236, 1236, 1236}, + {1233, 1233, 1233, 1233, 1233, 1233, 1233, 21: 1233, 207: 1233, 209: 1233, 1233, 213: 1233, 217: 1233, 291: 1233, 341: 1233, 1233, 1233, 1233, 1233}, + {1232, 1232, 1232, 1232, 1232, 1232, 1232, 21: 1232, 207: 1232, 209: 1232, 1232, 213: 1232, 217: 1232, 291: 1232, 341: 1232, 1232, 1232, 1232, 1232}, + {217: 3109}, + {99: 3108}, + // 1755 + {1230, 1230, 1230, 1230, 1230, 1230, 1230, 21: 1230, 207: 1230, 209: 1230, 1230, 213: 1230, 217: 1230, 291: 1230, 341: 1230, 1230, 1230, 1230, 1230}, + {1231, 1231, 1231, 1231, 1231, 1231, 1231, 21: 1231, 207: 1231, 209: 1231, 1231, 213: 1231, 217: 1231, 291: 1231, 341: 1231, 1231, 1231, 1231, 1231}, + {1238, 1238, 1238, 1238, 1238, 1238, 1238, 21: 1238, 207: 1238, 209: 1238, 1238, 213: 1238, 217: 1238, 291: 1238, 341: 1238, 1238, 1238, 1238, 1238}, + {448: 3112}, + {89: 3107, 234: 3106, 366: 3105, 3104, 647: 3113}, + // 1760 + {1234, 1234, 1234, 1234, 1234, 1234, 1234, 21: 1234, 207: 1234, 209: 1234, 1234, 213: 1234, 217: 1234, 291: 1234, 341: 1234, 1234, 1234, 1234, 1234}, + {2: 1312, 1312, 1312, 1312, 7: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 22: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 231: 1312}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1021, 231: 1021, 348: 3084, 1459, 1460, 1458, 511: 3116}, + {206: 1012, 231: 3118, 464: 3119, 523: 3117}, + {206: 3122}, + // 1765 + {60: 3121, 104: 3120}, + {206: 1011, 1011}, + {1014, 1014, 1014, 6: 1014, 8: 1014, 21: 1014, 206: 1014, 1014, 220: 1014, 231: 1014}, + {1013, 1013, 1013, 6: 1013, 8: 1013, 21: 1013, 206: 1013, 1013, 220: 1013, 231: 1013}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3123}, + // 1770 + {6: 3092, 21: 3124}, + {1019, 1019, 1019, 6: 1019, 8: 1019, 21: 1019, 231: 1019, 513: 3125}, + {1240, 1240, 3129, 6: 1240, 8: 3127, 21: 1240, 231: 3118, 464: 3128, 512: 3126}, + {1018, 1018, 1018, 6: 1018, 8: 1018, 21: 1018, 220: 1018, 231: 1018}, + {232: 3131, 240: 1117, 436: 3132}, + // 1775 + {1016, 1016, 1016, 6: 1016, 8: 1016, 21: 1016, 220: 1016, 231: 1016}, + {208: 3130}, + {1015, 1015, 1015, 6: 1015, 8: 1015, 21: 1015, 220: 1015, 231: 1015}, + {2: 1116, 1116, 1116, 1116, 7: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 22: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 208: 1116, 213: 1116, 240: 1116, 248: 1116}, + {240: 1448, 432: 2259, 443: 3133}, + // 1780 + {1017, 1017, 1017, 6: 1017, 8: 1017, 21: 1017, 220: 1017, 231: 1017}, + {206: 1012, 231: 3118, 464: 3119, 523: 3135}, + {206: 3136}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3137}, + {6: 3092, 21: 3138}, + // 1785 + {1019, 1019, 1019, 6: 1019, 8: 1019, 21: 1019, 231: 1019, 513: 3139}, + {1241, 1241, 3129, 6: 1241, 8: 3127, 21: 1241, 231: 3118, 464: 3128, 512: 3126}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1021, 348: 3084, 1459, 1460, 1458, 511: 3141}, + {206: 3142}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3143}, + // 1790 + {6: 3092, 21: 3144}, + {1019, 1019, 1019, 6: 1019, 8: 1019, 21: 1019, 231: 1019, 513: 3145}, + {1242, 1242, 3129, 6: 1242, 8: 3127, 21: 1242, 231: 3118, 464: 3128, 512: 3126}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1021, 231: 1021, 348: 3084, 1459, 1460, 1458, 511: 3147}, + {206: 1012, 231: 3118, 464: 3119, 523: 3148}, + // 1795 + {206: 3149}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3150}, + {6: 3092, 21: 3151}, + {1019, 1019, 1019, 6: 1019, 8: 1019, 21: 1019, 231: 1019, 513: 3152}, + {1243, 1243, 3129, 6: 1243, 8: 3127, 21: 1243, 231: 3118, 464: 3128, 512: 3126}, + // 1800 + {21: 3154}, + {1156, 1156}, + {1245, 1245, 3272, 3267, 1245, 1245, 1245, 21: 1245, 207: 3271, 209: 3265, 1252, 213: 3270, 217: 3266, 291: 1266, 341: 3264, 3269, 3273, 3095, 3276, 555: 3275, 575: 3277, 608: 3274, 644: 3268, 693: 3278, 3263}, + {196, 196, 196, 196, 196, 196, 196, 21: 196, 207: 196, 209: 196, 196, 213: 196, 217: 196, 291: 196, 341: 196, 196, 196, 196, 196}, + {195, 195, 195, 195, 195, 195, 195, 21: 195, 207: 195, 209: 195, 195, 213: 195, 217: 195, 291: 195, 341: 195, 195, 195, 195, 195}, + // 1805 + {194, 194, 194, 194, 194, 194, 194, 21: 194, 207: 194, 209: 194, 194, 213: 194, 217: 194, 291: 194, 341: 194, 194, 194, 194, 194}, + {134, 134, 134, 134, 134, 134, 134, 12: 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 430: 134, 134, 441: 2258, 453: 3261}, + {129, 129, 129, 129, 129, 129, 129, 12: 129, 21: 129, 207: 129, 209: 129, 129, 213: 129, 217: 129, 291: 129, 341: 129, 129, 129, 129, 129, 430: 129, 129, 510: 3260}, + {127, 127, 127, 127, 127, 127, 127, 12: 127, 21: 127, 206: 2263, 127, 209: 127, 127, 213: 127, 217: 127, 291: 127, 341: 127, 127, 127, 127, 127, 430: 127, 127, 441: 2264, 540: 3258, 552: 2265}, + {127, 127, 127, 127, 127, 127, 127, 12: 127, 21: 127, 206: 2263, 127, 209: 127, 127, 213: 127, 217: 127, 291: 127, 341: 127, 127, 127, 127, 127, 430: 127, 127, 441: 2264, 540: 3256, 552: 2265}, + // 1810 + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3255}, + {188, 188, 188, 188, 188, 188, 188, 12: 188, 21: 188, 206: 188, 188, 209: 188, 188, 213: 188, 217: 188, 291: 188, 341: 188, 188, 188, 188, 188, 430: 188, 188}, + {187, 187, 187, 187, 187, 187, 187, 12: 187, 21: 187, 206: 187, 187, 209: 187, 187, 213: 187, 217: 187, 291: 187, 341: 187, 187, 187, 187, 187, 430: 187, 187}, + {186, 186, 186, 186, 186, 186, 186, 12: 186, 21: 186, 206: 186, 186, 209: 186, 186, 213: 186, 217: 186, 291: 186, 341: 186, 186, 186, 186, 186, 430: 186, 186}, + {185, 185, 185, 185, 185, 185, 185, 12: 185, 21: 185, 206: 185, 185, 209: 185, 185, 213: 185, 217: 185, 291: 185, 341: 185, 185, 185, 185, 185, 430: 185, 185}, + // 1815 + {184, 184, 184, 184, 184, 184, 184, 12: 184, 21: 184, 206: 184, 184, 209: 184, 184, 213: 184, 217: 184, 291: 184, 341: 184, 184, 184, 184, 184, 430: 184, 184}, + {183, 183, 183, 183, 183, 183, 183, 12: 183, 21: 183, 206: 183, 183, 209: 183, 183, 213: 183, 217: 183, 291: 183, 341: 183, 183, 183, 183, 183, 430: 183, 183}, + {182, 182, 182, 182, 182, 182, 182, 12: 182, 21: 182, 206: 182, 182, 209: 182, 182, 213: 182, 217: 182, 291: 182, 341: 182, 182, 182, 182, 182, 430: 182, 182}, + {181, 181, 181, 181, 181, 181, 181, 12: 181, 21: 181, 206: 181, 181, 209: 181, 181, 213: 181, 217: 181, 291: 181, 341: 181, 181, 181, 181, 181, 430: 181, 181}, + {180, 180, 180, 180, 180, 180, 180, 12: 180, 21: 180, 206: 180, 180, 209: 180, 180, 213: 180, 217: 180, 291: 180, 341: 180, 180, 180, 180, 180, 430: 180, 180}, + // 1820 + {179, 179, 179, 179, 179, 179, 179, 12: 179, 21: 179, 206: 179, 179, 209: 179, 179, 213: 179, 217: 179, 291: 179, 341: 179, 179, 179, 179, 179, 430: 179, 179}, + {178, 178, 178, 178, 178, 178, 178, 12: 178, 21: 178, 206: 178, 178, 209: 178, 178, 213: 178, 217: 178, 291: 178, 341: 178, 178, 178, 178, 178, 430: 178, 178}, + {177, 177, 177, 177, 177, 177, 177, 12: 177, 21: 177, 207: 177, 209: 177, 177, 213: 177, 217: 177, 291: 177, 341: 177, 177, 177, 177, 177, 430: 177, 177}, + {176, 176, 176, 176, 176, 176, 176, 12: 176, 21: 176, 207: 176, 209: 176, 176, 213: 176, 217: 176, 291: 176, 341: 176, 176, 176, 176, 176, 430: 176, 176}, + {172, 172, 172, 172, 172, 172, 172, 12: 172, 21: 172, 206: 172, 172, 209: 172, 172, 213: 172, 217: 172, 291: 172, 341: 172, 172, 172, 172, 172, 430: 172, 172}, + // 1825 + {171, 171, 171, 171, 171, 171, 171, 12: 171, 21: 171, 206: 171, 171, 209: 171, 171, 213: 171, 217: 171, 291: 171, 341: 171, 171, 171, 171, 171, 430: 171, 171}, + {170, 170, 170, 170, 170, 170, 170, 12: 170, 21: 170, 206: 170, 170, 209: 170, 170, 213: 170, 217: 170, 291: 170, 341: 170, 170, 170, 170, 170, 430: 170, 170}, + {169, 169, 169, 169, 169, 169, 169, 12: 169, 21: 169, 206: 169, 169, 209: 169, 169, 213: 169, 217: 169, 291: 169, 341: 169, 169, 169, 169, 169, 430: 169, 169}, + {168, 168, 168, 168, 168, 168, 168, 12: 168, 21: 168, 206: 168, 168, 209: 168, 168, 213: 168, 217: 168, 291: 168, 341: 168, 168, 168, 168, 168, 430: 168, 168, 759: 3254}, + {166, 166, 166, 166, 166, 166, 166, 21: 166, 206: 166, 166, 209: 166, 166, 213: 166, 217: 166, 291: 166, 341: 166, 166, 166, 166, 166}, + // 1830 + {290: 3248}, + {290: 153, 353: 3243, 378: 3244}, + {206: 2257, 441: 3240}, + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3239}, + {206: 2257, 441: 3238}, + // 1835 + {159, 159, 159, 159, 159, 159, 159, 21: 159, 207: 159, 209: 159, 159, 213: 159, 217: 159, 291: 159, 341: 159, 159, 159, 159, 159}, + {121, 121, 121, 121, 121, 121, 121, 2276, 21: 121, 207: 121, 209: 121, 121, 213: 121, 217: 121, 239: 121, 248: 2273, 291: 121, 341: 121, 121, 121, 121, 121, 353: 2275, 449: 2274, 493: 3236}, + {206: 3231}, + {206: 3221}, + {155, 155, 155, 155, 155, 155, 155, 21: 155, 207: 155, 209: 155, 155, 213: 155, 217: 155, 291: 155, 341: 155, 155, 155, 155, 155}, + // 1840 + {206: 151}, + {206: 150}, + {149, 149, 149, 149, 149, 149, 149, 21: 149, 207: 149, 209: 149, 149, 213: 149, 217: 149, 291: 149, 341: 149, 149, 149, 149, 149}, + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3220}, + {147, 147, 147, 147, 147, 147, 147, 21: 147, 207: 147, 209: 147, 147, 213: 147, 217: 147, 291: 147, 341: 147, 147, 147, 147, 147}, + // 1845 + {146, 146, 146, 146, 146, 146, 146, 21: 146, 207: 146, 209: 146, 146, 213: 146, 217: 146, 291: 146, 341: 146, 146, 146, 146, 146}, + {145, 145, 145, 145, 145, 145, 145, 145, 21: 145, 207: 145, 209: 145, 145, 213: 145, 217: 145, 239: 145, 248: 145, 291: 145, 341: 145, 145, 145, 145, 145, 353: 145}, + {134, 134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 239: 134, 248: 134, 291: 134, 341: 134, 134, 134, 134, 134, 353: 134, 441: 2258, 453: 3219}, + {143, 143, 143, 143, 143, 143, 143, 143, 21: 143, 207: 143, 209: 143, 143, 213: 143, 217: 143, 239: 143, 248: 143, 291: 143, 341: 143, 143, 143, 143, 143, 353: 143}, + {142, 142, 142, 142, 142, 142, 142, 142, 21: 142, 207: 142, 209: 142, 142, 213: 142, 217: 142, 239: 142, 248: 142, 291: 142, 341: 142, 142, 142, 142, 142, 353: 142}, + // 1850 + {378: 3218}, + {140, 140, 140, 140, 140, 140, 140, 21: 140, 207: 140, 209: 140, 140, 213: 140, 217: 140, 291: 140, 341: 140, 140, 140, 140, 140}, + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3217}, + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3216}, + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3215}, + // 1855 + {134, 134, 134, 134, 134, 134, 134, 12: 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 430: 134, 134, 441: 2258, 453: 3209}, + {129, 129, 129, 129, 129, 129, 129, 12: 129, 21: 129, 207: 129, 209: 129, 129, 213: 129, 217: 129, 291: 129, 341: 129, 129, 129, 129, 129, 430: 129, 129, 510: 3210}, + {136, 136, 136, 136, 136, 136, 136, 12: 3212, 21: 136, 207: 136, 209: 136, 136, 213: 136, 217: 136, 291: 136, 341: 136, 136, 136, 136, 136, 430: 3211, 3213, 509: 3214}, + {132, 132, 132, 132, 132, 132, 132, 12: 132, 21: 132, 207: 132, 209: 132, 132, 213: 132, 217: 132, 291: 132, 341: 132, 132, 132, 132, 132, 430: 132, 132}, + {131, 131, 131, 131, 131, 131, 131, 12: 131, 21: 131, 207: 131, 209: 131, 131, 213: 131, 217: 131, 291: 131, 341: 131, 131, 131, 131, 131, 430: 131, 131}, + // 1860 + {130, 130, 130, 130, 130, 130, 130, 12: 130, 21: 130, 207: 130, 209: 130, 130, 213: 130, 217: 130, 291: 130, 341: 130, 130, 130, 130, 130, 430: 130, 130}, + {128, 128, 128, 128, 128, 128, 128, 12: 128, 21: 128, 207: 128, 209: 128, 128, 213: 128, 217: 128, 291: 128, 341: 128, 128, 128, 128, 128, 430: 128, 128}, + {137, 137, 137, 137, 137, 137, 137, 21: 137, 207: 137, 209: 137, 137, 213: 137, 217: 137, 291: 137, 341: 137, 137, 137, 137, 137}, + {138, 138, 138, 138, 138, 138, 138, 21: 138, 207: 138, 209: 138, 138, 213: 138, 217: 138, 291: 138, 341: 138, 138, 138, 138, 138}, + {139, 139, 139, 139, 139, 139, 139, 21: 139, 207: 139, 209: 139, 139, 213: 139, 217: 139, 291: 139, 341: 139, 139, 139, 139, 139}, + // 1865 + {141, 141, 141, 141, 141, 141, 141, 141, 21: 141, 207: 141, 209: 141, 141, 213: 141, 217: 141, 239: 141, 248: 141, 291: 141, 341: 141, 141, 141, 141, 141, 353: 141}, + {144, 144, 144, 144, 144, 144, 144, 144, 21: 144, 207: 144, 209: 144, 144, 213: 144, 217: 144, 239: 144, 248: 144, 291: 144, 341: 144, 144, 144, 144, 144, 353: 144}, + {148, 148, 148, 148, 148, 148, 148, 21: 148, 207: 148, 209: 148, 148, 213: 148, 217: 148, 291: 148, 341: 148, 148, 148, 148, 148}, + {208: 3223, 659: 3222}, + {6: 3225, 21: 3224}, + // 1870 + {6: 112, 21: 112}, + {118, 118, 118, 118, 118, 118, 118, 2276, 21: 118, 207: 118, 209: 118, 118, 213: 118, 217: 118, 239: 118, 291: 118, 341: 118, 118, 118, 118, 118, 353: 2275, 449: 2282, 551: 3227}, + {208: 3226}, + {6: 111, 21: 111}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3228}, + // 1875 + {156, 156, 156, 156, 156, 156, 156, 21: 156, 207: 156, 209: 156, 156, 213: 156, 217: 156, 291: 156, 341: 156, 156, 156, 156, 156}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 3230}, + {113, 113, 113, 113, 113, 113, 113, 21: 113, 207: 113, 209: 113, 113, 213: 113, 217: 113, 291: 113, 341: 113, 113, 113, 113, 113}, + {208: 3223, 659: 3232}, + {6: 3225, 21: 3233}, + // 1880 + {118, 118, 118, 118, 118, 118, 118, 2276, 21: 118, 207: 118, 209: 118, 118, 213: 118, 217: 118, 239: 118, 291: 118, 341: 118, 118, 118, 118, 118, 353: 2275, 449: 2282, 551: 3234}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3235}, + {157, 157, 157, 157, 157, 157, 157, 21: 157, 207: 157, 209: 157, 157, 213: 157, 217: 157, 291: 157, 341: 157, 157, 157, 157, 157}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3237}, + {158, 158, 158, 158, 158, 158, 158, 21: 158, 207: 158, 209: 158, 158, 213: 158, 217: 158, 291: 158, 341: 158, 158, 158, 158, 158}, + // 1885 + {160, 160, 160, 160, 160, 160, 160, 21: 160, 207: 160, 209: 160, 160, 213: 160, 217: 160, 291: 160, 341: 160, 160, 160, 160, 160}, + {161, 161, 161, 161, 161, 161, 161, 21: 161, 207: 161, 209: 161, 161, 213: 161, 217: 161, 291: 161, 341: 161, 161, 161, 161, 161}, + {121, 121, 121, 121, 121, 121, 121, 2276, 21: 121, 207: 121, 209: 121, 121, 213: 121, 217: 121, 239: 121, 248: 2273, 291: 121, 341: 121, 121, 121, 121, 121, 353: 2275, 449: 2274, 493: 3241}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3242}, + {162, 162, 162, 162, 162, 162, 162, 21: 162, 207: 162, 209: 162, 162, 213: 162, 217: 162, 291: 162, 341: 162, 162, 162, 162, 162}, + // 1890 + {206: 2257, 441: 3245}, + {206: 152}, + {121, 121, 121, 121, 121, 121, 121, 2276, 21: 121, 207: 121, 209: 121, 121, 213: 121, 217: 121, 239: 121, 248: 2273, 291: 121, 341: 121, 121, 121, 121, 121, 353: 2275, 449: 2274, 493: 3246}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3247}, + {163, 163, 163, 163, 163, 163, 163, 21: 163, 207: 163, 209: 163, 163, 213: 163, 217: 163, 291: 163, 341: 163, 163, 163, 163, 163}, + // 1895 + {121, 121, 121, 121, 121, 121, 121, 2276, 21: 121, 206: 2257, 121, 209: 121, 121, 213: 121, 217: 121, 239: 121, 248: 2273, 291: 121, 341: 121, 121, 121, 121, 121, 353: 2275, 441: 3249, 449: 2274, 493: 3250}, + {121, 121, 121, 121, 121, 121, 121, 2276, 21: 121, 207: 121, 209: 121, 121, 213: 121, 217: 121, 239: 121, 248: 2273, 291: 121, 341: 121, 121, 121, 121, 121, 353: 2275, 449: 2274, 493: 3252}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3251}, + {164, 164, 164, 164, 164, 164, 164, 21: 164, 207: 164, 209: 164, 164, 213: 164, 217: 164, 291: 164, 341: 164, 164, 164, 164, 164}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3253}, + // 1900 + {165, 165, 165, 165, 165, 165, 165, 21: 165, 207: 165, 209: 165, 165, 213: 165, 217: 165, 291: 165, 341: 165, 165, 165, 165, 165}, + {167, 167, 167, 167, 167, 167, 167, 12: 167, 21: 167, 206: 167, 167, 209: 167, 167, 213: 167, 217: 167, 291: 167, 341: 167, 167, 167, 167, 167, 430: 167, 167}, + {189, 189, 189, 189, 189, 189, 189, 21: 189, 207: 189, 209: 189, 189, 213: 189, 217: 189, 291: 189, 341: 189, 189, 189, 189, 189}, + {129, 129, 129, 129, 129, 129, 129, 12: 129, 21: 129, 207: 129, 209: 129, 129, 213: 129, 217: 129, 291: 129, 341: 129, 129, 129, 129, 129, 430: 129, 129, 510: 3257}, + {190, 190, 190, 190, 190, 190, 190, 12: 3212, 21: 190, 207: 190, 209: 190, 190, 213: 190, 217: 190, 291: 190, 341: 190, 190, 190, 190, 190, 430: 3211, 3213, 509: 3214}, + // 1905 + {129, 129, 129, 129, 129, 129, 129, 12: 129, 21: 129, 207: 129, 209: 129, 129, 213: 129, 217: 129, 291: 129, 341: 129, 129, 129, 129, 129, 430: 129, 129, 510: 3259}, + {191, 191, 191, 191, 191, 191, 191, 12: 3212, 21: 191, 207: 191, 209: 191, 191, 213: 191, 217: 191, 291: 191, 341: 191, 191, 191, 191, 191, 430: 3211, 3213, 509: 3214}, + {192, 192, 192, 192, 192, 192, 192, 12: 3212, 21: 192, 207: 192, 209: 192, 192, 213: 192, 217: 192, 291: 192, 341: 192, 192, 192, 192, 192, 430: 3211, 3213, 509: 3214}, + {129, 129, 129, 129, 129, 129, 129, 12: 129, 21: 129, 207: 129, 209: 129, 129, 213: 129, 217: 129, 291: 129, 341: 129, 129, 129, 129, 129, 430: 129, 129, 510: 3262}, + {193, 193, 193, 193, 193, 193, 193, 12: 3212, 21: 193, 207: 193, 209: 193, 193, 213: 193, 217: 193, 291: 193, 341: 193, 193, 193, 193, 193, 430: 3211, 3213, 509: 3214}, + // 1910 + {1277, 1277, 4: 1277, 1277, 1277, 21: 1277}, + {291: 1265}, + {217: 3317}, + {1263, 1263, 1263, 1263, 1263, 1263, 1263, 21: 1263, 207: 1263, 209: 1263, 1263, 213: 1263, 217: 1263, 291: 1263, 341: 1263, 1263, 1263, 1263, 1263}, + {1262, 1262, 1262, 1262, 1262, 1262, 1262, 21: 1262, 207: 1262, 209: 1262, 1262, 213: 1262, 217: 1262, 291: 1262, 341: 1262, 1262, 1262, 1262, 1262}, + // 1915 + {291: 3316}, + {1260, 1260, 1260, 1260, 1260, 1260, 1260, 21: 1260, 207: 1260, 209: 1260, 1260, 213: 1260, 217: 1260, 291: 3315, 341: 1260, 1260, 1260, 1260, 1260}, + {208: 1924, 214: 3308, 3309, 217: 1915, 240: 1919, 294: 1914, 1916, 297: 1918, 1917, 301: 1923, 3299, 3296, 305: 1922, 3297, 3298, 1921, 408: 3307, 410: 1920, 625: 3294, 3295, 3305, 656: 3306, 705: 3304}, + {448: 3292}, + {208: 3291}, + // 1920 + {206: 3288}, + {210: 3281}, + {1253, 1253, 1253, 1253, 1253, 1253, 1253, 21: 1253, 207: 1253, 209: 1253, 1253, 213: 1253, 217: 1253, 291: 1253, 341: 1253, 1253, 1253, 1253, 1253}, + {100: 3280}, + {1247, 1247, 1247, 1247, 1247, 1247, 1247, 21: 1247, 207: 1247, 209: 1247, 1247, 213: 1247, 217: 1247, 291: 1247, 341: 1247, 1247, 1247, 1247, 1247}, + // 1925 + {1244, 1244, 3272, 3267, 1244, 1244, 1244, 21: 1244, 207: 3271, 209: 3265, 1252, 213: 3270, 217: 3266, 291: 1266, 341: 3264, 3269, 3273, 3095, 3276, 555: 3275, 575: 3279, 608: 3274, 644: 3268}, + {1246, 1246, 1246, 1246, 1246, 1246, 1246, 21: 1246, 207: 1246, 209: 1246, 1246, 213: 1246, 217: 1246, 291: 1246, 341: 1246, 1246, 1246, 1246, 1246}, + {210: 1251}, + {206: 3282}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3283}, + // 1930 + {21: 3284, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {1250, 1250, 1250, 1250, 1250, 1250, 1250, 21: 1250, 207: 1250, 209: 1250, 1250, 213: 1250, 217: 1250, 291: 1250, 341: 1250, 1250, 1250, 1250, 1250, 777: 3287, 805: 3286, 3285}, + {1254, 1254, 1254, 1254, 1254, 1254, 1254, 21: 1254, 207: 1254, 209: 1254, 1254, 213: 1254, 217: 1254, 291: 1254, 341: 1254, 1254, 1254, 1254, 1254}, + {1249, 1249, 1249, 1249, 1249, 1249, 1249, 21: 1249, 207: 1249, 209: 1249, 1249, 213: 1249, 217: 1249, 291: 1249, 341: 1249, 1249, 1249, 1249, 1249}, + {1248, 1248, 1248, 1248, 1248, 1248, 1248, 21: 1248, 207: 1248, 209: 1248, 1248, 213: 1248, 217: 1248, 291: 1248, 341: 1248, 1248, 1248, 1248, 1248}, + // 1935 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3289}, + {21: 3290, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {1255, 1255, 1255, 1255, 1255, 1255, 1255, 21: 1255, 207: 1255, 209: 1255, 1255, 213: 1255, 217: 1255, 291: 1255, 341: 1255, 1255, 1255, 1255, 1255}, + {1256, 1256, 1256, 1256, 1256, 1256, 1256, 21: 1256, 207: 1256, 209: 1256, 1256, 213: 1256, 217: 1256, 291: 1256, 341: 1256, 1256, 1256, 1256, 1256}, + {302: 3299, 3296, 306: 3297, 3298, 625: 3294, 3295, 3293}, + // 1940 + {1257, 1257, 1257, 1257, 1257, 1257, 1257, 21: 1257, 207: 1257, 209: 1257, 1257, 213: 1257, 217: 1257, 291: 1257, 341: 1257, 1257, 1257, 1257, 1257}, + {1227, 1227, 1227, 1227, 1227, 1227, 1227, 21: 1227, 207: 1227, 209: 1227, 1227, 213: 1227, 217: 1227, 291: 1227, 341: 1227, 1227, 1227, 1227, 1227}, + {206: 3300}, + {1220, 1220, 1220, 1220, 1220, 1220, 1220, 21: 1220, 206: 1224, 1220, 209: 1220, 1220, 213: 1220, 217: 1220, 291: 1220, 341: 1220, 1220, 1220, 1220, 1220}, + {1219, 1219, 1219, 1219, 1219, 1219, 1219, 21: 1219, 206: 1223, 1219, 209: 1219, 1219, 213: 1219, 217: 1219, 291: 1219, 341: 1219, 1219, 1219, 1219, 1219}, + // 1945 + {1218, 1218, 1218, 1218, 1218, 1218, 1218, 21: 1218, 206: 1222, 1218, 209: 1218, 1218, 213: 1218, 217: 1218, 291: 1218, 341: 1218, 1218, 1218, 1218, 1218}, + {206: 1221}, + {21: 3301, 240: 1448, 432: 3302}, + {1226, 1226, 1226, 1226, 1226, 1226, 1226, 21: 1226, 207: 1226, 209: 1226, 1226, 213: 1226, 217: 1226, 291: 1226, 341: 1226, 1226, 1226, 1226, 1226}, + {21: 3303}, + // 1950 + {1225, 1225, 1225, 1225, 1225, 1225, 1225, 21: 1225, 207: 1225, 209: 1225, 1225, 213: 1225, 217: 1225, 291: 1225, 341: 1225, 1225, 1225, 1225, 1225}, + {1258, 1258, 1258, 1258, 1258, 1258, 1258, 21: 1258, 207: 1258, 209: 1258, 1258, 213: 1258, 217: 1258, 291: 1258, 341: 1258, 1258, 1258, 1258, 1258}, + {1229, 1229, 1229, 1229, 1229, 1229, 1229, 21: 1229, 207: 1229, 209: 1229, 1229, 213: 1229, 217: 1229, 291: 1229, 341: 1229, 1229, 1229, 1229, 1229}, + {1228, 1228, 1228, 1228, 1228, 1228, 1228, 21: 1228, 207: 1228, 209: 1228, 1228, 213: 1228, 217: 1228, 291: 1228, 341: 1228, 1228, 1228, 1228, 1228}, + {1217, 1217, 1217, 1217, 1217, 1217, 1217, 21: 1217, 207: 1217, 209: 1217, 1217, 213: 1217, 217: 1217, 291: 1217, 341: 1217, 1217, 1217, 1217, 1217}, + // 1955 + {240: 3311, 297: 3313, 3312, 629: 3314}, + {240: 3311, 297: 3313, 3312, 629: 3310}, + {1215, 1215, 1215, 1215, 1215, 1215, 1215, 21: 1215, 207: 1215, 209: 1215, 1215, 213: 1215, 217: 1215, 291: 1215, 341: 1215, 1215, 1215, 1215, 1215}, + {1214, 1214, 1214, 1214, 1214, 1214, 1214, 21: 1214, 207: 1214, 209: 1214, 1214, 213: 1214, 217: 1214, 291: 1214, 341: 1214, 1214, 1214, 1214, 1214}, + {1213, 1213, 1213, 1213, 1213, 1213, 1213, 21: 1213, 207: 1213, 209: 1213, 1213, 213: 1213, 217: 1213, 291: 1213, 341: 1213, 1213, 1213, 1213, 1213}, + // 1960 + {1212, 1212, 1212, 1212, 1212, 1212, 1212, 21: 1212, 207: 1212, 209: 1212, 1212, 213: 1212, 217: 1212, 291: 1212, 341: 1212, 1212, 1212, 1212, 1212}, + {1216, 1216, 1216, 1216, 1216, 1216, 1216, 21: 1216, 207: 1216, 209: 1216, 1216, 213: 1216, 217: 1216, 291: 1216, 341: 1216, 1216, 1216, 1216, 1216}, + {1259, 1259, 1259, 1259, 1259, 1259, 1259, 21: 1259, 207: 1259, 209: 1259, 1259, 213: 1259, 217: 1259, 291: 1259, 341: 1259, 1259, 1259, 1259, 1259}, + {1261, 1261, 1261, 1261, 1261, 1261, 1261, 21: 1261, 207: 1261, 209: 1261, 1261, 213: 1261, 217: 1261, 291: 1261, 341: 1261, 1261, 1261, 1261, 1261}, + {1264, 1264, 1264, 1264, 1264, 1264, 1264, 21: 1264, 207: 1264, 209: 1264, 1264, 213: 1264, 217: 1264, 291: 1264, 341: 1264, 1264, 1264, 1264, 1264}, + // 1965 + {291: 1300, 341: 1300, 1300, 359: 1300, 372: 1300, 1300}, + {1299, 1299, 6: 1299, 291: 1299, 341: 1299, 1299, 359: 1299, 372: 1299, 1299}, + {1157, 1157}, + {1193, 1193, 206: 1193, 210: 1193, 236: 1193, 347: 1193, 352: 1193, 354: 3393, 758: 3392}, + {7: 1194, 239: 1194, 353: 1194}, + // 1970 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 232: 3390, 348: 1691, 1459, 1460, 1458, 434: 3389}, + {7: 2276, 239: 3384, 353: 2275, 449: 3383}, + {232: 3131, 240: 1117, 436: 3381}, + {208: 1117, 232: 3131, 436: 3379}, + {232: 3131, 240: 1117, 436: 3377}, + // 1975 + {208: 1117, 232: 3131, 436: 3375}, + {232: 3131, 240: 1117, 436: 3373}, + {208: 1117, 232: 3131, 436: 3371}, + {208: 1117, 232: 3131, 436: 3369}, + {232: 3131, 240: 1117, 436: 3367}, + // 1980 + {232: 3131, 240: 1117, 436: 3365}, + {232: 3131, 240: 1117, 436: 3363}, + {232: 3131, 240: 1117, 436: 3361}, + {218, 218, 218, 218, 6: 218, 218, 218, 218, 218, 218, 13: 218, 218, 218, 218, 218, 218, 218, 218, 206: 218, 210: 218, 213: 218, 236: 218, 239: 218, 347: 218, 352: 218, 218, 218, 218, 218}, + {213: 1117, 232: 3131, 240: 1117, 436: 3359}, + // 1985 + {232: 3131, 240: 1117, 436: 3357}, + {213: 1117, 232: 3131, 240: 1117, 436: 3353}, + {209, 209, 3326, 3325, 6: 3351, 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 206: 209, 210: 209, 213: 3322, 236: 209, 239: 1195, 347: 209, 352: 209, 1195, 209, 3339, 3338, 472: 3324, 495: 3336, 499: 3350}, + {208, 208, 208, 208, 6: 208, 208, 208, 208, 208, 208, 13: 208, 208, 208, 208, 208, 208, 208, 208, 206: 208, 210: 208, 213: 208, 236: 208, 239: 208, 347: 208, 352: 208, 208, 208, 208, 208}, + {75: 1117, 1117, 82: 1117, 84: 1117, 90: 1117, 213: 1117, 232: 3131, 436: 3343}, + // 1990 + {75: 3349, 3347, 82: 3345, 84: 3346, 90: 3348, 213: 3344}, + {202, 202, 202, 202, 6: 202, 202, 202, 202, 202, 202, 13: 202, 202, 202, 202, 202, 202, 202, 202, 206: 202, 210: 202, 213: 202, 236: 202, 239: 202, 347: 202, 352: 202, 202, 202, 202, 202}, + {201, 201, 201, 201, 6: 201, 201, 201, 201, 201, 201, 13: 201, 201, 201, 201, 201, 201, 201, 201, 206: 201, 210: 201, 213: 201, 236: 201, 239: 201, 347: 201, 352: 201, 201, 201, 201, 201}, + {200, 200, 200, 200, 6: 200, 200, 200, 200, 200, 200, 13: 200, 200, 200, 200, 200, 200, 200, 200, 206: 200, 210: 200, 213: 200, 236: 200, 239: 200, 347: 200, 352: 200, 200, 200, 200, 200}, + {199, 199, 199, 199, 6: 199, 199, 199, 199, 199, 199, 13: 199, 199, 199, 199, 199, 199, 199, 199, 206: 199, 210: 199, 213: 199, 236: 199, 239: 199, 347: 199, 352: 199, 199, 199, 199, 199}, + // 1995 + {198, 198, 198, 198, 6: 198, 198, 198, 198, 198, 198, 13: 198, 198, 198, 198, 198, 198, 198, 198, 206: 198, 210: 198, 213: 198, 236: 198, 239: 198, 347: 198, 352: 198, 198, 198, 198, 198}, + {197, 197, 197, 197, 6: 197, 197, 197, 197, 197, 197, 13: 197, 197, 197, 197, 197, 197, 197, 197, 206: 197, 210: 197, 213: 197, 236: 197, 239: 197, 347: 197, 352: 197, 197, 197, 197, 197}, + {207, 207, 207, 207, 6: 207, 207, 207, 207, 207, 207, 13: 207, 207, 207, 207, 207, 207, 207, 207, 206: 207, 210: 207, 213: 207, 236: 207, 239: 207, 347: 207, 352: 207, 207, 207, 207, 207}, + {2: 3326, 3325, 7: 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 213: 3322, 239: 1195, 353: 1195, 355: 3339, 3338, 472: 3324, 495: 3336, 499: 3352}, + {206, 206, 206, 206, 6: 206, 206, 206, 206, 206, 206, 13: 206, 206, 206, 206, 206, 206, 206, 206, 206: 206, 210: 206, 213: 206, 236: 206, 239: 206, 347: 206, 352: 206, 206, 206, 206, 206}, + // 2000 + {213: 3355, 240: 1448, 432: 2259, 443: 3356, 658: 3354}, + {215, 215, 215, 215, 6: 215, 215, 215, 215, 215, 215, 13: 215, 215, 215, 215, 215, 215, 215, 215, 206: 215, 210: 215, 213: 215, 236: 215, 239: 215, 347: 215, 352: 215, 215, 215, 215, 215}, + {214, 214, 214, 214, 6: 214, 214, 214, 214, 214, 214, 13: 214, 214, 214, 214, 214, 214, 214, 214, 206: 214, 210: 214, 213: 214, 236: 214, 239: 214, 347: 214, 352: 214, 214, 214, 214, 214}, + {213, 213, 213, 213, 6: 213, 213, 213, 213, 213, 213, 13: 213, 213, 213, 213, 213, 213, 213, 213, 206: 213, 210: 213, 213: 213, 236: 213, 239: 213, 347: 213, 352: 213, 213, 213, 213, 213}, + {240: 1448, 432: 2259, 443: 3358}, + // 2005 + {216, 216, 216, 216, 6: 216, 216, 216, 216, 216, 216, 13: 216, 216, 216, 216, 216, 216, 216, 216, 206: 216, 210: 216, 213: 216, 236: 216, 239: 216, 347: 216, 352: 216, 216, 216, 216, 216}, + {213: 3355, 240: 1448, 432: 2259, 443: 3356, 658: 3360}, + {217, 217, 217, 217, 6: 217, 217, 217, 217, 217, 217, 13: 217, 217, 217, 217, 217, 217, 217, 217, 206: 217, 210: 217, 213: 217, 236: 217, 239: 217, 347: 217, 352: 217, 217, 217, 217, 217}, + {240: 1448, 432: 2259, 443: 3362}, + {219, 219, 219, 219, 6: 219, 219, 219, 219, 219, 219, 13: 219, 219, 219, 219, 219, 219, 219, 219, 206: 219, 210: 219, 213: 219, 236: 219, 239: 219, 347: 219, 352: 219, 219, 219, 219, 219}, + // 2010 + {240: 1448, 432: 2259, 443: 3364}, + {220, 220, 220, 220, 6: 220, 220, 220, 220, 220, 220, 13: 220, 220, 220, 220, 220, 220, 220, 220, 206: 220, 210: 220, 213: 220, 236: 220, 239: 220, 347: 220, 352: 220, 220, 220, 220, 220}, + {240: 1448, 432: 2259, 443: 3366}, + {221, 221, 221, 221, 6: 221, 221, 221, 221, 221, 221, 13: 221, 221, 221, 221, 221, 221, 221, 221, 206: 221, 210: 221, 213: 221, 236: 221, 239: 221, 347: 221, 352: 221, 221, 221, 221, 221}, + {240: 1448, 432: 2259, 443: 3368}, + // 2015 + {222, 222, 222, 222, 6: 222, 222, 222, 222, 222, 222, 13: 222, 222, 222, 222, 222, 222, 222, 222, 206: 222, 210: 222, 213: 222, 236: 222, 239: 222, 347: 222, 352: 222, 222, 222, 222, 222}, + {208: 3370}, + {223, 223, 223, 223, 6: 223, 223, 223, 223, 223, 223, 13: 223, 223, 223, 223, 223, 223, 223, 223, 206: 223, 210: 223, 213: 223, 236: 223, 239: 223, 347: 223, 352: 223, 223, 223, 223, 223}, + {208: 3372}, + {224, 224, 224, 224, 6: 224, 224, 224, 224, 224, 224, 13: 224, 224, 224, 224, 224, 224, 224, 224, 206: 224, 210: 224, 213: 224, 236: 224, 239: 224, 347: 224, 352: 224, 224, 224, 224, 224}, + // 2020 + {240: 1448, 432: 2259, 443: 3374}, + {225, 225, 225, 225, 6: 225, 225, 225, 225, 225, 225, 13: 225, 225, 225, 225, 225, 225, 225, 225, 206: 225, 210: 225, 213: 225, 236: 225, 239: 225, 347: 225, 352: 225, 225, 225, 225, 225}, + {208: 3376}, + {226, 226, 226, 226, 6: 226, 226, 226, 226, 226, 226, 13: 226, 226, 226, 226, 226, 226, 226, 226, 206: 226, 210: 226, 213: 226, 236: 226, 239: 226, 347: 226, 352: 226, 226, 226, 226, 226}, + {240: 1448, 432: 2259, 443: 3378}, + // 2025 + {227, 227, 227, 227, 6: 227, 227, 227, 227, 227, 227, 13: 227, 227, 227, 227, 227, 227, 227, 227, 206: 227, 210: 227, 213: 227, 236: 227, 239: 227, 347: 227, 352: 227, 227, 227, 227, 227}, + {208: 3380}, + {228, 228, 228, 228, 6: 228, 228, 228, 228, 228, 228, 13: 228, 228, 228, 228, 228, 228, 228, 228, 206: 228, 210: 228, 213: 228, 236: 228, 239: 228, 347: 228, 352: 228, 228, 228, 228, 228}, + {240: 1448, 432: 2259, 443: 3382}, + {229, 229, 229, 229, 6: 229, 229, 229, 229, 229, 229, 13: 229, 229, 229, 229, 229, 229, 229, 229, 206: 229, 210: 229, 213: 229, 236: 229, 239: 229, 347: 229, 352: 229, 229, 229, 229, 229}, + // 2030 + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 208: 1117, 232: 3131, 248: 1117, 436: 3387}, + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 208: 1117, 232: 3131, 436: 3385}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 3386}, + {230, 230, 230, 230, 6: 230, 230, 230, 230, 230, 230, 13: 230, 230, 230, 230, 230, 230, 230, 230, 206: 230, 210: 230, 213: 230, 236: 230, 239: 230, 347: 230, 352: 230, 230, 230, 230, 230}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 3388}, + // 2035 + {231, 231, 231, 231, 6: 231, 231, 231, 231, 231, 231, 13: 231, 231, 231, 231, 231, 231, 231, 231, 206: 231, 210: 231, 213: 231, 236: 231, 239: 231, 347: 231, 352: 231, 231, 231, 231, 231}, + {233, 233, 233, 233, 6: 233, 233, 233, 233, 233, 233, 13: 233, 233, 233, 233, 233, 233, 233, 233, 206: 233, 210: 233, 213: 233, 236: 233, 239: 233, 347: 233, 352: 233, 233, 233, 233, 233}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 3391}, + {232, 232, 232, 232, 6: 232, 232, 232, 232, 232, 232, 13: 232, 232, 232, 232, 232, 232, 232, 232, 206: 232, 210: 232, 213: 232, 236: 232, 239: 232, 347: 232, 352: 232, 232, 232, 232, 232}, + {1166, 1166, 206: 1166, 210: 1166, 236: 3472, 347: 3471, 352: 1166, 707: 3470}, + // 2040 + {362: 3394}, + {60: 3396, 291: 3395, 763: 3397}, + {206: 3465}, + {206: 3460}, + {27: 3399, 206: 3398}, + // 2045 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3441}, + {206: 3400}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 3401}, + {6: 1730, 21: 3402}, + {1183, 1183, 54: 3404, 206: 1183, 210: 1183, 236: 1183, 347: 1183, 352: 1183, 527: 3403}, + // 2050 + {1181, 1181, 206: 3407, 210: 1181, 236: 1181, 347: 1181, 352: 1181, 514: 3406}, + {240: 1448, 432: 3405}, + {1182, 1182, 55: 1182, 206: 1182, 210: 1182, 236: 1182, 347: 1182, 352: 1182}, + {1189, 1189, 206: 1189, 210: 1189, 236: 1189, 347: 1189, 352: 1189}, + {354: 3410, 640: 3409, 757: 3408}, + // 2055 + {6: 3439, 21: 3438}, + {6: 1179, 21: 1179}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3411, 1459, 1460, 1458}, + {2: 1169, 6: 1169, 9: 1169, 21: 1169, 26: 1169, 292: 3413, 756: 3412}, + {2: 3428, 6: 1176, 9: 3429, 21: 1176, 26: 3430, 639: 3427, 754: 3426, 3425}, + // 2060 + {127: 3414}, + {160: 3415}, + {206: 3417, 550: 3416}, + {2: 1168, 6: 1168, 9: 1168, 21: 1168, 26: 1168}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3419, 550: 3420, 624: 3421, 741: 3418}, + // 2065 + {6: 3423, 21: 3422}, + {6: 1093, 21: 1093, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {6: 1094, 21: 1094}, + {6: 1086, 21: 1086}, + {2: 1167, 6: 1167, 9: 1167, 21: 1167, 26: 1167}, + // 2070 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3419, 550: 3420, 624: 3424}, + {6: 1085, 21: 1085}, + {6: 1177, 21: 1177}, + {2: 3428, 6: 1175, 9: 3429, 21: 1175, 26: 3430, 639: 3437}, + {2: 1174, 6: 1174, 9: 1174, 21: 1174, 26: 1174}, + // 2075 + {208: 1117, 232: 3131, 436: 3435}, + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 232: 3131, 436: 3433}, + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 232: 3131, 436: 3431}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3432, 1459, 1460, 1458}, + {2: 1170, 6: 1170, 9: 1170, 21: 1170, 26: 1170}, + // 2080 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3434, 1459, 1460, 1458}, + {2: 1171, 6: 1171, 9: 1171, 21: 1171, 26: 1171}, + {208: 3436}, + {2: 1172, 6: 1172, 9: 1172, 21: 1172, 26: 1172}, + {2: 1173, 6: 1173, 9: 1173, 21: 1173, 26: 1173}, + // 2085 + {1180, 1180, 6: 1180, 206: 1180, 210: 1180, 236: 1180, 347: 1180, 352: 1180}, + {354: 3410, 640: 3440}, + {6: 1178, 21: 1178}, + {21: 3442, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {1183, 1183, 54: 3404, 1183, 206: 1183, 210: 1183, 236: 1183, 347: 1183, 352: 1183, 527: 3443}, + // 2090 + {1188, 1188, 55: 3445, 206: 1188, 210: 1188, 236: 1188, 347: 1188, 352: 1188, 779: 3444}, + {1181, 1181, 206: 3407, 210: 1181, 236: 1181, 347: 1181, 352: 1181, 514: 3459}, + {362: 3446}, + {60: 3447, 291: 3448}, + {206: 3455}, + // 2095 + {206: 3449}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 3450}, + {6: 1730, 21: 3451}, + {1185, 1185, 95: 3453, 206: 1185, 210: 1185, 236: 1185, 347: 1185, 352: 1185, 660: 3452}, + {1186, 1186, 206: 1186, 210: 1186, 236: 1186, 347: 1186, 352: 1186}, + // 2100 + {240: 1448, 432: 3454}, + {1184, 1184, 206: 1184, 210: 1184, 236: 1184, 347: 1184, 352: 1184}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3456}, + {21: 3457, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {1185, 1185, 95: 3453, 206: 1185, 210: 1185, 236: 1185, 347: 1185, 352: 1185, 660: 3458}, + // 2105 + {1187, 1187, 206: 1187, 210: 1187, 236: 1187, 347: 1187, 352: 1187}, + {1190, 1190, 206: 1190, 210: 1190, 236: 1190, 347: 1190, 352: 1190}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3461}, + {21: 3462, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {1183, 1183, 54: 3404, 206: 1183, 210: 1183, 236: 1183, 347: 1183, 352: 1183, 527: 3463}, + // 2110 + {1181, 1181, 206: 3407, 210: 1181, 236: 1181, 347: 1181, 352: 1181, 514: 3464}, + {1191, 1191, 206: 1191, 210: 1191, 236: 1191, 347: 1191, 352: 1191}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 3466}, + {6: 1730, 21: 3467}, + {1183, 1183, 54: 3404, 206: 1183, 210: 1183, 236: 1183, 347: 1183, 352: 1183, 527: 3468}, + // 2115 + {1181, 1181, 206: 3407, 210: 1181, 236: 1181, 347: 1181, 352: 1181, 514: 3469}, + {1192, 1192, 206: 1192, 210: 1192, 236: 1192, 347: 1192, 352: 1192}, + {1163, 1163, 206: 1163, 210: 3474, 352: 1163, 682: 3473}, + {1165, 1165, 206: 1165, 210: 1165, 352: 1165}, + {1164, 1164, 206: 1164, 210: 1164, 352: 1164}, + // 2120 + {1161, 1161, 206: 1383, 352: 1379, 406: 3478, 437: 3476, 1380, 1381, 1382, 444: 1385, 1384, 3477, 700: 3475}, + {1162, 1162, 206: 1162, 352: 1162}, + {1197, 1197}, + {1160, 1160, 219: 430}, + {1159, 1159}, + // 2125 + {1158, 1158}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1835, 1459, 1460, 1458, 506: 3480}, + {1201, 1201, 7: 1195, 213: 3322, 239: 1195, 353: 1195, 472: 3482, 583: 3484, 701: 3483, 3481}, + {1205, 1205}, + {7: 2276, 239: 3487, 353: 2275, 449: 3486}, + // 2130 + {1200, 1200, 7: 1195, 213: 3322, 239: 1195, 353: 1195, 472: 3482, 583: 3485}, + {1199, 1199, 7: 1199, 213: 1199, 239: 1199, 353: 1199}, + {1198, 1198, 7: 1198, 213: 1198, 239: 1198, 353: 1198}, + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 208: 1117, 232: 3131, 248: 1117, 436: 3490}, + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 208: 1117, 232: 3131, 436: 3488}, + // 2135 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 3489}, + {1202, 1202, 7: 1202, 213: 1202, 239: 1202, 353: 1202}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 3491}, + {1203, 1203, 7: 1203, 213: 1203, 239: 1203, 353: 1203}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3493, 1459, 1460, 1458}, + // 2140 + {207: 1012, 231: 3118, 464: 3119, 523: 3494}, + {207: 3495}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3496}, + {206: 3497}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3498}, + // 2145 + {6: 3092, 21: 3499}, + {1019, 1019, 1019, 8: 1019, 220: 1019, 231: 1019, 513: 3500}, + {1321, 1321, 3129, 8: 3127, 220: 3502, 231: 3118, 464: 3128, 512: 3126, 549: 3501, 739: 3503}, + {1320, 1320}, + {232: 3504}, + // 2150 + {1211, 1211}, + {117: 3508, 137: 3505, 149: 3507, 213: 3506}, + {1319, 1319, 6: 1319}, + {1318, 1318, 6: 1318}, + {1317, 1317, 6: 1317}, + // 2155 + {1316, 1316, 6: 1316}, + {1280, 1280}, + {1282, 1282, 218: 3511}, + {111: 3512}, + {152: 3513}, + // 2160 + {1281, 1281}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3516, 468: 3515}, + {1290, 1290, 6: 2570, 218: 3524, 492: 3532}, + {538, 538, 6: 538, 218: 538, 354: 3518, 359: 3517}, + {493, 493, 1540, 1463, 1464, 1496, 493, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 218: 493, 348: 2490, 1459, 1460, 1458, 522: 3530}, + // 2165 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3519, 1459, 1460, 1458, 641: 3520}, + {1304, 1304, 6: 1304, 218: 1304, 359: 1304}, + {1290, 1290, 6: 3521, 218: 3524, 359: 3523, 492: 3522}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3529, 1459, 1460, 1458}, + {1292, 1292}, + // 2170 + {493, 493, 1540, 1463, 1464, 1496, 493, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 218: 493, 348: 2490, 1459, 1460, 1458, 522: 3527}, + {240: 1448, 432: 3525}, + {73: 3526}, + {1289, 1289}, + {1290, 1290, 6: 2492, 218: 3524, 492: 3528}, + // 2175 + {1291, 1291}, + {1303, 1303, 6: 1303, 218: 1303, 359: 1303}, + {1290, 1290, 6: 2492, 218: 3524, 492: 3531}, + {1293, 1293}, + {1294, 1294}, + // 2180 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3536, 667: 3535, 787: 3534}, + {1298, 1298, 6: 3539}, + {1297, 1297, 6: 1297}, + {368: 3537}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3538}, + // 2185 + {1295, 1295, 6: 1295}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3536, 667: 3540}, + {1296, 1296, 6: 1296}, + {442: 3551}, + {2: 1027, 1027, 1027, 1027, 7: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 22: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 208: 1027, 282: 1027, 286: 2980, 543: 3543}, + // 2190 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 3544, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 1783, 518: 1784, 531: 3545}, + {930, 930, 6: 930, 30: 930, 206: 3546, 289: 930, 379: 930}, + {99, 99, 6: 1786}, + {21: 3547}, + {30: 3548}, + // 2195 + {362: 3549}, + {208: 1797, 520: 3550}, + {98, 98}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3552}, + {212, 212, 3326, 3325, 6: 212, 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 46: 3566, 80: 3559, 83: 3560, 88: 3561, 213: 3322, 220: 3502, 239: 1195, 296: 3556, 353: 1195, 355: 3339, 3338, 363: 3567, 365: 3558, 370: 3563, 3554, 377: 3564, 380: 3557, 383: 3562, 472: 3324, 495: 3336, 499: 3341, 549: 3565, 559: 3569, 565: 3555, 3568, 680: 3553}, + // 2200 + {1351, 1351, 6: 3638}, + {354: 3632}, + {1348, 1348, 6: 1348}, + {368: 3628}, + {2: 1311, 1311, 1311, 1311, 7: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 22: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 291: 1302, 341: 1302, 1302, 354: 3618, 359: 1302, 372: 1302, 1302, 504: 3585, 3616, 536: 3617, 3061, 3064}, + // 2205 + {2: 1311, 1311, 1311, 1311, 7: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 22: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 291: 2499, 341: 3605, 354: 3606, 359: 2500, 372: 3608, 475: 3607, 504: 3585, 3604}, + {548: 3603}, + {548: 3602}, + {2: 1311, 1311, 1311, 1311, 7: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 22: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 504: 3585, 3599}, + {2: 1311, 1311, 1311, 1311, 7: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 22: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 504: 3585, 3592}, + // 2210 + {2: 1311, 1311, 1311, 1311, 7: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 22: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 504: 3585, 3584}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 210: 3577, 291: 2499, 348: 1662, 1459, 1460, 1458, 359: 2500, 368: 3575, 429: 3576, 475: 3578}, + {1327, 1327, 6: 1327}, + {77: 1117, 86: 1117, 213: 1117, 232: 3131, 436: 3570}, + {1325, 1325, 6: 1325}, + // 2215 + {1306, 1306, 6: 1306}, + {211, 211, 3326, 3325, 6: 211, 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 213: 3322, 239: 1195, 353: 1195, 355: 3339, 3338, 472: 3324, 495: 3336, 499: 3350}, + {77: 3574, 86: 3573, 213: 3572, 679: 3571}, + {1326, 1326, 6: 1326}, + {1324, 1324, 6: 1324}, + // 2220 + {1323, 1323, 6: 1323}, + {1322, 1322, 6: 1322}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3583}, + {1330, 1330, 6: 1330}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3582}, + // 2225 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3579, 1459, 1460, 1458}, + {368: 3580}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3581, 1459, 1460, 1458}, + {1328, 1328, 6: 1328}, + {1329, 1329, 6: 1329}, + // 2230 + {1331, 1331, 6: 1331}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3586}, + {2: 1310, 1310, 1310, 1310, 7: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 22: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310}, + {234: 3587, 365: 3588}, + {213: 3590}, + // 2235 + {213: 3589}, + {1332, 1332, 6: 1332}, + {208: 1924, 214: 3308, 3309, 217: 1915, 240: 1919, 294: 1914, 1916, 297: 1918, 1917, 301: 1923, 305: 1922, 308: 1921, 408: 3307, 410: 1920, 656: 3591}, + {1333, 1333, 6: 1333}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3593}, + // 2240 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3062, 477: 3594}, + {1309, 1309, 4: 3597, 3596, 1309, 535: 3595}, + {1334, 1334, 6: 1334}, + {1308, 1308, 6: 1308}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3598}, + // 2245 + {1307, 1307, 6: 1307}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3062, 477: 3600}, + {1309, 1309, 4: 3597, 3596, 1309, 535: 3601}, + {1335, 1335, 6: 1335}, + {1336, 1336, 6: 1336}, + // 2250 + {1337, 1337, 6: 1337}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3614}, + {291: 3613}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3612, 1459, 1460, 1458}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3611, 1459, 1460, 1458}, + // 2255 + {291: 3609}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3319, 1459, 1460, 1458, 661: 3610}, + {1338, 1338, 6: 1338}, + {1339, 1339, 6: 1339}, + {1340, 1340, 6: 1340}, + // 2260 + {1341, 1341, 6: 1341}, + {1122, 1122, 6: 1122, 366: 2977, 2976, 556: 3615}, + {1342, 1342, 6: 1342}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 3621, 348: 1725, 1459, 1460, 1458, 433: 3062, 477: 3620}, + {1344, 1344, 6: 1344}, + // 2265 + {1181, 1181, 6: 1181, 206: 3407, 514: 3619}, + {1343, 1343, 6: 1343}, + {1309, 1309, 4: 3597, 3596, 1309, 535: 3627}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3062, 477: 3623, 690: 3622}, + {6: 3625, 21: 3624}, + // 2270 + {6: 1279, 21: 1279}, + {1345, 1345, 6: 1345}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3062, 477: 3626}, + {6: 1278, 21: 1278}, + {1346, 1346, 6: 1346}, + // 2275 + {7: 2276, 353: 2275, 449: 3629}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 3630}, + {114, 114, 6: 114, 239: 3229, 476: 3631}, + {1347, 1347, 6: 1347}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3519, 1459, 1460, 1458, 641: 3633}, + // 2280 + {1290, 1290, 6: 3521, 218: 3524, 359: 3635, 492: 3634}, + {1350, 1350}, + {493, 493, 1540, 1463, 1464, 1496, 493, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 218: 493, 348: 2490, 1459, 1460, 1458, 522: 3636}, + {1290, 1290, 6: 2492, 218: 3524, 492: 3637}, + {1349, 1349}, + // 2285 + {212, 212, 3326, 3325, 6: 212, 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 46: 3566, 80: 3559, 83: 3560, 88: 3561, 213: 3322, 220: 3502, 239: 1195, 296: 3556, 353: 1195, 355: 3339, 3338, 363: 3567, 365: 3558, 370: 3563, 377: 3564, 380: 3557, 383: 3562, 472: 3324, 495: 3336, 499: 3341, 549: 3565, 559: 3569, 565: 3555, 3639}, + {1305, 1305, 6: 1305}, + {1115, 1115, 47: 1375, 49: 1374, 70: 1388, 1359, 1361, 74: 1362, 79: 1377, 81: 1364, 85: 1390, 91: 1378, 93: 1360, 97: 1367, 1437, 206: 1383, 220: 1444, 234: 1387, 236: 1373, 249: 1370, 287: 1372, 352: 1379, 364: 1439, 1366, 370: 1356, 1358, 377: 1357, 406: 1429, 437: 1386, 1380, 1381, 1382, 444: 1385, 1384, 1426, 448: 1438, 454: 1365, 486: 1363, 488: 1400, 490: 1440, 1417, 494: 1424, 497: 1389, 502: 1432, 564: 1392, 567: 1393, 1394, 1395, 1396, 1397, 577: 1398, 1403, 1404, 1405, 1407, 1406, 586: 1399, 1376, 1369, 1408, 1409, 1410, 1414, 1411, 1413, 1412, 1391, 1401, 1368, 1402, 1371, 604: 1415, 609: 1416, 616: 1446, 1445, 1418, 620: 1442, 1419, 1420, 1435, 643: 1421, 649: 1423, 1441, 1425, 1422, 1427, 1428, 657: 3641, 669: 1430, 1431, 1443, 1434, 674: 1433}, + {242, 242}, + } +) + +var yyDebug = 0 + +type yyLexer interface { + Lex(lval *yySymType) int + Errorf(format string, a ...interface{}) + Errors() []error +} + +type yyLexerEx interface { + yyLexer + Reduced(rule, state int, lval *yySymType) bool +} + +func yySymName(c int) (s string) { + x, ok := yyXLAT[c] + if ok { + return yySymNames[x] + } + + return __yyfmt__.Sprintf("%d", c) +} + +func yylex1(yylex yyLexer, lval *yySymType) (n int) { + n = yylex.Lex(lval) + if n <= 0 { + n = yyEOFCode + } + if yyDebug >= 3 { + __yyfmt__.Printf("\nlex %s(%#x %d), lval: %+v\n", yySymName(n), n, n, lval) + } + return n +} + +func yyParse(yylex yyLexer, parser *Parser) int { + const yyError = 819 + + yyEx, _ := yylex.(yyLexerEx) + var yyn int + parser.yylval = yySymType{} + parser.yyVAL = yySymType{} + yyS := parser.cache + + Nerrs := 0 /* number of errors */ + Errflag := 0 /* error recovery flag */ + yyerrok := func() { + if yyDebug >= 2 { + __yyfmt__.Printf("yyerrok()\n") + } + Errflag = 0 + } + _ = yyerrok + yystate := 0 + yychar := -1 + var yyxchar int + var yyshift int + yyp := -1 + goto yystack + +ret0: + return 0 + +ret1: + return 1 + +yystack: + /* put a state and value onto the stack */ + yyp++ + if yyp >= len(yyS) { + nyys := make([]yySymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + yyS[yyp] = parser.yyVAL + yyS[yyp].yys = yystate + +yynewstate: + if yychar < 0 { + yychar = yylex1(yylex, &parser.yylval) + var ok bool + if yyxchar, ok = yyXLAT[yychar]; !ok { + yyxchar = len(yySymNames) // > tab width + } + } + if yyDebug >= 4 { + var a []int + for _, v := range yyS[:yyp+1] { + a = append(a, v.yys) + } + __yyfmt__.Printf("state stack %v\n", a) + } + row := yyParseTab[yystate] + yyn = 0 + if yyxchar < len(row) { + if yyn = int(row[yyxchar]); yyn != 0 { + yyn += yyTabOfs + } + } + switch { + case yyn > 0: // shift + yychar = -1 + parser.yyVAL = parser.yylval + yystate = yyn + yyshift = yyn + if yyDebug >= 2 { + __yyfmt__.Printf("shift, and goto state %d\n", yystate) + } + if Errflag > 0 { + Errflag-- + } + goto yystack + case yyn < 0: // reduce + case yystate == 1: // accept + if yyDebug >= 2 { + __yyfmt__.Println("accept") + } + goto ret0 + } + + if yyn == 0 { + /* error ... attempt to resume parsing */ + switch Errflag { + case 0: /* brand new error */ + if yyDebug >= 1 { + __yyfmt__.Printf("no action for %s in state %d\n", yySymName(yychar), yystate) + } + msg, ok := yyXErrors[yyXError{yystate, yyxchar}] + if !ok { + msg, ok = yyXErrors[yyXError{yystate, -1}] + } + if !ok && yyshift != 0 { + msg, ok = yyXErrors[yyXError{yyshift, yyxchar}] + } + if !ok { + msg, ok = yyXErrors[yyXError{yyshift, -1}] + } + if !ok || msg == "" { + msg = "syntax error" + } + // ignore goyacc error message + yylex.Errorf("") + Nerrs++ + fallthrough + + case 1, 2: /* incompletely recovered error ... try again */ + Errflag = 3 + + /* find a state where "error" is a legal shift action */ + for yyp >= 0 { + row := yyParseTab[yyS[yyp].yys] + if yyError < len(row) { + yyn = int(row[yyError]) + yyTabOfs + if yyn > 0 { // hit + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery found error shift in state %d\n", yyS[yyp].yys) + } + yystate = yyn /* simulate a shift of "error" */ + goto yystack + } + } + + /* the current p has no shift on "error", pop stack */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys) + } + yyp-- + } + /* there is no state on the stack with an error shift ... abort */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery failed\n") + } + goto ret1 + + case 3: /* no shift yet; clobber input char */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery discards %s\n", yySymName(yychar)) + } + if yychar == yyEOFCode { + goto ret1 + } + + yychar = -1 + goto yynewstate /* try again in the same state */ + } + } + + r := -yyn + x0 := yyReductions[r] + x, n := x0.xsym, x0.components + yypt := yyp + _ = yypt // guard against "declared and not used" + + yyp -= n + if yyp+1 >= len(yyS) { + nyys := make([]yySymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = yyS[yyp+1] + + /* consult goto table to find next state */ + exState := yystate + yystate = int(yyParseTab[yyS[yyp].yys][x]) + yyTabOfs + /* reduction by production r */ + if yyDebug >= 2 { + __yyfmt__.Printf("reduce using rule %v (%s), and goto state %d\n", r, yySymNames[x], yystate) + } + + switch r { + case 2: + { + parser.yyVAL.statement = &ast.AlterTableStmt{ + Table: yyS[yypt-1].item.(*ast.TableName), + Specs: yyS[yypt-0].item.([]*ast.AlterTableSpec), + } + } + case 3: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, PartitionNames: yyS[yypt-1].item.([]model.CIStr), MaxNumBuckets: yyS[yypt-0].item.(uint64)} + } + case 4: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{yyS[yypt-6].item.(*ast.TableName)}, + PartitionNames: yyS[yypt-3].item.([]model.CIStr), + IndexNames: yyS[yypt-1].item.([]model.CIStr), + IndexFlag: true, + MaxNumBuckets: yyS[yypt-0].item.(uint64), + } + } + case 5: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: yyS[yypt-0].item.([]*ast.TableOption), + } + } + case 6: + { + op := &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: []*ast.TableOption{{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-1].item.(string)}}, + } + if yyS[yypt-0].item != "" { + op.Options = append(op.Options, &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].item.(string)}) + } + parser.yyVAL.item = op + } + case 7: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 8: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: yyS[yypt-1].item.([]*ast.ColumnDef), + } + } + case 9: + { + constraint := yyS[yypt-0].item.(*ast.Constraint) + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddConstraint, + Constraint: constraint, + } + } + case 10: + { + var defs []*ast.PartitionDefinition + if yyS[yypt-0].item != nil { + defs = yyS[yypt-0].item.([]*ast.PartitionDefinition) + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddPartitions, + PartDefinitions: defs, + } + } + case 11: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropColumn, + OldColumnName: yyS[yypt-1].item.(*ast.ColumnName), + } + } + case 12: + { + parser.yyVAL.item = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} + } + case 13: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropPartition, + Name: yyS[yypt-0].ident, + } + } + case 14: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropIndex, + Name: yyS[yypt-0].ident, + } + } + case 15: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropForeignKey, + Name: yyS[yypt-0].item.(string), + } + } + case 16: + { + parser.yyVAL.item = &ast.AlterTableSpec{} + } + case 17: + { + parser.yyVAL.item = &ast.AlterTableSpec{} + } + case 18: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableModifyColumn, + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 19: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableChangeColumn, + OldColumnName: yyS[yypt-2].item.(*ast.ColumnName), + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 20: + { + option := &ast.ColumnOption{Expr: yyS[yypt-0].expr} + colDef := &ast.ColumnDef{ + Name: yyS[yypt-3].item.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } + case 21: + { + colDef := &ast.ColumnDef{ + Name: yyS[yypt-2].item.(*ast.ColumnName), + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } + case 22: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 23: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 24: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 25: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameIndex, + FromKey: model.NewCIStr(yyS[yypt-2].ident), + ToKey: model.NewCIStr(yyS[yypt-0].ident), + } + } + case 26: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableLock, + LockType: yyS[yypt-0].item.(ast.LockType), + } + } + case 27: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlgorithm, + } + } + case 28: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableForce, + } + } + case 34: + { + parser.yyVAL.item = ast.LockTypeNone + } + case 35: + { + parser.yyVAL.item = ast.LockTypeDefault + } + case 36: + { + parser.yyVAL.item = ast.LockTypeShared + } + case 37: + { + parser.yyVAL.item = ast.LockTypeExclusive + } + case 44: + { + parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} + } + case 45: + { + parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} + } + case 46: + { + parser.yyVAL.item = &ast.ColumnPosition{ + Tp: ast.ColumnPositionAfter, + RelativeColumn: yyS[yypt-0].item.(*ast.ColumnName), + } + } + case 47: + { + parser.yyVAL.item = []*ast.AlterTableSpec{yyS[yypt-0].item.(*ast.AlterTableSpec)} + } + case 48: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterTableSpec), yyS[yypt-0].item.(*ast.AlterTableSpec)) + } + case 49: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 50: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) + } + case 51: + { + parser.yyVAL.item = nil + } + case 52: + { + parser.yyVAL.item = nil + } + case 53: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 54: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 55: + { + parser.yyVAL.statement = &ast.RenameTableStmt{ + OldTable: yyS[yypt-0].item.([]*ast.TableToTable)[0].OldTable, + NewTable: yyS[yypt-0].item.([]*ast.TableToTable)[0].NewTable, + TableToTables: yyS[yypt-0].item.([]*ast.TableToTable), + } + } + case 56: + { + parser.yyVAL.item = []*ast.TableToTable{yyS[yypt-0].item.(*ast.TableToTable)} + } + case 57: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableToTable), yyS[yypt-0].item.(*ast.TableToTable)) + } + case 58: + { + parser.yyVAL.item = &ast.TableToTable{ + OldTable: yyS[yypt-2].item.(*ast.TableName), + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 59: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: yyS[yypt-1].item.([]*ast.TableName), MaxNumBuckets: yyS[yypt-0].item.(uint64)} + } + case 60: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, MaxNumBuckets: yyS[yypt-0].item.(uint64)} + } + case 61: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, PartitionNames: yyS[yypt-1].item.([]model.CIStr), MaxNumBuckets: yyS[yypt-0].item.(uint64)} + } + case 62: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, + PartitionNames: yyS[yypt-3].item.([]model.CIStr), + IndexNames: yyS[yypt-1].item.([]model.CIStr), + IndexFlag: true, + MaxNumBuckets: yyS[yypt-0].item.(uint64), + } + } + case 63: + { + parser.yyVAL.item = uint64(0) + } + case 64: + { + parser.yyVAL.item = getUint64FromNUM(yyS[yypt-1].item) + } + case 65: + { + parser.yyVAL.item = &ast.Assignment{Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].expr} + } + case 66: + { + parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} + } + case 67: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) + } + case 68: + { + parser.yyVAL.item = []*ast.Assignment{} + } + case 70: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 71: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 72: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 73: + { + parser.yyVAL.statement = &ast.BinlogStmt{Str: yyS[yypt-0].ident} + } + case 74: + { + parser.yyVAL.item = []*ast.ColumnDef{yyS[yypt-0].item.(*ast.ColumnDef)} + } + case 75: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnDef), yyS[yypt-0].item.(*ast.ColumnDef)) + } + case 76: + { + parser.yyVAL.item = &ast.ColumnDef{Name: yyS[yypt-2].item.(*ast.ColumnName), Tp: yyS[yypt-1].item.(*types.FieldType), Options: yyS[yypt-0].item.([]*ast.ColumnOption)} + } + case 77: + { + parser.yyVAL.item = &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 78: + { + parser.yyVAL.item = &ast.ColumnName{Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 79: + { + parser.yyVAL.item = &ast.ColumnName{Schema: model.NewCIStr(yyS[yypt-4].ident), Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 80: + { + parser.yyVAL.item = []*ast.ColumnName{yyS[yypt-0].item.(*ast.ColumnName)} + } + case 81: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnName), yyS[yypt-0].item.(*ast.ColumnName)) + } + case 82: + { + parser.yyVAL.item = []*ast.ColumnName{} + } + case 83: + { + parser.yyVAL.item = yyS[yypt-0].item.([]*ast.ColumnName) + } + case 84: + { + parser.yyVAL.item = []*ast.ColumnName{} + } + case 85: + { + parser.yyVAL.item = yyS[yypt-1].item.([]*ast.ColumnName) + } + case 86: + { + parser.yyVAL.statement = &ast.CommitStmt{} + } + case 89: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} + } + case 90: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNull} + } + case 91: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} + } + case 92: + { + // KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY + // can also be specified as just KEY when given in a column definition. + // See http://dev.mysql.com/doc/refman/5.7/en/create-table.html + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionPrimaryKey} + } + case 93: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } + case 94: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } + case 95: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: yyS[yypt-0].expr} + } + case 96: + { + nowFunc := &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: nowFunc} + } + case 97: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr(yyS[yypt-0].ident)} + } + case 98: + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-table.html + // The CHECK clause is parsed but ignored by all storage engines. + parser.yyVAL.item = &ast.ColumnOption{} + } + case 99: + { + startOffset := parser.startOffset(&yyS[yypt-2]) + endOffset := parser.endOffset(&yyS[yypt-1]) + expr := yyS[yypt-2].expr + expr.SetText(parser.src[startOffset:endOffset]) + + parser.yyVAL.item = &ast.ColumnOption{ + Tp: ast.ColumnOptionGenerated, + Expr: expr, + Stored: yyS[yypt-0].item.(bool), + } + } + case 100: + { + parser.yyVAL.item = &ast.ColumnOption{ + Tp: ast.ColumnOptionReference, + Refer: yyS[yypt-0].item.(*ast.ReferenceDef), + } + } + case 103: + { + parser.yyVAL.item = false + } + case 104: + { + parser.yyVAL.item = false + } + case 105: + { + parser.yyVAL.item = true + } + case 106: + { + parser.yyVAL.item = []*ast.ColumnOption{yyS[yypt-0].item.(*ast.ColumnOption)} + } + case 107: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.ColumnOption), yyS[yypt-0].item.(*ast.ColumnOption)) + } + case 108: + { + parser.yyVAL.item = []*ast.ColumnOption{} + } + case 109: + { + parser.yyVAL.item = yyS[yypt-0].item.([]*ast.ColumnOption) + } + case 110: + { + c := &ast.Constraint{ + Tp: ast.ConstraintPrimaryKey, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + if yyS[yypt-4].item != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = yyS[yypt-4].item.(model.IndexType) + } + parser.yyVAL.item = c + } + case 111: + { + c := &ast.Constraint{ + Tp: ast.ConstraintFulltext, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + Name: yyS[yypt-4].item.(string), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + parser.yyVAL.item = c + } + case 112: + { + c := &ast.Constraint{ + Tp: ast.ConstraintIndex, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + Name: yyS[yypt-5].item.(string), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + if yyS[yypt-4].item != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = yyS[yypt-4].item.(model.IndexType) + } + parser.yyVAL.item = c + } + case 113: + { + c := &ast.Constraint{ + Tp: ast.ConstraintUniq, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + Name: yyS[yypt-5].item.(string), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + if yyS[yypt-4].item != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = yyS[yypt-4].item.(model.IndexType) + } + parser.yyVAL.item = c + } + case 114: + { + parser.yyVAL.item = &ast.Constraint{ + Tp: ast.ConstraintForeignKey, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + Name: yyS[yypt-4].item.(string), + Refer: yyS[yypt-0].item.(*ast.ReferenceDef), + } + } + case 115: + { + var onDeleteOpt *ast.OnDeleteOpt + if yyS[yypt-1].item != nil { + onDeleteOpt = yyS[yypt-1].item.(*ast.OnDeleteOpt) + } + var onUpdateOpt *ast.OnUpdateOpt + if yyS[yypt-0].item != nil { + onUpdateOpt = yyS[yypt-0].item.(*ast.OnUpdateOpt) + } + parser.yyVAL.item = &ast.ReferenceDef{ + Table: yyS[yypt-5].item.(*ast.TableName), + IndexColNames: yyS[yypt-3].item.([]*ast.IndexColName), + OnDelete: onDeleteOpt, + OnUpdate: onUpdateOpt, + } + } + case 116: + { + parser.yyVAL.item = &ast.OnDeleteOpt{} + } + case 117: + { + parser.yyVAL.item = &ast.OnDeleteOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} + } + case 118: + { + parser.yyVAL.item = &ast.OnUpdateOpt{} + } + case 119: + { + parser.yyVAL.item = &ast.OnUpdateOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} + } + case 120: + { + parser.yyVAL.item = ast.ReferOptionRestrict + } + case 121: + { + parser.yyVAL.item = ast.ReferOptionCascade + } + case 122: + { + parser.yyVAL.item = ast.ReferOptionSetNull + } + case 123: + { + parser.yyVAL.item = ast.ReferOptionNoAction + } + case 126: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } + case 127: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } + case 128: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } + case 136: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].expr) + } + case 137: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr(yyS[yypt-0].item)} + } + case 138: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(yyS[yypt-0].item)} + } + case 142: + { + var indexOption *ast.IndexOption + if yyS[yypt-1].item != nil { + indexOption = yyS[yypt-1].item.(*ast.IndexOption) + if indexOption.Tp == model.IndexTypeInvalid { + if yyS[yypt-7].item != nil { + indexOption.Tp = yyS[yypt-7].item.(model.IndexType) + } + } + } else { + indexOption = &ast.IndexOption{} + if yyS[yypt-7].item != nil { + indexOption.Tp = yyS[yypt-7].item.(model.IndexType) + } + } + parser.yyVAL.statement = &ast.CreateIndexStmt{ + Unique: yyS[yypt-10].item.(bool), + IndexName: yyS[yypt-8].ident, + Table: yyS[yypt-5].item.(*ast.TableName), + IndexColNames: yyS[yypt-3].item.([]*ast.IndexColName), + IndexOption: indexOption, + } + } + case 143: + { + parser.yyVAL.item = false + } + case 144: + { + parser.yyVAL.item = true + } + case 145: + { + //Order is parsed but just ignored as MySQL did + parser.yyVAL.item = &ast.IndexColName{Column: yyS[yypt-2].item.(*ast.ColumnName), Length: yyS[yypt-1].item.(int)} + } + case 146: + { + parser.yyVAL.item = []*ast.IndexColName{yyS[yypt-0].item.(*ast.IndexColName)} + } + case 147: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.IndexColName), yyS[yypt-0].item.(*ast.IndexColName)) + } + case 148: + { + parser.yyVAL.statement = &ast.CreateDatabaseStmt{ + IfNotExists: yyS[yypt-2].item.(bool), + Name: yyS[yypt-1].item.(string), + Options: yyS[yypt-0].item.([]*ast.DatabaseOption), + } + } + case 149: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 150: + { + parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: yyS[yypt-0].item.(string)} + } + case 151: + { + parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: yyS[yypt-0].item.(string)} + } + case 152: + { + parser.yyVAL.item = []*ast.DatabaseOption{} + } + case 154: + { + parser.yyVAL.item = []*ast.DatabaseOption{yyS[yypt-0].item.(*ast.DatabaseOption)} + } + case 155: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.DatabaseOption), yyS[yypt-0].item.(*ast.DatabaseOption)) + } + case 156: + { + stmt := yyS[yypt-5].item.(*ast.CreateTableStmt) + stmt.Table = yyS[yypt-6].item.(*ast.TableName) + stmt.IfNotExists = yyS[yypt-7].item.(bool) + stmt.Options = yyS[yypt-4].item.([]*ast.TableOption) + if yyS[yypt-3].item != nil { + stmt.Partition = yyS[yypt-3].item.(*ast.PartitionOptions) + } + stmt.OnDuplicate = yyS[yypt-2].item.(ast.OnDuplicateCreateTableSelectType) + stmt.Select = yyS[yypt-0].item.(*ast.CreateTableStmt).Select + parser.yyVAL.statement = stmt + } + case 157: + { + parser.yyVAL.statement = &ast.CreateTableStmt{ + Table: yyS[yypt-1].item.(*ast.TableName), + ReferTable: yyS[yypt-0].item.(*ast.TableName), + IfNotExists: yyS[yypt-2].item.(bool), + } + } + case 160: + { + parser.yyVAL.item = nil + } + case 161: + { + parser.yyVAL.item = nil + } + case 162: + { + parser.yyVAL.item = nil + } + case 163: + { + var defs []*ast.PartitionDefinition + if yyS[yypt-0].item != nil { + defs = yyS[yypt-0].item.([]*ast.PartitionDefinition) + } + parser.yyVAL.item = &ast.PartitionOptions{ + Tp: model.PartitionTypeRange, + Expr: yyS[yypt-4].expr.(ast.ExprNode), + Definitions: defs, + } + } + case 164: + { + var defs []*ast.PartitionDefinition + if yyS[yypt-0].item != nil { + defs = yyS[yypt-0].item.([]*ast.PartitionDefinition) + } + parser.yyVAL.item = &ast.PartitionOptions{ + Tp: model.PartitionTypeRange, + ColumnNames: yyS[yypt-3].item.([]*ast.ColumnName), + Definitions: defs, + } + } + case 172: + { + parser.yyVAL.item = nil + } + case 173: + { + parser.yyVAL.item = yyS[yypt-1].item.([]*ast.PartitionDefinition) + } + case 174: + { + parser.yyVAL.item = []*ast.PartitionDefinition{yyS[yypt-0].item.(*ast.PartitionDefinition)} + } + case 175: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PartitionDefinition), yyS[yypt-0].item.(*ast.PartitionDefinition)) + } + case 176: + { + partDef := &ast.PartitionDefinition{ + Name: model.NewCIStr(yyS[yypt-2].ident), + } + switch yyS[yypt-1].item.(type) { + case []ast.ExprNode: + partDef.LessThan = yyS[yypt-1].item.([]ast.ExprNode) + case ast.ExprNode: + partDef.LessThan = make([]ast.ExprNode, 1) + partDef.LessThan[0] = yyS[yypt-1].item.(ast.ExprNode) + } + + if comment, ok := yyS[yypt-0].item.(string); ok { + partDef.Comment = comment + } + parser.yyVAL.item = partDef + } + case 177: + { + parser.yyVAL.item = nil + } + case 178: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 179: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 180: + { + if yyS[yypt-1].item != nil { + parser.yyVAL.item = yyS[yypt-1].item + } else { + parser.yyVAL.item = yyS[yypt-0].item + } + } + case 181: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 182: + { + parser.yyVAL.item = nil + } + case 183: + { + parser.yyVAL.item = nil + } + case 184: + { + parser.yyVAL.item = nil + } + case 185: + { + parser.yyVAL.item = &ast.MaxValueExpr{} + } + case 186: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 187: + { + parser.yyVAL.item = ast.OnDuplicateCreateTableSelectError + } + case 188: + { + parser.yyVAL.item = ast.OnDuplicateCreateTableSelectIgnore + } + case 189: + { + parser.yyVAL.item = ast.OnDuplicateCreateTableSelectReplace + } + case 192: + { + parser.yyVAL.item = &ast.CreateTableStmt{} + } + case 193: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement} + } + case 194: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement} + } + case 195: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].expr} + } + case 196: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 197: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 198: + { + startOffset := parser.startOffset(&yyS[yypt-1]) + selStmt := yyS[yypt-1].statement.(*ast.SelectStmt) + selStmt.SetText(string(parser.src[startOffset:])) + x := &ast.CreateViewStmt{ + OrReplace: yyS[yypt-9].item.(bool), + ViewName: yyS[yypt-4].item.(*ast.TableName), + Select: selStmt, + } + if yyS[yypt-3].item != nil { + x.Cols = yyS[yypt-3].item.([]model.CIStr) + } + parser.yyVAL.statement = x + } + case 199: + { + parser.yyVAL.item = false + } + case 200: + { + parser.yyVAL.item = true + } + case 201: + { + parser.yyVAL.item = "UNDEFINED" + } + case 202: + { + parser.yyVAL.item = strings.ToUpper(yyS[yypt-0].ident) + } + case 203: + { + parser.yyVAL.item = strings.ToUpper(yyS[yypt-0].ident) + } + case 204: + { + parser.yyVAL.item = strings.ToUpper(yyS[yypt-0].ident) + } + case 205: + { + parser.yyVAL.item = nil + } + case 206: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 207: + { + parser.yyVAL.item = "DEFINER" + } + case 208: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 209: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 210: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) + } + case 211: + { + parser.yyVAL.item = nil + } + case 212: + { + parser.yyVAL.item = yyS[yypt-1].item.([]model.CIStr) + } + case 213: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 214: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) + } + case 215: + { + parser.yyVAL.item = nil + } + case 216: + { + parser.yyVAL.item = yyS[yypt-2].ident + } + case 217: + { + parser.yyVAL.item = yyS[yypt-2].ident + } + case 218: + { + parser.yyVAL.statement = &ast.DoStmt{ + Exprs: yyS[yypt-0].item.([]ast.ExprNode), + } + } + case 219: + { + // Single Table + tn := yyS[yypt-4].item.(*ast.TableName) + tn.IndexHints = yyS[yypt-3].item.([]*ast.IndexHint) + join := &ast.Join{Left: &ast.TableSource{Source: tn}, Right: nil} + x := &ast.DeleteStmt{ + TableRefs: &ast.TableRefsClause{TableRefs: join}, + Priority: yyS[yypt-8].item.(mysql.PriorityEnum), + Quick: yyS[yypt-7].item.(bool), + IgnoreErr: yyS[yypt-6].item.(bool), + } + if yyS[yypt-2].item != nil { + x.Where = yyS[yypt-2].item.(ast.ExprNode) + } + if yyS[yypt-1].item != nil { + x.Order = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + x.Limit = yyS[yypt-0].item.(*ast.Limit) + } + + parser.yyVAL.statement = x + } + case 220: + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: yyS[yypt-6].item.(mysql.PriorityEnum), + Quick: yyS[yypt-5].item.(bool), + IgnoreErr: yyS[yypt-4].item.(bool), + IsMultiTable: true, + BeforeFrom: true, + Tables: &ast.DeleteTableList{Tables: yyS[yypt-3].item.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-1].item.(*ast.Join)}, + } + if yyS[yypt-7].item != nil { + x.TableHints = yyS[yypt-7].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + x.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = x + } + case 221: + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: yyS[yypt-7].item.(mysql.PriorityEnum), + Quick: yyS[yypt-6].item.(bool), + IgnoreErr: yyS[yypt-5].item.(bool), + IsMultiTable: true, + Tables: &ast.DeleteTableList{Tables: yyS[yypt-3].item.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-1].item.(*ast.Join)}, + } + if yyS[yypt-8].item != nil { + x.TableHints = yyS[yypt-8].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + x.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = x + } + case 223: + { + parser.yyVAL.statement = &ast.DropDatabaseStmt{IfExists: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].item.(string)} + } + case 224: + { + parser.yyVAL.statement = &ast.DropIndexStmt{IfExists: yyS[yypt-3].item.(bool), IndexName: yyS[yypt-2].ident, Table: yyS[yypt-0].item.(*ast.TableName)} + } + case 225: + { + parser.yyVAL.statement = &ast.DropTableStmt{Tables: yyS[yypt-1].item.([]*ast.TableName)} + } + case 226: + { + parser.yyVAL.statement = &ast.DropTableStmt{IfExists: true, Tables: yyS[yypt-1].item.([]*ast.TableName)} + } + case 227: + { + parser.yyVAL.statement = &ast.DoStmt{} + } + case 228: + { + parser.yyVAL.statement = &ast.DropUserStmt{IfExists: false, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} + } + case 229: + { + parser.yyVAL.statement = &ast.DropUserStmt{IfExists: true, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} + } + case 230: + { + parser.yyVAL.statement = &ast.DropStatsStmt{Table: yyS[yypt-0].item.(*ast.TableName)} + } + case 238: + { + parser.yyVAL.statement = nil + } + case 239: + { + parser.yyVAL.statement = &ast.TraceStmt{ + Stmt: yyS[yypt-0].statement, + Format: "row", + } + } + case 243: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-0].item.(*ast.TableName), + }, + } + } + case 244: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + Column: yyS[yypt-0].item.(*ast.ColumnName), + }, + } + } + case 245: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: "row", + } + } + case 246: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: yyS[yypt-1].ident, + } + } + case 247: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: "row", + Analyze: true, + } + } + case 248: + { + parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) + } + case 250: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.expr = &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: yyS[yypt-0].expr, + } + } + case 251: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 252: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 253: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 254: + { + expr, ok := yyS[yypt-0].expr.(*ast.ExistsSubqueryExpr) + if ok { + expr.Not = true + parser.yyVAL.expr = yyS[yypt-0].expr + } else { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} + } + } + case 255: + { + parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(1)} + } + case 256: + { + parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(0)} + } + case 257: + { + /* https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_is */ + parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 259: + { + parser.yyVAL.expr = &ast.MaxValueExpr{} + } + case 260: + { + parser.yyVAL.expr = yyS[yypt-0].expr + } + case 265: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 266: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 267: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 268: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 269: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 271: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 272: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 273: + { + expr := ast.NewValueExpr(yyS[yypt-0].item) + parser.yyVAL.item = []ast.ExprNode{expr} + } + case 274: + { + parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 275: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-1].item.(opcode.Op), L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 276: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.MultiRows = true + parser.yyVAL.expr = &ast.CompareSubqueryExpr{Op: yyS[yypt-2].item.(opcode.Op), L: yyS[yypt-3].expr, R: sq, All: yyS[yypt-1].item.(bool)} + } + case 277: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + variable := &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: yyS[yypt-0].expr, + } + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-3].item.(opcode.Op), L: yyS[yypt-4].expr, R: variable} + } + case 279: + { + parser.yyVAL.item = opcode.GE + } + case 280: + { + parser.yyVAL.item = opcode.GT + } + case 281: + { + parser.yyVAL.item = opcode.LE + } + case 282: + { + parser.yyVAL.item = opcode.LT + } + case 283: + { + parser.yyVAL.item = opcode.NE + } + case 284: + { + parser.yyVAL.item = opcode.NE + } + case 285: + { + parser.yyVAL.item = opcode.EQ + } + case 286: + { + parser.yyVAL.item = opcode.NullEQ + } + case 287: + { + parser.yyVAL.item = true + } + case 288: + { + parser.yyVAL.item = false + } + case 289: + { + parser.yyVAL.item = true + } + case 290: + { + parser.yyVAL.item = false + } + case 291: + { + parser.yyVAL.item = true + } + case 292: + { + parser.yyVAL.item = false + } + case 293: + { + parser.yyVAL.item = true + } + case 294: + { + parser.yyVAL.item = false + } + case 295: + { + parser.yyVAL.item = true + } + case 296: + { + parser.yyVAL.item = false + } + case 297: + { + parser.yyVAL.item = false + } + case 298: + { + parser.yyVAL.item = false + } + case 299: + { + parser.yyVAL.item = true + } + case 300: + { + parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-4].expr, Not: !yyS[yypt-3].item.(bool), List: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 301: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.MultiRows = true + parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), Sel: sq} + } + case 302: + { + parser.yyVAL.expr = &ast.BetweenExpr{ + Expr: yyS[yypt-4].expr, + Left: yyS[yypt-2].expr, + Right: yyS[yypt-0].expr, + Not: !yyS[yypt-3].item.(bool), + } + } + case 303: + { + escape := yyS[yypt-0].item.(string) + if len(escape) > 1 { + yylex.Errorf("Incorrect arguments %s to ESCAPE", escape) + return 1 + } else if len(escape) == 0 { + escape = "\\" + } + parser.yyVAL.expr = &ast.PatternLikeExpr{ + Expr: yyS[yypt-3].expr, + Pattern: yyS[yypt-1].expr, + Not: !yyS[yypt-2].item.(bool), + Escape: escape[0], + } + } + case 304: + { + parser.yyVAL.expr = &ast.PatternRegexpExpr{Expr: yyS[yypt-2].expr, Pattern: yyS[yypt-0].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 308: + { + parser.yyVAL.item = "\\" + } + case 309: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 310: + { + parser.yyVAL.item = &ast.SelectField{WildCard: &ast.WildCardField{}} + } + case 311: + { + wildCard := &ast.WildCardField{Table: model.NewCIStr(yyS[yypt-2].ident)} + parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} + } + case 312: + { + wildCard := &ast.WildCardField{Schema: model.NewCIStr(yyS[yypt-4].ident), Table: model.NewCIStr(yyS[yypt-2].ident)} + parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} + } + case 313: + { + expr := yyS[yypt-1].expr + asName := yyS[yypt-0].item.(string) + parser.yyVAL.item = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } + case 314: + { + /* + * ODBC escape syntax. + * See https://dev.mysql.com/doc/refman/5.7/en/expressions.html + */ + expr := yyS[yypt-2].expr + asName := yyS[yypt-0].item.(string) + parser.yyVAL.item = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } + case 315: + { + parser.yyVAL.item = "" + } + case 316: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 317: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 318: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 319: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 320: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 321: + { + field := yyS[yypt-0].item.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + parser.yyVAL.item = []*ast.SelectField{field} + } + case 322: + { + + fl := yyS[yypt-2].item.([]*ast.SelectField) + last := fl[len(fl)-1] + if last.Expr != nil && last.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-1]) + last.SetText(parser.src[last.Offset:lastEnd]) + } + newField := yyS[yypt-0].item.(*ast.SelectField) + newField.Offset = parser.startOffset(&yyS[yypt]) + parser.yyVAL.item = append(fl, newField) + } + case 323: + { + parser.yyVAL.item = &ast.GroupByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + } + case 324: + { + parser.yyVAL.item = nil + } + case 325: + { + parser.yyVAL.item = &ast.HavingClause{Expr: yyS[yypt-0].expr} + } + case 326: + { + parser.yyVAL.item = false + } + case 327: + { + parser.yyVAL.item = true + } + case 328: + { + parser.yyVAL.item = false + } + case 329: + { + parser.yyVAL.item = true + } + case 330: + { + parser.yyVAL.item = false + } + case 331: + { + parser.yyVAL.item = true + } + case 332: + { + parser.yyVAL.item = "" + } + case 333: + { + //"index name" + parser.yyVAL.item = yyS[yypt-0].ident + } + case 334: + { + parser.yyVAL.item = nil + } + case 335: + { + // Merge the options + if yyS[yypt-1].item == nil { + parser.yyVAL.item = yyS[yypt-0].item + } else { + opt1 := yyS[yypt-1].item.(*ast.IndexOption) + opt2 := yyS[yypt-0].item.(*ast.IndexOption) + if len(opt2.Comment) > 0 { + opt1.Comment = opt2.Comment + } else if opt2.Tp != 0 { + opt1.Tp = opt2.Tp + } + parser.yyVAL.item = opt1 + } + } + case 336: + { + parser.yyVAL.item = &ast.IndexOption{ + // TODO bug should be fix here! + // KeyBlockSize: $1.(uint64), + } + } + case 337: + { + parser.yyVAL.item = &ast.IndexOption{ + Tp: yyS[yypt-0].item.(model.IndexType), + } + } + case 338: + { + parser.yyVAL.item = &ast.IndexOption{ + Comment: yyS[yypt-0].ident, + } + } + case 339: + { + parser.yyVAL.item = model.IndexTypeBtree + } + case 340: + { + parser.yyVAL.item = model.IndexTypeHash + } + case 341: + { + parser.yyVAL.item = nil + } + case 342: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 548: + { + x := yyS[yypt-1].item.(*ast.InsertStmt) + x.Priority = yyS[yypt-5].item.(mysql.PriorityEnum) + x.IgnoreErr = yyS[yypt-4].item.(bool) + // Wraps many layers here so that it can be processed the same way as select statement. + ts := &ast.TableSource{Source: yyS[yypt-2].item.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + if yyS[yypt-0].item != nil { + x.OnDuplicate = yyS[yypt-0].item.([]*ast.Assignment) + } + parser.yyVAL.statement = x + } + case 551: + { + parser.yyVAL.item = &ast.InsertStmt{ + Columns: yyS[yypt-3].item.([]*ast.ColumnName), + Lists: yyS[yypt-0].item.([][]ast.ExprNode), + } + } + case 552: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(*ast.SelectStmt)} + } + case 553: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-4].item.([]*ast.ColumnName), Select: yyS[yypt-1].statement.(*ast.SelectStmt)} + } + case 554: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(*ast.UnionStmt)} + } + case 555: + { + parser.yyVAL.item = &ast.InsertStmt{Lists: yyS[yypt-0].item.([][]ast.ExprNode)} + } + case 556: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-1].statement.(*ast.SelectStmt)} + } + case 557: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(*ast.SelectStmt)} + } + case 558: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(*ast.UnionStmt)} + } + case 559: + { + parser.yyVAL.item = &ast.InsertStmt{Setlist: yyS[yypt-0].item.([]*ast.Assignment)} + } + case 562: + { + parser.yyVAL.item = [][]ast.ExprNode{yyS[yypt-0].item.([]ast.ExprNode)} + } + case 563: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([][]ast.ExprNode), yyS[yypt-0].item.([]ast.ExprNode)) + } + case 564: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 565: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 567: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 568: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 570: + { + parser.yyVAL.expr = &ast.DefaultExpr{} + } + case 571: + { + parser.yyVAL.item = &ast.Assignment{ + Column: yyS[yypt-2].item.(*ast.ColumnName), + Expr: yyS[yypt-0].expr, + } + } + case 572: + { + parser.yyVAL.item = []*ast.Assignment{} + } + case 573: + { + parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} + } + case 574: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) + } + case 575: + { + parser.yyVAL.item = nil + } + case 576: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 577: + { + x := yyS[yypt-0].item.(*ast.InsertStmt) + x.IsReplace = true + x.Priority = yyS[yypt-3].item.(mysql.PriorityEnum) + ts := &ast.TableSource{Source: yyS[yypt-1].item.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + parser.yyVAL.statement = x + } + case 578: + { + parser.yyVAL.ident = ast.DateLiteral + } + case 579: + { + parser.yyVAL.ident = ast.TimeLiteral + } + case 580: + { + parser.yyVAL.ident = ast.TimestampLiteral + } + case 581: + { + parser.yyVAL.expr = ast.NewValueExpr(false) + } + case 582: + { + parser.yyVAL.expr = ast.NewValueExpr(nil) + } + case 583: + { + parser.yyVAL.expr = ast.NewValueExpr(true) + } + case 584: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 585: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 586: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 587: + { + parser.yyVAL.expr = yyS[yypt-0].expr + } + case 588: + { + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + co, err := charset.GetDefaultCollation(yyS[yypt-1].ident) + if err != nil { + yylex.Errorf("Get collation error for charset: %s", yyS[yypt-1].ident) + return 1 + } + expr := ast.NewValueExpr(yyS[yypt-0].ident) + tp := expr.GetType() + tp.Charset = yyS[yypt-1].ident + tp.Collate = co + if tp.Collate == charset.CollationBin { + tp.Flag |= mysql.BinaryFlag + } + parser.yyVAL.expr = expr + } + case 589: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 590: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 591: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = expr + } + case 592: + { + valExpr := yyS[yypt-1].expr.(ast.ValueExpr) + strLit := valExpr.GetString() + expr := ast.NewValueExpr(strLit + yyS[yypt-0].ident) + // Fix #4239, use first string literal as projection name. + if valExpr.GetProjectionOffset() >= 0 { + expr.SetProjectionOffset(valExpr.GetProjectionOffset()) + } else { + expr.SetProjectionOffset(len(strLit)) + } + parser.yyVAL.expr = expr + } + case 593: + { + parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + } + case 594: + { + parser.yyVAL.item = []*ast.ByItem{yyS[yypt-0].item.(*ast.ByItem)} + } + case 595: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ByItem), yyS[yypt-0].item.(*ast.ByItem)) + } + case 596: + { + expr := yyS[yypt-1].expr + valueExpr, ok := expr.(ast.ValueExpr) + if ok { + position, isPosition := valueExpr.GetValue().(int64) + if isPosition { + expr = &ast.PositionExpr{N: int(position)} + } + } + parser.yyVAL.item = &ast.ByItem{Expr: expr, Desc: yyS[yypt-0].item.(bool)} + } + case 597: + { + parser.yyVAL.item = false // ASC by default + } + case 598: + { + parser.yyVAL.item = false + } + case 599: + { + parser.yyVAL.item = true + } + case 600: + { + parser.yyVAL.item = nil + } + case 601: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 602: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Or, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 603: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.And, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 604: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 605: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 606: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Plus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 607: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Minus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 608: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_ADD"), + Args: []ast.ExprNode{ + yyS[yypt-4].expr, + yyS[yypt-1].expr, + ast.NewValueExpr(yyS[yypt-0].ident), + }, + } + } + case 609: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_SUB"), + Args: []ast.ExprNode{ + yyS[yypt-4].expr, + yyS[yypt-1].expr, + ast.NewValueExpr(yyS[yypt-0].ident), + }, + } + } + case 610: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mul, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 611: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Div, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 612: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 613: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 614: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 615: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Xor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 617: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 618: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr(yyS[yypt-2].ident), + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 619: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr(yyS[yypt-2].ident), + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 620: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Schema: model.NewCIStr(yyS[yypt-4].ident), + Table: model.NewCIStr(yyS[yypt-2].ident), + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 625: + { + // TODO: Create a builtin function hold expr and collation. When do evaluation, convert expr result using the collation. + parser.yyVAL.expr = yyS[yypt-2].expr + } + case 627: + { + parser.yyVAL.expr = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + case 630: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} + } + case 631: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: yyS[yypt-0].expr} + } + case 632: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: yyS[yypt-0].expr} + } + case 633: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: yyS[yypt-0].expr} + } + case 634: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.Concat), Args: []ast.ExprNode{yyS[yypt-2].expr, yyS[yypt-0].expr}} + } + case 635: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} + } + case 637: + { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.endOffset(&yyS[yypt]) + expr := yyS[yypt-1].expr + expr.SetText(parser.src[startOffset:endOffset]) + parser.yyVAL.expr = &ast.ParenthesesExpr{Expr: expr} + } + case 638: + { + values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) + parser.yyVAL.expr = &ast.RowExpr{Values: values} + } + case 639: + { + values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) + parser.yyVAL.expr = &ast.RowExpr{Values: values} + } + case 640: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.Exists = true + parser.yyVAL.expr = &ast.ExistsSubqueryExpr{Sel: sq} + } + case 641: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary + x := types.NewFieldType(mysql.TypeString) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-0].expr, + Tp: x, + FunctionType: ast.CastBinaryOperator, + } + } + case 642: + { + /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ + tp := yyS[yypt-1].item.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-3].expr, + Tp: tp, + FunctionType: ast.CastFunction, + } + } + case 643: + { + x := &ast.CaseExpr{WhenClauses: yyS[yypt-2].item.([]*ast.WhenClause)} + if yyS[yypt-3].expr != nil { + x.Value = yyS[yypt-3].expr + } + if yyS[yypt-1].item != nil { + x.ElseClause = yyS[yypt-1].item.(ast.ExprNode) + } + parser.yyVAL.expr = x + } + case 644: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + tp := yyS[yypt-1].item.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-3].expr, + Tp: tp, + FunctionType: ast.CastConvertFunction, + } + } + case 645: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + charset1 := ast.NewValueExpr(yyS[yypt-1].item) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, charset1}, + } + } + case 646: + { + parser.yyVAL.expr = &ast.DefaultExpr{Name: yyS[yypt-1].expr.(*ast.ColumnNameExpr).Name} + } + case 647: + { + parser.yyVAL.expr = &ast.ValuesExpr{Column: yyS[yypt-1].expr.(*ast.ColumnNameExpr)} + } + case 648: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} + } + case 649: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + extract := &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONUnquote), Args: []ast.ExprNode{extract}} + } + case 652: + { + parser.yyVAL.item = false + } + case 653: + { + parser.yyVAL.item = true + } + case 654: + { + parser.yyVAL.item = false + } + case 656: + { + parser.yyVAL.item = true + } + case 659: + { + parser.yyVAL.item = true + } + case 700: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 701: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 702: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident)} + } + case 703: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident)} + } + case 704: + { + args := []ast.ExprNode{} + if yyS[yypt-0].item != nil { + args = append(args, yyS[yypt-0].item.(ast.ExprNode)) + } + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident), Args: args} + } + case 705: + { + nilVal := ast.NewValueExpr(nil) + args := yyS[yypt-1].item.([]ast.ExprNode) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, nilVal), + } + } + case 706: + { + charset1 := ast.NewValueExpr(yyS[yypt-1].item) + args := yyS[yypt-3].item.([]ast.ExprNode) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, charset1), + } + } + case 707: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} + } + case 708: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} + } + case 709: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} + } + case 710: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.InsertFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 711: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-3].expr, R: yyS[yypt-1].expr} + } + case 712: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.PasswordFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 713: + { + // This is ODBC syntax for date and time literals. + // See: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html + expr := ast.NewValueExpr(yyS[yypt-1].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident), Args: []ast.ExprNode{expr}} + } + case 714: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 715: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 716: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{ + yyS[yypt-3].expr, + yyS[yypt-1].expr, + ast.NewValueExpr("DAY"), + }, + } + } + case 717: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ + yyS[yypt-5].expr, + yyS[yypt-2].expr, + ast.NewValueExpr(yyS[yypt-1].ident), + }, + } + } + case 718: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ + yyS[yypt-5].expr, + yyS[yypt-2].expr, + ast.NewValueExpr(yyS[yypt-1].ident), + }, + } + } + case 719: + { + timeUnit := ast.NewValueExpr(yyS[yypt-3].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{timeUnit, yyS[yypt-1].expr}, + } + } + case 720: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-3].ident), yyS[yypt-1].expr}, + } + } + case 721: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}} + } + case 722: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 723: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 724: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 725: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 726: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-5].ident), yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 727: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-5].ident), yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 728: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-3].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr}, + } + } + case 729: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr}, + } + } + case 730: + { + nilVal := ast.NewValueExpr(nil) + direction := ast.NewValueExpr(int(yyS[yypt-3].item.(ast.TrimDirectionType))) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, nilVal, direction}, + } + } + case 731: + { + direction := ast.NewValueExpr(int(yyS[yypt-4].item.(ast.TrimDirectionType))) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-6].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr, direction}, + } + } + case 732: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 733: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 734: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 735: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 740: + { + parser.yyVAL.item = ast.TrimBoth + } + case 741: + { + parser.yyVAL.item = ast.TrimLeading + } + case 742: + { + parser.yyVAL.item = ast.TrimTrailing + } + case 743: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}, Distinct: yyS[yypt-2].item.(bool)} + } + case 744: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 745: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 746: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 747: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 748: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 749: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 750: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: true} + } + case 751: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 752: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 753: + { + args := []ast.ExprNode{ast.NewValueExpr(1)} + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: args} + } + case 754: + { + args := yyS[yypt-3].item.([]ast.ExprNode) + args = append(args, yyS[yypt-1].item.(ast.ExprNode)) + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-6].ident, Args: args, Distinct: yyS[yypt-4].item.(bool)} + } + case 755: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}, Distinct: yyS[yypt-2].item.(bool)} + } + case 756: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}, Distinct: yyS[yypt-2].item.(bool)} + } + case 757: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}, Distinct: yyS[yypt-2].item.(bool)} + } + case 758: + { + parser.yyVAL.item = ast.NewValueExpr(",") + } + case 759: + { + parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].ident) + } + case 760: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 761: + { + parser.yyVAL.item = nil + } + case 762: + { + parser.yyVAL.item = nil + } + case 763: + { + expr := ast.NewValueExpr(yyS[yypt-1].item) + parser.yyVAL.item = expr + } + case 764: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 765: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 766: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 767: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 768: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 769: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 770: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 771: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 772: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 773: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 774: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 775: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 776: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 777: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 778: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 779: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 780: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 781: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 782: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 783: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 784: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 785: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 786: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 787: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 788: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 789: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 790: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 791: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 792: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 793: + { + parser.yyVAL.expr = nil + } + case 794: + { + parser.yyVAL.expr = yyS[yypt-0].expr + } + case 795: + { + parser.yyVAL.item = []*ast.WhenClause{yyS[yypt-0].item.(*ast.WhenClause)} + } + case 796: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.WhenClause), yyS[yypt-0].item.(*ast.WhenClause)) + } + case 797: + { + parser.yyVAL.item = &ast.WhenClause{ + Expr: yyS[yypt-2].expr, + Result: yyS[yypt-0].expr, + } + } + case 798: + { + parser.yyVAL.item = nil + } + case 799: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 800: + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = yyS[yypt-0].item.(int) // TODO: Flen should be the flen of expression + if x.Flen != types.UnspecifiedLength { + x.Tp = mysql.TypeString + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 801: + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = yyS[yypt-1].item.(int) // TODO: Flen should be the flen of expression + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + if x.Charset == "" { + x.Charset = charset.CharsetUTF8 + x.Collate = charset.CollationUTF8 + } + parser.yyVAL.item = x + } + case 802: + { + x := types.NewFieldType(mysql.TypeDate) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 803: + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 804: + { + fopt := yyS[yypt-0].item.(*ast.FloatOpt) + x := types.NewFieldType(mysql.TypeNewDecimal) + x.Flen = fopt.Flen + x.Decimal = fopt.Decimal + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 805: + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 806: + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 807: + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Flag |= mysql.UnsignedFlag | mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + parser.yyVAL.item = x + } + case 808: + { + x := types.NewFieldType(mysql.TypeJSON) + x.Flag |= mysql.BinaryFlag | (mysql.ParseToJSONFlag) + x.Charset = charset.CharsetUTF8 + x.Collate = charset.CollationUTF8 + parser.yyVAL.item = x + } + case 809: + { + parser.yyVAL.item = mysql.NoPriority + } + case 810: + { + parser.yyVAL.item = mysql.LowPriority + } + case 811: + { + parser.yyVAL.item = mysql.HighPriority + } + case 812: + { + parser.yyVAL.item = mysql.DelayedPriority + } + case 813: + { + parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 814: + { + parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 815: + { + tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} + parser.yyVAL.item = tbl + } + case 816: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) + } + case 817: + { + parser.yyVAL.item = false + } + case 818: + { + parser.yyVAL.item = true + } + case 819: + { + var sqlText string + var sqlVar *ast.VariableExpr + switch yyS[yypt-0].item.(type) { + case string: + sqlText = yyS[yypt-0].item.(string) + case *ast.VariableExpr: + sqlVar = yyS[yypt-0].item.(*ast.VariableExpr) + } + parser.yyVAL.statement = &ast.PrepareStmt{ + Name: yyS[yypt-2].ident, + SQLText: sqlText, + SQLVar: sqlVar, + } + } + case 820: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 821: + { + parser.yyVAL.item = yyS[yypt-0].expr.(interface{}) + } + case 822: + { + parser.yyVAL.statement = &ast.ExecuteStmt{Name: yyS[yypt-0].ident} + } + case 823: + { + parser.yyVAL.statement = &ast.ExecuteStmt{ + Name: yyS[yypt-2].ident, + UsingVars: yyS[yypt-0].item.([]ast.ExprNode), + } + } + case 824: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 825: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 826: + { + parser.yyVAL.statement = &ast.DeallocateStmt{Name: yyS[yypt-0].ident} + } + case 829: + { + parser.yyVAL.statement = &ast.RollbackStmt{} + } + case 830: + { + st := &ast.SelectStmt{ + SelectStmtOpts: yyS[yypt-1].item.(*ast.SelectStmtOpts), + Distinct: yyS[yypt-1].item.(*ast.SelectStmtOpts).Distinct, + Fields: yyS[yypt-0].item.(*ast.FieldList), + } + parser.yyVAL.item = st + } + case 831: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := yyS[yypt-2].offset - 1 + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if yyS[yypt-1].item != nil { + st.Where = yyS[yypt-1].item.(ast.ExprNode) + } + + if yyS[yypt-0].item != nil { + st.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) + } + } + case 832: + { + st := yyS[yypt-5].item.(*ast.SelectStmt) + st.From = yyS[yypt-3].item.(*ast.TableRefsClause) + if st.SelectStmtOpts.TableHints != nil { + st.TableHints = st.SelectStmtOpts.TableHints + } + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-4]) + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if yyS[yypt-2].item != nil { + st.Where = yyS[yypt-2].item.(ast.ExprNode) + } + if yyS[yypt-1].item != nil { + st.GroupBy = yyS[yypt-1].item.(*ast.GroupByClause) + } + if yyS[yypt-0].item != nil { + st.Having = yyS[yypt-0].item.(*ast.HavingClause) + } + parser.yyVAL.item = st + } + case 833: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + src := parser.src + var lastEnd int + if yyS[yypt-2].item != nil { + lastEnd = yyS[yypt-2].offset - 1 + } else if yyS[yypt-1].item != nil { + lastEnd = yyS[yypt-1].offset - 1 + } else if yyS[yypt-0].item != ast.SelectLockNone { + lastEnd = yyS[yypt].offset - 1 + } else { + lastEnd = len(src) + if src[lastEnd-1] == ';' { + lastEnd-- + } + } + lastField.SetText(src[lastField.Offset:lastEnd]) + } + if yyS[yypt-2].item != nil { + st.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + st.Limit = yyS[yypt-1].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 834: + { + st := yyS[yypt-2].item.(*ast.SelectStmt) + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + if yyS[yypt-1].item != nil { + st.Limit = yyS[yypt-1].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 835: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + if yyS[yypt-2].item != nil { + st.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + st.Limit = yyS[yypt-1].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 837: + { + parser.yyVAL.item = &ast.TableRefsClause{TableRefs: yyS[yypt-0].item.(*ast.Join)} + } + case 838: + { + if j, ok := yyS[yypt-0].item.(*ast.Join); ok { + // if $1 is Join, use it directly + parser.yyVAL.item = j + } else { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-0].item.(ast.ResultSetNode), Right: nil} + } + } + case 839: + { + /* from a, b is default cross join */ + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: ast.CrossJoin} + } + case 840: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 841: + { + /* + * ODBC escape syntax for outer join is { OJ join_table } + * Use an Identifier for OJ + */ + parser.yyVAL.item = yyS[yypt-1].item + } + case 842: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 843: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 844: + { + tn := yyS[yypt-2].item.(*ast.TableName) + tn.IndexHints = yyS[yypt-0].item.([]*ast.IndexHint) + parser.yyVAL.item = &ast.TableSource{Source: tn, AsName: yyS[yypt-1].item.(model.CIStr)} + } + case 845: + { + st := yyS[yypt-2].statement.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(st, endOffset) + parser.yyVAL.item = &ast.TableSource{Source: yyS[yypt-2].statement.(*ast.SelectStmt), AsName: yyS[yypt-0].item.(model.CIStr)} + } + case 846: + { + parser.yyVAL.item = &ast.TableSource{Source: yyS[yypt-2].statement.(*ast.UnionStmt), AsName: yyS[yypt-0].item.(model.CIStr)} + } + case 847: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 848: + { + parser.yyVAL.item = model.CIStr{} + } + case 849: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 850: + { + parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) + } + case 851: + { + parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) + } + case 852: + { + parser.yyVAL.item = ast.HintUse + } + case 853: + { + parser.yyVAL.item = ast.HintIgnore + } + case 854: + { + parser.yyVAL.item = ast.HintForce + } + case 855: + { + parser.yyVAL.item = ast.HintForScan + } + case 856: + { + parser.yyVAL.item = ast.HintForJoin + } + case 857: + { + parser.yyVAL.item = ast.HintForOrderBy + } + case 858: + { + parser.yyVAL.item = ast.HintForGroupBy + } + case 859: + { + parser.yyVAL.item = &ast.IndexHint{ + IndexNames: yyS[yypt-1].item.([]model.CIStr), + HintType: yyS[yypt-4].item.(ast.IndexHintType), + HintScope: yyS[yypt-3].item.(ast.IndexHintScope), + } + } + case 860: + { + var nameList []model.CIStr + parser.yyVAL.item = nameList + } + case 861: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 862: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) + } + case 863: + { + parser.yyVAL.item = []*ast.IndexHint{yyS[yypt-0].item.(*ast.IndexHint)} + } + case 864: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.IndexHint), yyS[yypt-0].item.(*ast.IndexHint)) + } + case 865: + { + var hintList []*ast.IndexHint + parser.yyVAL.item = hintList + } + case 866: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 867: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: ast.CrossJoin} + } + case 868: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-4].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: ast.CrossJoin, On: on} + } + case 869: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-4].item.(ast.ResultSetNode), Tp: ast.CrossJoin, Using: yyS[yypt-1].item.([]*ast.ColumnName)} + } + case 870: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: yyS[yypt-5].item.(ast.JoinType), On: on} + } + case 871: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-8].item.(ast.ResultSetNode), Right: yyS[yypt-4].item.(ast.ResultSetNode), Tp: yyS[yypt-7].item.(ast.JoinType), Using: yyS[yypt-1].item.([]*ast.ColumnName)} + } + case 872: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-3].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), NaturalJoin: true} + } + case 873: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-5].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: yyS[yypt-3].item.(ast.JoinType), NaturalJoin: true} + } + case 874: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), StraightJoin: true} + } + case 875: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-4].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), StraightJoin: true, On: on} + } + case 876: + { + parser.yyVAL.item = ast.LeftJoin + } + case 877: + { + parser.yyVAL.item = ast.RightJoin + } + case 883: + { + parser.yyVAL.item = nil + } + case 884: + { + parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ValueExpr)} + } + case 885: + { + parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].item) + } + case 886: + { + parser.yyVAL.item = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + case 887: + { + parser.yyVAL.item = nil + } + case 888: + { + parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ExprNode)} + } + case 889: + { + parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-2].item.(ast.ExprNode), Count: yyS[yypt-0].item.(ast.ExprNode)} + } + case 890: + { + parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-0].item.(ast.ExprNode), Count: yyS[yypt-2].item.(ast.ExprNode)} + } + case 891: + { + opt := &ast.SelectStmtOpts{} + if yyS[yypt-5].item != nil { + opt.TableHints = yyS[yypt-5].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-4].item != nil { + opt.Distinct = yyS[yypt-4].item.(bool) + } + if yyS[yypt-3].item != nil { + opt.Priority = yyS[yypt-3].item.(mysql.PriorityEnum) + } + if yyS[yypt-2].item != nil { + opt.SQLCache = yyS[yypt-2].item.(bool) + } + if yyS[yypt-1].item != nil { + opt.CalcFoundRows = yyS[yypt-1].item.(bool) + } + if yyS[yypt-0].item != nil { + opt.StraightJoin = yyS[yypt-0].item.(bool) + } + + parser.yyVAL.item = opt + } + case 892: + { + parser.yyVAL.item = nil + } + case 893: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 894: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 895: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) + } + case 896: + { + parser.yyVAL.item = []*ast.TableOptimizerHint{yyS[yypt-0].item.(*ast.TableOptimizerHint)} + } + case 897: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TableOptimizerHint), yyS[yypt-0].item.(*ast.TableOptimizerHint)) + } + case 898: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), Tables: yyS[yypt-1].item.([]model.CIStr)} + } + case 899: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), Tables: yyS[yypt-1].item.([]model.CIStr)} + } + case 900: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), Tables: yyS[yypt-1].item.([]model.CIStr)} + } + case 901: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), MaxExecutionTime: getUint64FromNUM(yyS[yypt-1].item)} + } + case 902: + { + parser.yyVAL.item = false + } + case 903: + { + parser.yyVAL.item = true + } + case 904: + { + parser.yyVAL.item = true + } + case 905: + { + parser.yyVAL.item = true + } + case 906: + { + parser.yyVAL.item = false + } + case 907: + { + parser.yyVAL.item = false + } + case 908: + { + parser.yyVAL.item = true + } + case 909: + { + parser.yyVAL.item = &ast.FieldList{Fields: yyS[yypt-0].item.([]*ast.SelectField)} + } + case 910: + { + parser.yyVAL.item = nil + } + case 912: + { + s := yyS[yypt-1].statement.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(s, endOffset) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: s} + } + case 913: + { + s := yyS[yypt-1].statement.(*ast.UnionStmt) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: s} + } + case 914: + { + parser.yyVAL.item = ast.SelectLockNone + } + case 915: + { + parser.yyVAL.item = ast.SelectLockForUpdate + } + case 916: + { + parser.yyVAL.item = ast.SelectLockInShareMode + } + case 917: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + union := yyS[yypt-6].item.(*ast.UnionStmt) + st.IsAfterUnionDistinct = yyS[yypt-4].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-2].item != nil { + union.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + union.Limit = yyS[yypt-1].item.(*ast.Limit) + } + if yyS[yypt-2].item == nil && yyS[yypt-1].item == nil { + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + } + parser.yyVAL.statement = union + } + case 918: + { + st := yyS[yypt-2].item.(*ast.SelectStmt) + union := yyS[yypt-5].item.(*ast.UnionStmt) + st.IsAfterUnionDistinct = yyS[yypt-3].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-4]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-1].item != nil { + union.Limit = yyS[yypt-1].item.(*ast.Limit) + } else { + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + } + parser.yyVAL.statement = union + } + case 919: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + union := yyS[yypt-6].item.(*ast.UnionStmt) + st.IsAfterUnionDistinct = yyS[yypt-4].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-2].item != nil { + union.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + union.Limit = yyS[yypt-1].item.(*ast.Limit) + } + if yyS[yypt-2].item == nil && yyS[yypt-1].item == nil { + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + } + parser.yyVAL.statement = union + } + case 920: + { + union := yyS[yypt-7].item.(*ast.UnionStmt) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-6]) + parser.setLastSelectFieldText(lastSelect, endOffset) + st := yyS[yypt-3].statement.(*ast.SelectStmt) + st.IsInBraces = true + st.IsAfterUnionDistinct = yyS[yypt-5].item.(bool) + endOffset = parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(st, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-1].item != nil { + union.OrderBy = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + union.Limit = yyS[yypt-0].item.(*ast.Limit) + } + parser.yyVAL.statement = union + } + case 921: + { + selectList := &ast.UnionSelectList{Selects: []*ast.SelectStmt{yyS[yypt-0].item.(*ast.SelectStmt)}} + parser.yyVAL.item = &ast.UnionStmt{ + SelectList: selectList, + } + } + case 922: + { + union := yyS[yypt-3].item.(*ast.UnionStmt) + st := yyS[yypt-0].item.(*ast.SelectStmt) + st.IsAfterUnionDistinct = yyS[yypt-1].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + parser.yyVAL.item = union + } + case 923: + { + parser.yyVAL.item = yyS[yypt-0].statement.(interface{}) + } + case 924: + { + st := yyS[yypt-1].statement.(*ast.SelectStmt) + st.IsInBraces = true + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(st, endOffset) + parser.yyVAL.item = yyS[yypt-1].statement + } + case 926: + { + parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} + } + case 927: + { + parser.yyVAL.statement = &ast.SetPwdStmt{Password: yyS[yypt-0].item.(string)} + } + case 928: + { + parser.yyVAL.statement = &ast.SetPwdStmt{User: yyS[yypt-2].item.(*auth.UserIdentity), Password: yyS[yypt-0].item.(string)} + } + case 929: + { + vars := yyS[yypt-0].item.([]*ast.VariableAssignment) + for _, v := range vars { + v.IsGlobal = true + } + parser.yyVAL.statement = &ast.SetStmt{Variables: vars} + } + case 930: + { + parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} + } + case 931: + { + assigns := yyS[yypt-0].item.([]*ast.VariableAssignment) + for i := 0; i < len(assigns); i++ { + if assigns[i].Name == "tx_isolation" { + // A special session variable that make setting tx_isolation take effect one time. + assigns[i].Name = "tx_isolation_one_shot" + } + } + parser.yyVAL.statement = &ast.SetStmt{Variables: assigns} + } + case 932: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = yyS[yypt-0].item + } else { + parser.yyVAL.item = []*ast.VariableAssignment{} + } + } + case 933: + { + if yyS[yypt-0].item != nil { + varAssigns := yyS[yypt-0].item.([]*ast.VariableAssignment) + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), varAssigns...) + } else { + parser.yyVAL.item = yyS[yypt-2].item + } + } + case 934: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr(yyS[yypt-0].ident) + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_isolation", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 935: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr("0") + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 936: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr("1") + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 937: + { + parser.yyVAL.ident = ast.RepeatableRead + } + case 938: + { + parser.yyVAL.ident = ast.ReadCommitted + } + case 939: + { + parser.yyVAL.ident = ast.ReadUncommitted + } + case 940: + { + parser.yyVAL.ident = ast.Serializable + } + case 941: + { + parser.yyVAL.expr = ast.NewValueExpr("ON") + } + case 943: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 944: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsGlobal: true, IsSystem: true} + } + case 945: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 946: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 947: + { + v := strings.ToLower(yyS[yypt-2].ident) + var isGlobal bool + if strings.HasPrefix(v, "@@global.") { + isGlobal = true + v = strings.TrimPrefix(v, "@@global.") + } else if strings.HasPrefix(v, "@@session.") { + v = strings.TrimPrefix(v, "@@session.") + } else if strings.HasPrefix(v, "@@local.") { + v = strings.TrimPrefix(v, "@@local.") + } else if strings.HasPrefix(v, "@@") { + v = strings.TrimPrefix(v, "@@") + } + parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr, IsGlobal: isGlobal, IsSystem: true} + } + case 948: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} + } + case 949: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} + } + case 950: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-0].item.(string)), + } + } + case 951: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-2].item.(string)), + } + } + case 952: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-2].item.(string)), + ExtendValue: ast.NewValueExpr(yyS[yypt-0].item.(string)), + } + } + case 953: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-0].item.(string)), + } + } + case 954: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 955: + { + parser.yyVAL.item = charset.CharsetBin + } + case 956: + { + parser.yyVAL.item = []*ast.VariableAssignment{} + } + case 957: + { + parser.yyVAL.item = []*ast.VariableAssignment{yyS[yypt-0].item.(*ast.VariableAssignment)} + } + case 958: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), yyS[yypt-0].item.(*ast.VariableAssignment)) + } + case 961: + { + v := strings.ToLower(yyS[yypt-0].ident) + var isGlobal bool + explicitScope := true + if strings.HasPrefix(v, "@@global.") { + isGlobal = true + v = strings.TrimPrefix(v, "@@global.") + } else if strings.HasPrefix(v, "@@session.") { + v = strings.TrimPrefix(v, "@@session.") + } else if strings.HasPrefix(v, "@@local.") { + v = strings.TrimPrefix(v, "@@local.") + } else if strings.HasPrefix(v, "@@") { + v, explicitScope = strings.TrimPrefix(v, "@@"), false + } + parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: isGlobal, IsSystem: true, ExplicitScope: explicitScope} + } + case 962: + { + v := yyS[yypt-0].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: false, IsSystem: false} + } + case 963: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-0].item.(string), Hostname: "%"} + } + case 964: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-2].item.(string), Hostname: yyS[yypt-0].item.(string)} + } + case 965: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-1].item.(string), Hostname: strings.TrimPrefix(yyS[yypt-0].ident, "@")} + } + case 966: + { + parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} + } + case 967: + { + parser.yyVAL.item = []*auth.UserIdentity{yyS[yypt-0].item.(*auth.UserIdentity)} + } + case 968: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.UserIdentity), yyS[yypt-0].item.(*auth.UserIdentity)) + } + case 969: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 970: + { + parser.yyVAL.item = yyS[yypt-1].item.(string) + } + case 971: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 972: + { + parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDL} + } + case 973: + { + parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDLJobs} + } + case 974: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminShowDDLJobs, + JobNumber: yyS[yypt-0].item.(int64), + } + } + case 975: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCheckTable, + Tables: yyS[yypt-0].item.([]*ast.TableName), + } + } + case 976: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCheckIndex, + Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, + Index: string(yyS[yypt-0].ident), + } + } + case 977: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminRecoverIndex, + Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, + Index: string(yyS[yypt-0].ident), + } + } + case 978: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCleanupIndex, + Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, + Index: string(yyS[yypt-0].ident), + } + } + case 979: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCheckIndexRange, + Tables: []*ast.TableName{yyS[yypt-2].item.(*ast.TableName)}, + Index: string(yyS[yypt-1].ident), + HandleRanges: yyS[yypt-0].item.([]ast.HandleRange), + } + } + case 980: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminChecksumTable, + Tables: yyS[yypt-0].item.([]*ast.TableName), + } + } + case 981: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCancelDDLJobs, + JobIDs: yyS[yypt-0].item.([]int64), + } + } + case 982: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminShowDDLJobQueries, + JobIDs: yyS[yypt-0].item.([]int64), + } + } + case 983: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminShowSlow, + ShowSlow: yyS[yypt-0].item.(*ast.ShowSlow), + } + } + case 984: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowRecent, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 985: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowTop, + Kind: ast.ShowSlowKindDefault, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 986: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowTop, + Kind: ast.ShowSlowKindInternal, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 987: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowTop, + Kind: ast.ShowSlowKindAll, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 988: + { + parser.yyVAL.item = []ast.HandleRange{yyS[yypt-0].item.(ast.HandleRange)} + } + case 989: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.HandleRange), yyS[yypt-0].item.(ast.HandleRange)) + } + case 990: + { + parser.yyVAL.item = ast.HandleRange{Begin: yyS[yypt-3].item.(int64), End: yyS[yypt-1].item.(int64)} + } + case 991: + { + parser.yyVAL.item = []int64{yyS[yypt-0].item.(int64)} + } + case 992: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]int64), yyS[yypt-0].item.(int64)) + } + case 993: + { + stmt := yyS[yypt-1].item.(*ast.ShowStmt) + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 994: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateTable, + Table: yyS[yypt-0].item.(*ast.TableName), + } + } + case 995: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateDatabase, + DBName: yyS[yypt-0].item.(string), + } + } + case 996: + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html + parser.yyVAL.statement = &ast.ShowStmt{Tp: ast.ShowGrants} + } + case 997: + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowGrants, + User: yyS[yypt-0].item.(*auth.UserIdentity), + } + } + case 998: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowMasterStatus, + } + } + case 999: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowProcessList, + Full: yyS[yypt-1].item.(bool), + } + } + case 1000: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsMeta, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1001: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsHistograms, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1002: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsBuckets, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1003: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsHealthy, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1004: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowProfiles, + } + } + case 1005: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowPrivileges, + } + } + case 1011: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowEngines} + } + case 1012: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowDatabases} + } + case 1013: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowCharset} + } + case 1014: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTables, + DBName: yyS[yypt-0].item.(string), + Full: yyS[yypt-2].item.(bool), + } + } + case 1015: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTableStatus, + DBName: yyS[yypt-0].item.(string), + } + } + case 1016: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowIndex, + Table: yyS[yypt-0].item.(*ast.TableName), + } + } + case 1017: + { + show := &ast.ShowStmt{ + Tp: ast.ShowIndex, + Table: &ast.TableName{Name: model.NewCIStr(yyS[yypt-2].ident), Schema: model.NewCIStr(yyS[yypt-0].ident)}, + } + parser.yyVAL.item = show + } + case 1018: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + DBName: yyS[yypt-0].item.(string), + Full: yyS[yypt-3].item.(bool), + } + } + case 1019: + { + // SHOW FIELDS is a synonym for SHOW COLUMNS. + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + DBName: yyS[yypt-0].item.(string), + Full: yyS[yypt-3].item.(bool), + } + } + case 1020: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings} + } + case 1021: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors} + } + case 1022: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowVariables, + GlobalScope: yyS[yypt-1].item.(bool), + } + } + case 1023: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowStatus, + GlobalScope: yyS[yypt-1].item.(bool), + } + } + case 1024: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowCollation, + } + } + case 1025: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTriggers, + DBName: yyS[yypt-0].item.(string), + } + } + case 1026: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowProcedureStatus, + } + } + case 1027: + { + // This statement is similar to SHOW PROCEDURE STATUS but for stored functions. + // See http://dev.mysql.com/doc/refman/5.7/en/show-function-status.html + // We do not support neither stored functions nor stored procedures. + // So we reuse show procedure status process logic. + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowProcedureStatus, + } + } + case 1028: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowEvents, + DBName: yyS[yypt-0].item.(string), + } + } + case 1029: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowPlugins, + } + } + case 1030: + { + parser.yyVAL.item = nil + } + case 1031: + { + parser.yyVAL.item = &ast.PatternLikeExpr{ + Pattern: yyS[yypt-0].expr, + Escape: '\\', + } + } + case 1032: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1033: + { + parser.yyVAL.item = false + } + case 1034: + { + parser.yyVAL.item = true + } + case 1035: + { + parser.yyVAL.item = false + } + case 1036: + { + parser.yyVAL.item = false + } + case 1037: + { + parser.yyVAL.item = true + } + case 1038: + { + parser.yyVAL.item = "" + } + case 1039: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 1040: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) + } + case 1041: + { + tmp := yyS[yypt-0].item.(*ast.FlushStmt) + tmp.NoWriteToBinLog = yyS[yypt-1].item.(bool) + parser.yyVAL.statement = tmp + } + case 1042: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushPrivileges, + } + } + case 1043: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushStatus, + } + } + case 1044: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushTables, + Tables: yyS[yypt-1].item.([]*ast.TableName), + ReadLock: yyS[yypt-0].item.(bool), + } + } + case 1045: + { + parser.yyVAL.item = false + } + case 1046: + { + parser.yyVAL.item = true + } + case 1047: + { + parser.yyVAL.item = true + } + case 1048: + { + parser.yyVAL.item = []*ast.TableName{} + } + case 1049: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1050: + { + parser.yyVAL.item = false + } + case 1051: + { + parser.yyVAL.item = true + } + case 1091: + { + // `(select 1)`; is a valid select statement + // TODO: This is used to fix issue #320. There may be a better solution. + parser.yyVAL.statement = yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(ast.StmtNode) + } + case 1110: + { + if yyS[yypt-0].statement != nil { + s := yyS[yypt-0].statement + if lexer, ok := yylex.(stmtTexter); ok { + s.SetText(lexer.stmtText()) + } + parser.result = append(parser.result, s) + } + } + case 1111: + { + if yyS[yypt-0].statement != nil { + s := yyS[yypt-0].statement + if lexer, ok := yylex.(stmtTexter); ok { + s.SetText(lexer.stmtText()) + } + parser.result = append(parser.result, s) + } + } + case 1112: + { + cst := yyS[yypt-0].item.(*ast.Constraint) + if yyS[yypt-1].item != nil { + cst.Name = yyS[yypt-1].item.(string) + } + parser.yyVAL.item = cst + } + case 1113: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.ColumnDef) + } + case 1114: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.Constraint) + } + case 1115: + { + /* Nothing to do now */ + parser.yyVAL.item = nil + } + case 1116: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = []interface{}{yyS[yypt-0].item.(interface{})} + } else { + parser.yyVAL.item = []interface{}{} + } + } + case 1117: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = append(yyS[yypt-2].item.([]interface{}), yyS[yypt-0].item) + } else { + parser.yyVAL.item = yyS[yypt-2].item + } + } + case 1118: + { + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + parser.yyVAL.item = &ast.CreateTableStmt{ + Cols: columnDefs, + Constraints: constraints, + } + } + case 1119: + { + tes := yyS[yypt-1].item.([]interface{}) + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + for _, te := range tes { + switch te := te.(type) { + case *ast.ColumnDef: + columnDefs = append(columnDefs, te) + case *ast.Constraint: + constraints = append(constraints, te) + } + } + parser.yyVAL.item = &ast.CreateTableStmt{ + Cols: columnDefs, + Constraints: constraints, + } + } + case 1120: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].item.(string)} + } + case 1121: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].item.(string)} + } + case 1122: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-0].item.(string)} + } + case 1123: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].item.(string)} + } + case 1124: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIncrement, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1125: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionComment, StrValue: yyS[yypt-0].ident} + } + case 1126: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAvgRowLength, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1127: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionConnection, StrValue: yyS[yypt-0].ident} + } + case 1128: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCheckSum, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1129: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPassword, StrValue: yyS[yypt-0].ident} + } + case 1130: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCompression, StrValue: yyS[yypt-0].ident} + } + case 1131: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionKeyBlockSize, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1132: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMaxRows, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1133: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMinRows, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1134: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDelayKeyWrite, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1135: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionRowFormat, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1136: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsPersistent} + } + case 1137: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionShardRowID, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1138: + { + // Parse it but will ignore it. + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPackKeys} + } + case 1141: + { + parser.yyVAL.item = []*ast.TableOption{} + } + case 1143: + { + parser.yyVAL.item = []*ast.TableOption{} + } + case 1145: + { + parser.yyVAL.item = []*ast.TableOption{yyS[yypt-0].item.(*ast.TableOption)} + } + case 1146: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TableOption), yyS[yypt-0].item.(*ast.TableOption)) + } + case 1147: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableOption), yyS[yypt-0].item.(*ast.TableOption)) + } + case 1150: + { + parser.yyVAL.statement = &ast.TruncateTableStmt{Table: yyS[yypt-0].item.(*ast.TableName)} + } + case 1151: + { + parser.yyVAL.item = ast.RowFormatDefault + } + case 1152: + { + parser.yyVAL.item = ast.RowFormatDynamic + } + case 1153: + { + parser.yyVAL.item = ast.RowFormatFixed + } + case 1154: + { + parser.yyVAL.item = ast.RowFormatCompressed + } + case 1155: + { + parser.yyVAL.item = ast.RowFormatRedundant + } + case 1156: + { + parser.yyVAL.item = ast.RowFormatCompact + } + case 1157: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1158: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1159: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1160: + { + // TODO: check flen 0 + x := types.NewFieldType(yyS[yypt-2].item.(byte)) + x.Flen = yyS[yypt-1].item.(int) + for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + parser.yyVAL.item = x + } + case 1161: + { + // TODO: check flen 0 + x := types.NewFieldType(yyS[yypt-1].item.(byte)) + x.Flen = 1 + for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + parser.yyVAL.item = x + } + case 1162: + { + fopt := yyS[yypt-1].item.(*ast.FloatOpt) + x := types.NewFieldType(yyS[yypt-2].item.(byte)) + x.Flen = fopt.Flen + x.Decimal = fopt.Decimal + for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + parser.yyVAL.item = x + } + case 1163: + { + fopt := yyS[yypt-1].item.(*ast.FloatOpt) + x := types.NewFieldType(yyS[yypt-2].item.(byte)) + x.Flen = fopt.Flen + if x.Tp == mysql.TypeFloat { + if x.Flen > 24 { + x.Tp = mysql.TypeDouble + } + } + x.Decimal = fopt.Decimal + for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + parser.yyVAL.item = x + } + case 1164: + { + x := types.NewFieldType(yyS[yypt-1].item.(byte)) + x.Flen = yyS[yypt-0].item.(int) + if x.Flen == types.UnspecifiedLength || x.Flen == 0 { + x.Flen = 1 + } else if x.Flen > 64 { + yylex.Errorf("invalid field length %d for bit type, must in [1, 64]", x.Flen) + } + parser.yyVAL.item = x + } + case 1165: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1166: + { + parser.yyVAL.item = mysql.TypeShort + } + case 1167: + { + parser.yyVAL.item = mysql.TypeInt24 + } + case 1168: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1169: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1170: + { + parser.yyVAL.item = mysql.TypeShort + } + case 1171: + { + parser.yyVAL.item = mysql.TypeInt24 + } + case 1172: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1173: + { + parser.yyVAL.item = mysql.TypeLonglong + } + case 1174: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1175: + { + parser.yyVAL.item = mysql.TypeLonglong + } + case 1176: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1177: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1181: + { + parser.yyVAL.item = mysql.TypeNewDecimal + } + case 1182: + { + parser.yyVAL.item = mysql.TypeNewDecimal + } + case 1183: + { + parser.yyVAL.item = mysql.TypeFloat + } + case 1184: + { + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + parser.yyVAL.item = mysql.TypeFloat + } else { + parser.yyVAL.item = mysql.TypeDouble + } + } + case 1185: + { + parser.yyVAL.item = mysql.TypeDouble + } + case 1186: + { + parser.yyVAL.item = mysql.TypeDouble + } + case 1187: + { + parser.yyVAL.item = mysql.TypeBit + } + case 1188: + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = yyS[yypt-2].item.(int) + x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset + x.Collate = yyS[yypt-0].item.(string) + if yyS[yypt-1].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1189: + { + x := types.NewFieldType(mysql.TypeString) + x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset + x.Collate = yyS[yypt-0].item.(string) + if yyS[yypt-1].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1190: + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = yyS[yypt-2].item.(int) + x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset + x.Collate = yyS[yypt-0].item.(string) + if yyS[yypt-1].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1191: + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = yyS[yypt-2].item.(int) + x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset + x.Collate = yyS[yypt-0].item.(string) + if yyS[yypt-1].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1192: + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = yyS[yypt-0].item.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1193: + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = yyS[yypt-0].item.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1194: + { + x := yyS[yypt-0].item.(*types.FieldType) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = yyS[yypt-0].item.(*types.FieldType) + } + case 1195: + { + x := yyS[yypt-2].item.(*types.FieldType) + x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset + x.Collate = yyS[yypt-0].item.(string) + if yyS[yypt-1].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1196: + { + x := types.NewFieldType(mysql.TypeEnum) + x.Elems = yyS[yypt-3].item.([]string) + x.Charset = yyS[yypt-1].item.(string) + x.Collate = yyS[yypt-0].item.(string) + parser.yyVAL.item = x + } + case 1197: + { + x := types.NewFieldType(mysql.TypeSet) + x.Elems = yyS[yypt-3].item.([]string) + x.Charset = yyS[yypt-1].item.(string) + x.Collate = yyS[yypt-0].item.(string) + parser.yyVAL.item = x + } + case 1198: + { + x := types.NewFieldType(mysql.TypeJSON) + x.Decimal = 0 + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + parser.yyVAL.item = x + } + case 1204: + { + x := types.NewFieldType(mysql.TypeTinyBlob) + parser.yyVAL.item = x + } + case 1205: + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = yyS[yypt-0].item.(int) + parser.yyVAL.item = x + } + case 1206: + { + x := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = x + } + case 1207: + { + x := types.NewFieldType(mysql.TypeLongBlob) + parser.yyVAL.item = x + } + case 1208: + { + x := types.NewFieldType(mysql.TypeTinyBlob) + parser.yyVAL.item = x + + } + case 1209: + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = yyS[yypt-0].item.(int) + parser.yyVAL.item = x + } + case 1210: + { + x := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = x + } + case 1211: + { + x := types.NewFieldType(mysql.TypeLongBlob) + parser.yyVAL.item = x + } + case 1212: + { + x := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = x + } + case 1213: + { + x := types.NewFieldType(mysql.TypeDate) + parser.yyVAL.item = x + } + case 1214: + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + parser.yyVAL.item = x + } + case 1215: + { + x := types.NewFieldType(mysql.TypeTimestamp) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + parser.yyVAL.item = x + } + case 1216: + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen = mysql.MaxDurationWidthNoFsp + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + parser.yyVAL.item = x + } + case 1217: + { + x := types.NewFieldType(mysql.TypeYear) + x.Flen = yyS[yypt-1].item.(int) + if x.Flen != types.UnspecifiedLength && x.Flen != 4 { + yylex.Errorf("Supports only YEAR or YEAR(4) column.") + return -1 + } + parser.yyVAL.item = x + } + case 1218: + { + parser.yyVAL.item = int(yyS[yypt-1].item.(uint64)) + } + case 1219: + { + parser.yyVAL.item = types.UnspecifiedLength + } + case 1220: + { + parser.yyVAL.item = yyS[yypt-0].item.(int) + } + case 1221: + { + parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: true} + } + case 1222: + { + parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: false} + } + case 1223: + { + parser.yyVAL.item = &ast.TypeOpt{IsZerofill: true, IsUnsigned: true} + } + case 1224: + { + parser.yyVAL.item = []*ast.TypeOpt{} + } + case 1225: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TypeOpt), yyS[yypt-0].item.(*ast.TypeOpt)) + } + case 1226: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: types.UnspecifiedLength, Decimal: types.UnspecifiedLength} + } + case 1227: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: yyS[yypt-0].item.(int), Decimal: types.UnspecifiedLength} + } + case 1228: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.FloatOpt) + } + case 1229: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: int(yyS[yypt-3].item.(uint64)), Decimal: int(yyS[yypt-1].item.(uint64))} + } + case 1230: + { + parser.yyVAL.item = false + } + case 1231: + { + parser.yyVAL.item = true + } + case 1232: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: false, + Charset: "", + } + } + case 1233: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: true, + Charset: yyS[yypt-0].item.(string), + } + } + case 1234: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: yyS[yypt-0].item.(bool), + Charset: yyS[yypt-1].item.(string), + } + } + case 1235: + { + parser.yyVAL.item = "" + } + case 1236: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 1239: + { + parser.yyVAL.item = "" + } + case 1240: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 1241: + { + parser.yyVAL.item = []string{yyS[yypt-0].ident} + } + case 1242: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) + } + case 1243: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1244: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1245: + { + var refs *ast.Join + if x, ok := yyS[yypt-5].item.(*ast.Join); ok { + refs = x + } else { + refs = &ast.Join{Left: yyS[yypt-5].item.(ast.ResultSetNode)} + } + st := &ast.UpdateStmt{ + Priority: yyS[yypt-7].item.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: refs}, + List: yyS[yypt-3].item.([]*ast.Assignment), + IgnoreErr: yyS[yypt-6].item.(bool), + } + if yyS[yypt-8].item != nil { + st.TableHints = yyS[yypt-8].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-2].item != nil { + st.Where = yyS[yypt-2].item.(ast.ExprNode) + } + if yyS[yypt-1].item != nil { + st.Order = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + st.Limit = yyS[yypt-0].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 1246: + { + st := &ast.UpdateStmt{ + Priority: yyS[yypt-5].item.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-3].item.(*ast.Join)}, + List: yyS[yypt-1].item.([]*ast.Assignment), + IgnoreErr: yyS[yypt-4].item.(bool), + } + if yyS[yypt-6].item != nil { + st.TableHints = yyS[yypt-6].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + st.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = st + } + case 1247: + { + parser.yyVAL.statement = &ast.UseStmt{DBName: yyS[yypt-0].item.(string)} + } + case 1248: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1249: + { + parser.yyVAL.item = nil + } + case 1250: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1253: + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-user.html + parser.yyVAL.statement = &ast.CreateUserStmt{ + IfNotExists: yyS[yypt-1].item.(bool), + Specs: yyS[yypt-0].item.([]*ast.UserSpec), + } + } + case 1254: + { + parser.yyVAL.statement = &ast.AlterUserStmt{ + IfExists: yyS[yypt-1].item.(bool), + Specs: yyS[yypt-0].item.([]*ast.UserSpec), + } + } + case 1255: + { + auth := &ast.AuthOption{ + AuthString: yyS[yypt-0].item.(string), + ByAuthString: true, + } + parser.yyVAL.statement = &ast.AlterUserStmt{ + IfExists: yyS[yypt-6].item.(bool), + CurrentAuth: auth, + } + } + case 1256: + { + userSpec := &ast.UserSpec{ + User: yyS[yypt-1].item.(*auth.UserIdentity), + } + if yyS[yypt-0].item != nil { + userSpec.AuthOpt = yyS[yypt-0].item.(*ast.AuthOption) + } + parser.yyVAL.item = userSpec + } + case 1257: + { + parser.yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} + } + case 1258: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) + } + case 1259: + { + parser.yyVAL.item = nil + } + case 1260: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthString: yyS[yypt-0].item.(string), + ByAuthString: true, + } + } + case 1261: + { + parser.yyVAL.item = nil + } + case 1262: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthString: yyS[yypt-0].item.(string), + ByAuthString: true, + } + } + case 1263: + { + parser.yyVAL.item = &ast.AuthOption{ + HashString: yyS[yypt-0].item.(string), + } + } + case 1264: + { + parser.yyVAL.item = &ast.AuthOption{ + HashString: yyS[yypt-0].item.(string), + } + } + case 1265: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1266: + { + parser.yyVAL.statement = &ast.GrantStmt{ + Privs: yyS[yypt-6].item.([]*ast.PrivElem), + ObjectType: yyS[yypt-4].item.(ast.ObjectTypeType), + Level: yyS[yypt-3].item.(*ast.GrantLevel), + Users: yyS[yypt-1].item.([]*ast.UserSpec), + WithGrant: yyS[yypt-0].item.(bool), + } + } + case 1267: + { + parser.yyVAL.item = false + } + case 1268: + { + parser.yyVAL.item = true + } + case 1269: + { + parser.yyVAL.item = false + } + case 1270: + { + parser.yyVAL.item = false + } + case 1271: + { + parser.yyVAL.item = false + } + case 1272: + { + parser.yyVAL.item = false + } + case 1273: + { + parser.yyVAL.item = &ast.PrivElem{ + Priv: yyS[yypt-0].item.(mysql.PrivilegeType), + } + } + case 1274: + { + parser.yyVAL.item = &ast.PrivElem{ + Priv: yyS[yypt-3].item.(mysql.PrivilegeType), + Cols: yyS[yypt-1].item.([]*ast.ColumnName), + } + } + case 1275: + { + parser.yyVAL.item = []*ast.PrivElem{yyS[yypt-0].item.(*ast.PrivElem)} + } + case 1276: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PrivElem), yyS[yypt-0].item.(*ast.PrivElem)) + } + case 1277: + { + parser.yyVAL.item = mysql.AllPriv + } + case 1278: + { + parser.yyVAL.item = mysql.AllPriv + } + case 1279: + { + parser.yyVAL.item = mysql.AlterPriv + } + case 1280: + { + parser.yyVAL.item = mysql.CreatePriv + } + case 1281: + { + parser.yyVAL.item = mysql.CreateUserPriv + } + case 1282: + { + parser.yyVAL.item = mysql.TriggerPriv + } + case 1283: + { + parser.yyVAL.item = mysql.DeletePriv + } + case 1284: + { + parser.yyVAL.item = mysql.DropPriv + } + case 1285: + { + parser.yyVAL.item = mysql.ProcessPriv + } + case 1286: + { + parser.yyVAL.item = mysql.ExecutePriv + } + case 1287: + { + parser.yyVAL.item = mysql.IndexPriv + } + case 1288: + { + parser.yyVAL.item = mysql.InsertPriv + } + case 1289: + { + parser.yyVAL.item = mysql.SelectPriv + } + case 1290: + { + parser.yyVAL.item = mysql.SuperPriv + } + case 1291: + { + parser.yyVAL.item = mysql.ShowDBPriv + } + case 1292: + { + parser.yyVAL.item = mysql.UpdatePriv + } + case 1293: + { + parser.yyVAL.item = mysql.GrantPriv + } + case 1294: + { + parser.yyVAL.item = mysql.ReferencesPriv + } + case 1295: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1296: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1297: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1298: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1299: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1300: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1301: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1302: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1303: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1304: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1305: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1306: + { + parser.yyVAL.item = ast.ObjectTypeNone + } + case 1307: + { + parser.yyVAL.item = ast.ObjectTypeTable + } + case 1308: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelDB, + } + } + case 1309: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelGlobal, + } + } + case 1310: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelDB, + DBName: yyS[yypt-2].ident, + } + } + case 1311: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelTable, + DBName: yyS[yypt-2].ident, + TableName: yyS[yypt-0].ident, + } + } + case 1312: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelTable, + TableName: yyS[yypt-0].ident, + } + } + case 1313: + { + parser.yyVAL.statement = &ast.RevokeStmt{ + Privs: yyS[yypt-5].item.([]*ast.PrivElem), + ObjectType: yyS[yypt-3].item.(ast.ObjectTypeType), + Level: yyS[yypt-2].item.(*ast.GrantLevel), + Users: yyS[yypt-0].item.([]*ast.UserSpec), + } + } + case 1314: + { + x := &ast.LoadDataStmt{ + Path: yyS[yypt-8].ident, + Table: yyS[yypt-5].item.(*ast.TableName), + Columns: yyS[yypt-0].item.([]*ast.ColumnName), + IgnoreLines: yyS[yypt-1].item.(uint64), + } + if yyS[yypt-10].item != nil { + x.IsLocal = true + } + if yyS[yypt-3].item != nil { + x.FieldsInfo = yyS[yypt-3].item.(*ast.FieldsClause) + } + if yyS[yypt-2].item != nil { + x.LinesInfo = yyS[yypt-2].item.(*ast.LinesClause) + } + parser.yyVAL.statement = x + } + case 1315: + { + parser.yyVAL.item = uint64(0) + } + case 1316: + { + parser.yyVAL.item = getUint64FromNUM(yyS[yypt-1].item) + } + case 1319: + { + parser.yyVAL.item = nil + } + case 1320: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1321: + { + escape := "\\" + parser.yyVAL.item = &ast.FieldsClause{ + Terminated: "\t", + Escaped: escape[0], + } + } + case 1322: + { + escape := yyS[yypt-0].item.(string) + if escape != "\\" && len(escape) > 1 { + yylex.Errorf("Incorrect arguments %s to ESCAPE", escape) + return 1 + } + var enclosed byte + str := yyS[yypt-1].item.(string) + if len(str) > 1 { + yylex.Errorf("Incorrect arguments %s to ENCLOSED", escape) + return 1 + } else if len(str) != 0 { + enclosed = str[0] + } + var escaped byte + if len(escape) > 0 { + escaped = escape[0] + } + parser.yyVAL.item = &ast.FieldsClause{ + Terminated: yyS[yypt-2].item.(string), + Enclosed: enclosed, + Escaped: escaped, + } + } + case 1325: + { + parser.yyVAL.item = "\t" + } + case 1326: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1327: + { + parser.yyVAL.item = "" + } + case 1328: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1329: + { + parser.yyVAL.item = "\\" + } + case 1330: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1331: + { + parser.yyVAL.item = &ast.LinesClause{Terminated: "\n"} + } + case 1332: + { + parser.yyVAL.item = &ast.LinesClause{Starting: yyS[yypt-1].item.(string), Terminated: yyS[yypt-0].item.(string)} + } + case 1333: + { + parser.yyVAL.item = "" + } + case 1334: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1335: + { + parser.yyVAL.item = "\n" + } + case 1336: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1347: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + TiDBExtension: yyS[yypt-1].item.(bool), + } + } + case 1348: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + TiDBExtension: yyS[yypt-2].item.(bool), + } + } + case 1349: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + Query: true, + TiDBExtension: yyS[yypt-2].item.(bool), + } + } + case 1350: + { + parser.yyVAL.item = false + } + case 1351: + { + parser.yyVAL.item = true + } + case 1352: + { + parser.yyVAL.statement = &ast.LoadStatsStmt{ + Path: yyS[yypt-0].ident, + } + } + + } + + if yyEx != nil && yyEx.Reduced(r, exState, &parser.yyVAL) { + return -1 + } + goto yystack /* stack new state and value */ +} diff --git a/parser.y b/parser.y new file mode 100644 index 000000000..ff2469a67 --- /dev/null +++ b/parser.y @@ -0,0 +1,7207 @@ +%{ +// Copyright 2013 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Initial yacc source generated by ebnf2y[1] +// at 2013-10-04 23:10:47.861401015 +0200 CEST +// +// $ ebnf2y -o ql.y -oe ql.ebnf -start StatementList -pkg ql -p _ +// +// [1]: http://github.com/cznic/ebnf2y + +package parser + +import ( + "strings" + + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/types" +) + +%} + +%union { + offset int // offset + item interface{} + ident string + expr ast.ExprNode + statement ast.StmtNode +} + +%token + /*yy:token "%c" */ identifier "identifier" + /*yy:token "_%c" */ underscoreCS "UNDERSCORE_CHARSET" + /*yy:token "\"%c\"" */ stringLit "string literal" + singleAtIdentifier "identifier with single leading at" + doubleAtIdentifier "identifier with double leading at" + invalid "a special token never used by parser, used by lexer to indicate error" + hintBegin "hintBegin is a virtual token for optimizer hint grammar" + hintEnd "hintEnd is a virtual token for optimizer hint grammar" + andand "&&" + pipes "||" + + /* The following tokens belong to ODBCDateTimeType. */ + odbcDateType "d" + odbcTimeType "t" + odbcTimestampType "ts" + + /* The following tokens belong to ReservedKeyword. */ + add "ADD" + all "ALL" + alter "ALTER" + analyze "ANALYZE" + and "AND" + as "AS" + asc "ASC" + between "BETWEEN" + bigIntType "BIGINT" + binaryType "BINARY" + blobType "BLOB" + both "BOTH" + by "BY" + cascade "CASCADE" + caseKwd "CASE" + change "CHANGE" + character "CHARACTER" + charType "CHAR" + check "CHECK" + collate "COLLATE" + column "COLUMN" + constraint "CONSTRAINT" + convert "CONVERT" + create "CREATE" + cross "CROSS" + currentDate "CURRENT_DATE" + currentTime "CURRENT_TIME" + currentTs "CURRENT_TIMESTAMP" + currentUser "CURRENT_USER" + database "DATABASE" + databases "DATABASES" + dayHour "DAY_HOUR" + dayMicrosecond "DAY_MICROSECOND" + dayMinute "DAY_MINUTE" + daySecond "DAY_SECOND" + decimalType "DECIMAL" + defaultKwd "DEFAULT" + delayed "DELAYED" + deleteKwd "DELETE" + desc "DESC" + describe "DESCRIBE" + distinct "DISTINCT" + distinctRow "DISTINCTROW" + div "DIV" + doubleType "DOUBLE" + drop "DROP" + dual "DUAL" + elseKwd "ELSE" + enclosed "ENCLOSED" + escaped "ESCAPED" + exists "EXISTS" + explain "EXPLAIN" + falseKwd "FALSE" + floatType "FLOAT" + forKwd "FOR" + force "FORCE" + foreign "FOREIGN" + from "FROM" + fulltext "FULLTEXT" + generated "GENERATED" + grant "GRANT" + group "GROUP" + having "HAVING" + highPriority "HIGH_PRIORITY" + hourMicrosecond "HOUR_MICROSECOND" + hourMinute "HOUR_MINUTE" + hourSecond "HOUR_SECOND" + ifKwd "IF" + ignore "IGNORE" + in "IN" + index "INDEX" + infile "INFILE" + inner "INNER" + integerType "INTEGER" + interval "INTERVAL" + into "INTO" + is "IS" + insert "INSERT" + intType "INT" + int1Type "INT1" + int2Type "INT2" + int3Type "INT3" + int4Type "INT4" + int8Type "INT8" + join "JOIN" + key "KEY" + keys "KEYS" + kill "KILL" + leading "LEADING" + left "LEFT" + like "LIKE" + limit "LIMIT" + lines "LINES" + load "LOAD" + localTime "LOCALTIME" + localTs "LOCALTIMESTAMP" + lock "LOCK" + longblobType "LONGBLOB" + longtextType "LONGTEXT" + lowPriority "LOW_PRIORITY" + maxValue "MAXVALUE" + mediumblobType "MEDIUMBLOB" + mediumIntType "MEDIUMINT" + mediumtextType "MEDIUMTEXT" + minuteMicrosecond "MINUTE_MICROSECOND" + minuteSecond "MINUTE_SECOND" + mod "MOD" + not "NOT" + noWriteToBinLog "NO_WRITE_TO_BINLOG" + null "NULL" + numericType "NUMERIC" + nvarcharType "NVARCHAR" + on "ON" + option "OPTION" + or "OR" + order "ORDER" + outer "OUTER" + packKeys "PACK_KEYS" + partition "PARTITION" + precisionType "PRECISION" + primary "PRIMARY" + procedure "PROCEDURE" + shardRowIDBits "SHARD_ROW_ID_BITS" + rangeKwd "RANGE" + read "READ" + realType "REAL" + references "REFERENCES" + regexpKwd "REGEXP" + rename "RENAME" + repeat "REPEAT" + replace "REPLACE" + restrict "RESTRICT" + revoke "REVOKE" + right "RIGHT" + rlike "RLIKE" + secondMicrosecond "SECOND_MICROSECOND" + selectKwd "SELECT" + set "SET" + show "SHOW" + smallIntType "SMALLINT" + sql "SQL" + sqlCalcFoundRows "SQL_CALC_FOUND_ROWS" + starting "STARTING" + straightJoin "STRAIGHT_JOIN" + tableKwd "TABLE" + stored "STORED" + terminated "TERMINATED" + then "THEN" + tinyblobType "TINYBLOB" + tinyIntType "TINYINT" + tinytextType "TINYTEXT" + to "TO" + trailing "TRAILING" + trigger "TRIGGER" + trueKwd "TRUE" + unique "UNIQUE" + union "UNION" + unlock "UNLOCK" + unsigned "UNSIGNED" + update "UPDATE" + usage "USAGE" + use "USE" + using "USING" + utcDate "UTC_DATE" + utcTimestamp "UTC_TIMESTAMP" + utcTime "UTC_TIME" + values "VALUES" + long "LONG" + varcharType "VARCHAR" + varbinaryType "VARBINARY" + virtual "VIRTUAL" + when "WHEN" + where "WHERE" + write "WRITE" + with "WITH" + xor "XOR" + yearMonth "YEAR_MONTH" + zerofill "ZEROFILL" + natural "NATURAL" + + /* The following tokens belong to UnReservedKeyword. */ + action "ACTION" + after "AFTER" + always "ALWAYS" + algorithm "ALGORITHM" + any "ANY" + ascii "ASCII" + autoIncrement "AUTO_INCREMENT" + avgRowLength "AVG_ROW_LENGTH" + avg "AVG" + begin "BEGIN" + binlog "BINLOG" + bitType "BIT" + booleanType "BOOLEAN" + boolType "BOOL" + btree "BTREE" + byteType "BYTE" + cascaded "CASCADED" + charsetKwd "CHARSET" + checksum "CHECKSUM" + cleanup "CLEANUP" + client "CLIENT" + coalesce "COALESCE" + collation "COLLATION" + columns "COLUMNS" + comment "COMMENT" + commit "COMMIT" + committed "COMMITTED" + compact "COMPACT" + compressed "COMPRESSED" + compression "COMPRESSION" + connection "CONNECTION" + consistent "CONSISTENT" + day "DAY" + data "DATA" + dateType "DATE" + datetimeType "DATETIME" + deallocate "DEALLOCATE" + definer "DEFINER" + delayKeyWrite "DELAY_KEY_WRITE" + disable "DISABLE" + do "DO" + duplicate "DUPLICATE" + dynamic "DYNAMIC" + enable "ENABLE" + end "END" + engine "ENGINE" + engines "ENGINES" + enum "ENUM" + event "EVENT" + events "EVENTS" + escape "ESCAPE" + exclusive "EXCLUSIVE" + execute "EXECUTE" + fields "FIELDS" + first "FIRST" + fixed "FIXED" + flush "FLUSH" + format "FORMAT" + full "FULL" + function "FUNCTION" + grants "GRANTS" + hash "HASH" + hour "HOUR" + identified "IDENTIFIED" + isolation "ISOLATION" + indexes "INDEXES" + invoker "INVOKER" + jsonType "JSON" + keyBlockSize "KEY_BLOCK_SIZE" + local "LOCAL" + less "LESS" + level "LEVEL" + master "MASTER" + microsecond "MICROSECOND" + minute "MINUTE" + mode "MODE" + modify "MODIFY" + month "MONTH" + maxRows "MAX_ROWS" + maxConnectionsPerHour "MAX_CONNECTIONS_PER_HOUR" + maxQueriesPerHour "MAX_QUERIES_PER_HOUR" + maxUpdatesPerHour "MAX_UPDATES_PER_HOUR" + maxUserConnections "MAX_USER_CONNECTIONS" + merge "MERGE" + minRows "MIN_ROWS" + names "NAMES" + national "NATIONAL" + no "NO" + none "NONE" + offset "OFFSET" + only "ONLY" + password "PASSWORD" + partitions "PARTITIONS" + pipesAsOr + plugins "PLUGINS" + prepare "PREPARE" + privileges "PRIVILEGES" + process "PROCESS" + processlist "PROCESSLIST" + profiles "PROFILES" + quarter "QUARTER" + query "QUERY" + queries "QUERIES" + quick "QUICK" + recover "RECOVER" + redundant "REDUNDANT" + reload "RELOAD" + repeatable "REPEATABLE" + replication "REPLICATION" + reverse "REVERSE" + rollback "ROLLBACK" + routine "ROUTINE" + row "ROW" + rowCount "ROW_COUNT" + rowFormat "ROW_FORMAT" + second "SECOND" + security "SECURITY" + separator "SEPARATOR" + serializable "SERIALIZABLE" + session "SESSION" + share "SHARE" + shared "SHARED" + signed "SIGNED" + slave "SLAVE" + slow "SLOW" + snapshot "SNAPSHOT" + sqlCache "SQL_CACHE" + sqlNoCache "SQL_NO_CACHE" + start "START" + statsPersistent "STATS_PERSISTENT" + status "STATUS" + subpartition "SUBPARTITION" + subpartitions "SUBPARTITIONS" + super "SUPER" + some "SOME" + global "GLOBAL" + tables "TABLES" + tablespace "TABLESPACE" + temporary "TEMPORARY" + temptable "TEMPTABLE" + textType "TEXT" + than "THAN" + timeType "TIME" + timestampType "TIMESTAMP" + trace "TRACE" + transaction "TRANSACTION" + triggers "TRIGGERS" + truncate "TRUNCATE" + uncommitted "UNCOMMITTED" + unknown "UNKNOWN" + user "USER" + undefined "UNDEFINED" + value "VALUE" + variables "VARIABLES" + view "VIEW" + warnings "WARNINGS" + identSQLErrors "ERRORS" + week "WEEK" + yearType "YEAR" + + /* The following tokens belong to NotKeywordToken. */ + addDate "ADDDATE" + bitAnd "BIT_AND" + bitOr "BIT_OR" + bitXor "BIT_XOR" + cast "CAST" + copyKwd "COPY" + count "COUNT" + curTime "CURTIME" + dateAdd "DATE_ADD" + dateSub "DATE_SUB" + extract "EXTRACT" + getFormat "GET_FORMAT" + groupConcat "GROUP_CONCAT" + inplace "INPLACE" + internal "INTERNAL" + min "MIN" + max "MAX" + maxExecutionTime "MAX_EXECUTION_TIME" + now "NOW" + position "POSITION" + recent "RECENT" + subDate "SUBDATE" + sum "SUM" + substring "SUBSTRING" + timestampAdd "TIMESTAMPADD" + timestampDiff "TIMESTAMPDIFF" + top "TOP" + trim "TRIM" + + /* The following tokens belong to TiDBKeyword. */ + admin "ADMIN" + buckets "BUCKETS" + cancel "CANCEL" + ddl "DDL" + jobs "JOBS" + job "JOB" + stats "STATS" + statsMeta "STATS_META" + statsHistograms "STATS_HISTOGRAMS" + statsBuckets "STATS_BUCKETS" + statsHealthy "STATS_HEALTHY" + tidb "TIDB" + tidbHJ "TIDB_HJ" + tidbSMJ "TIDB_SMJ" + tidbINLJ "TIDB_INLJ" + + builtinAddDate + builtinBitAnd + builtinBitOr + builtinBitXor + builtinCast + builtinCount + builtinCurDate + builtinCurTime + builtinDateAdd + builtinDateSub + builtinExtract + builtinGroupConcat + builtinMax + builtinMin + builtinNow + builtinPosition + builtinStddevPop + builtinSubDate + builtinSubstring + builtinSum + builtinSysDate + builtinTrim + builtinUser + builtinVarPop + builtinVarSamp + +%token + + /*yy:token "1.%d" */ floatLit "floating-point literal" + /*yy:token "1.%d" */ decLit "decimal literal" + /*yy:token "%d" */ intLit "integer literal" + /*yy:token "%x" */ hexLit "hexadecimal literal" + /*yy:token "%b" */ bitLit "bit literal" + + andnot "&^" + assignmentEq ":=" + eq "=" + ge ">=" + le "<=" + jss "->" + juss "->>" + lsh "<<" + neq "!=" + neqSynonym "<>" + nulleq "<=>" + paramMarker "?" + rsh ">>" + +%token not2 + +%type + Expression "expression" + MaxValueOrExpression "maxvalue or expression" + BoolPri "boolean primary expression" + ExprOrDefault "expression or default" + PredicateExpr "Predicate expression factor" + SetExpr "Set variable statement value's expression" + BitExpr "bit expression" + SimpleExpr "simple expression" + SimpleIdent "Simple Identifier expression" + SumExpr "aggregate functions" + FunctionCallGeneric "Function call with Identifier" + FunctionCallKeyword "Function call with keyword as function name" + FunctionCallNonKeyword "Function call with nonkeyword as function name" + Literal "literal value" + Variable "User or system variable" + SystemVariable "System defined variable name" + UserVariable "User defined variable name" + SubSelect "Sub Select" + StringLiteral "text literal" + ExpressionOpt "Optional expression" + SignedLiteral "Literal or NumLiteral with sign" + DefaultValueExpr "DefaultValueExpr(Now or Signed Literal)" + NowSymOptionFraction "NowSym with optional fraction part" + +%type + AdminStmt "Check table statement or show ddl statement" + AlterTableStmt "Alter table statement" + AlterUserStmt "Alter user statement" + AnalyzeTableStmt "Analyze table statement" + BeginTransactionStmt "BEGIN TRANSACTION statement" + BinlogStmt "Binlog base64 statement" + CommitStmt "COMMIT statement" + CreateTableStmt "CREATE TABLE statement" + CreateViewStmt "CREATE VIEW stetement" + CreateUserStmt "CREATE User statement" + CreateDatabaseStmt "Create Database Statement" + CreateIndexStmt "CREATE INDEX statement" + DoStmt "Do statement" + DropDatabaseStmt "DROP DATABASE statement" + DropIndexStmt "DROP INDEX statement" + DropStatsStmt "DROP STATS statement" + DropTableStmt "DROP TABLE statement" + DropUserStmt "DROP USER" + DropViewStmt "DROP VIEW statement" + DeallocateStmt "Deallocate prepared statement" + DeleteFromStmt "DELETE FROM statement" + EmptyStmt "empty statement" + ExecuteStmt "Execute statement" + ExplainStmt "EXPLAIN statement" + ExplainableStmt "explainable statement" + FlushStmt "Flush statement" + GrantStmt "Grant statement" + InsertIntoStmt "INSERT INTO statement" + KillStmt "Kill statement" + LoadDataStmt "Load data statement" + LoadStatsStmt "Load statistic statement" + LockTablesStmt "Lock tables statement" + PreparedStmt "PreparedStmt" + SelectStmt "SELECT statement" + RenameTableStmt "rename table statement" + ReplaceIntoStmt "REPLACE INTO statement" + RevokeStmt "Revoke statement" + RollbackStmt "ROLLBACK statement" + SetStmt "Set variable statement" + ShowStmt "Show engines/databases/tables/columns/warnings/status statement" + Statement "statement" + TraceStmt "TRACE statement" + TraceableStmt "traceable statment" + TruncateTableStmt "TRUNCATE TABLE statement" + UnlockTablesStmt "Unlock tables statement" + UpdateStmt "UPDATE statement" + UnionStmt "Union select state ment" + UseStmt "USE statement" + +%type + AdminShowSlow "Admin Show Slow statement" + AlterTableOptionListOpt "alter table option list opt" + AlterTableSpec "Alter table specification" + AlterTableSpecList "Alter table specification list" + AnyOrAll "Any or All for subquery" + Assignment "assignment" + AssignmentList "assignment list" + AssignmentListOpt "assignment list opt" + AuthOption "User auth option" + AuthString "Password string value" + OptionalBraces "optional braces" + CastType "Cast function target type" + CharsetName "Character set name" + ColumnDef "table column definition" + ColumnDefList "table column definition list" + ColumnName "column name" + ColumnNameList "column name list" + ColumnList "column list" + ColumnNameListOpt "column name list opt" + ColumnNameListOptWithBrackets "column name list opt with brackets" + ColumnSetValue "insert statement set value by column name" + ColumnSetValueList "insert statement set value by column name list" + CompareOp "Compare opcode" + ColumnOption "column definition option" + ColumnOptionList "column definition option list" + VirtualOrStored "indicate generated column is stored or not" + ColumnOptionListOpt "optional column definition option list" + Constraint "table constraint" + ConstraintElem "table constraint element" + ConstraintKeywordOpt "Constraint Keyword or empty" + CreateIndexStmtUnique "CREATE INDEX optional UNIQUE clause" + CreateTableOptionListOpt "create table option list opt" + CreateTableSelectOpt "Select/Union statement in CREATE TABLE ... SELECT" + DatabaseOption "CREATE Database specification" + DatabaseOptionList "CREATE Database specification list" + DatabaseOptionListOpt "CREATE Database specification list opt" + DBName "Database Name" + DistinctOpt "Explicit distinct option" + DefaultFalseDistinctOpt "Distinct option which defaults to false" + DefaultTrueDistinctOpt "Distinct option which defaults to true" + BuggyDefaultFalseDistinctOpt "Distinct option which accepts DISTINCT ALL and defaults to false" + Enclosed "Enclosed by" + EqOpt "= or empty" + EscapedTableRef "escaped table reference" + Escaped "Escaped by" + ExpressionList "expression list" + MaxValueOrExpressionList "maxvalue or expression list" + ExpressionListOpt "expression list opt" + FuncDatetimePrecListOpt "Function datetime precision list opt" + FuncDatetimePrecList "Function datetime precision list" + Field "field expression" + Fields "Fields clause" + FieldsTerminated "Fields terminated by" + FieldAsName "Field alias name" + FieldAsNameOpt "Field alias name opt" + FieldList "field expression list" + FlushOption "Flush option" + TableRefsClause "Table references clause" + FuncDatetimePrec "Function datetime precision" + GlobalScope "The scope of variable" + GroupByClause "GROUP BY clause" + HashString "Hashed string" + HavingClause "HAVING clause" + HandleRange "handle range" + HandleRangeList "handle range list" + IfExists "If Exists" + IfNotExists "If Not Exists" + IgnoreOptional "IGNORE or empty" + IndexColName "Index column name" + IndexColNameList "List of index column name" + IndexHint "index hint" + IndexHintList "index hint list" + IndexHintListOpt "index hint list opt" + IndexHintScope "index hint scope" + IndexHintType "index hint type" + IndexName "index name" + IndexNameList "index name list" + IndexOption "Index Option" + IndexOptionList "Index Option List or empty" + IndexType "index type" + IndexTypeOpt "Optional index type" + InsertValues "Rest part of INSERT/REPLACE INTO statement" + JoinTable "join table" + JoinType "join type" + KillOrKillTiDB "Kill or Kill TiDB" + LikeEscapeOpt "like escape option" + LikeTableWithOrWithoutParen "LIKE table_name or ( LIKE table_name )" + LimitClause "LIMIT clause" + LimitOption "Limit option could be integer or parameter marker." + Lines "Lines clause" + LinesTerminated "Lines terminated by" + LocalOpt "Local opt" + LockClause "Alter table lock clause" + MaxNumBuckets "Max number of buckets" + NumLiteral "Num/Int/Float/Decimal Literal" + NoWriteToBinLogAliasOpt "NO_WRITE_TO_BINLOG alias LOCAL or empty" + ObjectType "Grant statement object type" + OnDuplicateKeyUpdate "ON DUPLICATE KEY UPDATE value list" + DuplicateOpt "[IGNORE|REPLACE] in CREATE TABLE ... SELECT statement" + OptFull "Full or empty" + Order "ORDER BY clause optional collation specification" + OrderBy "ORDER BY clause" + OrReplace "or replace" + ByItem "BY item" + OrderByOptional "Optional ORDER BY clause optional" + ByList "BY list" + QuickOptional "QUICK or empty" + PartitionDefinition "Partition definition" + PartitionDefinitionList "Partition definition list" + PartitionDefinitionListOpt "Partition definition list option" + PartitionOpt "Partition option" + PartitionNameList "Partition name list" + PartitionNumOpt "PARTITION NUM option" + PartDefValuesOpt "VALUES {LESS THAN {(expr | value_list) | MAXVALUE} | IN {value_list}" + PartDefOptionsOpt "PartDefOptionList option" + PartDefOptionList "PartDefOption list" + PartDefOption "COMMENT [=] xxx | TABLESPACE [=] tablespace_name | ENGINE [=] xxx" + PasswordOpt "Password option" + ColumnPosition "Column position [First|After ColumnName]" + PrepareSQL "Prepare statement sql string" + PriorityOpt "Statement priority option" + PrivElem "Privilege element" + PrivElemList "Privilege element list" + PrivLevel "Privilege scope" + PrivType "Privilege type" + ReferDef "Reference definition" + OnDeleteOpt "optional ON DELETE clause" + OnUpdateOpt "optional ON UPDATE clause" + OptGConcatSeparator "optional GROUP_CONCAT SEPARATOR" + ReferOpt "reference option" + RowFormat "Row format option" + RowValue "Row value" + SelectLockOpt "FOR UPDATE or LOCK IN SHARE MODE," + SelectStmtCalcFoundRows "SELECT statement optional SQL_CALC_FOUND_ROWS" + SelectStmtSQLCache "SELECT statement optional SQL_CAHCE/SQL_NO_CACHE" + SelectStmtStraightJoin "SELECT statement optional STRAIGHT_JOIN" + SelectStmtFieldList "SELECT statement field list" + SelectStmtLimit "SELECT statement optional LIMIT clause" + SelectStmtOpts "Select statement options" + SelectStmtBasic "SELECT statement from constant value" + SelectStmtFromDual "SELECT statement from dual" + SelectStmtFromTable "SELECT statement from table" + SelectStmtGroup "SELECT statement optional GROUP BY clause" + ShowTargetFilterable "Show target that can be filtered by WHERE or LIKE" + ShowDatabaseNameOpt "Show tables/columns statement database name option" + ShowTableAliasOpt "Show table alias option" + ShowLikeOrWhereOpt "Show like or where clause option" + Starting "Starting by" + StatementList "statement list" + StatsPersistentVal "stats_persistent value" + StringName "string literal or identifier" + StringList "string list" + SubPartitionOpt "SubPartition option" + SubPartitionNumOpt "SubPartition NUM option" + Symbol "Constraint Symbol" + TableAsName "table alias name" + TableAsNameOpt "table alias name optional" + TableElement "table definition element" + TableElementList "table definition element list" + TableElementListOpt "table definition element list optional" + TableFactor "table factor" + TableLock "Table name and lock type" + TableLockList "Table lock list" + TableName "Table name" + TableNameList "Table name list" + TableNameListOpt "Table name list opt" + TableOption "create table option" + TableOptionList "create table option list" + TableRef "table reference" + TableRefs "table references" + TableToTable "rename table to table" + TableToTableList "rename table to table by list" + + TransactionChar "Transaction characteristic" + TransactionChars "Transaction characteristic list" + TrimDirection "Trim string direction" + UnionOpt "Union Option(empty/ALL/DISTINCT)" + UnionClauseList "Union select clause list" + UnionSelect "Union (select) item" + Username "Username" + UsernameList "UsernameList" + UserSpec "Username and auth option" + UserSpecList "Username and auth option list" + UserVariableList "User defined variable name list" + Values "values" + ValuesList "values list" + ValuesOpt "values optional" + VariableAssignment "set variable value" + VariableAssignmentList "set variable value list" + ViewAlgorithm "view algorithm" + ViewCheckOption "view check option" + ViewDefiner "view definer" + ViewName "view name" + ViewFieldList "create view statement field list" + ViewSQLSecurity "view sql security" + WhereClause "WHERE clause" + WhereClauseOptional "Optional WHERE clause" + WhenClause "When clause" + WhenClauseList "When clause list" + WithReadLockOpt "With Read Lock opt" + WithGrantOptionOpt "With Grant Option opt" + ElseOpt "Optional else clause" + Type "Types" + + BetweenOrNotOp "Between predicate" + IsOrNotOp "Is predicate" + InOrNotOp "In predicate" + LikeOrNotOp "Like predicate" + RegexpOrNotOp "Regexp predicate" + + NumericType "Numeric types" + IntegerType "Integer Types types" + BooleanType "Boolean Types types" + FixedPointType "Exact value types" + FloatingPointType "Approximate value types" + BitValueType "bit value types" + StringType "String types" + BlobType "Blob types" + TextType "Text types" + DateAndTimeType "Date and Time types" + + OptFieldLen "Field length or empty" + FieldLen "Field length" + FieldOpts "Field type definition option list" + FieldOpt "Field type definition option" + FloatOpt "Floating-point type option" + Precision "Floating-point precision option" + OptBinary "Optional BINARY" + OptBinMod "Optional BINARY mode" + OptCharset "Optional Character setting" + OptCollate "Optional Collate setting" + IgnoreLines "Ignore num(int) lines" + NUM "A number" + NumList "Some numbers" + LengthNum "Field length num(uint64)" + HintTableList "Table list in optimizer hint" + TableOptimizerHintOpt "Table level optimizer hint" + TableOptimizerHints "Table level optimizer hints" + TableOptimizerHintList "Table level optimizer hint list" + +%type + AsOpt "AS or EmptyString" + KeyOrIndex "{KEY|INDEX}" + ColumnKeywordOpt "Column keyword or empty" + PrimaryOpt "Optional primary keyword" + NowSym "CURRENT_TIMESTAMP/LOCALTIME/LOCALTIMESTAMP" + NowSymFunc "CURRENT_TIMESTAMP/LOCALTIME/LOCALTIMESTAMP/NOW" + DefaultKwdOpt "optional DEFAULT keyword" + DatabaseSym "DATABASE or SCHEMA" + ExplainSym "EXPLAIN or DESCRIBE or DESC" + RegexpSym "REGEXP or RLIKE" + IntoOpt "INTO or EmptyString" + ValueSym "Value or Values" + Varchar "{NATIONAL VARCHAR|VARCHAR|NVARCHAR}" + TimeUnit "Time unit for 'DATE_ADD', 'DATE_SUB', 'ADDDATE', 'SUBDATE', 'EXTRACT'" + TimestampUnit "Time unit for 'TIMESTAMPADD' and 'TIMESTAMPDIFF'" + DeallocateSym "Deallocate or drop" + OuterOpt "optional OUTER clause" + CrossOpt "Cross join option" + TablesTerminalSym "{TABLE|TABLES}" + IsolationLevel "Isolation level" + ShowIndexKwd "Show index/indexs/key keyword" + DistinctKwd "DISTINCT/DISTINCTROW keyword" + FromOrIn "From or In" + OptTable "Optional table keyword" + OptInteger "Optional Integer keyword" + NationalOpt "National option" + CharsetKw "charset or charater set" + CommaOpt "optional comma" + LockType "Table locks type" + logAnd "logical and operator" + logOr "logical or operator" + FieldsOrColumns "Fields or columns" + GetFormatSelector "{DATE|DATETIME|TIME|TIMESTAMP}" + +%type + ODBCDateTimeType "ODBC type keywords for date and time literals" + Identifier "identifier or unreserved keyword" + NotKeywordToken "Tokens not mysql keyword but treated specially" + UnReservedKeyword "MySQL unreserved keywords" + TiDBKeyword "TiDB added keywords" + FunctionNameConflict "Built-in function call names which are conflict with keywords" + FunctionNameOptionalBraces "Function with optional braces, all of them are reserved keywords." + FunctionNameDatetimePrecision "Function with optional datetime precision, all of them are reserved keywords." + FunctionNameDateArith "Date arith function call names (date_add or date_sub)" + FunctionNameDateArithMultiForms "Date arith function call names (adddate or subdate)" + +%precedence empty + +%precedence sqlCache sqlNoCache +%precedence lowerThanIntervalKeyword +%precedence interval +%precedence lowerThanStringLitToken +%precedence stringLit +%precedence lowerThanSetKeyword +%precedence set +%precedence lowerThanInsertValues +%precedence insertValues +%precedence lowerThanCreateTableSelect +%precedence createTableSelect +%precedence lowerThanKey +%precedence key + +%left join straightJoin inner cross left right full natural +/* A dummy token to force the priority of TableRef production in a join. */ +%left tableRefPriority +%precedence lowerThanOn +%precedence on using +%right assignmentEq +%left pipes or pipesAsOr +%left xor +%left andand and +%left between +%precedence lowerThanEq +%left eq ge le neq neqSynonym '>' '<' is like in +%left '|' +%left '&' +%left rsh lsh +%left '-' '+' +%left '*' '/' '%' div mod +%left '^' +%left '~' neg +%right not not2 +%right collate + +%precedence '(' +%precedence quick +%precedence escape +%precedence lowerThanComma +%precedence ',' +%precedence higherThanComma + +%start Start + +%% + +Start: + StatementList + +/**************************************AlterTableStmt*************************************** + * See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html + *******************************************************************************************/ +AlterTableStmt: + "ALTER" IgnoreOptional "TABLE" TableName AlterTableSpecList + { + $$ = &ast.AlterTableStmt{ + Table: $4.(*ast.TableName), + Specs: $5.([]*ast.AlterTableSpec), + } + } +| "ALTER" IgnoreOptional "TABLE" TableName "ANALYZE" "PARTITION" PartitionNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, PartitionNames: $7.([]model.CIStr), MaxNumBuckets: $8.(uint64),} + } +| "ALTER" IgnoreOptional "TABLE" TableName "ANALYZE" "PARTITION" PartitionNameList "INDEX" IndexNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{$4.(*ast.TableName)}, + PartitionNames: $7.([]model.CIStr), + IndexNames: $9.([]model.CIStr), + IndexFlag: true, + MaxNumBuckets: $10.(uint64), + } + } + +AlterTableSpec: + AlterTableOptionListOpt + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options:$1.([]*ast.TableOption), + } + } +| "CONVERT" "TO" CharsetKw CharsetName OptCollate + { + op := &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options:[]*ast.TableOption{{Tp: ast.TableOptionCharset, StrValue: $4.(string)}}, + } + if $5 != "" { + op.Options = append(op.Options, &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: $5.(string)}) + } + $$ = op + } +| "ADD" ColumnKeywordOpt ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: []*ast.ColumnDef{$3.(*ast.ColumnDef)}, + Position: $4.(*ast.ColumnPosition), + } + } +| "ADD" ColumnKeywordOpt '(' ColumnDefList ')' + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: $4.([]*ast.ColumnDef), + } + } +| "ADD" Constraint + { + constraint := $2.(*ast.Constraint) + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddConstraint, + Constraint: constraint, + } + } +| "ADD" "PARTITION" PartitionDefinitionListOpt + { + var defs []*ast.PartitionDefinition + if $3 != nil { + defs = $3.([]*ast.PartitionDefinition) + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddPartitions, + PartDefinitions: defs, + } + } +| "DROP" ColumnKeywordOpt ColumnName RestrictOrCascadeOpt + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropColumn, + OldColumnName: $3.(*ast.ColumnName), + } + } +| "DROP" "PRIMARY" "KEY" + { + $$ = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} + } +| "DROP" "PARTITION" Identifier + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropPartition, + Name: $3, + } + } +| "DROP" KeyOrIndex Identifier + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropIndex, + Name: $3, + } + } +| "DROP" "FOREIGN" "KEY" Symbol + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropForeignKey, + Name: $4.(string), + } + } +| "DISABLE" "KEYS" + { + $$ = &ast.AlterTableSpec{} + } +| "ENABLE" "KEYS" + { + $$ = &ast.AlterTableSpec{} + } +| "MODIFY" ColumnKeywordOpt ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableModifyColumn, + NewColumns: []*ast.ColumnDef{$3.(*ast.ColumnDef)}, + Position: $4.(*ast.ColumnPosition), + } + } +| "CHANGE" ColumnKeywordOpt ColumnName ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableChangeColumn, + OldColumnName: $3.(*ast.ColumnName), + NewColumns: []*ast.ColumnDef{$4.(*ast.ColumnDef)}, + Position: $5.(*ast.ColumnPosition), + } + } +| "ALTER" ColumnKeywordOpt ColumnName "SET" "DEFAULT" SignedLiteral + { + option := &ast.ColumnOption{Expr: $6} + colDef := &ast.ColumnDef{ + Name: $3.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } +| "ALTER" ColumnKeywordOpt ColumnName "DROP" "DEFAULT" + { + colDef := &ast.ColumnDef{ + Name: $3.(*ast.ColumnName), + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } +| "RENAME" "TO" TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $3.(*ast.TableName), + } + } +| "RENAME" TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $2.(*ast.TableName), + } + } +| "RENAME" "AS" TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $3.(*ast.TableName), + } + } +| "RENAME" KeyOrIndex Identifier "TO" Identifier + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameIndex, + FromKey: model.NewCIStr($3), + ToKey: model.NewCIStr($5), + } + } +| LockClause + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableLock, + LockType: $1.(ast.LockType), + } + } +| "ALGORITHM" EqOpt AlterAlgorithm + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlgorithm, + } + } +| "FORCE" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableForce, + } + } + + +AlterAlgorithm: + "DEFAULT" | "INPLACE" | "COPY" + +LockClauseOpt: + {} +| LockClause {} + +LockClause: + "LOCK" eq "NONE" + { + $$ = ast.LockTypeNone + } +| "LOCK" eq "DEFAULT" + { + $$ = ast.LockTypeDefault + } +| "LOCK" eq "SHARED" + { + $$ = ast.LockTypeShared + } +| "LOCK" eq "EXCLUSIVE" + { + $$ = ast.LockTypeExclusive + } + +KeyOrIndex: "KEY" | "INDEX" + + +KeyOrIndexOpt: + {} +| KeyOrIndex + +ColumnKeywordOpt: + {} +| "COLUMN" + +ColumnPosition: + { + $$ = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} + } +| "FIRST" + { + $$ = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} + } +| "AFTER" ColumnName + { + $$ = &ast.ColumnPosition{ + Tp: ast.ColumnPositionAfter, + RelativeColumn: $2.(*ast.ColumnName), + } + } + +AlterTableSpecList: + AlterTableSpec + { + $$ = []*ast.AlterTableSpec{$1.(*ast.AlterTableSpec)} + } +| AlterTableSpecList ',' AlterTableSpec + { + $$ = append($1.([]*ast.AlterTableSpec), $3.(*ast.AlterTableSpec)) + } + +PartitionNameList: + Identifier + { + $$ = []model.CIStr{model.NewCIStr($1)} + } +| PartitionNameList ',' Identifier + { + $$ = append($1.([]model.CIStr), model.NewCIStr($3)) + } + +ConstraintKeywordOpt: + { + $$ = nil + } +| "CONSTRAINT" + { + $$ = nil + } +| "CONSTRAINT" Symbol + { + $$ = $2.(string) + } + +Symbol: + Identifier + { + $$ = $1 + } + +/**************************************RenameTableStmt*************************************** + * See http://dev.mysql.com/doc/refman/5.7/en/rename-table.html + * + * TODO: refactor this when you are going to add full support for multiple schema changes. + * Currently it is only useful for syncer which depends heavily on tidb parser to do some dirty work. + *******************************************************************************************/ +RenameTableStmt: + "RENAME" "TABLE" TableToTableList + { + $$ = &ast.RenameTableStmt{ + OldTable: $3.([]*ast.TableToTable)[0].OldTable, + NewTable: $3.([]*ast.TableToTable)[0].NewTable, + TableToTables: $3.([]*ast.TableToTable), + } + } + +TableToTableList: + TableToTable + { + $$ = []*ast.TableToTable{$1.(*ast.TableToTable)} + } +| TableToTableList ',' TableToTable + { + $$ = append($1.([]*ast.TableToTable), $3.(*ast.TableToTable)) + } + +TableToTable: + TableName "TO" TableName + { + $$ = &ast.TableToTable{ + OldTable: $1.(*ast.TableName), + NewTable: $3.(*ast.TableName), + } + } + + +/*******************************************************************************************/ + +AnalyzeTableStmt: + "ANALYZE" "TABLE" TableNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{TableNames: $3.([]*ast.TableName), MaxNumBuckets: $4.(uint64)} + } +| "ANALYZE" "TABLE" TableName "INDEX" IndexNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, IndexNames: $5.([]model.CIStr), IndexFlag: true, MaxNumBuckets: $6.(uint64)} + } +| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, PartitionNames: $5.([]model.CIStr), MaxNumBuckets: $6.(uint64),} + } +| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{$3.(*ast.TableName)}, + PartitionNames: $5.([]model.CIStr), + IndexNames: $7.([]model.CIStr), + IndexFlag: true, + MaxNumBuckets: $8.(uint64), + } + } + +MaxNumBuckets: + { + $$ = uint64(0) + } +| "WITH" NUM "BUCKETS" + { + $$ = getUint64FromNUM($2) + } + +/*******************************************************************************************/ +Assignment: + ColumnName eq Expression + { + $$ = &ast.Assignment{Column: $1.(*ast.ColumnName), Expr:$3} + } + +AssignmentList: + Assignment + { + $$ = []*ast.Assignment{$1.(*ast.Assignment)} + } +| AssignmentList ',' Assignment + { + $$ = append($1.([]*ast.Assignment), $3.(*ast.Assignment)) + } + +AssignmentListOpt: + /* EMPTY */ + { + $$ = []*ast.Assignment{} + } +| AssignmentList + +BeginTransactionStmt: + "BEGIN" + { + $$ = &ast.BeginStmt{} + } +| "START" "TRANSACTION" + { + $$ = &ast.BeginStmt{} + } +| "START" "TRANSACTION" "WITH" "CONSISTENT" "SNAPSHOT" + { + $$ = &ast.BeginStmt{} + } + +BinlogStmt: + "BINLOG" stringLit + { + $$ = &ast.BinlogStmt{Str: $2} + } + +ColumnDefList: + ColumnDef + { + $$ = []*ast.ColumnDef{$1.(*ast.ColumnDef)} + } +| ColumnDefList ',' ColumnDef + { + $$ = append($1.([]*ast.ColumnDef), $3.(*ast.ColumnDef)) + } + +ColumnDef: + ColumnName Type ColumnOptionListOpt + { + $$ = &ast.ColumnDef{Name: $1.(*ast.ColumnName), Tp: $2.(*types.FieldType), Options: $3.([]*ast.ColumnOption)} + } + +ColumnName: + Identifier + { + $$ = &ast.ColumnName{Name: model.NewCIStr($1)} + } +| Identifier '.' Identifier + { + $$ = &ast.ColumnName{Table: model.NewCIStr($1), Name: model.NewCIStr($3)} + } +| Identifier '.' Identifier '.' Identifier + { + $$ = &ast.ColumnName{Schema: model.NewCIStr($1), Table: model.NewCIStr($3), Name: model.NewCIStr($5)} + } + +ColumnNameList: + ColumnName + { + $$ = []*ast.ColumnName{$1.(*ast.ColumnName)} + } +| ColumnNameList ',' ColumnName + { + $$ = append($1.([]*ast.ColumnName), $3.(*ast.ColumnName)) + } + +ColumnNameListOpt: + /* EMPTY */ + { + $$ = []*ast.ColumnName{} + } +| ColumnNameList + { + $$ = $1.([]*ast.ColumnName) + } + +ColumnNameListOptWithBrackets: + /* EMPTY */ + { + $$ = []*ast.ColumnName{} + } +| '(' ColumnNameListOpt ')' + { + $$ = $2.([]*ast.ColumnName) + } + +CommitStmt: + "COMMIT" + { + $$ = &ast.CommitStmt{} + } + +PrimaryOpt: + {} +| "PRIMARY" + +ColumnOption: + "NOT" "NULL" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} + } +| "NULL" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionNull} + } +| "AUTO_INCREMENT" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} + } +| PrimaryOpt "KEY" + { + // KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY + // can also be specified as just KEY when given in a column definition. + // See http://dev.mysql.com/doc/refman/5.7/en/create-table.html + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionPrimaryKey} + } +| "UNIQUE" %prec lowerThanKey + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } +| "UNIQUE" "KEY" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } +| "DEFAULT" DefaultValueExpr + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: $2} + } +| "ON" "UPDATE" NowSymOptionFraction + { + nowFunc := &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: nowFunc} + } +| "COMMENT" stringLit + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr($2)} + } +| "CHECK" '(' Expression ')' + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-table.html + // The CHECK clause is parsed but ignored by all storage engines. + $$ = &ast.ColumnOption{} + } +| GeneratedAlways "AS" '(' Expression ')' VirtualOrStored + { + startOffset := parser.startOffset(&yyS[yypt-2]) + endOffset := parser.endOffset(&yyS[yypt-1]) + expr := $4 + expr.SetText(parser.src[startOffset:endOffset]) + + $$ = &ast.ColumnOption{ + Tp: ast.ColumnOptionGenerated, + Expr: expr, + Stored: $6.(bool), + } + } +| ReferDef + { + $$ = &ast.ColumnOption{ + Tp: ast.ColumnOptionReference, + Refer: $1.(*ast.ReferenceDef), + } + } + +GeneratedAlways: | "GENERATED" "ALWAYS" + +VirtualOrStored: + { + $$ = false + } +| "VIRTUAL" + { + $$ = false + } +| "STORED" + { + $$ = true + } + +ColumnOptionList: + ColumnOption + { + $$ = []*ast.ColumnOption{$1.(*ast.ColumnOption)} + } +| ColumnOptionList ColumnOption + { + $$ = append($1.([]*ast.ColumnOption), $2.(*ast.ColumnOption)) + } + +ColumnOptionListOpt: + { + $$ = []*ast.ColumnOption{} + } +| ColumnOptionList + { + $$ = $1.([]*ast.ColumnOption) + } + +ConstraintElem: + "PRIMARY" "KEY" IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintPrimaryKey, + Keys: $6.([]*ast.IndexColName), + } + if $8 != nil { + c.Option = $8.(*ast.IndexOption) + } + if $4 != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = $4.(model.IndexType) + } + $$ = c + } +| "FULLTEXT" KeyOrIndex IndexName '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintFulltext, + Keys: $5.([]*ast.IndexColName), + Name: $3.(string), + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } + $$ = c + } +| KeyOrIndex IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintIndex, + Keys: $5.([]*ast.IndexColName), + Name: $2.(string), + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } + if $3 != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = $3.(model.IndexType) + } + $$ = c + } +| "UNIQUE" KeyOrIndexOpt IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintUniq, + Keys: $6.([]*ast.IndexColName), + Name: $3.(string), + } + if $8 != nil { + c.Option = $8.(*ast.IndexOption) + } + if $4 != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = $4.(model.IndexType) + } + $$ = c + } +| "FOREIGN" "KEY" IndexName '(' IndexColNameList ')' ReferDef + { + $$ = &ast.Constraint{ + Tp: ast.ConstraintForeignKey, + Keys: $5.([]*ast.IndexColName), + Name: $3.(string), + Refer: $7.(*ast.ReferenceDef), + } + } + +ReferDef: + "REFERENCES" TableName '(' IndexColNameList ')' OnDeleteOpt OnUpdateOpt + { + var onDeleteOpt *ast.OnDeleteOpt + if $6 != nil { + onDeleteOpt = $6.(*ast.OnDeleteOpt) + } + var onUpdateOpt *ast.OnUpdateOpt + if $7 != nil { + onUpdateOpt = $7.(*ast.OnUpdateOpt) + } + $$ = &ast.ReferenceDef{ + Table: $2.(*ast.TableName), + IndexColNames: $4.([]*ast.IndexColName), + OnDelete: onDeleteOpt, + OnUpdate: onUpdateOpt, + } + } + +OnDeleteOpt: + { + $$ = &ast.OnDeleteOpt{} + } %prec lowerThanOn +| "ON" "DELETE" ReferOpt + { + $$ = &ast.OnDeleteOpt{ReferOpt: $3.(ast.ReferOptionType)} + } + +OnUpdateOpt: + { + $$ = &ast.OnUpdateOpt{} + } %prec lowerThanOn +| "ON" "UPDATE" ReferOpt + { + $$ = &ast.OnUpdateOpt{ReferOpt: $3.(ast.ReferOptionType)} + } + +ReferOpt: + "RESTRICT" + { + $$ = ast.ReferOptionRestrict + } +| "CASCADE" + { + $$ = ast.ReferOptionCascade + } +| "SET" "NULL" + { + $$ = ast.ReferOptionSetNull + } +| "NO" "ACTION" + { + $$ = ast.ReferOptionNoAction + } + +/* + * The DEFAULT clause specifies a default value for a column. + * With one exception, the default value must be a constant; + * it cannot be a function or an expression. This means, for example, + * that you cannot set the default for a date column to be the value of + * a function such as NOW() or CURRENT_DATE. The exception is that you + * can specify CURRENT_TIMESTAMP as the default for a TIMESTAMP or DATETIME column. + * + * See http://dev.mysql.com/doc/refman/5.7/en/create-table.html + * https://github.com/mysql/mysql-server/blob/5.7/sql/sql_yacc.yy#L6832 + */ +DefaultValueExpr: + NowSymOptionFraction | SignedLiteral + +NowSymOptionFraction: + NowSym + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } +| NowSymFunc '(' ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } +| NowSymFunc '(' NUM ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } + +/* +* See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_localtime +* TODO: Process other three keywords +*/ +NowSymFunc: + "CURRENT_TIMESTAMP" | "LOCALTIME" | "LOCALTIMESTAMP" | builtinNow +NowSym: + "CURRENT_TIMESTAMP" | "LOCALTIME" | "LOCALTIMESTAMP" + + +SignedLiteral: + Literal + { + $$ = ast.NewValueExpr($1) + } +| '+' NumLiteral + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr($2)} + } +| '-' NumLiteral + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr($2)} + } + +NumLiteral: + intLit +| floatLit +| decLit + + +CreateIndexStmt: + "CREATE" CreateIndexStmtUnique "INDEX" Identifier IndexTypeOpt "ON" TableName '(' IndexColNameList ')' IndexOptionList LockClauseOpt + { + var indexOption *ast.IndexOption + if $11 != nil { + indexOption = $11.(*ast.IndexOption) + if indexOption.Tp == model.IndexTypeInvalid { + if $5 != nil { + indexOption.Tp = $5.(model.IndexType) + } + } + } else { + indexOption = &ast.IndexOption{} + if $5 != nil { + indexOption.Tp = $5.(model.IndexType) + } + } + $$ = &ast.CreateIndexStmt{ + Unique: $2.(bool), + IndexName: $4, + Table: $7.(*ast.TableName), + IndexColNames: $9.([]*ast.IndexColName), + IndexOption: indexOption, + } + } + +CreateIndexStmtUnique: + { + $$ = false + } +| "UNIQUE" + { + $$ = true + } + +IndexColName: + ColumnName OptFieldLen Order + { + //Order is parsed but just ignored as MySQL did + $$ = &ast.IndexColName{Column: $1.(*ast.ColumnName), Length: $2.(int)} + } + +IndexColNameList: + IndexColName + { + $$ = []*ast.IndexColName{$1.(*ast.IndexColName)} + } +| IndexColNameList ',' IndexColName + { + $$ = append($1.([]*ast.IndexColName), $3.(*ast.IndexColName)) + } + + + +/******************************************************************* + * + * Create Database Statement + * CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name + * [create_specification] ... + * + * create_specification: + * [DEFAULT] CHARACTER SET [=] charset_name + * | [DEFAULT] COLLATE [=] collation_name + *******************************************************************/ +CreateDatabaseStmt: + "CREATE" DatabaseSym IfNotExists DBName DatabaseOptionListOpt + { + $$ = &ast.CreateDatabaseStmt{ + IfNotExists: $3.(bool), + Name: $4.(string), + Options: $5.([]*ast.DatabaseOption), + } + } + +DBName: + Identifier + { + $$ = $1 + } + +DatabaseOption: + DefaultKwdOpt CharsetKw EqOpt CharsetName + { + $$ = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: $4.(string)} + } +| DefaultKwdOpt "COLLATE" EqOpt StringName + { + $$ = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: $4.(string)} + } + +DatabaseOptionListOpt: + { + $$ = []*ast.DatabaseOption{} + } +| DatabaseOptionList + +DatabaseOptionList: + DatabaseOption + { + $$ = []*ast.DatabaseOption{$1.(*ast.DatabaseOption)} + } +| DatabaseOptionList DatabaseOption + { + $$ = append($1.([]*ast.DatabaseOption), $2.(*ast.DatabaseOption)) + } + +/******************************************************************* + * + * Create Table Statement + * + * Example: + * CREATE TABLE Persons + * ( + * P_Id int NOT NULL, + * LastName varchar(255) NOT NULL, + * FirstName varchar(255), + * Address varchar(255), + * City varchar(255), + * PRIMARY KEY (P_Id) + * ) + *******************************************************************/ + +CreateTableStmt: + "CREATE" "TABLE" IfNotExists TableName TableElementListOpt CreateTableOptionListOpt PartitionOpt DuplicateOpt AsOpt CreateTableSelectOpt + { + stmt := $5.(*ast.CreateTableStmt) + stmt.Table = $4.(*ast.TableName) + stmt.IfNotExists = $3.(bool) + stmt.Options = $6.([]*ast.TableOption) + if $7 != nil { + stmt.Partition = $7.(*ast.PartitionOptions) + } + stmt.OnDuplicate = $8.(ast.OnDuplicateCreateTableSelectType) + stmt.Select = $10.(*ast.CreateTableStmt).Select + $$ = stmt + } +| "CREATE" "TABLE" IfNotExists TableName LikeTableWithOrWithoutParen + { + $$ = &ast.CreateTableStmt{ + Table: $4.(*ast.TableName), + ReferTable: $5.(*ast.TableName), + IfNotExists: $3.(bool), + } + } + +DefaultKwdOpt: + {} +| "DEFAULT" + +PartitionOpt: + { + $$ = nil + } +| "PARTITION" "BY" "KEY" '(' ColumnNameList ')' PartitionNumOpt PartitionDefinitionListOpt + { + $$ = nil + } +| "PARTITION" "BY" "HASH" '(' Expression ')' PartitionNumOpt PartitionDefinitionListOpt + { + $$ = nil + } +| "PARTITION" "BY" "RANGE" '(' Expression ')' PartitionNumOpt SubPartitionOpt PartitionDefinitionListOpt + { + var defs []*ast.PartitionDefinition + if $9 != nil { + defs = $9.([]*ast.PartitionDefinition) + } + $$ = &ast.PartitionOptions{ + Tp: model.PartitionTypeRange, + Expr: $5.(ast.ExprNode), + Definitions: defs, + } + } +| "PARTITION" "BY" "RANGE" "COLUMNS" '(' ColumnNameList ')' PartitionNumOpt PartitionDefinitionListOpt + { + var defs []*ast.PartitionDefinition + if $9 != nil { + defs = $9.([]*ast.PartitionDefinition) + } + $$ = &ast.PartitionOptions{ + Tp: model.PartitionTypeRange, + ColumnNames: $6.([]*ast.ColumnName), + Definitions: defs, + } + } + +SubPartitionOpt: + {} +| "SUBPARTITION" "BY" "HASH" '(' Expression ')' SubPartitionNumOpt + {} +| "SUBPARTITION" "BY" "KEY" '(' ColumnNameList ')' SubPartitionNumOpt + {} + +SubPartitionNumOpt: + {} +| "SUBPARTITIONS" NUM + {} + +PartitionNumOpt: + {} +| "PARTITIONS" NUM + {} + +PartitionDefinitionListOpt: + /* empty */ %prec lowerThanCreateTableSelect + { + $$ = nil + } +| '(' PartitionDefinitionList ')' + { + $$ = $2.([]*ast.PartitionDefinition) + } + +PartitionDefinitionList: + PartitionDefinition + { + $$ = []*ast.PartitionDefinition{$1.(*ast.PartitionDefinition)} + } +| PartitionDefinitionList ',' PartitionDefinition + { + $$ = append($1.([]*ast.PartitionDefinition), $3.(*ast.PartitionDefinition)) + } + +PartitionDefinition: + "PARTITION" Identifier PartDefValuesOpt PartDefOptionsOpt + { + partDef := &ast.PartitionDefinition{ + Name: model.NewCIStr($2), + } + switch $3.(type) { + case []ast.ExprNode: + partDef.LessThan = $3.([]ast.ExprNode) + case ast.ExprNode: + partDef.LessThan = make([]ast.ExprNode, 1) + partDef.LessThan[0] = $3.(ast.ExprNode) + } + + if comment, ok := $4.(string); ok { + partDef.Comment = comment + } + $$ = partDef + } + +PartDefOptionsOpt: + { + $$ = nil + } +| PartDefOptionList + { + $$ = $1 + } + +PartDefOptionList: + PartDefOption + { + $$ = $1 + } +| PartDefOptionList PartDefOption + { + if $1 != nil { + $$ = $1 + } else { + $$ = $2 + } + } + +PartDefOption: + "COMMENT" EqOpt stringLit + { + $$ = $3 + } +| "ENGINE" EqOpt Identifier + { + $$ = nil + } +| "TABLESPACE" EqOpt Identifier + { + $$ = nil + } + + +PartDefValuesOpt: + { + $$ = nil + } +| "VALUES" "LESS" "THAN" "MAXVALUE" + { + $$ = &ast.MaxValueExpr{} + } +| "VALUES" "LESS" "THAN" '(' MaxValueOrExpressionList ')' + { + $$ = $5 + } + +DuplicateOpt: + { + $$ = ast.OnDuplicateCreateTableSelectError + } +| "IGNORE" + { + $$ = ast.OnDuplicateCreateTableSelectIgnore + } +| "REPLACE" + { + $$ = ast.OnDuplicateCreateTableSelectReplace + } + +AsOpt: + {} +| "AS" + {} + +CreateTableSelectOpt: + /* empty */ + { + $$ = &ast.CreateTableStmt{} + } +| + SelectStmt + { + $$ = &ast.CreateTableStmt{Select: $1} + } +| + UnionStmt + { + $$ = &ast.CreateTableStmt{Select: $1} + } +| + SubSelect %prec createTableSelect + // TODO: We may need better solution as issue #320. + { + $$ = &ast.CreateTableStmt{Select: $1} + } + +LikeTableWithOrWithoutParen: + "LIKE" TableName + { + $$ = $2 + } +| + '(' "LIKE" TableName ')' + { + $$ = $3 + } + +/******************************************************************* + * + * Create View Statement + * + * Example: + * CREATE VIEW OR REPLACE ALGORITHM = MERGE DEFINER="root@localhost" SQL SECURITY = definer view_name (col1,col2) + * as select Col1,Col2 from table WITH LOCAL CHECK OPTION + *******************************************************************/ +CreateViewStmt: + "CREATE" OrReplace ViewAlgorithm ViewDefiner ViewSQLSecurity "VIEW" ViewName ViewFieldList "AS" SelectStmt ViewCheckOption + { + startOffset := parser.startOffset(&yyS[yypt-1]) + selStmt := $10.(*ast.SelectStmt) + selStmt.SetText(string(parser.src[startOffset:])) + x := &ast.CreateViewStmt { + OrReplace: $2.(bool), + ViewName: $7.(*ast.TableName), + Select: selStmt, + } + if $8 != nil{ + x.Cols = $8.([]model.CIStr) + } + $$ = x + } + +OrReplace: + { + $$ = false + } +| "OR" "REPLACE" + { + $$ = true + } + +ViewAlgorithm: + /* EMPTY */ + { + $$ = "UNDEFINED" + } +| "ALGORITHM" "=" "UNDEFINED" + { + $$ = strings.ToUpper($3) + } +| "ALGORITHM" "=" "MERGE" + { + $$ = strings.ToUpper($3) + } +| "ALGORITHM" "=" "TEMPTABLE" + { + $$ = strings.ToUpper($3) + } + +ViewDefiner: + /* EMPTY */ + { + $$ = nil + } +| "DEFINER" "=" Username + { + $$ = $3 + } + +ViewSQLSecurity: + /* EMPTY */ + { + $$ = "DEFINER" + } +| "SQL" "SECURITY" "DEFINER" + { + $$ = $3 + } +| "SQL" "SECURITY" "INVOKER" + { + $$ = $3 + } + +ViewName: + TableName + { + $$ = $1.(*ast.TableName) + } + +ViewFieldList: + /* Empty */ + { + $$ = nil + } +| '(' ColumnList ')' + { + $$ = $2.([]model.CIStr) + } + +ColumnList: + Identifier + { + $$ = []model.CIStr{model.NewCIStr($1)} + } +| ColumnList ',' Identifier + { + $$ = append($1.([]model.CIStr), model.NewCIStr($3)) + } + +ViewCheckOption: + /* EMPTY */ + { + $$ = nil + } +| "WITH" "CASCADED" "CHECK" "OPTION" + { + $$ = $2 + } +| "WITH" "LOCAL" "CHECK" "OPTION" + { + $$ = $2 + } + +/****************************************************************** + * Do statement + * See https://dev.mysql.com/doc/refman/5.7/en/do.html + ******************************************************************/ +DoStmt: + "DO" ExpressionList + { + $$ = &ast.DoStmt { + Exprs: $2.([]ast.ExprNode), + } + } + +/******************************************************************* + * + * Delete Statement + * + *******************************************************************/ +DeleteFromStmt: + "DELETE" TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional "FROM" TableName IndexHintListOpt WhereClauseOptional OrderByOptional LimitClause + { + // Single Table + tn := $7.(*ast.TableName) + tn.IndexHints = $8.([]*ast.IndexHint) + join := &ast.Join{Left: &ast.TableSource{Source: tn}, Right: nil} + x := &ast.DeleteStmt{ + TableRefs: &ast.TableRefsClause{TableRefs: join}, + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + } + if $9 != nil { + x.Where = $9.(ast.ExprNode) + } + if $10 != nil { + x.Order = $10.(*ast.OrderByClause) + } + if $11 != nil { + x.Limit = $11.(*ast.Limit) + } + + $$ = x + } +| "DELETE" TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional TableNameList "FROM" TableRefs WhereClauseOptional + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + IsMultiTable: true, + BeforeFrom: true, + Tables: &ast.DeleteTableList{Tables: $6.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: $8.(*ast.Join)}, + } + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $9 != nil { + x.Where = $9.(ast.ExprNode) + } + $$ = x + } + +| "DELETE" TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional "FROM" TableNameList "USING" TableRefs WhereClauseOptional + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + IsMultiTable: true, + Tables: &ast.DeleteTableList{Tables: $7.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: $9.(*ast.Join)}, + } + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $10 != nil { + x.Where = $10.(ast.ExprNode) + } + $$ = x + } + +DatabaseSym: +"DATABASE" + +DropDatabaseStmt: + "DROP" DatabaseSym IfExists DBName + { + $$ = &ast.DropDatabaseStmt{IfExists: $3.(bool), Name: $4.(string)} + } + +DropIndexStmt: + "DROP" "INDEX" IfExists Identifier "ON" TableName + { + $$ = &ast.DropIndexStmt{IfExists: $3.(bool), IndexName: $4, Table: $6.(*ast.TableName)} + } + +DropTableStmt: + "DROP" TableOrTables TableNameList RestrictOrCascadeOpt + { + $$ = &ast.DropTableStmt{Tables: $3.([]*ast.TableName)} + } +| "DROP" TableOrTables "IF" "EXISTS" TableNameList RestrictOrCascadeOpt + { + $$ = &ast.DropTableStmt{IfExists: true, Tables: $5.([]*ast.TableName)} + } + +DropViewStmt: + "DROP" "VIEW" "IF" "EXISTS" TableNameList + { + $$ = &ast.DoStmt{} + } + +DropUserStmt: + "DROP" "USER" UsernameList + { + $$ = &ast.DropUserStmt{IfExists: false, UserList: $3.([]*auth.UserIdentity)} + } +| "DROP" "USER" "IF" "EXISTS" UsernameList + { + $$ = &ast.DropUserStmt{IfExists: true, UserList: $5.([]*auth.UserIdentity)} + } + +DropStatsStmt: + "DROP" "STATS" TableName + { + $$ = &ast.DropStatsStmt{Table: $3.(*ast.TableName)} + } + +RestrictOrCascadeOpt: + {} +| "RESTRICT" +| "CASCADE" + +TableOrTables: + "TABLE" +| "TABLES" + +EqOpt: + {} +| eq + +EmptyStmt: + /* EMPTY */ + { + $$ = nil + } + +TraceStmt: + "TRACE" TraceableStmt + { + $$ = &ast.TraceStmt{ + Stmt: $2, + Format: "row", + } + } + +ExplainSym: +"EXPLAIN" | "DESCRIBE" | "DESC" + +ExplainStmt: + ExplainSym TableName + { + $$ = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: $2.(*ast.TableName), + }, + } + } +| ExplainSym TableName ColumnName + { + $$ = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: $2.(*ast.TableName), + Column: $3.(*ast.ColumnName), + }, + } + } +| ExplainSym ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $2, + Format: "row", + } + } +| ExplainSym "FORMAT" "=" stringLit ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $5, + Format: $4, + } + } +| ExplainSym "ANALYZE" ExplainableStmt + { + $$ = &ast.ExplainStmt { + Stmt: $3, + Format: "row", + Analyze: true, + } + } + +LengthNum: + NUM + { + $$ = getUint64FromNUM($1) + } + +NUM: + intLit + +Expression: + singleAtIdentifier assignmentEq Expression %prec assignmentEq + { + v := $1 + v = strings.TrimPrefix(v, "@") + $$ = &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: $3, + } + } +| Expression logOr Expression %prec pipes + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: $1, R: $3} + } +| Expression "XOR" Expression %prec xor + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: $1, R: $3} + } +| Expression logAnd Expression %prec andand + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: $1, R: $3} + } +| "NOT" Expression %prec not + { + expr, ok := $2.(*ast.ExistsSubqueryExpr) + if ok { + expr.Not = true + $$ = $2 + } else { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not, V: $2} + } + } +| BoolPri IsOrNotOp trueKwd %prec is + { + $$ = &ast.IsTruthExpr{Expr:$1, Not: !$2.(bool), True: int64(1)} + } +| BoolPri IsOrNotOp falseKwd %prec is + { + $$ = &ast.IsTruthExpr{Expr:$1, Not: !$2.(bool), True: int64(0)} + } +| BoolPri IsOrNotOp "UNKNOWN" %prec is + { + /* https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_is */ + $$ = &ast.IsNullExpr{Expr: $1, Not: !$2.(bool)} + } +| BoolPri + +MaxValueOrExpression: + "MAXVALUE" + { + $$ = &ast.MaxValueExpr{} + } +| Expression + { + $$ = $1 + } + + +logOr: + pipesAsOr +| "OR" + +logAnd: +"&&" | "AND" + +ExpressionList: + Expression + { + $$ = []ast.ExprNode{$1} + } +| ExpressionList ',' Expression + { + $$ = append($1.([]ast.ExprNode), $3) + } + +MaxValueOrExpressionList: + MaxValueOrExpression + { + $$ = []ast.ExprNode{$1} +} +| MaxValueOrExpressionList ',' MaxValueOrExpression +{ + $$ = append($1.([]ast.ExprNode), $3) + } + + +ExpressionListOpt: + { + $$ = []ast.ExprNode{} + } +| ExpressionList + +FuncDatetimePrecListOpt: + { + $$ = []ast.ExprNode{} + } +| FuncDatetimePrecList + { + $$ = $1 + } + +FuncDatetimePrecList: + intLit + { + expr := ast.NewValueExpr($1) + $$ = []ast.ExprNode{expr} + } + +BoolPri: + BoolPri IsOrNotOp "NULL" %prec is + { + $$ = &ast.IsNullExpr{Expr: $1, Not: !$2.(bool)} + } +| BoolPri CompareOp PredicateExpr %prec eq + { + $$ = &ast.BinaryOperationExpr{Op: $2.(opcode.Op), L: $1, R: $3} + } +| BoolPri CompareOp AnyOrAll SubSelect %prec eq + { + sq := $4.(*ast.SubqueryExpr) + sq.MultiRows = true + $$ = &ast.CompareSubqueryExpr{Op: $2.(opcode.Op), L: $1, R: sq, All: $3.(bool)} + } +| BoolPri CompareOp singleAtIdentifier assignmentEq PredicateExpr %prec assignmentEq + { + v := $3 + v = strings.TrimPrefix(v, "@") + variable := &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: $5, + } + $$ = &ast.BinaryOperationExpr{Op: $2.(opcode.Op), L: $1, R: variable} + } +| PredicateExpr + +CompareOp: + ">=" + { + $$ = opcode.GE + } +| '>' + { + $$ = opcode.GT + } +| "<=" + { + $$ = opcode.LE + } +| '<' + { + $$ = opcode.LT + } +| "!=" + { + $$ = opcode.NE + } +| "<>" + { + $$ = opcode.NE + } +| "=" + { + $$ = opcode.EQ + } +| "<=>" + { + $$ = opcode.NullEQ + } + +BetweenOrNotOp: + "BETWEEN" + { + $$ = true + } +| "NOT" "BETWEEN" + { + $$ = false + } + +IsOrNotOp: + "IS" + { + $$ = true + } +| "IS" "NOT" + { + $$ = false + } + +InOrNotOp: + "IN" + { + $$ = true + } +| "NOT" "IN" + { + $$ = false + } + +LikeOrNotOp: + "LIKE" + { + $$ = true + } +| "NOT" "LIKE" + { + $$ = false + } + +RegexpOrNotOp: + RegexpSym + { + $$ = true + } +| "NOT" RegexpSym + { + $$ = false + } + +AnyOrAll: + "ANY" + { + $$ = false + } +| "SOME" + { + $$ = false + } +| "ALL" + { + $$ = true + } + +PredicateExpr: + BitExpr InOrNotOp '(' ExpressionList ')' + { + $$ = &ast.PatternInExpr{Expr: $1, Not: !$2.(bool), List: $4.([]ast.ExprNode)} + } +| BitExpr InOrNotOp SubSelect + { + sq := $3.(*ast.SubqueryExpr) + sq.MultiRows = true + $$ = &ast.PatternInExpr{Expr: $1, Not: !$2.(bool), Sel: sq} + } +| BitExpr BetweenOrNotOp BitExpr "AND" PredicateExpr + { + $$ = &ast.BetweenExpr{ + Expr: $1, + Left: $3, + Right: $5, + Not: !$2.(bool), + } + } +| BitExpr LikeOrNotOp SimpleExpr LikeEscapeOpt + { + escape := $4.(string) + if len(escape) > 1 { + yylex.Errorf("Incorrect arguments %s to ESCAPE", escape) + return 1 + } else if len(escape) == 0 { + escape = "\\" + } + $$ = &ast.PatternLikeExpr{ + Expr: $1, + Pattern: $3, + Not: !$2.(bool), + Escape: escape[0], + } + } +| BitExpr RegexpOrNotOp SimpleExpr + { + $$ = &ast.PatternRegexpExpr{Expr: $1, Pattern: $3, Not: !$2.(bool)} + } +| BitExpr + +RegexpSym: +"REGEXP" | "RLIKE" + +LikeEscapeOpt: + %prec empty + { + $$ = "\\" + } +| "ESCAPE" stringLit + { + $$ = $2 + } + +Field: + '*' + { + $$ = &ast.SelectField{WildCard: &ast.WildCardField{}} + } +| Identifier '.' '*' + { + wildCard := &ast.WildCardField{Table: model.NewCIStr($1)} + $$ = &ast.SelectField{WildCard: wildCard} + } +| Identifier '.' Identifier '.' '*' + { + wildCard := &ast.WildCardField{Schema: model.NewCIStr($1), Table: model.NewCIStr($3)} + $$ = &ast.SelectField{WildCard: wildCard} + } +| Expression FieldAsNameOpt + { + expr := $1 + asName := $2.(string) + $$ = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } +| '{' Identifier Expression '}' FieldAsNameOpt + { + /* + * ODBC escape syntax. + * See https://dev.mysql.com/doc/refman/5.7/en/expressions.html + */ + expr := $3 + asName := $5.(string) + $$ = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } + +FieldAsNameOpt: + /* EMPTY */ + { + $$ = "" + } +| FieldAsName + { + $$ = $1 + } + +FieldAsName: + Identifier + { + $$ = $1 + } +| "AS" Identifier + { + $$ = $2 + } +| stringLit + { + $$ = $1 + } +| "AS" stringLit + { + $$ = $2 + } + +FieldList: + Field + { + field := $1.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + $$ = []*ast.SelectField{field} + } +| FieldList ',' Field + { + + fl := $1.([]*ast.SelectField) + last := fl[len(fl)-1] + if last.Expr != nil && last.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-1]) + last.SetText(parser.src[last.Offset:lastEnd]) + } + newField := $3.(*ast.SelectField) + newField.Offset = parser.startOffset(&yyS[yypt]) + $$ = append(fl, newField) + } + +GroupByClause: + "GROUP" "BY" ByList + { + $$ = &ast.GroupByClause{Items: $3.([]*ast.ByItem)} + } + +HavingClause: + { + $$ = nil + } +| "HAVING" Expression + { + $$ = &ast.HavingClause{Expr: $2} + } + +IfExists: + { + $$ = false + } +| "IF" "EXISTS" + { + $$ = true + } + +IfNotExists: + { + $$ = false + } +| "IF" "NOT" "EXISTS" + { + $$ = true + } + + +IgnoreOptional: + { + $$ = false + } +| "IGNORE" + { + $$ = true + } + +IndexName: + { + $$ = "" + } +| Identifier + { + //"index name" + $$ = $1 + } + +IndexOptionList: + { + $$ = nil + } +| IndexOptionList IndexOption + { + // Merge the options + if $1 == nil { + $$ = $2 + } else { + opt1 := $1.(*ast.IndexOption) + opt2 := $2.(*ast.IndexOption) + if len(opt2.Comment) > 0 { + opt1.Comment = opt2.Comment + } else if opt2.Tp != 0 { + opt1.Tp = opt2.Tp + } + $$ = opt1 + } + } + + +IndexOption: + "KEY_BLOCK_SIZE" EqOpt LengthNum + { + $$ = &ast.IndexOption{ + // TODO bug should be fix here! + // KeyBlockSize: $1.(uint64), + } + } +| IndexType + { + $$ = &ast.IndexOption { + Tp: $1.(model.IndexType), + } + } +| "COMMENT" stringLit + { + $$ = &ast.IndexOption { + Comment: $2, + } + } + +IndexType: + "USING" "BTREE" + { + $$ = model.IndexTypeBtree + } +| "USING" "HASH" + { + $$ = model.IndexTypeHash + } + +IndexTypeOpt: + { + $$ = nil + } +| IndexType + { + $$ = $1 + } + +/**********************************Identifier********************************************/ +Identifier: +identifier | UnReservedKeyword | NotKeywordToken | TiDBKeyword + +UnReservedKeyword: + "ACTION" | "ASCII" | "AUTO_INCREMENT" | "AFTER" | "ALWAYS" | "AVG" | "BEGIN" | "BIT" | "BOOL" | "BOOLEAN" | "BTREE" | "BYTE" | "CLEANUP" | "CHARSET" +| "COLUMNS" | "COMMIT" | "COMPACT" | "COMPRESSED" | "CONSISTENT" | "DATA" | "DATE" %prec lowerThanStringLitToken| "DATETIME" | "DAY" | "DEALLOCATE" | "DO" | "DUPLICATE" +| "DYNAMIC"| "END" | "ENGINE" | "ENGINES" | "ENUM" | "ERRORS" | "ESCAPE" | "EXECUTE" | "FIELDS" | "FIRST" | "FIXED" | "FLUSH" | "FORMAT" | "FULL" |"GLOBAL" +| "HASH" | "HOUR" | "LESS" | "LOCAL" | "NAMES" | "OFFSET" | "PASSWORD" %prec lowerThanEq | "PREPARE" | "QUICK" | "REDUNDANT" +| "ROLLBACK" | "SESSION" | "SIGNED" | "SNAPSHOT" | "START" | "STATUS" | "SUBPARTITIONS" | "SUBPARTITION" | "TABLES" | "TABLESPACE" | "TEXT" | "THAN" | "TIME" %prec lowerThanStringLitToken +| "TIMESTAMP" %prec lowerThanStringLitToken | "TRACE" | "TRANSACTION" | "TRUNCATE" | "UNKNOWN" | "VALUE" | "WARNINGS" | "YEAR" | "MODE" | "WEEK" | "ANY" | "SOME" | "USER" | "IDENTIFIED" +| "COLLATION" | "COMMENT" | "AVG_ROW_LENGTH" | "CONNECTION" | "CHECKSUM" | "COMPRESSION" | "KEY_BLOCK_SIZE" | "MASTER" | "MAX_ROWS" +| "MIN_ROWS" | "NATIONAL" | "ROW" | "ROW_FORMAT" | "QUARTER" | "GRANTS" | "TRIGGERS" | "DELAY_KEY_WRITE" | "ISOLATION" | "JSON" +| "REPEATABLE" | "COMMITTED" | "UNCOMMITTED" | "ONLY" | "SERIALIZABLE" | "LEVEL" | "VARIABLES" | "SQL_CACHE" | "INDEXES" | "PROCESSLIST" +| "SQL_NO_CACHE" | "DISABLE" | "ENABLE" | "REVERSE" | "PRIVILEGES" | "NO" | "BINLOG" | "FUNCTION" | "VIEW" | "MODIFY" | "EVENTS" | "PARTITIONS" +| "NONE" | "SUPER" | "EXCLUSIVE" | "STATS_PERSISTENT" | "ROW_COUNT" | "COALESCE" | "MONTH" | "PROCESS" | "PROFILES" +| "MICROSECOND" | "MINUTE" | "PLUGINS" | "QUERY" | "QUERIES" | "SECOND" | "SEPARATOR" | "SHARE" | "SHARED" | "SLOW" | "MAX_CONNECTIONS_PER_HOUR" | "MAX_QUERIES_PER_HOUR" | "MAX_UPDATES_PER_HOUR" +| "MAX_USER_CONNECTIONS" | "REPLICATION" | "CLIENT" | "SLAVE" | "RELOAD" | "TEMPORARY" | "ROUTINE" | "EVENT" | "ALGORITHM" | "DEFINER" | "INVOKER" | "MERGE" | "TEMPTABLE" | "UNDEFINED" | "SECURITY" | "CASCADED" | "RECOVER" + + + +TiDBKeyword: +"ADMIN" | "BUCKETS" | "CANCEL" | "DDL" | "JOBS" | "JOB" | "STATS" | "STATS_META" | "STATS_HISTOGRAMS" | "STATS_BUCKETS" | "STATS_HEALTHY" | "TIDB" | "TIDB_HJ" | "TIDB_SMJ" | "TIDB_INLJ" + +NotKeywordToken: + "ADDDATE" | "BIT_AND" | "BIT_OR" | "BIT_XOR" | "CAST" | "COPY" | "COUNT" | "CURTIME" | "DATE_ADD" | "DATE_SUB" | "EXTRACT" | "GET_FORMAT" | "GROUP_CONCAT" | "INPLACE" | "INTERNAL" +|"MIN" | "MAX" | "MAX_EXECUTION_TIME" | "NOW" | "RECENT" | "POSITION" | "SUBDATE" | "SUBSTRING" | "SUM" | "TIMESTAMPADD" | "TIMESTAMPDIFF" | "TOP" | "TRIM" + +/************************************************************************************ + * + * Insert Statements + * + * TODO: support PARTITION + **********************************************************************************/ +InsertIntoStmt: + "INSERT" PriorityOpt IgnoreOptional IntoOpt TableName InsertValues OnDuplicateKeyUpdate + { + x := $6.(*ast.InsertStmt) + x.Priority = $2.(mysql.PriorityEnum) + x.IgnoreErr = $3.(bool) + // Wraps many layers here so that it can be processed the same way as select statement. + ts := &ast.TableSource{Source: $5.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + if $7 != nil { + x.OnDuplicate = $7.([]*ast.Assignment) + } + $$ = x + } + +IntoOpt: + {} +| "INTO" + +InsertValues: + '(' ColumnNameListOpt ')' ValueSym ValuesList + { + $$ = &ast.InsertStmt{ + Columns: $2.([]*ast.ColumnName), + Lists: $5.([][]ast.ExprNode), + } + } +| '(' ColumnNameListOpt ')' SelectStmt + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $4.(*ast.SelectStmt)} + } +| '(' ColumnNameListOpt ')' '(' SelectStmt ')' + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $5.(*ast.SelectStmt)} + } +| '(' ColumnNameListOpt ')' UnionStmt + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $4.(*ast.UnionStmt)} + } +| ValueSym ValuesList %prec insertValues + { + $$ = &ast.InsertStmt{Lists: $2.([][]ast.ExprNode)} + } +| '(' SelectStmt ')' + { + $$ = &ast.InsertStmt{Select: $2.(*ast.SelectStmt)} + } +| SelectStmt + { + $$ = &ast.InsertStmt{Select: $1.(*ast.SelectStmt)} + } +| UnionStmt + { + $$ = &ast.InsertStmt{Select: $1.(*ast.UnionStmt)} + } +| "SET" ColumnSetValueList + { + $$ = &ast.InsertStmt{Setlist: $2.([]*ast.Assignment)} + } + +ValueSym: +"VALUE" | "VALUES" + +ValuesList: + RowValue + { + $$ = [][]ast.ExprNode{$1.([]ast.ExprNode)} + } +| ValuesList ',' RowValue + { + $$ = append($1.([][]ast.ExprNode), $3.([]ast.ExprNode)) + } + +RowValue: + '(' ValuesOpt ')' + { + $$ = $2 + } + +ValuesOpt: + { + $$ = []ast.ExprNode{} + } +| Values + +Values: + Values ',' ExprOrDefault + { + $$ = append($1.([]ast.ExprNode), $3) + } +| ExprOrDefault + { + $$ = []ast.ExprNode{$1} + } + +ExprOrDefault: + Expression +| "DEFAULT" + { + $$ = &ast.DefaultExpr{} + } + +ColumnSetValue: + ColumnName eq Expression + { + $$ = &ast.Assignment{ + Column: $1.(*ast.ColumnName), + Expr: $3, + } + } + +ColumnSetValueList: + { + $$ = []*ast.Assignment{} + } +| ColumnSetValue + { + $$ = []*ast.Assignment{$1.(*ast.Assignment)} + } +| ColumnSetValueList ',' ColumnSetValue + { + $$ = append($1.([]*ast.Assignment), $3.(*ast.Assignment)) + } + +/* + * ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... + * See https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html + */ +OnDuplicateKeyUpdate: + { + $$ = nil + } +| "ON" "DUPLICATE" "KEY" "UPDATE" AssignmentList + { + $$ = $5 + } + +/***********************************Insert Statements END************************************/ + +/************************************************************************************ + * Replace Statements + * See https://dev.mysql.com/doc/refman/5.7/en/replace.html + * + * TODO: support PARTITION + **********************************************************************************/ +ReplaceIntoStmt: + "REPLACE" PriorityOpt IntoOpt TableName InsertValues + { + x := $5.(*ast.InsertStmt) + x.IsReplace = true + x.Priority = $2.(mysql.PriorityEnum) + ts := &ast.TableSource{Source: $4.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + $$ = x + } + +/***********************************Replace Statements END************************************/ + +ODBCDateTimeType: + "d" + { + $$ = ast.DateLiteral + } +| "t" + { + $$ = ast.TimeLiteral + } +| "ts" + { + $$ = ast.TimestampLiteral + } + +Literal: + "FALSE" + { + $$ = ast.NewValueExpr(false) + } +| "NULL" + { + $$ = ast.NewValueExpr(nil) + } +| "TRUE" + { + $$ = ast.NewValueExpr(true) + } +| floatLit + { + $$ = ast.NewValueExpr($1) + } +| decLit + { + $$ = ast.NewValueExpr($1) + } +| intLit + { + $$ = ast.NewValueExpr($1) + } +| StringLiteral %prec lowerThanStringLitToken + { + $$ = $1 + } +| "UNDERSCORE_CHARSET" stringLit + { + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + co, err := charset.GetDefaultCollation($1) + if err != nil { + yylex.Errorf("Get collation error for charset: %s", $1) + return 1 + } + expr := ast.NewValueExpr($2) + tp := expr.GetType() + tp.Charset = $1 + tp.Collate = co + if tp.Collate == charset.CollationBin { + tp.Flag |= mysql.BinaryFlag + } + $$ = expr + } +| hexLit + { + $$ = ast.NewValueExpr($1) + } +| bitLit + { + $$ = ast.NewValueExpr($1) + } + +StringLiteral: + stringLit + { + expr := ast.NewValueExpr($1) + $$ = expr + } +| StringLiteral stringLit + { + valExpr := $1.(ast.ValueExpr) + strLit := valExpr.GetString() + expr := ast.NewValueExpr(strLit+$2) + // Fix #4239, use first string literal as projection name. + if valExpr.GetProjectionOffset() >= 0 { + expr.SetProjectionOffset(valExpr.GetProjectionOffset()) + } else { + expr.SetProjectionOffset(len(strLit)) + } + $$ = expr + } + + +OrderBy: + "ORDER" "BY" ByList + { + $$ = &ast.OrderByClause{Items: $3.([]*ast.ByItem)} + } + +ByList: + ByItem + { + $$ = []*ast.ByItem{$1.(*ast.ByItem)} + } +| ByList ',' ByItem + { + $$ = append($1.([]*ast.ByItem), $3.(*ast.ByItem)) + } + +ByItem: + Expression Order + { + expr := $1 + valueExpr, ok := expr.(ast.ValueExpr) + if ok { + position, isPosition := valueExpr.GetValue().(int64) + if isPosition { + expr = &ast.PositionExpr{N: int(position)} + } + } + $$ = &ast.ByItem{Expr: expr, Desc: $2.(bool)} + } + +Order: + /* EMPTY */ + { + $$ = false // ASC by default + } +| "ASC" + { + $$ = false + } +| "DESC" + { + $$ = true + } + +OrderByOptional: + { + $$ = nil + } +| OrderBy + { + $$ = $1 + } + +BitExpr: + BitExpr '|' BitExpr %prec '|' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Or, L: $1, R: $3} + } +| BitExpr '&' BitExpr %prec '&' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.And, L: $1, R: $3} + } +| BitExpr "<<" BitExpr %prec lsh + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: $1, R: $3} + } +| BitExpr ">>" BitExpr %prec rsh + { + $$ = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: $1, R: $3} + } +| BitExpr '+' BitExpr %prec '+' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Plus, L: $1, R: $3} + } +| BitExpr '-' BitExpr %prec '-' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Minus, L: $1, R: $3} + } +| BitExpr '+' "INTERVAL" Expression TimeUnit %prec '+' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_ADD"), + Args: []ast.ExprNode{ + $1, + $4, + ast.NewValueExpr($5), + }, + } + } +| BitExpr '-' "INTERVAL" Expression TimeUnit %prec '+' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_SUB"), + Args: []ast.ExprNode{ + $1, + $4, + ast.NewValueExpr($5), + }, + } + } +| BitExpr '*' BitExpr %prec '*' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mul, L: $1, R: $3} + } +| BitExpr '/' BitExpr %prec '/' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Div, L: $1, R: $3} + } +| BitExpr '%' BitExpr %prec '%' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $1, R: $3} + } +| BitExpr "DIV" BitExpr %prec div + { + $$ = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: $1, R: $3} + } +| BitExpr "MOD" BitExpr %prec mod + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $1, R: $3} + } +| BitExpr '^' BitExpr + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Xor, L: $1, R: $3} + } +| SimpleExpr + +SimpleIdent: + Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Name: model.NewCIStr($1), + }} + } +| Identifier '.' Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr($1), + Name: model.NewCIStr($3), + }} + } +| '.' Identifier '.' Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr($2), + Name: model.NewCIStr($4), + }} + } +| Identifier '.' Identifier '.' Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Schema: model.NewCIStr($1), + Table: model.NewCIStr($3), + Name: model.NewCIStr($5), + }} + } + +SimpleExpr: + SimpleIdent +| FunctionCallKeyword +| FunctionCallNonKeyword +| FunctionCallGeneric +| SimpleExpr "COLLATE" StringName %prec neg + { + // TODO: Create a builtin function hold expr and collation. When do evaluation, convert expr result using the collation. + $$ = $1 + } +| Literal +| paramMarker + { + $$ = ast.NewParamMarkerExpr(yyS[yypt].offset) + } +| Variable +| SumExpr +| '!' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not, V: $2} + } +| '~' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: $2} + } +| '-' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Minus, V: $2} + } +| '+' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Plus, V: $2} + } +| SimpleExpr pipes SimpleExpr + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.Concat), Args: []ast.ExprNode{$1, $3}} + } +| not2 SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not, V: $2} + } +| SubSelect +| '(' Expression ')' { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.endOffset(&yyS[yypt]) + expr := $2 + expr.SetText(parser.src[startOffset:endOffset]) + $$ = &ast.ParenthesesExpr{Expr: expr} + } +| '(' ExpressionList ',' Expression ')' + { + values := append($2.([]ast.ExprNode), $4) + $$ = &ast.RowExpr{Values: values} + } +| "ROW" '(' ExpressionList ',' Expression ')' + { + values := append($3.([]ast.ExprNode), $5) + $$ = &ast.RowExpr{Values: values} + } +| "EXISTS" SubSelect + { + sq := $2.(*ast.SubqueryExpr) + sq.Exists = true + $$ = &ast.ExistsSubqueryExpr{Sel: sq} + } +| "BINARY" SimpleExpr %prec neg + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary + x := types.NewFieldType(mysql.TypeString) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + $$ = &ast.FuncCastExpr{ + Expr: $2, + Tp: x, + FunctionType: ast.CastBinaryOperator, + } + } +| builtinCast '(' Expression "AS" CastType ')' + { + /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ + tp := $5.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + $$ = &ast.FuncCastExpr{ + Expr: $3, + Tp: tp, + FunctionType: ast.CastFunction, + } + } +| "CASE" ExpressionOpt WhenClauseList ElseOpt "END" + { + x := &ast.CaseExpr{WhenClauses: $3.([]*ast.WhenClause)} + if $2 != nil { + x.Value = $2 + } + if $4 != nil { + x.ElseClause = $4.(ast.ExprNode) + } + $$ = x + } +| "CONVERT" '(' Expression ',' CastType ')' + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + tp := $5.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + $$ = &ast.FuncCastExpr{ + Expr: $3, + Tp: tp, + FunctionType: ast.CastConvertFunction, + } + } +| "CONVERT" '(' Expression "USING" StringName ')' + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + charset1 := ast.NewValueExpr($5) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, charset1}, + } + } +| "DEFAULT" '(' SimpleIdent ')' + { + $$ = &ast.DefaultExpr{Name: $3.(*ast.ColumnNameExpr).Name} + } +| "VALUES" '(' SimpleIdent ')' %prec lowerThanInsertValues + { + $$ = &ast.ValuesExpr{Column: $3.(*ast.ColumnNameExpr)} + } +| SimpleIdent jss stringLit + { + expr := ast.NewValueExpr($3) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{$1, expr}} + } +| SimpleIdent juss stringLit + { + expr := ast.NewValueExpr($3) + extract := &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{$1, expr}} + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONUnquote), Args: []ast.ExprNode{extract}} + } + +DistinctKwd: + "DISTINCT" +| "DISTINCTROW" + +DistinctOpt: + "ALL" + { + $$ = false + } +| DistinctKwd + { + $$ = true + } + +DefaultFalseDistinctOpt: + { + $$ = false + } +| DistinctOpt + +DefaultTrueDistinctOpt: + { + $$ = true + } +| DistinctOpt + +BuggyDefaultFalseDistinctOpt: + DefaultFalseDistinctOpt +| DistinctKwd "ALL" + { + $$ = true + } + + +FunctionNameConflict: + "ASCII" +| "CHARSET" +| "COALESCE" +| "COLLATION" +| "DATE" +| "DATABASE" +| "DAY" +| "HOUR" +| "IF" +| "INTERVAL" %prec lowerThanIntervalKeyword +| "FORMAT" +| "LEFT" +| "MICROSECOND" +| "MINUTE" +| "MONTH" +| builtinNow +| "QUARTER" +| "REPEAT" +| "REPLACE" +| "REVERSE" +| "RIGHT" +| "ROW_COUNT" +| "SECOND" +| "TIME" +| "TIMESTAMP" +| "TRUNCATE" +| "USER" +| "WEEK" +| "YEAR" + +OptionalBraces: + {} | '(' ')' {} + +FunctionNameOptionalBraces: + "CURRENT_USER" +| "CURRENT_DATE" +| "UTC_DATE" + +FunctionNameDatetimePrecision: + "CURRENT_TIME" +| "CURRENT_TIMESTAMP" +| "LOCALTIME" +| "LOCALTIMESTAMP" +| "UTC_TIME" +| "UTC_TIMESTAMP" + +FunctionCallKeyword: + FunctionNameConflict '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| builtinUser '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| FunctionNameOptionalBraces OptionalBraces + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1)} + } +| builtinCurDate '(' ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1)} + } +| FunctionNameDatetimePrecision FuncDatetimePrec + { + args := []ast.ExprNode{} + if $2 != nil { + args = append(args, $2.(ast.ExprNode)) + } + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: args} + } +| "CHAR" '(' ExpressionList ')' + { + nilVal := ast.NewValueExpr(nil) + args := $3.([]ast.ExprNode) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, nilVal), + } + } +| "CHAR" '(' ExpressionList "USING" StringName ')' + { + charset1 := ast.NewValueExpr($5) + args := $3.([]ast.ExprNode) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, charset1), + } + } +| "DATE" stringLit + { + expr := ast.NewValueExpr($2) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} + } +| "TIME" stringLit + { + expr := ast.NewValueExpr($2) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} + } +| "TIMESTAMP" stringLit + { + expr := ast.NewValueExpr($2) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} + } +| "INSERT" '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName:model.NewCIStr(ast.InsertFunc), Args: $3.([]ast.ExprNode)} + } +| "MOD" '(' BitExpr ',' BitExpr ')' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $3, R: $5} + } +| "PASSWORD" '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName:model.NewCIStr(ast.PasswordFunc), Args: $3.([]ast.ExprNode)} + } +| '{' ODBCDateTimeType stringLit '}' + { + // This is ODBC syntax for date and time literals. + // See: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html + expr := ast.NewValueExpr($3) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($2), Args: []ast.ExprNode{expr}} + } + +FunctionCallNonKeyword: + builtinCurTime '(' FuncDatetimePrecListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| builtinSysDate '(' FuncDatetimePrecListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| FunctionNameDateArithMultiForms '(' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $5, + ast.NewValueExpr("DAY"), + }, + } + } +| FunctionNameDateArithMultiForms '(' Expression ',' "INTERVAL" Expression TimeUnit ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $6, + ast.NewValueExpr($7), + }, + } + } +| FunctionNameDateArith '(' Expression ',' "INTERVAL" Expression TimeUnit ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $6, + ast.NewValueExpr($7), + }, + } + } +| builtinExtract '(' TimeUnit "FROM" Expression ')' + { + timeUnit := ast.NewValueExpr($3) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{timeUnit, $5}, + } + } +| "GET_FORMAT" '(' GetFormatSelector ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ast.NewValueExpr($3), $5}, + } + } +| builtinPosition '(' BitExpr "IN" Expression ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: []ast.ExprNode{$3, $5}} + } +| builtinSubstring '(' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5}, + } + } +| builtinSubstring '(' Expression "FROM" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5}, + } + } +| builtinSubstring '(' Expression ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5, $7}, + } + } +| builtinSubstring '(' Expression "FROM" Expression "FOR" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5, $7}, + } + } +| "TIMESTAMPADD" '(' TimestampUnit ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ast.NewValueExpr($3), $5, $7}, + } + } +| "TIMESTAMPDIFF" '(' TimestampUnit ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ast.NewValueExpr($3), $5, $7}, + } + } +| builtinTrim '(' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3}, + } + } +| builtinTrim '(' Expression "FROM" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$5, $3}, + } + } +| builtinTrim '(' TrimDirection "FROM" Expression ')' + { + nilVal := ast.NewValueExpr(nil) + direction := ast.NewValueExpr(int($3.(ast.TrimDirectionType))) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$5, nilVal, direction}, + } + } +| builtinTrim '(' TrimDirection Expression "FROM" Expression ')' + { + direction := ast.NewValueExpr(int($3.(ast.TrimDirectionType))) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$6, $4, direction}, + } + } + +GetFormatSelector: + "DATE" + { + $$ = strings.ToUpper($1) + } +| "DATETIME" + { + $$ = strings.ToUpper($1) + } +| "TIME" + { + $$ = strings.ToUpper($1) + } +| "TIMESTAMP" + { + $$ = strings.ToUpper($1) + } + + +FunctionNameDateArith: + builtinDateAdd +| builtinDateSub + + +FunctionNameDateArithMultiForms: + builtinAddDate +| builtinSubDate + + +TrimDirection: + "BOTH" + { + $$ = ast.TrimBoth + } +| "LEADING" + { + $$ = ast.TrimLeading + } +| "TRAILING" + { + $$ = ast.TrimTrailing + } + +SumExpr: + "AVG" '(' BuggyDefaultFalseDistinctOpt Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } +| builtinBitAnd '(' Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } +| builtinBitAnd '(' "ALL" Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } +| builtinBitOr '(' Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } +| builtinBitOr '(' "ALL" Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } +| builtinBitXor '(' Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } +| builtinBitXor '(' "ALL" Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } +| builtinCount '(' DistinctKwd ExpressionList ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: $4.([]ast.ExprNode), Distinct: true} + } +| builtinCount '(' "ALL" Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } +| builtinCount '(' Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } +| builtinCount '(' '*' ')' + { + args := []ast.ExprNode{ast.NewValueExpr(1)} + $$ = &ast.AggregateFuncExpr{F: $1, Args: args} + } +| builtinGroupConcat '(' BuggyDefaultFalseDistinctOpt ExpressionList OrderByOptional OptGConcatSeparator ')' + { + args := $4.([]ast.ExprNode) + args = append(args, $6.(ast.ExprNode)) + $$ = &ast.AggregateFuncExpr{F: $1, Args: args, Distinct: $3.(bool)} + } +| builtinMax '(' BuggyDefaultFalseDistinctOpt Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } +| builtinMin '(' BuggyDefaultFalseDistinctOpt Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } +| builtinSum '(' BuggyDefaultFalseDistinctOpt Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + +OptGConcatSeparator: + { + $$ = ast.NewValueExpr(",") + } +| "SEPARATOR" stringLit + { + $$ = ast.NewValueExpr($2) + } + + +FunctionCallGeneric: + identifier '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } + +FuncDatetimePrec: + { + $$ = nil + } +| '(' ')' + { + $$ = nil + } +| '(' intLit ')' + { + expr := ast.NewValueExpr($2) + $$ = expr + } + +TimeUnit: + "MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "SECOND" + { + $$ = strings.ToUpper($1) + } +| "MINUTE" + { + $$ = strings.ToUpper($1) + } +| "HOUR" + { + $$ = strings.ToUpper($1) + } +| "DAY" + { + $$ = strings.ToUpper($1) + } +| "WEEK" + { + $$ = strings.ToUpper($1) + } +| "MONTH" + { + $$ = strings.ToUpper($1) + } +| "QUARTER" + { + $$ = strings.ToUpper($1) + } +| "YEAR" + { + $$ = strings.ToUpper($1) + } +| "SECOND_MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "MINUTE_MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "MINUTE_SECOND" + { + $$ = strings.ToUpper($1) + } +| "HOUR_MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "HOUR_SECOND" + { + $$ = strings.ToUpper($1) + } +| "HOUR_MINUTE" + { + $$ = strings.ToUpper($1) + } +| "DAY_MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "DAY_SECOND" + { + $$ = strings.ToUpper($1) + } +| "DAY_MINUTE" + { + $$ = strings.ToUpper($1) + } +| "DAY_HOUR" + { + $$ = strings.ToUpper($1) + } +| "YEAR_MONTH" + { + $$ = strings.ToUpper($1) + } + +TimestampUnit: + "MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "SECOND" + { + $$ = strings.ToUpper($1) + } +| "MINUTE" + { + $$ = strings.ToUpper($1) + } +| "HOUR" + { + $$ = strings.ToUpper($1) + } +| "DAY" + { + $$ = strings.ToUpper($1) + } +| "WEEK" + { + $$ = strings.ToUpper($1) + } +| "MONTH" + { + $$ = strings.ToUpper($1) + } +| "QUARTER" + { + $$ = strings.ToUpper($1) + } +| "YEAR" + { + $$ = strings.ToUpper($1) + } + +ExpressionOpt: + { + $$ = nil + } +| Expression + { + $$ = $1 + } + +WhenClauseList: + WhenClause + { + $$ = []*ast.WhenClause{$1.(*ast.WhenClause)} + } +| WhenClauseList WhenClause + { + $$ = append($1.([]*ast.WhenClause), $2.(*ast.WhenClause)) + } + +WhenClause: + "WHEN" Expression "THEN" Expression + { + $$ = &ast.WhenClause{ + Expr: $2, + Result: $4, + } + } + +ElseOpt: + /* empty */ + { + $$ = nil + } +| "ELSE" Expression + { + $$ = $2 + } + +CastType: + "BINARY" OptFieldLen + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = $2.(int) // TODO: Flen should be the flen of expression + if x.Flen != types.UnspecifiedLength { + x.Tp = mysql.TypeString + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "CHAR" OptFieldLen OptBinary + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = $2.(int) // TODO: Flen should be the flen of expression + x.Charset = $3.(*ast.OptBinary).Charset + if $3.(*ast.OptBinary).IsBinary{ + x.Flag |= mysql.BinaryFlag + } + if x.Charset == "" { + x.Charset = charset.CharsetUTF8 + x.Collate = charset.CollationUTF8 + } + $$ = x + } +| "DATE" + { + x := types.NewFieldType(mysql.TypeDate) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "DATETIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "DECIMAL" FloatOpt + { + fopt := $2.(*ast.FloatOpt) + x := types.NewFieldType(mysql.TypeNewDecimal) + x.Flen = fopt.Flen + x.Decimal = fopt.Decimal + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "TIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "SIGNED" OptInteger + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "UNSIGNED" OptInteger + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Flag |= mysql.UnsignedFlag | mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + $$ = x + } +| "JSON" + { + x := types.NewFieldType(mysql.TypeJSON) + x.Flag |= mysql.BinaryFlag | (mysql.ParseToJSONFlag) + x.Charset = charset.CharsetUTF8 + x.Collate = charset.CollationUTF8 + $$ = x + } + +PriorityOpt: + { + $$ = mysql.NoPriority + } +| "LOW_PRIORITY" + { + $$ = mysql.LowPriority + } +| "HIGH_PRIORITY" + { + $$ = mysql.HighPriority + } +| "DELAYED" + { + $$ = mysql.DelayedPriority + } + +TableName: + Identifier + { + $$ = &ast.TableName{Name:model.NewCIStr($1)} + } +| Identifier '.' Identifier + { + $$ = &ast.TableName{Schema:model.NewCIStr($1), Name:model.NewCIStr($3)} + } + +TableNameList: + TableName + { + tbl := []*ast.TableName{$1.(*ast.TableName)} + $$ = tbl + } +| TableNameList ',' TableName + { + $$ = append($1.([]*ast.TableName), $3.(*ast.TableName)) + } + +QuickOptional: + %prec empty + { + $$ = false + } +| "QUICK" + { + $$ = true + } + +/***************************Prepared Statement Start****************************** + * See https://dev.mysql.com/doc/refman/5.7/en/prepare.html + * Example: + * PREPARE stmt_name FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; + * OR + * SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; + * PREPARE stmt_name FROM @s; + */ + +PreparedStmt: + "PREPARE" Identifier "FROM" PrepareSQL + { + var sqlText string + var sqlVar *ast.VariableExpr + switch $4.(type) { + case string: + sqlText = $4.(string) + case *ast.VariableExpr: + sqlVar = $4.(*ast.VariableExpr) + } + $$ = &ast.PrepareStmt{ + Name: $2, + SQLText: sqlText, + SQLVar: sqlVar, + } + } + +PrepareSQL: + stringLit + { + $$ = $1 + } +| UserVariable + { + $$ = $1.(interface{}) + } + + +/* + * See https://dev.mysql.com/doc/refman/5.7/en/execute.html + * Example: + * EXECUTE stmt1 USING @a, @b; + * OR + * EXECUTE stmt1; + */ +ExecuteStmt: + "EXECUTE" Identifier + { + $$ = &ast.ExecuteStmt{Name: $2} + } +| "EXECUTE" Identifier "USING" UserVariableList + { + $$ = &ast.ExecuteStmt{ + Name: $2, + UsingVars: $4.([]ast.ExprNode), + } + } + +UserVariableList: + UserVariable + { + $$ = []ast.ExprNode{$1} + } +| UserVariableList ',' UserVariable + { + $$ = append($1.([]ast.ExprNode), $3) + } + +/* + * See https://dev.mysql.com/doc/refman/5.0/en/deallocate-prepare.html + */ + +DeallocateStmt: + DeallocateSym "PREPARE" Identifier + { + $$ = &ast.DeallocateStmt{Name: $3} + } + +DeallocateSym: +"DEALLOCATE" | "DROP" + +/****************************Prepared Statement End*******************************/ + + +RollbackStmt: + "ROLLBACK" + { + $$ = &ast.RollbackStmt{} + } + +SelectStmtBasic: + "SELECT" SelectStmtOpts SelectStmtFieldList + { + st := &ast.SelectStmt { + SelectStmtOpts: $2.(*ast.SelectStmtOpts), + Distinct: $2.(*ast.SelectStmtOpts).Distinct, + Fields: $3.(*ast.FieldList), + } + $$ = st + } + +SelectStmtFromDual: + SelectStmtBasic FromDual WhereClauseOptional OrderByOptional + { + st := $1.(*ast.SelectStmt) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := yyS[yypt-2].offset-1 + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if $3 != nil { + st.Where = $3.(ast.ExprNode) + } + + if $4 != nil { + st.OrderBy = $4.(*ast.OrderByClause) + } + } + + +SelectStmtFromTable: + SelectStmtBasic "FROM" + TableRefsClause WhereClauseOptional SelectStmtGroup HavingClause + { + st := $1.(*ast.SelectStmt) + st.From = $3.(*ast.TableRefsClause) + if st.SelectStmtOpts.TableHints != nil { + st.TableHints = st.SelectStmtOpts.TableHints + } + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-4]) + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if $4 != nil { + st.Where = $4.(ast.ExprNode) + } + if $5 != nil { + st.GroupBy = $5.(*ast.GroupByClause) + } + if $6 != nil { + st.Having = $6.(*ast.HavingClause) + } + $$ = st + } + +SelectStmt: + SelectStmtBasic OrderByOptional SelectStmtLimit SelectLockOpt + { + st := $1.(*ast.SelectStmt) + st.LockTp = $4.(ast.SelectLockType) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + src := parser.src + var lastEnd int + if $2 != nil { + lastEnd = yyS[yypt-2].offset-1 + } else if $3 != nil { + lastEnd = yyS[yypt-1].offset-1 + } else if $4 != ast.SelectLockNone { + lastEnd = yyS[yypt].offset-1 + } else { + lastEnd = len(src) + if src[lastEnd-1] == ';' { + lastEnd-- + } + } + lastField.SetText(src[lastField.Offset:lastEnd]) + } + if $2 != nil { + st.OrderBy = $2.(*ast.OrderByClause) + } + if $3 != nil { + st.Limit = $3.(*ast.Limit) + } + $$ = st + } +| SelectStmtFromDual SelectStmtLimit SelectLockOpt + { + st := $1.(*ast.SelectStmt) + st.LockTp = $3.(ast.SelectLockType) + if $2 != nil { + st.Limit = $2.(*ast.Limit) + } + $$ = st + } +| SelectStmtFromTable OrderByOptional SelectStmtLimit SelectLockOpt + { + st := $1.(*ast.SelectStmt) + st.LockTp = $4.(ast.SelectLockType) + if $2 != nil { + st.OrderBy = $2.(*ast.OrderByClause) + } + if $3 != nil { + st.Limit = $3.(*ast.Limit) + } + $$ = st + } + +FromDual: + "FROM" "DUAL" + + +TableRefsClause: + TableRefs + { + $$ = &ast.TableRefsClause{TableRefs: $1.(*ast.Join)} + } + +TableRefs: + EscapedTableRef + { + if j, ok := $1.(*ast.Join); ok { + // if $1 is Join, use it directly + $$ = j + } else { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: nil} + } + } +| TableRefs ',' EscapedTableRef + { + /* from a, b is default cross join */ + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin} + } + +EscapedTableRef: + TableRef %prec lowerThanSetKeyword + { + $$ = $1 + } +| '{' Identifier TableRef '}' + { + /* + * ODBC escape syntax for outer join is { OJ join_table } + * Use an Identifier for OJ + */ + $$ = $3 + } + +TableRef: + TableFactor + { + $$ = $1 + } +| JoinTable + { + $$ = $1 + } + +TableFactor: + TableName TableAsNameOpt IndexHintListOpt + { + tn := $1.(*ast.TableName) + tn.IndexHints = $3.([]*ast.IndexHint) + $$ = &ast.TableSource{Source: tn, AsName: $2.(model.CIStr)} + } +| '(' SelectStmt ')' TableAsName + { + st := $2.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(st, endOffset) + $$ = &ast.TableSource{Source: $2.(*ast.SelectStmt), AsName: $4.(model.CIStr)} + } +| '(' UnionStmt ')' TableAsName + { + $$ = &ast.TableSource{Source: $2.(*ast.UnionStmt), AsName: $4.(model.CIStr)} + } +| '(' TableRefs ')' + { + $$ = $2 + } + +TableAsNameOpt: + { + $$ = model.CIStr{} + } +| TableAsName + { + $$ = $1 + } + +TableAsName: + Identifier + { + $$ = model.NewCIStr($1) + } +| "AS" Identifier + { + $$ = model.NewCIStr($2) + } + +IndexHintType: + "USE" KeyOrIndex + { + $$ = ast.HintUse + } +| "IGNORE" KeyOrIndex + { + $$ = ast.HintIgnore + } +| "FORCE" KeyOrIndex + { + $$ = ast.HintForce + } + +IndexHintScope: + { + $$ = ast.HintForScan + } +| "FOR" "JOIN" + { + $$ = ast.HintForJoin + } +| "FOR" "ORDER" "BY" + { + $$ = ast.HintForOrderBy + } +| "FOR" "GROUP" "BY" + { + $$ = ast.HintForGroupBy + } + + +IndexHint: + IndexHintType IndexHintScope '(' IndexNameList ')' + { + $$ = &ast.IndexHint{ + IndexNames: $4.([]model.CIStr), + HintType: $1.(ast.IndexHintType), + HintScope: $2.(ast.IndexHintScope), + } + } + +IndexNameList: + { + var nameList []model.CIStr + $$ = nameList + } +| Identifier + { + $$ = []model.CIStr{model.NewCIStr($1)} + } +| IndexNameList ',' Identifier + { + $$ = append($1.([]model.CIStr), model.NewCIStr($3)) + } + + +IndexHintList: + IndexHint + { + $$ = []*ast.IndexHint{$1.(*ast.IndexHint)} + } +| IndexHintList IndexHint + { + $$ = append($1.([]*ast.IndexHint), $2.(*ast.IndexHint)) + } + +IndexHintListOpt: + { + var hintList []*ast.IndexHint + $$ = hintList + } +| IndexHintList + { + $$ = $1 + } + +JoinTable: + /* Use %prec to evaluate production TableRef before cross join */ + TableRef CrossOpt TableRef %prec tableRefPriority + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin} + } +| TableRef CrossOpt TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $5} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin, On: on} + } +| TableRef CrossOpt TableRef "USING" '(' ColumnNameList ')' + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin, Using: $6.([]*ast.ColumnName)} + } +| TableRef JoinType OuterOpt "JOIN" TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $7} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $5.(ast.ResultSetNode), Tp: $2.(ast.JoinType), On: on} + } +| TableRef JoinType OuterOpt "JOIN" TableRef "USING" '(' ColumnNameList ')' + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $5.(ast.ResultSetNode), Tp: $2.(ast.JoinType), Using: $8.([]*ast.ColumnName)} + } +| TableRef "NATURAL" "JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $4.(ast.ResultSetNode), NaturalJoin: true} + } +| TableRef "NATURAL" JoinType OuterOpt "JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $6.(ast.ResultSetNode), Tp: $3.(ast.JoinType), NaturalJoin: true} + } +| TableRef "STRAIGHT_JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), StraightJoin: true} + } +| TableRef "STRAIGHT_JOIN" TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $5} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), StraightJoin: true, On: on} + } + +JoinType: + "LEFT" + { + $$ = ast.LeftJoin + } +| "RIGHT" + { + $$ = ast.RightJoin + } + +OuterOpt: + {} +| "OUTER" + +CrossOpt: + "JOIN" +| "CROSS" "JOIN" +| "INNER" "JOIN" + + +LimitClause: + { + $$ = nil + } +| "LIMIT" LimitOption + { + $$ = &ast.Limit{Count: $2.(ast.ValueExpr)} + } + +LimitOption: + LengthNum + { + $$ = ast.NewValueExpr($1) + } +| paramMarker + { + $$ = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + +SelectStmtLimit: + { + $$ = nil + } +| "LIMIT" LimitOption + { + $$ = &ast.Limit{Count: $2.(ast.ExprNode)} + } +| "LIMIT" LimitOption ',' LimitOption + { + $$ = &ast.Limit{Offset: $2.(ast.ExprNode), Count: $4.(ast.ExprNode)} + } +| "LIMIT" LimitOption "OFFSET" LimitOption + { + $$ = &ast.Limit{Offset: $4.(ast.ExprNode), Count: $2.(ast.ExprNode)} + } + + +SelectStmtOpts: + TableOptimizerHints DefaultFalseDistinctOpt PriorityOpt SelectStmtSQLCache SelectStmtCalcFoundRows SelectStmtStraightJoin + { + opt := &ast.SelectStmtOpts{} + if $1 != nil { + opt.TableHints = $1.([]*ast.TableOptimizerHint) + } + if $2 != nil { + opt.Distinct = $2.(bool) + } + if $3 != nil { + opt.Priority = $3.(mysql.PriorityEnum) + } + if $4 != nil { + opt.SQLCache = $4.(bool) + } + if $5 != nil { + opt.CalcFoundRows = $5.(bool) + } + if $6 != nil { + opt.StraightJoin = $6.(bool) + } + + $$ = opt + } + +TableOptimizerHints: + /* empty */ + { + $$ = nil + } +| hintBegin TableOptimizerHintList hintEnd + { + $$ = $2 + } + +HintTableList: + Identifier + { + $$ = []model.CIStr{model.NewCIStr($1)} + } +| HintTableList ',' Identifier + { + $$ = append($1.([]model.CIStr), model.NewCIStr($3)) + } + +TableOptimizerHintList: + TableOptimizerHintOpt + { + $$ = []*ast.TableOptimizerHint{$1.(*ast.TableOptimizerHint)} + } +| TableOptimizerHintList TableOptimizerHintOpt + { + $$ = append($1.([]*ast.TableOptimizerHint), $2.(*ast.TableOptimizerHint)) + } + +TableOptimizerHintOpt: + tidbSMJ '(' HintTableList ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), Tables: $3.([]model.CIStr)} + } +| tidbINLJ '(' HintTableList ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), Tables: $3.([]model.CIStr)} + } +| tidbHJ '(' HintTableList ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), Tables: $3.([]model.CIStr)} + } +| maxExecutionTime '(' NUM ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), MaxExecutionTime: getUint64FromNUM($3)} + } + +SelectStmtCalcFoundRows: + { + $$ = false + } +| "SQL_CALC_FOUND_ROWS" + { + $$ = true + } +SelectStmtSQLCache: + %prec empty + { + $$ = true + } +| "SQL_CACHE" + { + $$ = true + } +| "SQL_NO_CACHE" + { + $$ = false + } +SelectStmtStraightJoin: + %prec empty + { + $$ = false + } +| "STRAIGHT_JOIN" + { + $$ = true + } + +SelectStmtFieldList: + FieldList + { + $$ = &ast.FieldList{Fields: $1.([]*ast.SelectField)} + } + +SelectStmtGroup: + /* EMPTY */ + { + $$ = nil + } +| GroupByClause + +// See https://dev.mysql.com/doc/refman/5.7/en/subqueries.html +SubSelect: + '(' SelectStmt ')' + { + s := $2.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(s, endOffset) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: s} + } +| '(' UnionStmt ')' + { + s := $2.(*ast.UnionStmt) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: s} + } + +// See https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html +SelectLockOpt: + /* empty */ + { + $$ = ast.SelectLockNone + } +| "FOR" "UPDATE" + { + $$ = ast.SelectLockForUpdate + } +| "LOCK" "IN" "SHARE" "MODE" + { + $$ = ast.SelectLockInShareMode + } + +// See https://dev.mysql.com/doc/refman/5.7/en/union.html +UnionStmt: + UnionClauseList "UNION" UnionOpt SelectStmtBasic OrderByOptional SelectStmtLimit SelectLockOpt + { + st := $4.(*ast.SelectStmt) + union := $1.(*ast.UnionStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $5 != nil { + union.OrderBy = $5.(*ast.OrderByClause) + } + if $6 != nil { + union.Limit = $6.(*ast.Limit) + } + if $5 == nil && $6 == nil { + st.LockTp = $7.(ast.SelectLockType) + } + $$ = union + } +| UnionClauseList "UNION" UnionOpt SelectStmtFromDual SelectStmtLimit SelectLockOpt + { + st := $4.(*ast.SelectStmt) + union := $1.(*ast.UnionStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-4]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $5 != nil { + union.Limit = $5.(*ast.Limit) + } else { + st.LockTp = $6.(ast.SelectLockType) + } + $$ = union + } +| UnionClauseList "UNION" UnionOpt SelectStmtFromTable OrderByOptional + SelectStmtLimit SelectLockOpt + { + st := $4.(*ast.SelectStmt) + union := $1.(*ast.UnionStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $5 != nil { + union.OrderBy = $5.(*ast.OrderByClause) + } + if $6 != nil { + union.Limit = $6.(*ast.Limit) + } + if $5 == nil && $6 == nil { + st.LockTp = $7.(ast.SelectLockType) + } + $$ = union + } +| UnionClauseList "UNION" UnionOpt '(' SelectStmt ')' OrderByOptional SelectStmtLimit + { + union := $1.(*ast.UnionStmt) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-6]) + parser.setLastSelectFieldText(lastSelect, endOffset) + st := $5.(*ast.SelectStmt) + st.IsInBraces = true + st.IsAfterUnionDistinct = $3.(bool) + endOffset = parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(st, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $7 != nil { + union.OrderBy = $7.(*ast.OrderByClause) + } + if $8 != nil { + union.Limit = $8.(*ast.Limit) + } + $$ = union + } + +UnionClauseList: + UnionSelect + { + selectList := &ast.UnionSelectList{Selects: []*ast.SelectStmt{$1.(*ast.SelectStmt)}} + $$ = &ast.UnionStmt{ + SelectList: selectList, + } + } +| UnionClauseList "UNION" UnionOpt UnionSelect + { + union := $1.(*ast.UnionStmt) + st := $4.(*ast.SelectStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + $$ = union + } + +UnionSelect: + SelectStmt + { + $$ = $1.(interface{}) + } +| '(' SelectStmt ')' + { + st := $2.(*ast.SelectStmt) + st.IsInBraces = true + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(st, endOffset) + $$ = $2 + } + +UnionOpt: +DefaultTrueDistinctOpt + + +/********************Set Statement*******************************/ +SetStmt: + "SET" VariableAssignmentList + { + $$ = &ast.SetStmt{Variables: $2.([]*ast.VariableAssignment)} + } +| "SET" "PASSWORD" eq PasswordOpt + { + $$ = &ast.SetPwdStmt{Password: $4.(string)} + } +| "SET" "PASSWORD" "FOR" Username eq PasswordOpt + { + $$ = &ast.SetPwdStmt{User: $4.(*auth.UserIdentity), Password: $6.(string)} + } +| "SET" "GLOBAL" "TRANSACTION" TransactionChars + { + vars := $4.([]*ast.VariableAssignment) + for _, v := range vars { + v.IsGlobal = true + } + $$ = &ast.SetStmt{Variables: vars} + } +| "SET" "SESSION" "TRANSACTION" TransactionChars + { + $$ = &ast.SetStmt{Variables: $4.([]*ast.VariableAssignment)} + } +| "SET" "TRANSACTION" TransactionChars + { + assigns := $3.([]*ast.VariableAssignment) + for i:=0; i 24 { + x.Tp = mysql.TypeDouble + } + } + x.Decimal = fopt.Decimal + for _, o := range $3.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + $$ = x + } +| BitValueType OptFieldLen + { + x := types.NewFieldType($1.(byte)) + x.Flen = $2.(int) + if x.Flen == types.UnspecifiedLength || x.Flen == 0 { + x.Flen = 1 + } else if x.Flen > 64 { + yylex.Errorf("invalid field length %d for bit type, must in [1, 64]", x.Flen) + } + $$ = x + } + +IntegerType: + "TINYINT" + { + $$ = mysql.TypeTiny + } +| "SMALLINT" + { + $$ = mysql.TypeShort + } +| "MEDIUMINT" + { + $$ = mysql.TypeInt24 + } +| "INT" + { + $$ = mysql.TypeLong + } +| "INT1" + { + $$ = mysql.TypeTiny + } +| "INT2" + { + $$ = mysql.TypeShort + } +| "INT3" + { + $$ = mysql.TypeInt24 + } +| "INT4" + { + $$ = mysql.TypeLong + } +| "INT8" + { + $$ = mysql.TypeLonglong + } +| "INTEGER" + { + $$ = mysql.TypeLong + } +| "BIGINT" + { + $$ = mysql.TypeLonglong + } + + +BooleanType: + "BOOL" + { + $$ = mysql.TypeTiny + } +| "BOOLEAN" + { + $$ = mysql.TypeTiny + } + +OptInteger: + {} +| "INTEGER" +| "INT" + +FixedPointType: + "DECIMAL" + { + $$ = mysql.TypeNewDecimal + } +| "NUMERIC" + { + $$ = mysql.TypeNewDecimal + } + +FloatingPointType: + "FLOAT" + { + $$ = mysql.TypeFloat + } +| "REAL" + { + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + $$ = mysql.TypeFloat + } else { + $$ = mysql.TypeDouble + } + } +| "DOUBLE" + { + $$ = mysql.TypeDouble + } +| "DOUBLE" "PRECISION" + { + $$ = mysql.TypeDouble + } + +BitValueType: + "BIT" + { + $$ = mysql.TypeBit + } + +StringType: + NationalOpt "CHAR" FieldLen OptBinary OptCollate + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = $3.(int) + x.Charset = $4.(*ast.OptBinary).Charset + x.Collate = $5.(string) + if $4.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| NationalOpt "CHAR" OptBinary OptCollate + { + x := types.NewFieldType(mysql.TypeString) + x.Charset = $3.(*ast.OptBinary).Charset + x.Collate = $4.(string) + if $3.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| "NATIONAL" "CHARACTER" FieldLen OptBinary OptCollate + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = $3.(int) + x.Charset = $4.(*ast.OptBinary).Charset + x.Collate = $5.(string) + if $4.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| Varchar FieldLen OptBinary OptCollate + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = $2.(int) + x.Charset = $3.(*ast.OptBinary).Charset + x.Collate = $4.(string) + if $3.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| "BINARY" OptFieldLen + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = $2.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "VARBINARY" FieldLen + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = $2.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| BlobType + { + x := $1.(*types.FieldType) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + $$ = $1.(*types.FieldType) + } +| TextType OptBinary OptCollate + { + x := $1.(*types.FieldType) + x.Charset = $2.(*ast.OptBinary).Charset + x.Collate = $3.(string) + if $2.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| "ENUM" '(' StringList ')' OptCharset OptCollate + { + x := types.NewFieldType(mysql.TypeEnum) + x.Elems = $3.([]string) + x.Charset = $5.(string) + x.Collate = $6.(string) + $$ = x + } +| "SET" '(' StringList ')' OptCharset OptCollate + { + x := types.NewFieldType(mysql.TypeSet) + x.Elems = $3.([]string) + x.Charset = $5.(string) + x.Collate = $6.(string) + $$ = x + } +| "JSON" + { + x := types.NewFieldType(mysql.TypeJSON) + x.Decimal = 0 + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + $$ = x + } + +NationalOpt: + {} +| "NATIONAL" + +Varchar: +"NATIONAL" "VARCHAR" +| "VARCHAR" +| "NVARCHAR" + + +BlobType: + "TINYBLOB" + { + x := types.NewFieldType(mysql.TypeTinyBlob) + $$ = x + } +| "BLOB" OptFieldLen + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = $2.(int) + $$ = x + } +| "MEDIUMBLOB" + { + x := types.NewFieldType(mysql.TypeMediumBlob) + $$ = x + } +| "LONGBLOB" + { + x := types.NewFieldType(mysql.TypeLongBlob) + $$ = x + } + +TextType: + "TINYTEXT" + { + x := types.NewFieldType(mysql.TypeTinyBlob) + $$ = x + + } +| "TEXT" OptFieldLen + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = $2.(int) + $$ = x + } +| "MEDIUMTEXT" + { + x := types.NewFieldType(mysql.TypeMediumBlob) + $$ = x + } +| "LONGTEXT" + { + x := types.NewFieldType(mysql.TypeLongBlob) + $$ = x + } +| "LONG" "VARCHAR" + { + x := types.NewFieldType(mysql.TypeMediumBlob) + $$ = x + } + + +DateAndTimeType: + "DATE" + { + x := types.NewFieldType(mysql.TypeDate) + $$ = x + } +| "DATETIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + $$ = x + } +| "TIMESTAMP" OptFieldLen + { + x := types.NewFieldType(mysql.TypeTimestamp) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + $$ = x + } +| "TIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen = mysql.MaxDurationWidthNoFsp + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + $$ = x + } +| "YEAR" OptFieldLen FieldOpts + { + x := types.NewFieldType(mysql.TypeYear) + x.Flen = $2.(int) + if x.Flen != types.UnspecifiedLength && x.Flen != 4 { + yylex.Errorf("Supports only YEAR or YEAR(4) column.") + return -1 + } + $$ = x + } + +FieldLen: + '(' LengthNum ')' + { + $$ = int($2.(uint64)) + } + +OptFieldLen: + { + $$ = types.UnspecifiedLength + } +| FieldLen + { + $$ = $1.(int) + } + +FieldOpt: + "UNSIGNED" + { + $$ = &ast.TypeOpt{IsUnsigned: true} + } +| "SIGNED" + { + $$ = &ast.TypeOpt{IsUnsigned: false} + } +| "ZEROFILL" + { + $$ = &ast.TypeOpt{IsZerofill: true, IsUnsigned: true} + } + +FieldOpts: + { + $$ = []*ast.TypeOpt{} + } +| FieldOpts FieldOpt + { + $$ = append($1.([]*ast.TypeOpt), $2.(*ast.TypeOpt)) + } + +FloatOpt: + { + $$ = &ast.FloatOpt{Flen: types.UnspecifiedLength, Decimal: types.UnspecifiedLength} + } +| FieldLen + { + $$ = &ast.FloatOpt{Flen: $1.(int), Decimal: types.UnspecifiedLength} + } +| Precision + { + $$ = $1.(*ast.FloatOpt) + } + +Precision: + '(' LengthNum ',' LengthNum ')' + { + $$ = &ast.FloatOpt{Flen: int($2.(uint64)), Decimal: int($4.(uint64))} + } + +OptBinMod: + { + $$ = false + } +| "BINARY" + { + $$ = true + } + +OptBinary: + { + $$ = &ast.OptBinary{ + IsBinary: false, + Charset: "", + } + } +| "BINARY" OptCharset + { + $$ = &ast.OptBinary{ + IsBinary: true, + Charset: $2.(string), + } + } +| CharsetKw CharsetName OptBinMod + { + $$ = &ast.OptBinary{ + IsBinary: $3.(bool), + Charset: $2.(string), + } + } + +OptCharset: + { + $$ = "" + } +| CharsetKw CharsetName + { + $$ = $2.(string) + } + +CharsetKw: + "CHARACTER" "SET" +| "CHARSET" + +OptCollate: + { + $$ = "" + } +| "COLLATE" StringName + { + $$ = $2.(string) + } + +StringList: + stringLit + { + $$ = []string{$1} + } +| StringList ',' stringLit + { + $$ = append($1.([]string), $3) + } + +StringName: + stringLit + { + $$ = $1 + } +| Identifier + { + $$ = $1 + } + +/*********************************************************************************** + * Update Statement + * See https://dev.mysql.com/doc/refman/5.7/en/update.html + ***********************************************************************************/ +UpdateStmt: + "UPDATE" TableOptimizerHints PriorityOpt IgnoreOptional TableRef "SET" AssignmentList WhereClauseOptional OrderByOptional LimitClause + { + var refs *ast.Join + if x, ok := $5.(*ast.Join); ok { + refs = x + } else { + refs = &ast.Join{Left: $5.(ast.ResultSetNode)} + } + st := &ast.UpdateStmt{ + Priority: $3.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: refs}, + List: $7.([]*ast.Assignment), + IgnoreErr: $4.(bool), + } + if $2 != nil { + st.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $8 != nil { + st.Where = $8.(ast.ExprNode) + } + if $9 != nil { + st.Order = $9.(*ast.OrderByClause) + } + if $10 != nil { + st.Limit = $10.(*ast.Limit) + } + $$ = st + } +| "UPDATE" TableOptimizerHints PriorityOpt IgnoreOptional TableRefs "SET" AssignmentList WhereClauseOptional + { + st := &ast.UpdateStmt{ + Priority: $3.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: $5.(*ast.Join)}, + List: $7.([]*ast.Assignment), + IgnoreErr: $4.(bool), + } + if $2 != nil { + st.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $8 != nil { + st.Where = $8.(ast.ExprNode) + } + $$ = st + } + +UseStmt: + "USE" DBName + { + $$ = &ast.UseStmt{DBName: $2.(string)} + } + +WhereClause: + "WHERE" Expression + { + $$ = $2 + } + +WhereClauseOptional: + { + $$ = nil + } +| WhereClause + { + $$ = $1 + } + +CommaOpt: + {} +| ',' + {} + +/************************************************************************************ + * Account Management Statements + * https://dev.mysql.com/doc/refman/5.7/en/account-management-sql.html + ************************************************************************************/ +CreateUserStmt: + "CREATE" "USER" IfNotExists UserSpecList + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-user.html + $$ = &ast.CreateUserStmt{ + IfNotExists: $3.(bool), + Specs: $4.([]*ast.UserSpec), + } + } + +/* See http://dev.mysql.com/doc/refman/5.7/en/alter-user.html */ +AlterUserStmt: + "ALTER" "USER" IfExists UserSpecList + { + $$ = &ast.AlterUserStmt{ + IfExists: $3.(bool), + Specs: $4.([]*ast.UserSpec), + } + } +| "ALTER" "USER" IfExists "USER" '(' ')' "IDENTIFIED" "BY" AuthString + { + auth := &ast.AuthOption { + AuthString: $9.(string), + ByAuthString: true, + } + $$ = &ast.AlterUserStmt{ + IfExists: $3.(bool), + CurrentAuth: auth, + } + } + +UserSpec: + Username AuthOption + { + userSpec := &ast.UserSpec{ + User: $1.(*auth.UserIdentity), + } + if $2 != nil { + userSpec.AuthOpt = $2.(*ast.AuthOption) + } + $$ = userSpec + } + +UserSpecList: + UserSpec + { + $$ = []*ast.UserSpec{$1.(*ast.UserSpec)} + } +| UserSpecList ',' UserSpec + { + $$ = append($1.([]*ast.UserSpec), $3.(*ast.UserSpec)) + } + +AuthOption: + { + $$ = nil + } +| "IDENTIFIED" "BY" AuthString + { + $$ = &ast.AuthOption { + AuthString: $3.(string), + ByAuthString: true, + } + } +| "IDENTIFIED" "WITH" StringName + { + $$ = nil + } +| "IDENTIFIED" "WITH" StringName "BY" AuthString + { + $$ = &ast.AuthOption { + AuthString: $5.(string), + ByAuthString: true, + } + } +| "IDENTIFIED" "WITH" StringName "AS" HashString + { + $$ = &ast.AuthOption{ + HashString: $5.(string), + } + } +| "IDENTIFIED" "BY" "PASSWORD" HashString + { + $$ = &ast.AuthOption{ + HashString: $4.(string), + } + } + +HashString: + stringLit + { + $$ = $1 + } + +/************************************************************************************* + * Grant statement + * See https://dev.mysql.com/doc/refman/5.7/en/grant.html + *************************************************************************************/ +GrantStmt: + "GRANT" PrivElemList "ON" ObjectType PrivLevel "TO" UserSpecList WithGrantOptionOpt + { + $$ = &ast.GrantStmt{ + Privs: $2.([]*ast.PrivElem), + ObjectType: $4.(ast.ObjectTypeType), + Level: $5.(*ast.GrantLevel), + Users: $7.([]*ast.UserSpec), + WithGrant: $8.(bool), + } + } + +WithGrantOptionOpt: + { + $$ = false + } +| "WITH" "GRANT" "OPTION" + { + $$ = true + } +| "WITH" "MAX_QUERIES_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_UPDATES_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_CONNECTIONS_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_USER_CONNECTIONS" NUM + { + $$ = false + } + +PrivElem: + PrivType + { + $$ = &ast.PrivElem{ + Priv: $1.(mysql.PrivilegeType), + } + } +| PrivType '(' ColumnNameList ')' + { + $$ = &ast.PrivElem{ + Priv: $1.(mysql.PrivilegeType), + Cols: $3.([]*ast.ColumnName), + } + } + +PrivElemList: + PrivElem + { + $$ = []*ast.PrivElem{$1.(*ast.PrivElem)} + } +| PrivElemList ',' PrivElem + { + $$ = append($1.([]*ast.PrivElem), $3.(*ast.PrivElem)) + } + +PrivType: + "ALL" + { + $$ = mysql.AllPriv + } +| "ALL" "PRIVILEGES" + { + $$ = mysql.AllPriv + } +| "ALTER" + { + $$ = mysql.AlterPriv + } +| "CREATE" + { + $$ = mysql.CreatePriv + } +| "CREATE" "USER" + { + $$ = mysql.CreateUserPriv + } +| "TRIGGER" + { + $$ = mysql.TriggerPriv + } +| "DELETE" + { + $$ = mysql.DeletePriv + } +| "DROP" + { + $$ = mysql.DropPriv + } +| "PROCESS" + { + $$ = mysql.ProcessPriv + } +| "EXECUTE" + { + $$ = mysql.ExecutePriv + } +| "INDEX" + { + $$ = mysql.IndexPriv + } +| "INSERT" + { + $$ = mysql.InsertPriv + } +| "SELECT" + { + $$ = mysql.SelectPriv + } +| "SUPER" + { + $$ = mysql.SuperPriv + } +| "SHOW" "DATABASES" + { + $$ = mysql.ShowDBPriv + } +| "UPDATE" + { + $$ = mysql.UpdatePriv + } +| "GRANT" "OPTION" + { + $$ = mysql.GrantPriv + } +| "REFERENCES" + { + $$ = mysql.ReferencesPriv + } +| "REPLICATION" "SLAVE" + { + $$ = mysql.PrivilegeType(0) + } +| "REPLICATION" "CLIENT" + { + $$ = mysql.PrivilegeType(0) + } +| "USAGE" + { + $$ = mysql.PrivilegeType(0) + } +| "RELOAD" + { + $$ = mysql.PrivilegeType(0) + } +| "CREATE" "TEMPORARY" "TABLES" + { + $$ = mysql.PrivilegeType(0) + } +| "LOCK" "TABLES" + { + $$ = mysql.PrivilegeType(0) + } +| "CREATE" "VIEW" + { + $$ = mysql.PrivilegeType(0) + } +| "SHOW" "VIEW" + { + $$ = mysql.PrivilegeType(0) + } +| "CREATE" "ROUTINE" + { + $$ = mysql.PrivilegeType(0) + } +| "ALTER" "ROUTINE" + { + $$ = mysql.PrivilegeType(0) + } +| "EVENT" + { + $$ = mysql.PrivilegeType(0) + } + +ObjectType: + { + $$ = ast.ObjectTypeNone + } +| "TABLE" + { + $$ = ast.ObjectTypeTable + } + +PrivLevel: + '*' + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelDB, + } + } +| '*' '.' '*' + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelGlobal, + } + } +| Identifier '.' '*' + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelDB, + DBName: $1, + } + } +| Identifier '.' Identifier + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelTable, + DBName: $1, + TableName: $3, + } + } +| Identifier + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelTable, + TableName: $1, + } + } + +/**************************************RevokeStmt******************************************* + * See https://dev.mysql.com/doc/refman/5.7/en/revoke.html + *******************************************************************************************/ +RevokeStmt: + "REVOKE" PrivElemList "ON" ObjectType PrivLevel "FROM" UserSpecList + { + $$ = &ast.RevokeStmt{ + Privs: $2.([]*ast.PrivElem), + ObjectType: $4.(ast.ObjectTypeType), + Level: $5.(*ast.GrantLevel), + Users: $7.([]*ast.UserSpec), + } + } + +/**************************************LoadDataStmt***************************************** + * See https://dev.mysql.com/doc/refman/5.7/en/load-data.html + *******************************************************************************************/ +LoadDataStmt: + "LOAD" "DATA" LocalOpt "INFILE" stringLit "INTO" "TABLE" TableName CharsetOpt Fields Lines IgnoreLines ColumnNameListOptWithBrackets + { + x := &ast.LoadDataStmt{ + Path: $5, + Table: $8.(*ast.TableName), + Columns: $13.([]*ast.ColumnName), + IgnoreLines:$12.(uint64), + } + if $3 != nil { + x.IsLocal = true + } + if $10 != nil { + x.FieldsInfo = $10.(*ast.FieldsClause) + } + if $11 != nil { + x.LinesInfo = $11.(*ast.LinesClause) + } + $$ = x + } + +IgnoreLines: + { + $$ = uint64(0) + } +| "IGNORE" NUM "LINES" + { + $$ = getUint64FromNUM($2) + } + +CharsetOpt: + {} +| "CHARACTER" "SET" CharsetName + +LocalOpt: + { + $$ = nil + } +| "LOCAL" + { + $$ = $1 + } + +Fields: + { + escape := "\\" + $$ = &ast.FieldsClause{ + Terminated: "\t", + Escaped: escape[0], + } + } +| FieldsOrColumns FieldsTerminated Enclosed Escaped + { + escape := $4.(string) + if escape != "\\" && len(escape) > 1 { + yylex.Errorf("Incorrect arguments %s to ESCAPE", escape) + return 1 + } + var enclosed byte + str := $3.(string) + if len(str) > 1 { + yylex.Errorf("Incorrect arguments %s to ENCLOSED", escape) + return 1 + }else if len(str) != 0 { + enclosed = str[0] + } + var escaped byte + if len(escape) > 0 { + escaped = escape[0] + } + $$ = &ast.FieldsClause{ + Terminated: $2.(string), + Enclosed: enclosed, + Escaped: escaped, + } + } + +FieldsOrColumns: +"FIELDS" | "COLUMNS" + +FieldsTerminated: + { + $$ = "\t" + } +| "TERMINATED" "BY" stringLit + { + $$ = $3 + } + +Enclosed: + { + $$ = "" + } +| "ENCLOSED" "BY" stringLit + { + $$ = $3 + } + +Escaped: + { + $$ = "\\" + } +| "ESCAPED" "BY" stringLit + { + $$ = $3 + } + +Lines: + { + $$ = &ast.LinesClause{Terminated: "\n"} + } +| "LINES" Starting LinesTerminated + { + $$ = &ast.LinesClause{Starting: $2.(string), Terminated: $3.(string)} + } + +Starting: + { + $$ = "" + } +| "STARTING" "BY" stringLit + { + $$ = $3 + } + +LinesTerminated: + { + $$ = "\n" + } +| "TERMINATED" "BY" stringLit + { + $$ = $3 + } + + +/********************************************************************* + * Lock/Unlock Tables + * See http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html + * All the statement leaves empty. This is used to prevent mysqldump error. + *********************************************************************/ + +UnlockTablesStmt: + "UNLOCK" TablesTerminalSym {} + +LockTablesStmt: + "LOCK" TablesTerminalSym TableLockList + {} + +TablesTerminalSym: + "TABLES" +| "TABLE" + +TableLock: + TableName LockType + +LockType: + "READ" +| "READ" "LOCAL" +| "WRITE" + +TableLockList: + TableLock +| TableLockList ',' TableLock + + +/******************************************************************** + * Kill Statement + * See https://dev.mysql.com/doc/refman/5.7/en/kill.html + *******************************************************************/ + +KillStmt: + KillOrKillTiDB NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($2), + TiDBExtension: $1.(bool), + } + } +| KillOrKillTiDB "CONNECTION" NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($3), + TiDBExtension: $1.(bool), + } + } +| KillOrKillTiDB "QUERY" NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($3), + Query: true, + TiDBExtension: $1.(bool), + } + } + +KillOrKillTiDB: + "KILL" + { + $$ = false + } +/* KILL TIDB is a special grammar extension in TiDB, it can be used only when + the client connect to TiDB directly, not proxied under LVS. */ +| "KILL" "TIDB" + { + $$ = true + } + +/*******************************************************************************************/ + +LoadStatsStmt: + "LOAD" "STATS" stringLit + { + $$ = &ast.LoadStatsStmt{ + Path: $3, + } + } + +%% diff --git a/parser_test.go b/parser_test.go new file mode 100644 index 000000000..86d94706b --- /dev/null +++ b/parser_test.go @@ -0,0 +1,2429 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "fmt" + "runtime" + "strings" + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/errors" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" + _ "github.com/pingcap/tidb/types/parser_driver" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testParserSuite{}) + +type testParserSuite struct { +} + +func (s *testParserSuite) TestSimple(c *C) { + parser := New() + + reservedKws := []string{ + "add", "all", "alter", "analyze", "and", "as", "asc", "between", "bigint", + "binary", "blob", "both", "by", "cascade", "case", "change", "character", "check", "collate", + "column", "constraint", "convert", "create", "cross", "current_date", "current_time", + "current_timestamp", "current_user", "database", "databases", "day_hour", "day_microsecond", + "day_minute", "day_second", "decimal", "default", "delete", "desc", "describe", + "distinct", "distinctRow", "div", "double", "drop", "dual", "else", "enclosed", "escaped", + "exists", "explain", "false", "float", "for", "force", "foreign", "from", + "fulltext", "grant", "group", "having", "hour_microsecond", "hour_minute", + "hour_second", "if", "ignore", "in", "index", "infile", "inner", "insert", "int", "into", "integer", + "interval", "is", "join", "key", "keys", "kill", "leading", "left", "like", "limit", "lines", "load", + "localtime", "localtimestamp", "lock", "longblob", "longtext", "mediumblob", "maxvalue", "mediumint", "mediumtext", + "minute_microsecond", "minute_second", "mod", "not", "no_write_to_binlog", "null", "numeric", + "on", "option", "or", "order", "outer", "partition", "precision", "primary", "procedure", "range", "read", "real", + "references", "regexp", "rename", "repeat", "replace", "revoke", "restrict", "right", "rlike", + "schema", "schemas", "second_microsecond", "select", "set", "show", "smallint", + "starting", "table", "terminated", "then", "tinyblob", "tinyint", "tinytext", "to", + "trailing", "true", "union", "unique", "unlock", "unsigned", + "update", "use", "using", "utc_date", "values", "varbinary", "varchar", + "when", "where", "write", "xor", "year_month", "zerofill", + "generated", "virtual", "stored", "usage", + "delayed", "high_priority", "low_priority", + // TODO: support the following keywords + // "with", + } + for _, kw := range reservedKws { + src := fmt.Sprintf("SELECT * FROM db.%s;", kw) + _, err := parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil, Commentf("source %s", src)) + + src = fmt.Sprintf("SELECT * FROM %s.desc", kw) + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil, Commentf("source %s", src)) + + src = fmt.Sprintf("SELECT t.%s FROM t", kw) + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil, Commentf("source %s", src)) + } + + // Testcase for unreserved keywords + unreservedKws := []string{ + "auto_increment", "after", "begin", "bit", "bool", "boolean", "charset", "columns", "commit", + "date", "datediff", "datetime", "deallocate", "do", "from_days", "end", "engine", "engines", "execute", "first", "full", + "local", "names", "offset", "password", "prepare", "quick", "rollback", "session", "signed", + "start", "global", "tables", "tablespace", "text", "time", "timestamp", "tidb", "transaction", "truncate", "unknown", + "value", "warnings", "year", "now", "substr", "subpartition", "subpartitions", "substring", "mode", "any", "some", "user", "identified", + "collation", "comment", "avg_row_length", "checksum", "compression", "connection", "key_block_size", + "max_rows", "min_rows", "national", "row", "quarter", "escape", "grants", "status", "fields", "triggers", + "delay_key_write", "isolation", "partitions", "repeatable", "committed", "uncommitted", "only", "serializable", "level", + "curtime", "variables", "dayname", "version", "btree", "hash", "row_format", "dynamic", "fixed", "compressed", + "compact", "redundant", "sql_no_cache sql_no_cache", "sql_cache sql_cache", "action", "round", + "enable", "disable", "reverse", "space", "privileges", "get_lock", "release_lock", "sleep", "no", "greatest", "least", + "binlog", "hex", "unhex", "function", "indexes", "from_unixtime", "processlist", "events", "less", "than", "timediff", + "ln", "log", "log2", "log10", "timestampdiff", "pi", "quote", "none", "super", "shared", "exclusive", + "always", "stats", "stats_meta", "stats_histogram", "stats_buckets", "stats_healthy", "tidb_version", "replication", "slave", "client", + "max_connections_per_hour", "max_queries_per_hour", "max_updates_per_hour", "max_user_connections", "event", "reload", "routine", "temporary", + } + for _, kw := range unreservedKws { + src := fmt.Sprintf("SELECT %s FROM tbl;", kw) + _, err := parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil, Commentf("source %s", src)) + } + + // Testcase for prepared statement + src := "SELECT id+?, id+? from t;" + _, err := parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + // Testcase for -- Comment and unary -- operator + src = "CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED); -- foo\nSelect --1 from foo;" + stmts, err := parser.Parse(src, "", "") + c.Assert(err, IsNil) + c.Assert(stmts, HasLen, 2) + + // Testcase for /*! xx */ + // See http://dev.mysql.com/doc/refman/5.7/en/comments.html + // Fix: https://github.com/pingcap/tidb/issues/971 + src = "/*!40101 SET character_set_client = utf8 */;" + stmts, err = parser.Parse(src, "", "") + c.Assert(err, IsNil) + c.Assert(stmts, HasLen, 1) + stmt := stmts[0] + _, ok := stmt.(*ast.SetStmt) + c.Assert(ok, IsTrue) + + // for issue #2017 + src = "insert into blobtable (a) values ('/*! truncated */');" + stmt, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + is, ok := stmt.(*ast.InsertStmt) + c.Assert(ok, IsTrue) + c.Assert(is.Lists, HasLen, 1) + c.Assert(is.Lists[0], HasLen, 1) + c.Assert(is.Lists[0][0].(ast.ValueExpr).GetDatumString(), Equals, "/*! truncated */") + + // Testcase for CONVERT(expr,type) + src = "SELECT CONVERT('111', SIGNED);" + st, err := parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + ss, ok := st.(*ast.SelectStmt) + c.Assert(ok, IsTrue) + c.Assert(len(ss.Fields.Fields), Equals, 1) + cv, ok := ss.Fields.Fields[0].Expr.(*ast.FuncCastExpr) + c.Assert(ok, IsTrue) + c.Assert(cv.FunctionType, Equals, ast.CastConvertFunction) + + // for query start with comment + srcs := []string{ + "/* some comments */ SELECT CONVERT('111', SIGNED) ;", + "/* some comments */ /*comment*/ SELECT CONVERT('111', SIGNED) ;", + "SELECT /*comment*/ CONVERT('111', SIGNED) ;", + "SELECT CONVERT('111', /*comment*/ SIGNED) ;", + "SELECT CONVERT('111', SIGNED) /*comment*/;", + } + for _, src := range srcs { + st, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + ss, ok = st.(*ast.SelectStmt) + c.Assert(ok, IsTrue) + } + + // for issue #961 + src = "create table t (c int key);" + st, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + cs, ok := st.(*ast.CreateTableStmt) + c.Assert(ok, IsTrue) + c.Assert(cs.Cols, HasLen, 1) + c.Assert(cs.Cols[0].Options, HasLen, 1) + c.Assert(cs.Cols[0].Options[0].Tp, Equals, ast.ColumnOptionPrimaryKey) + + // for issue #4497 + src = "create table t1(a NVARCHAR(100));" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + // for issue 2803 + src = "use quote;" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + // issue #4354 + src = "select b'';" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + src = "select B'';" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + // src = "select 0b'';" + // _, err = parser.ParseOneStmt(src, "", "") + // c.Assert(err, NotNil) + + // for #4909, support numericType `signed` filedOpt. + src = "CREATE TABLE t(_sms smallint signed, _smu smallint unsigned);" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + // for #7371, support NATIONAL CHARACTER + // reference link: https://dev.mysql.com/doc/refman/5.7/en/charset-national.html + src = "CREATE TABLE t(c1 NATIONAL CHARACTER(10));" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + src = `CREATE TABLE t(a tinyint signed, + b smallint signed, + c mediumint signed, + d int signed, + e int1 signed, + f int2 signed, + g int3 signed, + h int4 signed, + i int8 signed, + j integer signed, + k bigint signed, + l bool signed, + m boolean signed + );` + + st, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + ct, ok := st.(*ast.CreateTableStmt) + c.Assert(ok, IsTrue) + for _, col := range ct.Cols { + c.Assert(col.Tp.Flag&mysql.UnsignedFlag, Equals, uint(0)) + } + + // for issue #4006 + src = `insert into tb(v) (select v from tb);` + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) +} + +type testCase struct { + src string + ok bool +} + +type testErrMsgCase struct { + src string + ok bool + err error +} + +func (s *testParserSuite) RunTest(c *C, table []testCase) { + parser := New() + for _, t := range table { + _, err := parser.Parse(t.src, "", "") + comment := Commentf("source %v", t.src) + if t.ok { + c.Assert(err, IsNil, comment) + } else { + c.Assert(err, NotNil, comment) + } + } +} + +func (s *testParserSuite) RunErrMsgTest(c *C, table []testErrMsgCase) { + parser := New() + for _, t := range table { + _, err := parser.Parse(t.src, "", "") + comment := Commentf("source %v", t.src) + if t.err != nil { + c.Assert(terror.ErrorEqual(err, t.err), IsTrue, comment) + } else { + c.Assert(err, IsNil, comment) + } + } +} + +func (s *testParserSuite) TestDMLStmt(c *C) { + table := []testCase{ + {"", true}, + {";", true}, + {"INSERT INTO foo VALUES (1234)", true}, + {"INSERT INTO foo VALUES (1234, 5678)", true}, + {"INSERT INTO t1 (SELECT * FROM t2)", true}, + // 15 + {"INSERT INTO foo VALUES (1 || 2)", true}, + {"INSERT INTO foo VALUES (1 | 2)", true}, + {"INSERT INTO foo VALUES (false || true)", true}, + {"INSERT INTO foo VALUES (bar(5678))", true}, + // 20 + {"INSERT INTO foo VALUES ()", true}, + {"SELECT * FROM t", true}, + {"SELECT * FROM t AS u", true}, + // 25 + {"SELECT * FROM t, v", true}, + {"SELECT * FROM t AS u, v", true}, + {"SELECT * FROM t, v AS w", true}, + {"SELECT * FROM t AS u, v AS w", true}, + {"SELECT * FROM foo, bar, foo", true}, + // 30 + {"SELECT DISTINCTS * FROM t", false}, + {"SELECT DISTINCT * FROM t", true}, + {"SELECT DISTINCTROW * FROM t", true}, + {"SELECT ALL * FROM t", true}, + {"SELECT DISTINCT ALL * FROM t", false}, + {"SELECT DISTINCTROW ALL * FROM t", false}, + {"INSERT INTO foo (a) VALUES (42)", true}, + {"INSERT INTO foo (a,) VALUES (42,)", false}, + // 35 + {"INSERT INTO foo (a,b) VALUES (42,314)", true}, + {"INSERT INTO foo (a,b,) VALUES (42,314)", false}, + {"INSERT INTO foo (a,b,) VALUES (42,314,)", false}, + {"INSERT INTO foo () VALUES ()", true}, + {"INSERT INTO foo VALUE ()", true}, + + // for issue 2402 + {"INSERT INTO tt VALUES (01000001783);", true}, + {"INSERT INTO tt VALUES (default);", true}, + + {"REPLACE INTO foo VALUES (1 || 2)", true}, + {"REPLACE INTO foo VALUES (1 | 2)", true}, + {"REPLACE INTO foo VALUES (false || true)", true}, + {"REPLACE INTO foo VALUES (bar(5678))", true}, + {"REPLACE INTO foo VALUES ()", true}, + {"REPLACE INTO foo (a,b) VALUES (42,314)", true}, + {"REPLACE INTO foo (a,b,) VALUES (42,314)", false}, + {"REPLACE INTO foo (a,b,) VALUES (42,314,)", false}, + {"REPLACE INTO foo () VALUES ()", true}, + {"REPLACE INTO foo VALUE ()", true}, + // 40 + {`SELECT stuff.id + FROM stuff + WHERE stuff.value >= ALL (SELECT stuff.value + FROM stuff)`, true}, + {"BEGIN", true}, + {"START TRANSACTION", true}, + // 45 + {"COMMIT", true}, + {"ROLLBACK", true}, + {`BEGIN; + INSERT INTO foo VALUES (42, 3.14); + INSERT INTO foo VALUES (-1, 2.78); + COMMIT;`, true}, + {`BEGIN; + INSERT INTO tmp SELECT * from bar; + SELECT * from tmp; + ROLLBACK;`, true}, + + // qualified select + {"SELECT a.b.c FROM t", true}, + {"SELECT a.b.*.c FROM t", false}, + {"SELECT a.b.* FROM t", true}, + {"SELECT a FROM t", true}, + {"SELECT a.b.c.d FROM t", false}, + + // do statement + {"DO 1", true}, + {"DO 1 from t", false}, + + // load data + {"load data infile '/tmp/t.csv' into table t", true}, + {"load data infile '/tmp/t.csv' into table t character set utf8", true}, + {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab'", true}, + {"load data infile '/tmp/t.csv' into table t columns terminated by 'ab'", true}, + {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b'", true}, + {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*'", true}, + {"load data infile '/tmp/t.csv' into table t lines starting by 'ab'", true}, + {"load data infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy'", true}, + {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy'", true}, + {"load data infile '/tmp/t.csv' into table t terminated by 'xy' fields terminated by 'ab'", false}, + {"load data local infile '/tmp/t.csv' into table t", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab'", true}, + {"load data local infile '/tmp/t.csv' into table t columns terminated by 'ab'", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b'", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*'", true}, + {"load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' enclosed by 'b' escaped by '*'", true}, + {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab'", true}, + {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy'", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy'", true}, + {"load data local infile '/tmp/t.csv' into table t terminated by 'xy' fields terminated by 'ab'", false}, + {"load data infile '/tmp/t.csv' into table t (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t columns terminated by 'ab' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' enclosed by 'b' escaped by '*' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' lines terminated by 'xy' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t (a,b) fields terminated by 'ab'", false}, + {"load data local infile '/tmp/t.csv' into table t ignore 1 lines", true}, + {"load data local infile '/tmp/t.csv' into table t ignore -1 lines", false}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' (a,b) ignore 1 lines", false}, + {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy' ignore 1 lines", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*' ignore 1 lines (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by ''", true}, + + // select for update + {"SELECT * from t for update", true}, + {"SELECT * from t lock in share mode", true}, + + // from join + {"SELECT * from t1, t2, t3", true}, + {"select * from t1 join t2 left join t3 on t2.id = t3.id", true}, + {"select * from t1 right join t2 on t1.id = t2.id left join t3 on t3.id = t2.id", true}, + {"select * from t1 right join t2 on t1.id = t2.id left join t3", false}, + {"select * from t1 join t2 left join t3 using (id)", true}, + {"select * from t1 right join t2 using (id) left join t3 using (id)", true}, + {"select * from t1 right join t2 using (id) left join t3", false}, + {"select * from t1 natural join t2", true}, + {"select * from t1 natural right join t2", true}, + {"select * from t1 natural left outer join t2", true}, + {"select * from t1 natural inner join t2", false}, + {"select * from t1 natural cross join t2", false}, + + // for straight_join + {"select * from t1 straight_join t2 on t1.id = t2.id", true}, + {"select straight_join * from t1 join t2 on t1.id = t2.id", true}, + {"select straight_join * from t1 left join t2 on t1.id = t2.id", true}, + {"select straight_join * from t1 right join t2 on t1.id = t2.id", true}, + {"select straight_join * from t1 straight_join t2 on t1.id = t2.id", true}, + + // for "USE INDEX" in delete statement + {"DELETE FROM t1 USE INDEX(idx_a) WHERE t1.id=1;", true}, + {"DELETE t1, t2 FROM t1 USE INDEX(idx_a) JOIN t2 WHERE t1.id=t2.id;", true}, + {"DELETE t1, t2 FROM t1 USE INDEX(idx_a) JOIN t2 USE INDEX(idx_a) WHERE t1.id=t2.id;", true}, + + // for admin + {"admin show ddl;", true}, + {"admin show ddl jobs;", true}, + {"admin show ddl jobs 20;", true}, + {"admin show ddl jobs -1;", false}, + {"admin show ddl job queries 1", true}, + {"admin show ddl job queries 1, 2, 3, 4", true}, + {"admin check table t1, t2;", true}, + {"admin check index tableName idxName;", true}, + {"admin check index tableName idxName (1, 2), (4, 5);", true}, + {"admin checksum table t1, t2;", true}, + {"admin cancel ddl jobs 1", true}, + {"admin cancel ddl jobs 1, 2", true}, + {"admin recover index t1 idx_a", true}, + {"admin cleanup index t1 idx_a", true}, + {"admin show slow top 3", true}, + {"admin show slow top internal 7", true}, + {"admin show slow top all 9", true}, + {"admin show slow recent 11", true}, + + // for on duplicate key update + {"INSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);", true}, + {"INSERT IGNORE INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);", true}, + + // for delete statement + {"DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;", true}, + {"DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;", true}, + {"DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id limit 10;", false}, + {"DELETE /*+ TiDB_INLJ(t1, t2) */ t1, t2 from t1, t2 where t1.id=t2.id;", true}, + {"DELETE /*+ TiDB_HJ(t1, t2) */ t1, t2 from t1, t2 where t1.id=t2.id", true}, + + // for update statement + {"UPDATE t SET id = id + 1 ORDER BY id DESC;", true}, + {"UPDATE items,month SET items.price=month.price WHERE items.id=month.id;", true}, + {"UPDATE items,month SET items.price=month.price WHERE items.id=month.id LIMIT 10;", false}, + {"UPDATE user T0 LEFT OUTER JOIN user_profile T1 ON T1.id = T0.profile_id SET T0.profile_id = 1 WHERE T0.profile_id IN (1);", true}, + {"UPDATE /*+ TiDB_INLJ(t1, t2) */ t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba", true}, + {"UPDATE /*+ TiDB_SMJ(t1, t2) */ t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba", true}, + + // for select with where clause + {"SELECT * FROM t WHERE 1 = 1", true}, + + // for dual + {"select 1 from dual", true}, + {"select 1 from dual limit 1", true}, + {"select 1 where exists (select 2)", false}, + {"select 1 from dual where not exists (select 2)", true}, + {"select 1 as a from dual order by a", true}, + {"select 1 as a from dual where 1 < any (select 2) order by a", true}, + {"select 1 order by 1", true}, + + // for https://github.com/pingcap/tidb/issues/320 + {`(select 1);`, true}, + + // for https://github.com/pingcap/tidb/issues/1050 + {`SELECT /*!40001 SQL_NO_CACHE */ * FROM test WHERE 1 limit 0, 2000;`, true}, + + {`ANALYZE TABLE t`, true}, + + // for comments + {`/** 20180417 **/ show databases;`, true}, + {`/* 20180417 **/ show databases;`, true}, + {`/** 20180417 */ show databases;`, true}, + {`/** 20180417 ******/ show databases;`, true}, + + // for Binlog stmt + {`BINLOG ' +BxSFVw8JAAAA8QAAAPUAAAAAAAQANS41LjQ0LU1hcmlhREItbG9nAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA5gm5Mg== +'/*!*/;`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestDBAStmt(c *C) { + table := []testCase{ + // for SHOW statement + {"SHOW VARIABLES LIKE 'character_set_results'", true}, + {"SHOW GLOBAL VARIABLES LIKE 'character_set_results'", true}, + {"SHOW SESSION VARIABLES LIKE 'character_set_results'", true}, + {"SHOW VARIABLES", true}, + {"SHOW GLOBAL VARIABLES", true}, + {"SHOW GLOBAL VARIABLES WHERE Variable_name = 'autocommit'", true}, + {"SHOW STATUS", true}, + {"SHOW GLOBAL STATUS", true}, + {"SHOW SESSION STATUS", true}, + {`SHOW STATUS LIKE 'Up%'`, true}, + {`SHOW STATUS WHERE Variable_name LIKE 'Up%'`, true}, + {`SHOW FULL TABLES FROM icar_qa LIKE play_evolutions`, true}, + {`SHOW FULL TABLES WHERE Table_Type != 'VIEW'`, true}, + {`SHOW GRANTS`, true}, + {`SHOW GRANTS FOR 'test'@'localhost'`, true}, + {`SHOW GRANTS FOR current_user()`, true}, + {`SHOW GRANTS FOR current_user`, true}, + {`SHOW COLUMNS FROM City;`, true}, + {`SHOW COLUMNS FROM tv189.1_t_1_x;`, true}, + {`SHOW FIELDS FROM City;`, true}, + {`SHOW TRIGGERS LIKE 't'`, true}, + {`SHOW DATABASES LIKE 'test2'`, true}, + {`SHOW PROCEDURE STATUS WHERE Db='test'`, true}, + {`SHOW FUNCTION STATUS WHERE Db='test'`, true}, + {`SHOW INDEX FROM t;`, true}, + {`SHOW KEYS FROM t;`, true}, + {`SHOW INDEX IN t;`, true}, + {`SHOW KEYS IN t;`, true}, + {`SHOW INDEXES IN t where true;`, true}, + {`SHOW KEYS FROM t FROM test where true;`, true}, + {`SHOW EVENTS FROM test_db WHERE definer = 'current_user'`, true}, + {`SHOW PLUGINS`, true}, + {`SHOW PROFILES`, true}, + {`SHOW MASTER STATUS`, true}, + {`SHOW PRIVILEGES`, true}, + // for show character set + {"show character set;", true}, + {"show charset", true}, + // for show collation + {"show collation", true}, + {`show collation like 'utf8%'`, true}, + {"show collation where Charset = 'utf8' and Collation = 'utf8_bin'", true}, + // for show full columns + {"show columns in t;", true}, + {"show full columns in t;", true}, + // for show create table + {"show create table test.t", true}, + {"show create table t", true}, + // for show stats_meta. + {"show stats_meta", true}, + {"show stats_meta where table_name = 't'", true}, + // for show stats_histograms + {"show stats_histograms", true}, + {"show stats_histograms where col_name = 'a'", true}, + // for show stats_buckets + {"show stats_buckets", true}, + {"show stats_buckets where col_name = 'a'", true}, + // for show stats_healthy. + {"show stats_healthy", true}, + {"show stats_healthy where table_name = 't'", true}, + + // for load stats + {"load stats '/tmp/stats.json'", true}, + // set + // user defined + {"SET @ = 1", true}, + {"SET @' ' = 1", true}, + {"SET @! = 1", false}, + {"SET @1 = 1", true}, + {"SET @a = 1", true}, + {"SET @b := 1", true}, + {"SET @.c = 1", true}, + {"SET @_d = 1", true}, + {"SET @_e._$. = 1", true}, + {"SET @~f = 1", false}, + {"SET @`g,` = 1", true}, + // session system variables + {"SET SESSION autocommit = 1", true}, + {"SET @@session.autocommit = 1", true}, + {"SET @@SESSION.autocommit = 1", true}, + {"SET @@GLOBAL.GTID_PURGED = '123'", true}, + {"SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN", true}, + {"SET LOCAL autocommit = 1", true}, + {"SET @@local.autocommit = 1", true}, + {"SET @@autocommit = 1", true}, + {"SET autocommit = 1", true}, + // global system variables + {"SET GLOBAL autocommit = 1", true}, + {"SET @@global.autocommit = 1", true}, + // set default value + {"SET @@global.autocommit = default", true}, + {"SET @@session.autocommit = default", true}, + // SET CHARACTER SET + {"SET CHARACTER SET utf8mb4;", true}, + {"SET CHARACTER SET 'utf8mb4';", true}, + // set password + {"SET PASSWORD = 'password';", true}, + {"SET PASSWORD FOR 'root'@'localhost' = 'password';", true}, + // SET TRANSACTION Syntax + {"SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ", true}, + {"SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ", true}, + {"SET SESSION TRANSACTION READ WRITE", true}, + {"SET SESSION TRANSACTION READ ONLY", true}, + {"SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED", true}, + {"SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED", true}, + {"SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE", true}, + {"SET TRANSACTION ISOLATION LEVEL REPEATABLE READ", true}, + {"SET TRANSACTION READ WRITE", true}, + {"SET TRANSACTION READ ONLY", true}, + {"SET TRANSACTION ISOLATION LEVEL READ COMMITTED", true}, + {"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED", true}, + {"SET TRANSACTION ISOLATION LEVEL SERIALIZABLE", true}, + // for set names + {"set names utf8", true}, + {"set names utf8 collate utf8_unicode_ci", true}, + {"set names binary", true}, + // for set names and set vars + {"set names utf8, @@session.sql_mode=1;", true}, + {"set @@session.sql_mode=1, names utf8, charset utf8;", true}, + + // for FLUSH statement + {"flush no_write_to_binlog tables tbl1 with read lock", true}, + {"flush table", true}, + {"flush tables", true}, + {"flush tables tbl1", true}, + {"flush no_write_to_binlog tables tbl1", true}, + {"flush local tables tbl1", true}, + {"flush table with read lock", true}, + {"flush tables tbl1, tbl2, tbl3", true}, + {"flush tables tbl1, tbl2, tbl3 with read lock", true}, + {"flush privileges", true}, + {"flush status", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestFlushTable(c *C) { + parser := New() + stmt, err := parser.Parse("flush local tables tbl1,tbl2 with read lock", "", "") + c.Assert(err, IsNil) + flushTable := stmt[0].(*ast.FlushStmt) + c.Assert(flushTable.Tp, Equals, ast.FlushTables) + c.Assert(flushTable.Tables[0].Name.L, Equals, "tbl1") + c.Assert(flushTable.Tables[1].Name.L, Equals, "tbl2") + c.Assert(flushTable.NoWriteToBinLog, IsTrue) + c.Assert(flushTable.ReadLock, IsTrue) +} + +func (s *testParserSuite) TestFlushPrivileges(c *C) { + parser := New() + stmt, err := parser.Parse("flush privileges", "", "") + c.Assert(err, IsNil) + flushPrivilege := stmt[0].(*ast.FlushStmt) + c.Assert(flushPrivilege.Tp, Equals, ast.FlushPrivileges) +} + +func (s *testParserSuite) TestExpression(c *C) { + table := []testCase{ + // sign expression + {"SELECT ++1", true}, + {"SELECT -*1", false}, + {"SELECT -+1", true}, + {"SELECT -1", true}, + {"SELECT --1", true}, + + // for string literal + {`select '''a''', """a"""`, true}, + {`select ''a''`, false}, + {`select ""a""`, false}, + {`select '''a''';`, true}, + {`select '\'a\'';`, true}, + {`select "\"a\"";`, true}, + {`select """a""";`, true}, + {`select _utf8"string";`, true}, + {`select _binary"string";`, true}, + {"select N'string'", true}, + {"select n'string'", true}, + // for comparison + {"select 1 <=> 0, 1 <=> null, 1 = null", true}, + // for date literal + {"select date'1989-09-10'", true}, + {"select date 19890910", false}, + // for time literal + {"select time '00:00:00.111'", true}, + {"select time 19890910", false}, + // for timestamp literal + {"select timestamp '1989-09-10 11:11:11'", true}, + {"select timestamp 19890910", false}, + + // The ODBC syntax for time/date/timestamp literal. + // See: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html + {"select {ts '1989-09-10 11:11:11'}", true}, + {"select {d '1989-09-10'}", true}, + {"select {t '00:00:00.111'}", true}, + // If the identifier is not in (t, d, ts), we just ignore it and consider the following expression as the value. + // See: https://dev.mysql.com/doc/refman/5.7/en/expressions.html + {"select {ts123 '1989-09-10 11:11:11'}", true}, + {"select {ts123 123}", true}, + {"select {ts123 1 xor 1}", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestBuiltin(c *C) { + table := []testCase{ + // for builtin functions + {"SELECT POW(1, 2)", true}, + {"SELECT POW(1, 2, 1)", true}, // illegal number of arguments shall pass too + {"SELECT POW(1, 0.5)", true}, + {"SELECT POW(1, -1)", true}, + {"SELECT POW(-1, 1)", true}, + {"SELECT RAND();", true}, + {"SELECT RAND(1);", true}, + {"SELECT MOD(10, 2);", true}, + {"SELECT ROUND(-1.23);", true}, + {"SELECT ROUND(1.23, 1);", true}, + {"SELECT ROUND(1.23, 1, 1);", true}, + {"SELECT CEIL(-1.23);", true}, + {"SELECT CEILING(1.23);", true}, + {"SELECT FLOOR(-1.23);", true}, + {"SELECT LN(1);", true}, + {"SELECT LN(1, 2);", true}, + {"SELECT LOG(-2);", true}, + {"SELECT LOG(2, 65536);", true}, + {"SELECT LOG(2, 65536, 1);", true}, + {"SELECT LOG2(2);", true}, + {"SELECT LOG2(2, 2);", true}, + {"SELECT LOG10(10);", true}, + {"SELECT LOG10(10, 1);", true}, + {"SELECT ABS(10, 1);", true}, + {"SELECT ABS(10);", true}, + {"SELECT ABS();", true}, + {"SELECT CONV(10+'10'+'10'+X'0a',10,10);", true}, + {"SELECT CONV();", true}, + {"SELECT CRC32('MySQL');", true}, + {"SELECT CRC32();", true}, + {"SELECT SIGN();", true}, + {"SELECT SIGN(0);", true}, + {"SELECT SQRT(0);", true}, + {"SELECT SQRT();", true}, + {"SELECT ACOS();", true}, + {"SELECT ACOS(1);", true}, + {"SELECT ACOS(1, 2);", true}, + {"SELECT ASIN();", true}, + {"SELECT ASIN(1);", true}, + {"SELECT ASIN(1, 2);", true}, + {"SELECT ATAN(0), ATAN(1), ATAN(1, 2);", true}, + {"SELECT ATAN2(), ATAN2(1,2);", true}, + {"SELECT COS(0);", true}, + {"SELECT COS(1);", true}, + {"SELECT COS(1, 2);", true}, + {"SELECT COT();", true}, + {"SELECT COT(1);", true}, + {"SELECT COT(1, 2);", true}, + {"SELECT DEGREES();", true}, + {"SELECT DEGREES(0);", true}, + {"SELECT EXP();", true}, + {"SELECT EXP(1);", true}, + {"SELECT PI();", true}, + {"SELECT PI(1);", true}, + {"SELECT RADIANS();", true}, + {"SELECT RADIANS(1);", true}, + {"SELECT SIN();", true}, + {"SELECT SIN(1);", true}, + {"SELECT TAN(1);", true}, + {"SELECT TAN();", true}, + {"SELECT TRUNCATE(1.223,1);", true}, + {"SELECT TRUNCATE();", true}, + + {"SELECT SUBSTR('Quadratically',5);", true}, + {"SELECT SUBSTR('Quadratically',5, 3);", true}, + {"SELECT SUBSTR('Quadratically' FROM 5);", true}, + {"SELECT SUBSTR('Quadratically' FROM 5 FOR 3);", true}, + + {"SELECT SUBSTRING('Quadratically',5);", true}, + {"SELECT SUBSTRING('Quadratically',5, 3);", true}, + {"SELECT SUBSTRING('Quadratically' FROM 5);", true}, + {"SELECT SUBSTRING('Quadratically' FROM 5 FOR 3);", true}, + + {"SELECT CONVERT('111', SIGNED);", true}, + + {"SELECT LEAST(), LEAST(1, 2, 3);", true}, + + {"SELECT INTERVAL(1, 0, 1, 2)", true}, + {"SELECT DATE_ADD('2008-01-02', INTERVAL INTERVAL(1, 0, 1) DAY);", true}, + + // information functions + {"SELECT DATABASE();", true}, + {"SELECT SCHEMA();", true}, + {"SELECT USER();", true}, + {"SELECT USER(1);", true}, + {"SELECT CURRENT_USER();", true}, + {"SELECT CURRENT_USER;", true}, + {"SELECT CONNECTION_ID();", true}, + {"SELECT VERSION();", true}, + {"SELECT BENCHMARK(1000000, AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')));", true}, + {"SELECT BENCHMARK(AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')));", true}, + {"SELECT CHARSET('abc');", true}, + {"SELECT COERCIBILITY('abc');", true}, + {"SELECT COERCIBILITY('abc', 'a');", true}, + {"SELECT COLLATION('abc');", true}, + {"SELECT ROW_COUNT();", true}, + {"SELECT SESSION_USER();", true}, + {"SELECT SYSTEM_USER();", true}, + + {"SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);", true}, + {"SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);", true}, + + {`SELECT ASCII(), ASCII(""), ASCII("A"), ASCII(1);`, true}, + + {`SELECT LOWER("A"), UPPER("a")`, true}, + {`SELECT LCASE("A"), UCASE("a")`, true}, + + {`SELECT REPLACE('www.mysql.com', 'w', 'Ww')`, true}, + + {`SELECT LOCATE('bar', 'foobarbar');`, true}, + {`SELECT LOCATE('bar', 'foobarbar', 5);`, true}, + + {`SELECT tidb_version();`, true}, + {`SELECT tidb_is_ddl_owner();`, true}, + + // for time fsp + {"CREATE TABLE t( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );", true}, + + // for row + {"select row(1)", false}, + {"select row(1, 1,)", false}, + {"select (1, 1,)", false}, + {"select row(1, 1) > row(1, 1), row(1, 1, 1) > row(1, 1, 1)", true}, + {"Select (1, 1) > (1, 1)", true}, + {"create table t (row int)", true}, + + // for cast with charset + {"SELECT *, CAST(data AS CHAR CHARACTER SET utf8) FROM t;", true}, + + // for cast as JSON + {"SELECT *, CAST(data AS JSON) FROM t;", true}, + + // for cast as signed int, fix issue #3691. + {"select cast(1 as signed int);", true}, + + // for last_insert_id + {"SELECT last_insert_id();", true}, + {"SELECT last_insert_id(1);", true}, + + // for binary operator + {"SELECT binary 'a';", true}, + + // for bit_count + {`SELECT BIT_COUNT(1);`, true}, + + // select time + {"select current_timestamp", true}, + {"select current_timestamp()", true}, + {"select current_timestamp(6)", true}, + {"select current_timestamp(null)", false}, + {"select current_timestamp(-1)", false}, + {"select current_timestamp(1.0)", false}, + {"select current_timestamp('2')", false}, + {"select now()", true}, + {"select now(6)", true}, + {"select sysdate(), sysdate(6)", true}, + {"SELECT time('01:02:03');", true}, + {"SELECT time('01:02:03.1')", true}, + {"SELECT time('20.1')", true}, + {"SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001');", true}, + {"SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');", true}, + {"SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');", true}, + {"SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');", true}, + + // select current_time + {"select current_time", true}, + {"select current_time()", true}, + {"select current_time(6)", true}, + {"select current_time(-1)", false}, + {"select current_time(1.0)", false}, + {"select current_time('1')", false}, + {"select current_time(null)", false}, + {"select curtime()", true}, + {"select curtime(6)", true}, + {"select curtime(-1)", false}, + {"select curtime(1.0)", false}, + {"select curtime('1')", false}, + {"select curtime(null)", false}, + + // select utc_timestamp + {"select utc_timestamp", true}, + {"select utc_timestamp()", true}, + {"select utc_timestamp(6)", true}, + {"select utc_timestamp(-1)", false}, + {"select utc_timestamp(1.0)", false}, + {"select utc_timestamp('1')", false}, + {"select utc_timestamp(null)", false}, + + // select utc_time + {"select utc_time", true}, + {"select utc_time()", true}, + {"select utc_time(6)", true}, + {"select utc_time(-1)", false}, + {"select utc_time(1.0)", false}, + {"select utc_time('1')", false}, + {"select utc_time(null)", false}, + + // for microsecond, second, minute, hour + {"SELECT MICROSECOND('2009-12-31 23:59:59.000010');", true}, + {"SELECT SECOND('10:05:03');", true}, + {"SELECT MINUTE('2008-02-03 10:05:03');", true}, + {"SELECT HOUR(), HOUR('10:05:03');", true}, + + // for date, day, weekday + {"SELECT CURRENT_DATE, CURRENT_DATE(), CURDATE()", true}, + {"SELECT CURRENT_DATE, CURRENT_DATE(), CURDATE(1)", false}, + {"SELECT DATEDIFF('2003-12-31', '2003-12-30');", true}, + {"SELECT DATE('2003-12-31 01:02:03');", true}, + {"SELECT DATE();", true}, + {"SELECT DATE('2003-12-31 01:02:03', '');", true}, + {`SELECT DATE_FORMAT('2003-12-31 01:02:03', '%W %M %Y');`, true}, + {"SELECT DAY('2007-02-03');", true}, + {"SELECT DAYOFMONTH('2007-02-03');", true}, + {"SELECT DAYOFWEEK('2007-02-03');", true}, + {"SELECT DAYOFYEAR('2007-02-03');", true}, + {"SELECT DAYNAME('2007-02-03');", true}, + {"SELECT FROM_DAYS(1423);", true}, + {"SELECT WEEKDAY('2007-02-03');", true}, + + // for utc_date + {"SELECT UTC_DATE, UTC_DATE();", true}, + {"SELECT UTC_DATE(), UTC_DATE()+0", true}, + + // for week, month, year + {"SELECT WEEK();", true}, + {"SELECT WEEK('2007-02-03');", true}, + {"SELECT WEEK('2007-02-03', 0);", true}, + {"SELECT WEEKOFYEAR('2007-02-03');", true}, + {"SELECT MONTH('2007-02-03');", true}, + {"SELECT MONTHNAME('2007-02-03');", true}, + {"SELECT YEAR('2007-02-03');", true}, + {"SELECT YEARWEEK('2007-02-03');", true}, + {"SELECT YEARWEEK('2007-02-03', 0);", true}, + + // for ADDTIME, SUBTIME + {"SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');", true}, + {"SELECT ADDTIME('02:00:00.999998');", true}, + {"SELECT ADDTIME();", true}, + {"SELECT SUBTIME('01:00:00.999999', '02:00:00.999998');", true}, + + // for CONVERT_TZ + {"SELECT CONVERT_TZ();", true}, + {"SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');", true}, + {"SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00', '+10:00');", true}, + + // for GET_FORMAT + {"SELECT GET_FORMAT(DATE, 'USA');", true}, + {"SELECT GET_FORMAT(DATETIME, 'USA');", true}, + {"SELECT GET_FORMAT(TIME, 'USA');", true}, + {"SELECT GET_FORMAT(TIMESTAMP, 'USA');", true}, + + // for LOCALTIME, LOCALTIMESTAMP + {"SELECT LOCALTIME(), LOCALTIME(1)", true}, + {"SELECT LOCALTIMESTAMP(), LOCALTIMESTAMP(2)", true}, + + // for MAKEDATE, MAKETIME + {"SELECT MAKEDATE(2011,31);", true}, + {"SELECT MAKETIME(12,15,30);", true}, + {"SELECT MAKEDATE();", true}, + {"SELECT MAKETIME();", true}, + + // for PERIOD_ADD, PERIOD_DIFF + {"SELECT PERIOD_ADD(200801,2)", true}, + {"SELECT PERIOD_DIFF(200802,200703)", true}, + + // for QUARTER + {"SELECT QUARTER('2008-04-01');", true}, + + // for SEC_TO_TIME + {"SELECT SEC_TO_TIME(2378)", true}, + + // for TIME_FORMAT + {`SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l')`, true}, + + // for TIME_TO_SEC + {"SELECT TIME_TO_SEC('22:23:00')", true}, + + // for TIMESTAMPADD + {"SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');", true}, + + // for TO_DAYS, TO_SECONDS + {"SELECT TO_DAYS('2007-10-07')", true}, + {"SELECT TO_SECONDS('2009-11-29')", true}, + + // for LAST_DAY + {"SELECT LAST_DAY('2003-02-05');", true}, + + // for UTC_TIME + {"SELECT UTC_TIME(), UTC_TIME(1)", true}, + + // for time extract + {`select extract(microsecond from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(second from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(minute from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(hour from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(day from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(week from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(month from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(quarter from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(year from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(second_microsecond from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(minute_microsecond from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(minute_second from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(hour_microsecond from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(hour_second from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(hour_minute from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(day_microsecond from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(day_second from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(day_minute from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(day_hour from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(year_month from "2011-11-11 10:10:10.123456")`, true}, + + // for from_unixtime + {`select from_unixtime(1447430881)`, true}, + {`select from_unixtime(1447430881.123456)`, true}, + {`select from_unixtime(1447430881.1234567)`, true}, + {`select from_unixtime(1447430881.9999999)`, true}, + {`select from_unixtime(1447430881, "%Y %D %M %h:%i:%s %x")`, true}, + {`select from_unixtime(1447430881.123456, "%Y %D %M %h:%i:%s %x")`, true}, + {`select from_unixtime(1447430881.1234567, "%Y %D %M %h:%i:%s %x")`, true}, + + // for issue 224 + {`SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;`, true}, + + // for string functions + // trim + {`SELECT TRIM(' bar ');`, true}, + {`SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');`, true}, + {`SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');`, true}, + {`SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');`, true}, + {`SELECT LTRIM(' foo ');`, true}, + {`SELECT RTRIM(' bar ');`, true}, + + {`SELECT RPAD('hi', 6, 'c');`, true}, + {`SELECT BIT_LENGTH('hi');`, true}, + {`SELECT CHAR(65);`, true}, + {`SELECT CHAR_LENGTH('abc');`, true}, + {`SELECT CHARACTER_LENGTH('abc');`, true}, + {`SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');`, true}, + {`SELECT FIND_IN_SET('foo', 'foo,bar')`, true}, + {`SELECT FIND_IN_SET('foo')`, true}, // illegal number of argument still pass + {`SELECT MAKE_SET(1,'a'), MAKE_SET(1,'a','b','c')`, true}, + {`SELECT MID('Sakila', -5, 3)`, true}, + {`SELECT OCT(12)`, true}, + {`SELECT OCTET_LENGTH('text')`, true}, + {`SELECT ORD('2')`, true}, + {`SELECT POSITION('bar' IN 'foobarbar')`, true}, + {`SELECT QUOTE('Don\'t!')`, true}, + {`SELECT BIN(12)`, true}, + {`SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo')`, true}, + {`SELECT EXPORT_SET(5,'Y','N'), EXPORT_SET(5,'Y','N',','), EXPORT_SET(5,'Y','N',',',4)`, true}, + {`SELECT FORMAT(), FORMAT(12332.2,2,'de_DE'), FORMAT(12332.123456, 4)`, true}, + {`SELECT FROM_BASE64('abc')`, true}, + {`SELECT TO_BASE64('abc')`, true}, + {`SELECT INSERT(), INSERT('Quadratic', 3, 4, 'What'), INSTR('foobarbar', 'bar')`, true}, + {`SELECT LOAD_FILE('/tmp/picture')`, true}, + {`SELECT LPAD('hi',4,'??')`, true}, + {`SELECT LEFT("foobar", 3)`, true}, + {`SELECT RIGHT("foobar", 3)`, true}, + + // repeat + {`SELECT REPEAT("a", 10);`, true}, + + // for miscellaneous functions + {`SELECT SLEEP(10);`, true}, + {`SELECT ANY_VALUE(@arg);`, true}, + {`SELECT INET_ATON('10.0.5.9');`, true}, + {`SELECT INET_NTOA(167773449);`, true}, + {`SELECT INET6_ATON('fdfe::5a55:caff:fefa:9089');`, true}, + {`SELECT INET6_NTOA(INET_NTOA(167773449));`, true}, + {`SELECT IS_FREE_LOCK(@str);`, true}, + {`SELECT IS_IPV4('10.0.5.9');`, true}, + {`SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.5.9'));`, true}, + {`SELECT IS_IPV4_MAPPED(INET6_ATON('::10.0.5.9'));`, true}, + {`SELECT IS_IPV6('10.0.5.9');`, true}, + {`SELECT IS_USED_LOCK(@str);`, true}, + {`SELECT MASTER_POS_WAIT(@log_name, @log_pos), MASTER_POS_WAIT(@log_name, @log_pos, @timeout), MASTER_POS_WAIT(@log_name, @log_pos, @timeout, @channel_name);`, true}, + {`SELECT NAME_CONST('myname', 14);`, true}, + {`SELECT RELEASE_ALL_LOCKS();`, true}, + {`SELECT UUID();`, true}, + {`SELECT UUID_SHORT()`, true}, + // test illegal arguments + {`SELECT SLEEP();`, true}, + {`SELECT ANY_VALUE();`, true}, + {`SELECT INET_ATON();`, true}, + {`SELECT INET_NTOA();`, true}, + {`SELECT INET6_ATON();`, true}, + {`SELECT INET6_NTOA(INET_NTOA());`, true}, + {`SELECT IS_FREE_LOCK();`, true}, + {`SELECT IS_IPV4();`, true}, + {`SELECT IS_IPV4_COMPAT(INET6_ATON());`, true}, + {`SELECT IS_IPV4_MAPPED(INET6_ATON());`, true}, + {`SELECT IS_IPV6()`, true}, + {`SELECT IS_USED_LOCK();`, true}, + {`SELECT MASTER_POS_WAIT();`, true}, + {`SELECT NAME_CONST();`, true}, + {`SELECT RELEASE_ALL_LOCKS(1);`, true}, + {`SELECT UUID(1);`, true}, + {`SELECT UUID_SHORT(1)`, true}, + // interval + {`select "2011-11-11 10:10:10.123456" + interval 10 second`, true}, + {`select "2011-11-11 10:10:10.123456" - interval 10 second`, true}, + // for date_add + {`select date_add("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 10 second)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 10 minute)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 10 hour)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 10 day)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 1 week)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 1 month)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 1 quarter)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 1 year)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", 10)`, false}, + {`select date_add("2011-11-11 10:10:10.123456", 0.10)`, false}, + {`select date_add("2011-11-11 10:10:10.123456", "11,11")`, false}, + + // for strcmp + {`select strcmp('abc', 'def')`, true}, + + // for adddate + {`select adddate("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 10 second)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 10 minute)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 10 hour)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 10 day)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 1 week)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 1 month)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 1 quarter)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 1 year)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", 10)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", 0.10)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", "11,11")`, true}, + + // for date_sub + {`select date_sub("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 10 second)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 10 minute)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 10 hour)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 10 day)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 1 week)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 1 month)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 1 quarter)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 1 year)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", 10)`, false}, + {`select date_sub("2011-11-11 10:10:10.123456", 0.10)`, false}, + {`select date_sub("2011-11-11 10:10:10.123456", "11,11")`, false}, + + // for subdate + {`select subdate("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 10 second)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 10 minute)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 10 hour)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 10 day)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 1 week)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 1 month)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 1 quarter)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 1 year)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", 10)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", 0.10)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", "11,11")`, true}, + + // for unix_timestamp + {`select unix_timestamp()`, true}, + {`select unix_timestamp('2015-11-13 10:20:19.012')`, true}, + + // for misc functions + {`SELECT GET_LOCK('lock1',10);`, true}, + {`SELECT RELEASE_LOCK('lock1');`, true}, + + // for aggregate functions + {`select avg(), avg(c1,c2) from t;`, false}, + {`select avg(distinct c1) from t;`, true}, + {`select avg(distinctrow c1) from t;`, true}, + {`select avg(distinct all c1) from t;`, true}, + {`select avg(distinctrow all c1) from t;`, true}, + {`select avg(c2) from t;`, true}, + {`select bit_and(c1) from t;`, true}, + {`select bit_and(all c1) from t;`, true}, + {`select bit_and(distinct c1) from t;`, false}, + {`select bit_and(distinctrow c1) from t;`, false}, + {`select bit_and(distinctrow all c1) from t;`, false}, + {`select bit_and(distinct all c1) from t;`, false}, + {`select bit_and(), bit_and(distinct c1) from t;`, false}, + {`select bit_and(), bit_and(distinctrow c1) from t;`, false}, + {`select bit_and(), bit_and(all c1) from t;`, false}, + {`select bit_or(c1) from t;`, true}, + {`select bit_or(all c1) from t;`, true}, + {`select bit_or(distinct c1) from t;`, false}, + {`select bit_or(distinctrow c1) from t;`, false}, + {`select bit_or(distinctrow all c1) from t;`, false}, + {`select bit_or(distinct all c1) from t;`, false}, + {`select bit_or(), bit_or(distinct c1) from t;`, false}, + {`select bit_or(), bit_or(distinctrow c1) from t;`, false}, + {`select bit_or(), bit_or(all c1) from t;`, false}, + {`select bit_xor(c1) from t;`, true}, + {`select bit_xor(all c1) from t;`, true}, + {`select bit_xor(distinct c1) from t;`, false}, + {`select bit_xor(distinctrow c1) from t;`, false}, + {`select bit_xor(distinctrow all c1) from t;`, false}, + {`select bit_xor(), bit_xor(distinct c1) from t;`, false}, + {`select bit_xor(), bit_xor(distinctrow c1) from t;`, false}, + {`select bit_xor(), bit_xor(all c1) from t;`, false}, + {`select max(c1,c2) from t;`, false}, + {`select max(distinct c1) from t;`, true}, + {`select max(distinctrow c1) from t;`, true}, + {`select max(distinct all c1) from t;`, true}, + {`select max(distinctrow all c1) from t;`, true}, + {`select max(c2) from t;`, true}, + {`select min(c1,c2) from t;`, false}, + {`select min(distinct c1) from t;`, true}, + {`select min(distinctrow c1) from t;`, true}, + {`select min(distinct all c1) from t;`, true}, + {`select min(distinctrow all c1) from t;`, true}, + {`select min(c2) from t;`, true}, + {`select sum(c1,c2) from t;`, false}, + {`select sum(distinct c1) from t;`, true}, + {`select sum(distinctrow c1) from t;`, true}, + {`select sum(distinct all c1) from t;`, true}, + {`select sum(distinctrow all c1) from t;`, true}, + {`select sum(c2) from t;`, true}, + {`select count(c1) from t;`, true}, + {`select count(distinct *) from t;`, false}, + {`select count(distinctrow *) from t;`, false}, + {`select count(*) from t;`, true}, + {`select count(distinct c1, c2) from t;`, true}, + {`select count(distinctrow c1, c2) from t;`, true}, + {`select count(c1, c2) from t;`, false}, + {`select count(all c1) from t;`, true}, + {`select count(distinct all c1) from t;`, false}, + {`select count(distinctrow all c1) from t;`, false}, + {`select group_concat(c2,c1) from t group by c1;`, true}, + {`select group_concat(c2,c1 SEPARATOR ';') from t group by c1;`, true}, + {`select group_concat(distinct c2,c1) from t group by c1;`, true}, + {`select group_concat(distinctrow c2,c1) from t group by c1;`, true}, + {`SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name;`, true}, + + // for encryption and compression functions + {`select AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3'))`, true}, + {`select AES_DECRYPT(@crypt_str,@key_str)`, true}, + {`select AES_DECRYPT(@crypt_str,@key_str,@init_vector);`, true}, + {`SELECT COMPRESS('');`, true}, + {`SELECT DECODE(@crypt_str, @pass_str);`, true}, + {`SELECT DES_DECRYPT(@crypt_str), DES_DECRYPT(@crypt_str, @key_str);`, true}, + {`SELECT DES_ENCRYPT(@str), DES_ENCRYPT(@key_num);`, true}, + {`SELECT ENCODE('cleartext', CONCAT('my_random_salt','my_secret_password'));`, true}, + {`SELECT ENCRYPT('hello'), ENCRYPT('hello', @salt);`, true}, + {`SELECT MD5('testing');`, true}, + {`SELECT OLD_PASSWORD(@str);`, true}, + {`SELECT PASSWORD(@str);`, true}, + {`SELECT RANDOM_BYTES(@len);`, true}, + {`SELECT SHA1('abc');`, true}, + {`SELECT SHA('abc');`, true}, + {`SELECT SHA2('abc', 224);`, true}, + {`SELECT UNCOMPRESS('any string');`, true}, + {`SELECT UNCOMPRESSED_LENGTH(@compressed_string);`, true}, + {`SELECT VALIDATE_PASSWORD_STRENGTH(@str);`, true}, + + // For JSON functions. + {`SELECT JSON_EXTRACT();`, true}, + {`SELECT JSON_UNQUOTE();`, true}, + {`SELECT JSON_TYPE('[123]');`, true}, + {`SELECT JSON_TYPE();`, true}, + + // For two json grammar sugar. + {`SELECT a->'$.a' FROM t`, true}, + {`SELECT a->>'$.a' FROM t`, true}, + {`SELECT '{}'->'$.a' FROM t`, false}, + {`SELECT '{}'->>'$.a' FROM t`, false}, + {`SELECT a->3 FROM t`, false}, + {`SELECT a->>3 FROM t`, false}, + + // Test that quoted identifier can be a function name. + {"SELECT `uuid`()", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestIdentifier(c *C) { + table := []testCase{ + // for quote identifier + {"select `a`, `a.b`, `a b` from t", true}, + // for unquoted identifier + {"create table MergeContextTest$Simple (value integer not null, primary key (value))", true}, + // for as + {"select 1 as a, 1 as `a`, 1 as \"a\", 1 as 'a'", true}, + {`select 1 as a, 1 as "a", 1 as 'a'`, true}, + {`select 1 a, 1 "a", 1 'a'`, true}, + {`select * from t as "a"`, false}, + {`select * from t a`, true}, + // reserved keyword can't be used as identifier directly, but A.B pattern is an exception + {`select COUNT from DESC`, false}, + {`select COUNT from SELECT.DESC`, true}, + {"use `select`", true}, + {"use select", false}, + {`select * from t as a`, true}, + {"select 1 full, 1 row, 1 abs", true}, + {"select * from t full, t1 row, t2 abs", true}, + // for issue 1878, identifiers may begin with digit. + {"create database 123test", true}, + {"create database 123", false}, + {"create database `123`", true}, + {"create table `123` (123a1 int)", true}, + {"create table 123 (123a1 int)", false}, + {fmt.Sprintf("select * from t%cble", 0), false}, + {"select 1 full, 1 row, 1 abs", true}, + {"select * from t full, t1 row, t2 abs", true}, + // for issue 3954, should NOT be recognized as identifiers. + {`select .78+123`, true}, + {`select .78+.21`, true}, + {`select .78-123`, true}, + {`select .78-.21`, true}, + {`select .78--123`, true}, + {`select .78*123`, true}, + {`select .78*.21`, true}, + {`select .78/123`, true}, + {`select .78/.21`, true}, + {`select .78,123`, true}, + {`select .78,.21`, true}, + {`select .78 , 123`, true}, + {`select .78.123`, false}, + {`select .78#123`, true}, // select .78 + {`insert float_test values(.67, 'string');`, true}, + {`select .78'123'`, true}, // select .78 as '123' + {"select .78`123`", true}, // select .78 as `123` + {`select .78"123"`, true}, // select .78 as "123" + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestDDL(c *C) { + table := []testCase{ + {"CREATE", false}, + {"CREATE TABLE", false}, + {"CREATE TABLE foo (", false}, + {"CREATE TABLE foo ()", false}, + {"CREATE TABLE foo ();", false}, + {"CREATE TABLE foo (a TINYINT UNSIGNED);", true}, + {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED)", true}, + {"CREATE TABLE foo (a bigint unsigned, b bool);", true}, + {"CREATE TABLE foo (a TINYINT, b SMALLINT) CREATE TABLE bar (x INT, y int64)", false}, + {"CREATE TABLE foo (a int, b float); CREATE TABLE bar (x double, y float)", true}, + {"CREATE TABLE foo (a bytes)", false}, + {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED)", true}, + {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) -- foo", true}, + // {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) // foo", true}, + {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) /* foo */", true}, + {"CREATE TABLE foo /* foo */ (a SMALLINT UNSIGNED, b INT UNSIGNED) /* foo */", true}, + {"CREATE TABLE foo (name CHAR(50) BINARY)", true}, + {"CREATE TABLE foo (name CHAR(50) COLLATE utf8_bin)", true}, + {"CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8)", true}, + {"CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8 BINARY)", true}, + {"CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8 BINARY CHARACTER set utf8)", false}, + {"CREATE TABLE foo (name CHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin)", true}, + {"CREATE TABLE foo (a.b, b);", false}, + {"CREATE TABLE foo (a, b.c);", false}, + {"CREATE TABLE (name CHAR(50) BINARY)", false}, + // for table option + {"create table t (c int) avg_row_length = 3", true}, + {"create table t (c int) avg_row_length 3", true}, + {"create table t (c int) checksum = 0", true}, + {"create table t (c int) checksum 1", true}, + {"create table t (c int) compression = 'NONE'", true}, + {"create table t (c int) compression 'lz4'", true}, + {"create table t (c int) connection = 'abc'", true}, + {"create table t (c int) connection 'abc'", true}, + {"create table t (c int) key_block_size = 1024", true}, + {"create table t (c int) key_block_size 1024", true}, + {"create table t (c int) max_rows = 1000", true}, + {"create table t (c int) max_rows 1000", true}, + {"create table t (c int) min_rows = 1000", true}, + {"create table t (c int) min_rows 1000", true}, + {"create table t (c int) password = 'abc'", true}, + {"create table t (c int) password 'abc'", true}, + {"create table t (c int) DELAY_KEY_WRITE=1", true}, + {"create table t (c int) DELAY_KEY_WRITE 1", true}, + {"create table t (c int) ROW_FORMAT = default", true}, + {"create table t (c int) ROW_FORMAT default", true}, + {"create table t (c int) ROW_FORMAT = fixed", true}, + {"create table t (c int) ROW_FORMAT = compressed", true}, + {"create table t (c int) ROW_FORMAT = compact", true}, + {"create table t (c int) ROW_FORMAT = redundant", true}, + {"create table t (c int) ROW_FORMAT = dynamic", true}, + {"create table t (c int) STATS_PERSISTENT = default", true}, + {"create table t (c int) STATS_PERSISTENT = 0", true}, + {"create table t (c int) STATS_PERSISTENT = 1", true}, + {"create table t (c int) PACK_KEYS = 1", true}, + {"create table t (c int) PACK_KEYS = 0", true}, + {"create table t (c int) PACK_KEYS = DEFAULT", true}, + {`create table testTableCompression (c VARCHAR(15000)) compression="ZLIB";`, true}, + {`create table t1 (c1 int) compression="zlib";`, true}, + + // partition option + {"create table t (c int) PARTITION BY HASH (c) PARTITIONS 32;", true}, + {"create table t (c int) PARTITION BY RANGE (Year(VDate)) (PARTITION p1980 VALUES LESS THAN (1980) ENGINE = MyISAM, PARTITION p1990 VALUES LESS THAN (1990) ENGINE = MyISAM, PARTITION pothers VALUES LESS THAN MAXVALUE ENGINE = MyISAM)", true}, + {"create table t (c int, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '') PARTITION BY RANGE (UNIX_TIMESTAMP(create_time)) (PARTITION p201610 VALUES LESS THAN(1477929600), PARTITION p201611 VALUES LESS THAN(1480521600),PARTITION p201612 VALUES LESS THAN(1483200000),PARTITION p201701 VALUES LESS THAN(1485878400),PARTITION p201702 VALUES LESS THAN(1488297600),PARTITION p201703 VALUES LESS THAN(1490976000))", true}, + {"CREATE TABLE `md_product_shop` (`shopCode` varchar(4) DEFAULT NULL COMMENT '地点') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 /*!50100 PARTITION BY KEY (shopCode) PARTITIONS 19 */;", true}, + {"CREATE TABLE `payinfo1` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `oderTime` datetime NOT NULL) ENGINE=InnoDB AUTO_INCREMENT=641533032 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8 /*!50500 PARTITION BY RANGE COLUMNS(oderTime) (PARTITION P2011 VALUES LESS THAN ('2012-01-01 00:00:00') ENGINE = InnoDB, PARTITION P1201 VALUES LESS THAN ('2012-02-01 00:00:00') ENGINE = InnoDB, PARTITION PMAX VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB)*/;", true}, + {`CREATE TABLE app_channel_daily_report (id bigint(20) NOT NULL AUTO_INCREMENT, app_version varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'default', gmt_create datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=33703438 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci +/*!50100 PARTITION BY RANGE (month(gmt_create)-1) +(PARTITION part0 VALUES LESS THAN (1) COMMENT = '1月份' ENGINE = InnoDB, + PARTITION part1 VALUES LESS THAN (2) COMMENT = '2月份' ENGINE = InnoDB, + PARTITION part2 VALUES LESS THAN (3) COMMENT = '3月份' ENGINE = InnoDB, + PARTITION part3 VALUES LESS THAN (4) COMMENT = '4月份' ENGINE = InnoDB, + PARTITION part4 VALUES LESS THAN (5) COMMENT = '5月份' ENGINE = InnoDB, + PARTITION part5 VALUES LESS THAN (6) COMMENT = '6月份' ENGINE = InnoDB, + PARTITION part6 VALUES LESS THAN (7) COMMENT = '7月份' ENGINE = InnoDB, + PARTITION part7 VALUES LESS THAN (8) COMMENT = '8月份' ENGINE = InnoDB, + PARTITION part8 VALUES LESS THAN (9) COMMENT = '9月份' ENGINE = InnoDB, + PARTITION part9 VALUES LESS THAN (10) COMMENT = '10月份' ENGINE = InnoDB, + PARTITION part10 VALUES LESS THAN (11) COMMENT = '11月份' ENGINE = InnoDB, + PARTITION part11 VALUES LESS THAN (12) COMMENT = '12月份' ENGINE = InnoDB) */ ;`, true}, + + // for check clause + {"create table t (c1 bool, c2 bool, check (c1 in (0, 1)), check (c2 in (0, 1)))", true}, + {"CREATE TABLE Customer (SD integer CHECK (SD > 0), First_Name varchar(30));", true}, + + {"create database xxx", true}, + {"create database if exists xxx", false}, + {"create database if not exists xxx", true}, + {"create schema xxx", true}, + {"create schema if exists xxx", false}, + {"create schema if not exists xxx", true}, + // for drop database/schema/table/stats + {"drop database xxx", true}, + {"drop database if exists xxx", true}, + {"drop database if not exists xxx", false}, + {"drop schema xxx", true}, + {"drop schema if exists xxx", true}, + {"drop schema if not exists xxx", false}, + {"drop table", false}, + {"drop table xxx", true}, + {"drop table xxx, yyy", true}, + {"drop tables xxx", true}, + {"drop tables xxx, yyy", true}, + {"drop table if exists xxx", true}, + {"drop table if not exists xxx", false}, + {"drop table xxx restrict", true}, + {"drop table xxx, yyy cascade", true}, + {"drop table if exists xxx restrict", true}, + {"drop view if exists xxx", true}, + {"drop stats t", true}, + // for issue 974 + {`CREATE TABLE address ( + id bigint(20) NOT NULL AUTO_INCREMENT, + create_at datetime NOT NULL, + deleted tinyint(1) NOT NULL, + update_at datetime NOT NULL, + version bigint(20) DEFAULT NULL, + address varchar(128) NOT NULL, + address_detail varchar(128) NOT NULL, + cellphone varchar(16) NOT NULL, + latitude double NOT NULL, + longitude double NOT NULL, + name varchar(16) NOT NULL, + sex tinyint(1) NOT NULL, + user_id bigint(20) NOT NULL, + PRIMARY KEY (id), + CONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id), + INDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment '' + ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;`, true}, + // for issue 975 + {`CREATE TABLE test_data ( + id bigint(20) NOT NULL AUTO_INCREMENT, + create_at datetime NOT NULL, + deleted tinyint(1) NOT NULL, + update_at datetime NOT NULL, + version bigint(20) DEFAULT NULL, + address varchar(255) NOT NULL, + amount decimal(19,2) DEFAULT NULL, + charge_id varchar(32) DEFAULT NULL, + paid_amount decimal(19,2) DEFAULT NULL, + transaction_no varchar(64) DEFAULT NULL, + wx_mp_app_id varchar(32) DEFAULT NULL, + contacts varchar(50) DEFAULT NULL, + deliver_fee decimal(19,2) DEFAULT NULL, + deliver_info varchar(255) DEFAULT NULL, + deliver_time varchar(255) DEFAULT NULL, + description varchar(255) DEFAULT NULL, + invoice varchar(255) DEFAULT NULL, + order_from int(11) DEFAULT NULL, + order_state int(11) NOT NULL, + packing_fee decimal(19,2) DEFAULT NULL, + payment_time datetime DEFAULT NULL, + payment_type int(11) DEFAULT NULL, + phone varchar(50) NOT NULL, + store_employee_id bigint(20) DEFAULT NULL, + store_id bigint(20) NOT NULL, + user_id bigint(20) NOT NULL, + payment_mode int(11) NOT NULL, + current_latitude double NOT NULL, + current_longitude double NOT NULL, + address_latitude double NOT NULL, + address_longitude double NOT NULL, + PRIMARY KEY (id), + CONSTRAINT food_order_ibfk_1 FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id), + CONSTRAINT food_order_ibfk_2 FOREIGN KEY (store_id) REFERENCES waimaiqa.store (id), + CONSTRAINT food_order_ibfk_3 FOREIGN KEY (store_employee_id) REFERENCES waimaiqa.store_employee (id), + UNIQUE FK_UNIQUE_charge_id USING BTREE (charge_id) comment '', + INDEX FK_eqst2x1xisn3o0wbrlahnnqq8 USING BTREE (store_employee_id) comment '', + INDEX FK_8jcmec4kb03f4dod0uqwm54o9 USING BTREE (store_id) comment '', + INDEX FK_a3t0m9apja9jmrn60uab30pqd USING BTREE (user_id) comment '' + ) ENGINE=InnoDB AUTO_INCREMENT=95 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;`, true}, + {`create table t (c int KEY);`, true}, + {`CREATE TABLE address ( + id bigint(20) NOT NULL AUTO_INCREMENT, + create_at datetime NOT NULL, + deleted tinyint(1) NOT NULL, + update_at datetime NOT NULL, + version bigint(20) DEFAULT NULL, + address varchar(128) NOT NULL, + address_detail varchar(128) NOT NULL, + cellphone varchar(16) NOT NULL, + latitude double NOT NULL, + longitude double NOT NULL, + name varchar(16) NOT NULL, + sex tinyint(1) NOT NULL, + user_id bigint(20) NOT NULL, + PRIMARY KEY (id), + CONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id) ON DELETE CASCADE ON UPDATE NO ACTION, + INDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment '' + ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;`, true}, + {"CREATE TABLE address (\r\nid bigint(20) NOT NULL AUTO_INCREMENT,\r\ncreate_at datetime NOT NULL,\r\ndeleted tinyint(1) NOT NULL,\r\nupdate_at datetime NOT NULL,\r\nversion bigint(20) DEFAULT NULL,\r\naddress varchar(128) NOT NULL,\r\naddress_detail varchar(128) NOT NULL,\r\ncellphone varchar(16) NOT NULL,\r\nlatitude double NOT NULL,\r\nlongitude double NOT NULL,\r\nname varchar(16) NOT NULL,\r\nsex tinyint(1) NOT NULL,\r\nuser_id bigint(20) NOT NULL,\r\nPRIMARY KEY (id),\r\nCONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id) ON DELETE CASCADE ON UPDATE NO ACTION,\r\nINDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment ''\r\n) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;", true}, + // for issue 1802 + {`CREATE TABLE t1 ( + accout_id int(11) DEFAULT '0', + summoner_id int(11) DEFAULT '0', + union_name varbinary(52) NOT NULL, + union_id int(11) DEFAULT '0', + PRIMARY KEY (union_name)) ENGINE=MyISAM DEFAULT CHARSET=binary;`, true}, + // Create table with multiple index options. + {`create table t (c int, index ci (c) USING BTREE COMMENT "123");`, true}, + // for default value + {"CREATE TABLE sbtest (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, k integer UNSIGNED DEFAULT '0' NOT NULL, c char(120) DEFAULT '' NOT NULL, pad char(60) DEFAULT '' NOT NULL, PRIMARY KEY (id) )", true}, + {"create table test (create_date TIMESTAMP NOT NULL COMMENT '创建日期 create date' DEFAULT now());", true}, + {"create table ts (t int, v timestamp(3) default CURRENT_TIMESTAMP(3));", true}, + // Create table with primary key name. + {"create table if not exists `t` (`id` int not null auto_increment comment '消息ID', primary key `pk_id` (`id`) );", true}, + // Create table with like. + {"create table a like b", true}, + {"create table a (like b)", true}, + {"create table if not exists a like b", true}, + {"create table if not exists a (like b)", true}, + {"create table if not exists a like (b)", false}, + {"create table a (t int) like b", false}, + {"create table a (t int) like (b)", false}, + // Create table with select statement + {"create table a select * from b", true}, + {"create table a as select * from b", true}, + {"create table a (m int, n datetime) as select * from b", true}, + {"create table a (unique(n)) as select n from b", true}, + {"create table a ignore as select n from b", true}, + {"create table a replace as select n from b", true}, + {"create table a (m int) replace as (select n as m from b union select n+1 as m from c group by 1 limit 2)", true}, + + // Create table with no option is valid for parser + {"create table a", true}, + + {"create table t (a timestamp default now)", false}, + {"create table t (a timestamp default now())", true}, + {"create table t (a timestamp default now() on update now)", false}, + {"create table t (a timestamp default now() on update now())", true}, + {"CREATE TABLE t (c TEXT) default CHARACTER SET utf8, default COLLATE utf8_general_ci;", true}, + {"CREATE TABLE t (c TEXT) shard_row_id_bits = 1;", true}, + // Create table with ON UPDATE CURRENT_TIMESTAMP(6), specify fraction part. + {"CREATE TABLE IF NOT EXISTS `general_log` (`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),`user_host` mediumtext NOT NULL,`thread_id` bigint(20) unsigned NOT NULL,`server_id` int(10) unsigned NOT NULL,`command_type` varchar(64) NOT NULL,`argument` mediumblob NOT NULL) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'", true}, + // For reference_definition in column_definition. + {"CREATE TABLE followers ( f1 int NOT NULL REFERENCES user_profiles (uid) );", true}, + + // for alter table + {"ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED)", true}, + {"ALTER TABLE ADD COLUMN (a SMALLINT UNSIGNED)", false}, + {"ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED, b varchar(255))", true}, + {"ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED FIRST)", false}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED FIRST", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED AFTER b", true}, + {"ALTER TABLE employees ADD PARTITION", true}, + {"ALTER TABLE employees ADD PARTITION ( PARTITION P1 VALUES LESS THAN (2010))", true}, + {"ALTER TABLE employees ADD PARTITION ( PARTITION P2 VALUES LESS THAN MAXVALUE)", true}, + {`ALTER TABLE employees ADD PARTITION ( + PARTITION P1 VALUES LESS THAN (2010), + PARTITION P2 VALUES LESS THAN (2015), + PARTITION P3 VALUES LESS THAN MAXVALUE)`, true}, + // For drop table partition statement. + {"alter table t drop partition p1;", true}, + {"alter table t drop partition p2;", true}, + {"ALTER TABLE t DISABLE KEYS", true}, + {"ALTER TABLE t ENABLE KEYS", true}, + {"ALTER TABLE t MODIFY COLUMN a varchar(255)", true}, + {"ALTER TABLE t CHANGE COLUMN a b varchar(255)", true}, + {"ALTER TABLE t CHANGE COLUMN a b varchar(255) CHARACTER SET utf8 BINARY", true}, + {"ALTER TABLE t CHANGE COLUMN a b varchar(255) FIRST", true}, + {"ALTER TABLE db.t RENAME to db1.t1", true}, + {"ALTER TABLE db.t RENAME db1.t1", true}, + {"ALTER TABLE t RENAME as t1", true}, + {"ALTER TABLE t ALTER COLUMN a SET DEFAULT 1", true}, + {"ALTER TABLE t ALTER a SET DEFAULT 1", true}, + {"ALTER TABLE t ALTER COLUMN a SET DEFAULT CURRENT_TIMESTAMP", false}, + {"ALTER TABLE t ALTER COLUMN a SET DEFAULT NOW()", false}, + {"ALTER TABLE t ALTER COLUMN a SET DEFAULT 1+1", false}, + {"ALTER TABLE t ALTER COLUMN a DROP DEFAULT", true}, + {"ALTER TABLE t ALTER a DROP DEFAULT", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=none", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=default", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=shared", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=exclusive", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=NONE", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=DEFAULT", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=SHARED", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=EXCLUSIVE", true}, + {"ALTER TABLE t ADD FULLTEXT KEY `FullText` (`name` ASC)", true}, + {"ALTER TABLE t ADD FULLTEXT INDEX `FullText` (`name` ASC)", true}, + {"ALTER TABLE t ADD INDEX (a) USING BTREE COMMENT 'a'", true}, + {"ALTER TABLE t ADD KEY (a) USING HASH COMMENT 'a'", true}, + {"ALTER TABLE t ADD PRIMARY KEY (a) COMMENT 'a'", true}, + {"ALTER TABLE t ADD UNIQUE (a) COMMENT 'a'", true}, + {"ALTER TABLE t ADD UNIQUE KEY (a) COMMENT 'a'", true}, + {"ALTER TABLE t ADD UNIQUE INDEX (a) COMMENT 'a'", true}, + {"ALTER TABLE t ENGINE ''", true}, + {"ALTER TABLE t ENGINE = ''", true}, + {"ALTER TABLE t ENGINE = 'innodb'", true}, + {"ALTER TABLE t ENGINE = innodb", true}, + {"ALTER TABLE `db`.`t` ENGINE = ``", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, ADD COLUMN a SMALLINT", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT, ENGINE = '', default COLLATE = utf8_general_ci", true}, + {"ALTER TABLE t ENGINE = '', COMMENT='', default COLLATE = utf8_general_ci", true}, + {"ALTER TABLE t ENGINE = '', ADD COLUMN a SMALLINT", true}, + {"ALTER TABLE t default COLLATE = utf8_general_ci, ENGINE = '', ADD COLUMN a SMALLINT", true}, + {"ALTER TABLE t shard_row_id_bits = 1", true}, + {"ALTER TABLE t AUTO_INCREMENT 3", true}, + {"ALTER TABLE t AUTO_INCREMENT = 3", true}, + {"ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL , ALGORITHM = DEFAULT;", true}, + {"ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL , ALGORITHM = INPLACE;", true}, + {"ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL , ALGORITHM = COPY;", true}, + {"ALTER TABLE t CONVERT TO CHARACTER SET utf8;", true}, + {"ALTER TABLE t CONVERT TO CHARSET utf8;", true}, + {"ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;", true}, + {"ALTER TABLE t CONVERT TO CHARSET utf8 COLLATE utf8_bin;", true}, + {"ALTER TABLE t FORCE", true}, + {"ALTER TABLE t DROP INDEX;", false}, + {"ALTER TABLE t DROP COLUMN a CASCADE", true}, + {`ALTER TABLE testTableCompression COMPRESSION="LZ4";`, true}, + {`ALTER TABLE t1 COMPRESSION="zlib";`, true}, + + // For #6405 + {"ALTER TABLE t RENAME KEY a TO b;", true}, + {"ALTER TABLE t RENAME INDEX a TO b;", true}, + + {"alter table t analyze partition a", true}, + {"alter table t analyze partition a with 4 buckets", true}, + {"alter table t analyze partition a index b", true}, + {"alter table t analyze partition a index b with 4 buckets", true}, + + // For create index statement + {"CREATE INDEX idx ON t (a)", true}, + {"CREATE INDEX idx ON t (a) USING HASH", true}, + {"CREATE INDEX idx ON t (a) COMMENT 'foo'", true}, + {"CREATE INDEX idx ON t (a) USING HASH COMMENT 'foo'", true}, + {"CREATE INDEX idx ON t (a) LOCK=NONE", true}, + {"CREATE INDEX idx USING BTREE ON t (a) USING HASH COMMENT 'foo'", true}, + {"CREATE INDEX idx USING BTREE ON t (a)", true}, + + // for rename table statement + {"RENAME TABLE t TO t1", true}, + {"RENAME TABLE t t1", false}, + {"RENAME TABLE d.t TO d1.t1", true}, + {"RENAME TABLE t1 TO t2, t3 TO t4", true}, + + // for truncate statement + {"TRUNCATE TABLE t1", true}, + {"TRUNCATE t1", true}, + + // for empty alert table index + {"ALTER TABLE t ADD INDEX () ", false}, + {"ALTER TABLE t ADD UNIQUE ()", false}, + {"ALTER TABLE t ADD UNIQUE INDEX ()", false}, + {"ALTER TABLE t ADD UNIQUE KEY ()", false}, + + // for issue 4538 + {"create table a (process double)", true}, + + // for issue 4740 + {"create table t (a int1, b int2, c int3, d int4, e int8)", true}, + + // for issue 5918 + {"create table t (lv long varchar null)", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestOptimizerHints(c *C) { + parser := New() + stmt, err := parser.Parse("select /*+ tidb_SMJ(T1,t2) tidb_smj(T3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + c.Assert(err, IsNil) + selectStmt := stmt[0].(*ast.SelectStmt) + + hints := selectStmt.TableHints + c.Assert(len(hints), Equals, 2) + c.Assert(hints[0].HintName.L, Equals, "tidb_smj") + c.Assert(len(hints[0].Tables), Equals, 2) + c.Assert(hints[0].Tables[0].L, Equals, "t1") + c.Assert(hints[0].Tables[1].L, Equals, "t2") + + c.Assert(hints[1].HintName.L, Equals, "tidb_smj") + c.Assert(hints[1].Tables[0].L, Equals, "t3") + c.Assert(hints[1].Tables[1].L, Equals, "t4") + + c.Assert(len(selectStmt.TableHints), Equals, 2) + + stmt, err = parser.Parse("select /*+ TIDB_INLJ(t1, T2) tidb_inlj(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + c.Assert(err, IsNil) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + c.Assert(len(hints), Equals, 2) + c.Assert(hints[0].HintName.L, Equals, "tidb_inlj") + c.Assert(len(hints[0].Tables), Equals, 2) + c.Assert(hints[0].Tables[0].L, Equals, "t1") + c.Assert(hints[0].Tables[1].L, Equals, "t2") + + c.Assert(hints[1].HintName.L, Equals, "tidb_inlj") + c.Assert(hints[1].Tables[0].L, Equals, "t3") + c.Assert(hints[1].Tables[1].L, Equals, "t4") + + stmt, err = parser.Parse("select /*+ TIDB_HJ(t1, T2) tidb_hj(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + c.Assert(err, IsNil) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + c.Assert(len(hints), Equals, 2) + c.Assert(hints[0].HintName.L, Equals, "tidb_hj") + c.Assert(len(hints[0].Tables), Equals, 2) + c.Assert(hints[0].Tables[0].L, Equals, "t1") + c.Assert(hints[0].Tables[1].L, Equals, "t2") + + c.Assert(hints[1].HintName.L, Equals, "tidb_hj") + c.Assert(hints[1].Tables[0].L, Equals, "t3") + c.Assert(hints[1].Tables[1].L, Equals, "t4") + + stmt, err = parser.Parse("SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 where t1.c1 = t2.c1", "", "") + c.Assert(err, IsNil) + selectStmt = stmt[0].(*ast.SelectStmt) + hints = selectStmt.TableHints + c.Assert(len(hints), Equals, 1) + c.Assert(hints[0].HintName.L, Equals, "max_execution_time") + c.Assert(hints[0].MaxExecutionTime, Equals, uint64(1000)) +} + +func (s *testParserSuite) TestType(c *C) { + table := []testCase{ + // for time fsp + {"CREATE TABLE t( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );", true}, + + // for hexadecimal + {"select x'0a', X'11', 0x11", true}, + {"select x'13181C76734725455A'", true}, + {"select x'0xaa'", false}, + {"select 0X11", false}, + {"select 0x4920616D2061206C6F6E672068657820737472696E67", true}, + + // for bit + {"select 0b01, 0b0, b'11', B'11'", true}, + {"select 0B01", false}, + {"select 0b21", false}, + + // for enum and set type + {"create table t (c1 enum('a', 'b'), c2 set('a', 'b'))", true}, + {"create table t (c1 enum)", false}, + {"create table t (c1 set)", false}, + + // for blob and text field length + {"create table t (c1 blob(1024), c2 text(1024))", true}, + + // for year + {"create table t (y year(4), y1 year)", true}, + {"create table t (y year(4) unsigned zerofill zerofill, y1 year signed unsigned zerofill)", true}, + + // for national + {"create table t (c1 national char(2), c2 national varchar(2))", true}, + + // for json type + {`create table t (a JSON);`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestPrivilege(c *C) { + table := []testCase{ + // for create user + {`CREATE USER 'test'`, true}, + {`CREATE USER test`, true}, + {"CREATE USER `test`", true}, + {"CREATE USER test-user", false}, + {"CREATE USER test.user", false}, + {"CREATE USER 'test-user'", true}, + {"CREATE USER `test-user`", true}, + {"CREATE USER test.user", false}, + {"CREATE USER 'test.user'", true}, + {"CREATE USER `test.user`", true}, + {"CREATE USER uesr1@localhost", true}, + {"CREATE USER `uesr1`@localhost", true}, + {"CREATE USER uesr1@`localhost`", true}, + {"CREATE USER `uesr1`@`localhost`", true}, + {"CREATE USER 'uesr1'@localhost", true}, + {"CREATE USER uesr1@'localhost'", true}, + {"CREATE USER 'uesr1'@'localhost'", true}, + {"CREATE USER 'uesr1'@`localhost`", true}, + {"CREATE USER `uesr1`@'localhost'", true}, + {"create user 'bug19354014user'@'%' identified WITH mysql_native_password", true}, + {"create user 'bug19354014user'@'%' identified WITH mysql_native_password by 'new-password'", true}, + {"create user 'bug19354014user'@'%' identified WITH mysql_native_password as 'hashstring'", true}, + {`CREATE USER IF NOT EXISTS 'root'@'localhost' IDENTIFIED BY 'new-password'`, true}, + {`CREATE USER 'root'@'localhost' IDENTIFIED BY 'new-password'`, true}, + {`CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD 'hashstring'`, true}, + {`CREATE USER 'root'@'localhost' IDENTIFIED BY 'new-password', 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD 'hashstring'`, true}, + {`ALTER USER IF EXISTS 'root'@'localhost' IDENTIFIED BY 'new-password'`, true}, + {`ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password'`, true}, + {`ALTER USER 'root'@'localhost' IDENTIFIED BY PASSWORD 'hashstring'`, true}, + {`ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password', 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD 'hashstring'`, true}, + {`ALTER USER USER() IDENTIFIED BY 'new-password'`, true}, + {`ALTER USER IF EXISTS USER() IDENTIFIED BY 'new-password'`, true}, + {`DROP USER 'root'@'localhost', 'root1'@'localhost'`, true}, + {`DROP USER IF EXISTS 'root'@'localhost'`, true}, + + // for grant statement + {"GRANT ALL ON db1.* TO 'jeffrey'@'localhost';", true}, + {"GRANT ALL ON db1.* TO 'jeffrey'@'localhost' WITH GRANT OPTION;", true}, + {"GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';", true}, + {"GRANT ALL ON *.* TO 'someuser'@'somehost';", true}, + {"GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';", true}, + {"GRANT ALL ON mydb.* TO 'someuser'@'somehost';", true}, + {"GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';", true}, + {"GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';", true}, + {"GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';", true}, + {"GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';", true}, + {"grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by 'password';", true}, + {"GRANT SELECT ON test.* to 'test'", true}, // For issue 2654. + {"grant PROCESS,usage, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'xxxxxxxxxx'@'%' identified by password 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'", true}, // For issue 4865 + {"/* rds internal mark */ GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, RELOAD, PROCESS, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER on *.* to 'root2'@'%' identified by password '*sdsadsdsadssadsadsadsadsada' with grant option", true}, + + // for revoke statement + {"REVOKE ALL ON db1.* FROM 'jeffrey'@'localhost';", true}, + {"REVOKE SELECT ON db2.invoice FROM 'jeffrey'@'localhost';", true}, + {"REVOKE ALL ON *.* FROM 'someuser'@'somehost';", true}, + {"REVOKE SELECT, INSERT ON *.* FROM 'someuser'@'somehost';", true}, + {"REVOKE ALL ON mydb.* FROM 'someuser'@'somehost';", true}, + {"REVOKE SELECT, INSERT ON mydb.* FROM 'someuser'@'somehost';", true}, + {"REVOKE ALL ON mydb.mytbl FROM 'someuser'@'somehost';", true}, + {"REVOKE SELECT, INSERT ON mydb.mytbl FROM 'someuser'@'somehost';", true}, + {"REVOKE SELECT (col1), INSERT (col1,col2) ON mydb.mytbl FROM 'someuser'@'somehost';", true}, + {"REVOKE all privileges on zabbix.* FROM 'zabbix'@'localhost' identified by 'password';", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestComment(c *C) { + table := []testCase{ + {"create table t (c int comment 'comment')", true}, + {"create table t (c int) comment = 'comment'", true}, + {"create table t (c int) comment 'comment'", true}, + {"create table t (c int) comment comment", false}, + {"create table t (comment text)", true}, + {"START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */", true}, + // for comment in query + {"/*comment*/ /*comment*/ select c /* this is a comment */ from t;", true}, + // for unclosed comment + {"delete from t where a = 7 or 1=1/*' and b = 'p'", false}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestCommentErrMsg(c *C) { + table := []testErrMsgCase{ + {"delete from t where a = 7 or 1=1/*' and b = 'p'", false, errors.New("[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/*' and b = 'p'' at line 1")}, + {"delete from t where a = 7 or\n 1=1/*' and b = 'p'", false, errors.New("[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/*' and b = 'p'' at line 2")}, + {"select 1/*", false, errors.New("[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/*' at line 1")}, + {"select 1/* comment */", false, nil}, + } + s.RunErrMsgTest(c, table) +} + +type subqueryChecker struct { + text string + c *C +} + +// Enter implements ast.Visitor interface. +func (sc *subqueryChecker) Enter(inNode ast.Node) (outNode ast.Node, skipChildren bool) { + if expr, ok := inNode.(*ast.SubqueryExpr); ok { + sc.c.Assert(expr.Query.Text(), Equals, sc.text) + return inNode, true + } + return inNode, false +} + +// Leave implements ast.Visitor interface. +func (sc *subqueryChecker) Leave(inNode ast.Node) (node ast.Node, ok bool) { + return inNode, true +} + +func (s *testParserSuite) TestSubquery(c *C) { + table := []testCase{ + // for compare subquery + {"SELECT 1 > (select 1)", true}, + {"SELECT 1 > ANY (select 1)", true}, + {"SELECT 1 > ALL (select 1)", true}, + {"SELECT 1 > SOME (select 1)", true}, + + // for exists subquery + {"SELECT EXISTS select 1", false}, + {"SELECT EXISTS (select 1)", true}, + {"SELECT + EXISTS (select 1)", true}, + {"SELECT - EXISTS (select 1)", true}, + {"SELECT NOT EXISTS (select 1)", true}, + {"SELECT + NOT EXISTS (select 1)", false}, + {"SELECT - NOT EXISTS (select 1)", false}, + } + s.RunTest(c, table) + + tests := []struct { + input string + text string + }{ + {"SELECT 1 > (select 1)", "select 1"}, + {"SELECT 1 > (select 1 union select 2)", "select 1 union select 2"}, + } + parser := New() + for _, t := range tests { + stmt, err := parser.ParseOneStmt(t.input, "", "") + c.Assert(err, IsNil) + stmt.Accept(&subqueryChecker{ + text: t.text, + c: c, + }) + } +} +func (s *testParserSuite) TestUnion(c *C) { + table := []testCase{ + {"select c1 from t1 union select c2 from t2", true}, + {"select c1 from t1 union (select c2 from t2)", true}, + {"select c1 from t1 union (select c2 from t2) order by c1", true}, + {"select c1 from t1 union select c2 from t2 order by c2", true}, + {"select c1 from t1 union (select c2 from t2) limit 1", true}, + {"select c1 from t1 union (select c2 from t2) limit 1, 1", true}, + {"select c1 from t1 union (select c2 from t2) order by c1 limit 1", true}, + {"(select c1 from t1) union distinct select c2 from t2", true}, + {"(select c1 from t1) union distinctrow select c2 from t2", true}, + {"(select c1 from t1) union all select c2 from t2", true}, + {"(select c1 from t1) union distinct all select c2 from t2", false}, + {"(select c1 from t1) union distinctrow all select c2 from t2", false}, + {"(select c1 from t1) union (select c2 from t2) order by c1 union select c3 from t3", false}, + {"(select c1 from t1) union (select c2 from t2) limit 1 union select c3 from t3", false}, + {"(select c1 from t1) union select c2 from t2 union (select c3 from t3) order by c1 limit 1", true}, + {"select (select 1 union select 1) as a", true}, + {"select * from (select 1 union select 2) as a", true}, + {"insert into t select c1 from t1 union select c2 from t2", true}, + {"insert into t (c) select c1 from t1 union select c2 from t2", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestLikeEscape(c *C) { + table := []testCase{ + // for like escape + {`select "abc_" like "abc\\_" escape ''`, true}, + {`select "abc_" like "abc\\_" escape '\\'`, true}, + {`select "abc_" like "abc\\_" escape '||'`, false}, + {`select "abc" like "escape" escape '+'`, true}, + } + + s.RunTest(c, table) +} + +func (s *testParserSuite) TestMysqlDump(c *C) { + // Statements used by mysqldump. + table := []testCase{ + {`UNLOCK TABLES;`, true}, + {`LOCK TABLES t1 READ;`, true}, + {`show table status like 't'`, true}, + {`LOCK TABLES t2 WRITE`, true}, + + // for unlock table and lock table + {`UNLOCK TABLE;`, true}, + {`LOCK TABLE t1 READ;`, true}, + {`show table status like 't'`, true}, + {`LOCK TABLE t2 WRITE`, true}, + {`LOCK TABLE t1 WRITE, t3 READ`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestIndexHint(c *C) { + table := []testCase{ + {`select * from t use index ();`, true}, + {`select * from t use index (idx);`, true}, + {`select * from t use index (idx1, idx2);`, true}, + {`select * from t ignore key (idx1)`, true}, + {`select * from t force index for join (idx1)`, true}, + {`select * from t use index for order by (idx1)`, true}, + {`select * from t force index for group by (idx1)`, true}, + {`select * from t use index for group by (idx1) use index for order by (idx2), t2`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestPriority(c *C) { + table := []testCase{ + {`select high_priority * from t`, true}, + {`select low_priority * from t`, true}, + {`select delayed * from t`, true}, + {`insert high_priority into t values (1)`, true}, + {`insert LOW_PRIORITY into t values (1)`, true}, + {`insert delayed into t values (1)`, true}, + {`update low_priority t set a = 2`, true}, + {`update high_priority t set a = 2`, true}, + {`update delayed t set a = 2`, true}, + {`delete low_priority from t where a = 2`, true}, + {`delete high_priority from t where a = 2`, true}, + {`delete delayed from t where a = 2`, true}, + {`replace high_priority into t values (1)`, true}, + {`replace LOW_PRIORITY into t values (1)`, true}, + {`replace delayed into t values (1)`, true}, + } + s.RunTest(c, table) + + parser := New() + stmt, err := parser.Parse("select HIGH_PRIORITY * from t", "", "") + c.Assert(err, IsNil) + sel := stmt[0].(*ast.SelectStmt) + c.Assert(sel.SelectStmtOpts.Priority, Equals, mysql.HighPriority) +} + +func (s *testParserSuite) TestSQLNoCache(c *C) { + table := []testCase{ + {`select SQL_NO_CACHE * from t`, false}, + {`select SQL_CACHE * from t`, true}, + {`select * from t`, true}, + } + + parser := New() + for _, tt := range table { + stmt, err := parser.Parse(tt.src, "", "") + c.Assert(err, IsNil) + + sel := stmt[0].(*ast.SelectStmt) + c.Assert(sel.SelectStmtOpts.SQLCache, Equals, tt.ok) + } +} + +func (s *testParserSuite) TestEscape(c *C) { + table := []testCase{ + {`select """;`, false}, + {`select """";`, true}, + {`select "汉字";`, true}, + {`select 'abc"def';`, true}, + {`select 'a\r\n';`, true}, + {`select "\a\r\n"`, true}, + {`select "\xFF"`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestInsertStatementMemoryAllocation(c *C) { + sql := "insert t values (1)" + strings.Repeat(",(1)", 1000) + var oldStats, newStats runtime.MemStats + runtime.ReadMemStats(&oldStats) + _, err := New().ParseOneStmt(sql, "", "") + c.Assert(err, IsNil) + runtime.ReadMemStats(&newStats) + c.Assert(int(newStats.TotalAlloc-oldStats.TotalAlloc), Less, 1024*500) +} + +func (s *testParserSuite) TestExplain(c *C) { + table := []testCase{ + {"explain select c1 from t1", true}, + {"explain delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;", true}, + {"explain insert into t values (1), (2), (3)", true}, + {"explain replace into foo values (1 || 2)", true}, + {"explain update t set id = id + 1 order by id desc;", true}, + {"explain select c1 from t1 union (select c2 from t2) limit 1, 1", true}, + {`explain format = "row" select c1 from t1 union (select c2 from t2) limit 1, 1`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestTrace(c *C) { + table := []testCase{ + {"trace select c1 from t1", true}, + {"trace delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;", true}, + {"trace insert into t values (1), (2), (3)", true}, + {"trace replace into foo values (1 || 2)", true}, + {"trace update t set id = id + 1 order by id desc;", true}, + {"trace select c1 from t1 union (select c2 from t2) limit 1, 1", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestView(c *C) { + table := []testCase{ + {"create view v as select * from t", true}, + {"create or replace view v as select * from t", true}, + {"create or replace algorithm = undefined view v as select * from t", true}, + {"create or replace algorithm = merge view v as select * from t", true}, + {"create or replace algorithm = temptable view v as select * from t", true}, + {"create or replace algorithm = merge definer = 'root' view v as select * from t", true}, + {"create or replace algorithm = merge definer = 'root' sql security definer view v as select * from t", true}, + {"create or replace algorithm = merge definer = 'root' sql security invoker view v as select * from t", true}, + {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t", true}, + {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t with local check option", true}, + {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t with cascaded check option", true}, + {"create or replace algorithm = merge definer = current_user view v as select * from t", true}, + } + s.RunTest(c, table) + + // Test case for the text of the select statement in create view statement. + p := New() + sms, err := p.Parse("create view v as select * from t", "", "") + c.Assert(err, IsNil) + v, ok := sms[0].(*ast.CreateViewStmt) + c.Assert(ok, IsTrue) + c.Assert(v.Select.Text(), Equals, "select * from t") +} + +func (s *testParserSuite) TestTimestampDiffUnit(c *C) { + // Test case for timestampdiff unit. + // TimeUnit should be unified to upper case. + parser := New() + stmt, err := parser.Parse("SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'), TIMESTAMPDIFF(month,'2003-02-01','2003-05-01');", "", "") + c.Assert(err, IsNil) + ss := stmt[0].(*ast.SelectStmt) + fields := ss.Fields.Fields + c.Assert(len(fields), Equals, 2) + expr := fields[0].Expr + f, ok := expr.(*ast.FuncCallExpr) + c.Assert(ok, IsTrue) + c.Assert(f.Args[0].(ast.ValueExpr).GetDatumString(), Equals, "MONTH") + + expr = fields[1].Expr + f, ok = expr.(*ast.FuncCallExpr) + c.Assert(ok, IsTrue) + c.Assert(f.Args[0].(ast.ValueExpr).GetDatumString(), Equals, "MONTH") + + // Test Illegal TimeUnit for TimestampDiff + table := []testCase{ + {"SELECT TIMESTAMPDIFF(SECOND_MICROSECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(MINUTE_MICROSECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(MINUTE_SECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(HOUR_MICROSECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(HOUR_SECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(HOUR_MINUTE,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(DAY_MICROSECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(DAY_SECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(DAY_MINUTE,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(DAY_HOUR,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(YEAR_MONTH,'2003-02-01','2003-05-01')", false}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestSessionManage(c *C) { + table := []testCase{ + // Kill statement. + // See https://dev.mysql.com/doc/refman/5.7/en/kill.html + {"kill 23123", true}, + {"kill connection 23123", true}, + {"kill query 23123", true}, + {"kill tidb 23123", true}, + {"kill tidb connection 23123", true}, + {"kill tidb query 23123", true}, + {"show processlist", true}, + {"show full processlist", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestSQLModeANSIQuotes(c *C) { + parser := New() + parser.SetSQLMode(mysql.ModeANSIQuotes) + tests := []string{ + `CREATE TABLE "table" ("id" int)`, + `select * from t "tt"`, + } + for _, test := range tests { + _, err := parser.Parse(test, "", "") + c.Assert(err, IsNil) + } +} + +func (s *testParserSuite) TestDDLStatements(c *C) { + parser := New() + // Tests that whatever the charset it is define, we always assign utf8 charset and utf8_bin collate. + createTableStr := `CREATE TABLE t ( + a varchar(64) binary, + b char(10) charset utf8 collate utf8_general_ci, + c text charset latin1) ENGINE=innoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin` + stmts, err := parser.Parse(createTableStr, "", "") + c.Assert(err, IsNil) + stmt := stmts[0].(*ast.CreateTableStmt) + c.Assert(mysql.HasBinaryFlag(stmt.Cols[0].Tp.Flag), IsTrue) + for _, colDef := range stmt.Cols[1:] { + c.Assert(mysql.HasBinaryFlag(colDef.Tp.Flag), IsFalse) + } + for _, tblOpt := range stmt.Options { + switch tblOpt.Tp { + case ast.TableOptionCharset: + c.Assert(tblOpt.StrValue, Equals, "utf8") + case ast.TableOptionCollate: + c.Assert(tblOpt.StrValue, Equals, "utf8_bin") + } + } + createTableStr = `CREATE TABLE t ( + a varbinary(64), + b binary(10), + c blob)` + stmts, err = parser.Parse(createTableStr, "", "") + c.Assert(err, IsNil) + stmt = stmts[0].(*ast.CreateTableStmt) + for _, colDef := range stmt.Cols { + c.Assert(colDef.Tp.Charset, Equals, charset.CharsetBin) + c.Assert(colDef.Tp.Collate, Equals, charset.CollationBin) + c.Assert(mysql.HasBinaryFlag(colDef.Tp.Flag), IsTrue) + } +} + +func (s *testParserSuite) TestAnalyze(c *C) { + table := []testCase{ + {"analyze table t1", true}, + {"analyze table t,t1", true}, + {"analyze table t1 index", true}, + {"analyze table t1 index a", true}, + {"analyze table t1 index a,b", true}, + {"analyze table t with 4 buckets", true}, + {"analyze table t index a with 4 buckets", true}, + {"analyze table t partition a", true}, + {"analyze table t partition a with 4 buckets", true}, + {"analyze table t partition a index b", true}, + {"analyze table t partition a index b with 4 buckets", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestGeneratedColumn(c *C) { + tests := []struct { + input string + ok bool + expr string + }{ + {"create table t (c int, d int generated always as (c + 1) virtual)", true, "c + 1"}, + {"create table t (c int, d int as ( c + 1 ) virtual)", true, "c + 1"}, + {"create table t (c int, d int as (1 + 1) stored)", true, "1 + 1"}, + } + parser := New() + for _, tt := range tests { + stmtNodes, err := parser.Parse(tt.input, "", "") + if tt.ok { + c.Assert(err, IsNil) + stmtNode := stmtNodes[0] + for _, col := range stmtNode.(*ast.CreateTableStmt).Cols { + for _, opt := range col.Options { + if opt.Tp == ast.ColumnOptionGenerated { + c.Assert(opt.Expr.Text(), Equals, tt.expr) + } + } + } + } else { + c.Assert(err, NotNil) + } + } + +} + +func (s *testParserSuite) TestSetTransaction(c *C) { + // Set transaction is equivalent to setting the global or session value of tx_isolation. + // For example: + // SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED + // SET SESSION tx_isolation='READ-COMMITTED' + tests := []struct { + input string + isGlobal bool + value string + }{ + { + "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED", + false, "READ-COMMITTED", + }, + { + "SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ", + true, "REPEATABLE-READ", + }, + } + parser := New() + for _, t := range tests { + stmt1, err := parser.ParseOneStmt(t.input, "", "") + c.Assert(err, IsNil) + setStmt := stmt1.(*ast.SetStmt) + vars := setStmt.Variables[0] + c.Assert(vars.Name, Equals, "tx_isolation") + c.Assert(vars.IsGlobal, Equals, t.isGlobal) + c.Assert(vars.IsSystem, Equals, true) + c.Assert(vars.Value.(ast.ValueExpr).GetValue(), Equals, t.value) + } +} + +func (s *testParserSuite) TestSideEffect(c *C) { + // This test cover a bug that parse an error SQL doesn't leave the parser in a + // clean state, cause the following SQL parse fail. + parser := New() + _, err := parser.ParseOneStmt("create table t /*!50100 'abc', 'abc' */;", "", "") + c.Assert(err, NotNil) + + _, err = parser.ParseOneStmt("show tables;", "", "") + c.Assert(err, IsNil) +} + +func (s *testParserSuite) TestTablePartition(c *C) { + table := []testCase{ + {"ALTER TABLE t1 ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT 'APSTART \\' APEND')", true}, + {"ALTER TABLE t1 ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT = 'xxx')", true}, + {`CREATE TABLE t1 (a int not null,b int not null,c int not null,primary key(a,b)) + partition by range (a) + partitions 3 + (partition x1 values less than (5), + partition x2 values less than (10), + partition x3 values less than maxvalue);`, true}, + {"CREATE TABLE t1 (a int not null) partition by range (a) (partition x1 values less than (5) tablespace ts1)", true}, + {`create table t (a int) partition by range (a) + (PARTITION p0 VALUES LESS THAN (63340531200) ENGINE = MyISAM, + PARTITION p1 VALUES LESS THAN (63342604800) ENGINE MyISAM)`, true}, + {`create table t (a int) partition by range (a) + (PARTITION p0 VALUES LESS THAN (63340531200) ENGINE = MyISAM COMMENT 'xxx', + PARTITION p1 VALUES LESS THAN (63342604800) ENGINE = MyISAM)`, true}, + {`create table t1 (a int) partition by range (a) + (PARTITION p0 VALUES LESS THAN (63340531200) COMMENT 'xxx' ENGINE = MyISAM , + PARTITION p1 VALUES LESS THAN (63342604800) ENGINE = MyISAM)`, true}, + {`create table t (id int) + partition by range (id) + subpartition by key (id) subpartitions 2 + (partition p0 values less than (42))`, true}, + {`create table t (id int) + partition by range (id) + subpartition by hash (id) + (partition p0 values less than (42))`, true}, + } + s.RunTest(c, table) + + // Check comment content. + parser := New() + stmt, err := parser.ParseOneStmt("create table t (id int) partition by range (id) (partition p0 values less than (10) comment 'check')", "", "") + c.Assert(err, IsNil) + createTable := stmt.(*ast.CreateTableStmt) + c.Assert(createTable.Partition.Definitions[0].Comment, Equals, "check") +} + +func (s *testParserSuite) TestNotExistsSubquery(c *C) { + table := []testCase{ + {`select * from t1 where not exists (select * from t2 where t1.a = t2.a)`, true}, + } + + parser := New() + for _, tt := range table { + stmt, err := parser.Parse(tt.src, "", "") + c.Assert(err, IsNil) + + sel := stmt[0].(*ast.SelectStmt) + exists, ok := sel.Where.(*ast.ExistsSubqueryExpr) + c.Assert(ok, IsTrue) + c.Assert(exists.Not, Equals, tt.ok) + } +} diff --git a/terror/terror.go b/terror/terror.go new file mode 100644 index 000000000..a5443653d --- /dev/null +++ b/terror/terror.go @@ -0,0 +1,344 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package terror + +import ( + "encoding/json" + "fmt" + "strconv" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" + log "github.com/sirupsen/logrus" +) + +// Global error instances. +var ( + ErrCritical = ClassGlobal.New(CodeExecResultIsEmpty, "critical error %v") + ErrResultUndetermined = ClassGlobal.New(CodeResultUndetermined, "execution result undetermined") +) + +// ErrCode represents a specific error type in a error class. +// Same error code can be used in different error classes. +type ErrCode int + +const ( + // Executor error codes. + + // CodeUnknown is for errors of unknown reason. + CodeUnknown ErrCode = -1 + // CodeExecResultIsEmpty indicates execution result is empty. + CodeExecResultIsEmpty ErrCode = 3 + + // Expression error codes. + + // CodeMissConnectionID indicates connection id is missing. + CodeMissConnectionID ErrCode = 1 + + // Special error codes. + + // CodeResultUndetermined indicates the sql execution result is undetermined. + CodeResultUndetermined ErrCode = 2 +) + +// ErrClass represents a class of errors. +type ErrClass int + +// Error classes. +const ( + ClassAutoid ErrClass = iota + 1 + ClassDDL + ClassDomain + ClassEvaluator + ClassExecutor + ClassExpression + ClassAdmin + ClassKV + ClassMeta + ClassOptimizer + ClassParser + ClassPerfSchema + ClassPrivilege + ClassSchema + ClassServer + ClassStructure + ClassVariable + ClassXEval + ClassTable + ClassTypes + ClassGlobal + ClassMockTikv + ClassJSON + ClassTiKV + ClassSession + // Add more as needed. +) + +var errClz2Str = map[ErrClass]string{ + ClassAutoid: "autoid", + ClassDDL: "ddl", + ClassDomain: "domain", + ClassExecutor: "executor", + ClassExpression: "expression", + ClassAdmin: "admin", + ClassMeta: "meta", + ClassKV: "kv", + ClassOptimizer: "planner", + ClassParser: "parser", + ClassPerfSchema: "perfschema", + ClassPrivilege: "privilege", + ClassSchema: "schema", + ClassServer: "server", + ClassStructure: "structure", + ClassVariable: "variable", + ClassTable: "table", + ClassTypes: "types", + ClassGlobal: "global", + ClassMockTikv: "mocktikv", + ClassJSON: "json", + ClassTiKV: "tikv", + ClassSession: "session", +} + +// String implements fmt.Stringer interface. +func (ec ErrClass) String() string { + if s, exists := errClz2Str[ec]; exists { + return s + } + return strconv.Itoa(int(ec)) +} + +// EqualClass returns true if err is *Error with the same class. +func (ec ErrClass) EqualClass(err error) bool { + e := errors.Cause(err) + if e == nil { + return false + } + if te, ok := e.(*Error); ok { + return te.class == ec + } + return false +} + +// NotEqualClass returns true if err is not *Error with the same class. +func (ec ErrClass) NotEqualClass(err error) bool { + return !ec.EqualClass(err) +} + +// New creates an *Error with an error code and an error message. +// Usually used to create base *Error. +func (ec ErrClass) New(code ErrCode, message string) *Error { + return &Error{ + class: ec, + code: code, + message: message, + } +} + +// Error implements error interface and adds integer Class and Code, so +// errors with different message can be compared. +type Error struct { + class ErrClass + code ErrCode + message string + args []interface{} + file string + line int +} + +// Class returns ErrClass +func (e *Error) Class() ErrClass { + return e.class +} + +// Code returns ErrCode +func (e *Error) Code() ErrCode { + return e.code +} + +// MarshalJSON implements json.Marshaler interface. +func (e *Error) MarshalJSON() ([]byte, error) { + return json.Marshal(&struct { + Class ErrClass `json:"class"` + Code ErrCode `json:"code"` + Msg string `json:"message"` + }{ + Class: e.class, + Code: e.code, + Msg: e.getMsg(), + }) +} + +// UnmarshalJSON implements json.Unmarshaler interface. +func (e *Error) UnmarshalJSON(data []byte) error { + err := &struct { + Class ErrClass `json:"class"` + Code ErrCode `json:"code"` + Msg string `json:"message"` + }{} + + if err := json.Unmarshal(data, &err); err != nil { + return errors.Trace(err) + } + + e.class = err.Class + e.code = err.Code + e.message = err.Msg + return nil +} + +// Location returns the location where the error is created, +// implements juju/errors locationer interface. +func (e *Error) Location() (file string, line int) { + return e.file, e.line +} + +// Error implements error interface. +func (e *Error) Error() string { + return fmt.Sprintf("[%s:%d]%s", e.class, e.code, e.getMsg()) +} + +func (e *Error) getMsg() string { + if len(e.args) > 0 { + return fmt.Sprintf(e.message, e.args...) + } + return e.message +} + +// GenWithStack generates a new *Error with the same class and code, and a new formatted message. +func (e *Error) GenWithStack(format string, args ...interface{}) error { + err := *e + err.message = format + err.args = args + return errors.AddStack(&err) +} + +// GenWithStackByArgs generates a new *Error with the same class and code, and new arguments. +func (e *Error) GenWithStackByArgs(args ...interface{}) error { + err := *e + err.args = args + return errors.AddStack(&err) +} + +// FastGen generates a new *Error with the same class and code, and a new formatted message. +// This will not call runtime.Caller to get file and line. +func (e *Error) FastGen(format string, args ...interface{}) error { + err := *e + err.message = format + err.args = args + return &err +} + +// Equal checks if err is equal to e. +func (e *Error) Equal(err error) bool { + originErr := errors.Cause(err) + if originErr == nil { + return false + } + + if error(e) == originErr { + return true + } + inErr, ok := originErr.(*Error) + return ok && e.class == inErr.class && e.code == inErr.code +} + +// NotEqual checks if err is not equal to e. +func (e *Error) NotEqual(err error) bool { + return !e.Equal(err) +} + +// ToSQLError convert Error to mysql.SQLError. +func (e *Error) ToSQLError() *mysql.SQLError { + code := e.getMySQLErrorCode() + return mysql.NewErrf(code, "%s", e.getMsg()) +} + +var defaultMySQLErrorCode uint16 + +func (e *Error) getMySQLErrorCode() uint16 { + codeMap, ok := ErrClassToMySQLCodes[e.class] + if !ok { + log.Warnf("Unknown error class: %v", e.class) + return defaultMySQLErrorCode + } + code, ok := codeMap[e.code] + if !ok { + log.Debugf("Unknown error class: %v code: %v", e.class, e.code) + return defaultMySQLErrorCode + } + return code +} + +var ( + // ErrClassToMySQLCodes is the map of ErrClass to code-map. + ErrClassToMySQLCodes map[ErrClass]map[ErrCode]uint16 +) + +func init() { + ErrClassToMySQLCodes = make(map[ErrClass]map[ErrCode]uint16) + defaultMySQLErrorCode = mysql.ErrUnknown +} + +// ErrorEqual returns a boolean indicating whether err1 is equal to err2. +func ErrorEqual(err1, err2 error) bool { + e1 := errors.Cause(err1) + e2 := errors.Cause(err2) + + if e1 == e2 { + return true + } + + if e1 == nil || e2 == nil { + return e1 == e2 + } + + te1, ok1 := e1.(*Error) + te2, ok2 := e2.(*Error) + if ok1 && ok2 { + return te1.class == te2.class && te1.code == te2.code + } + + return e1.Error() == e2.Error() +} + +// ErrorNotEqual returns a boolean indicating whether err1 isn't equal to err2. +func ErrorNotEqual(err1, err2 error) bool { + return !ErrorEqual(err1, err2) +} + +// MustNil cleans up and fatals if err is not nil. +func MustNil(err error, closeFuns ...func()) { + if err != nil { + for _, f := range closeFuns { + f() + } + log.Fatalf(errors.ErrorStack(err)) + } +} + +// Call executes a function and checks the returned err. +func Call(fn func() error) { + err := fn() + if err != nil { + log.Error(errors.ErrorStack(err)) + } +} + +// Log logs the error if it is not nil. +func Log(err error) { + if err != nil { + log.Error(errors.ErrorStack(err)) + } +} diff --git a/terror/terror_test.go b/terror/terror_test.go new file mode 100644 index 000000000..fe93ef4a9 --- /dev/null +++ b/terror/terror_test.go @@ -0,0 +1,163 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package terror + +import ( + "encoding/json" + "strings" + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/util/testleak" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testTErrorSuite{}) + +type testTErrorSuite struct { +} + +func (s *testTErrorSuite) TestErrCode(c *C) { + c.Assert(CodeMissConnectionID, Equals, ErrCode(1)) + c.Assert(CodeResultUndetermined, Equals, ErrCode(2)) +} + +func (s *testTErrorSuite) TestTError(c *C) { + defer testleak.AfterTest(c)() + c.Assert(ClassParser.String(), Not(Equals), "") + c.Assert(ClassOptimizer.String(), Not(Equals), "") + c.Assert(ClassKV.String(), Not(Equals), "") + c.Assert(ClassServer.String(), Not(Equals), "") + + parserErr := ClassParser.New(ErrCode(1), "error 1") + c.Assert(parserErr.Error(), Not(Equals), "") + c.Assert(ClassParser.EqualClass(parserErr), IsTrue) + c.Assert(ClassParser.NotEqualClass(parserErr), IsFalse) + + c.Assert(ClassOptimizer.EqualClass(parserErr), IsFalse) + optimizerErr := ClassOptimizer.New(ErrCode(2), "abc") + c.Assert(ClassOptimizer.EqualClass(errors.New("abc")), IsFalse) + c.Assert(ClassOptimizer.EqualClass(nil), IsFalse) + c.Assert(optimizerErr.Equal(optimizerErr.GenWithStack("def")), IsTrue) + c.Assert(optimizerErr.Equal(nil), IsFalse) + c.Assert(optimizerErr.Equal(errors.New("abc")), IsFalse) + + // Test case for FastGen. + c.Assert(optimizerErr.Equal(optimizerErr.FastGen("def")), IsTrue) + c.Assert(optimizerErr.Equal(optimizerErr.FastGen("def: %s", "def")), IsTrue) + kvErr := ClassKV.New(1062, "key already exist") + e := kvErr.FastGen("Duplicate entry '%d' for key 'PRIMARY'", 1) + c.Assert(e.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'PRIMARY'") + kvMySQLErrCodes := map[ErrCode]uint16{ + 1062: uint16(1062), + } + ErrClassToMySQLCodes[ClassKV] = kvMySQLErrCodes + sqlErr := errors.Cause(e).(*Error).ToSQLError() + c.Assert(sqlErr.Message, Equals, "Duplicate entry '1' for key 'PRIMARY'") + c.Assert(sqlErr.Code, Equals, uint16(1062)) + + err := errors.Trace(ErrCritical.GenWithStackByArgs("test")) + c.Assert(ErrCritical.Equal(err), IsTrue) + + err = errors.Trace(ErrCritical) + c.Assert(ErrCritical.Equal(err), IsTrue) +} + +func (s *testTErrorSuite) TestJson(c *C) { + prevTErr := &Error{ + class: ClassTable, + code: CodeExecResultIsEmpty, + message: "json test", + } + buf, err := json.Marshal(prevTErr) + c.Assert(err, IsNil) + var curTErr Error + err = json.Unmarshal(buf, &curTErr) + c.Assert(err, IsNil) + isEqual := prevTErr.Equal(&curTErr) + c.Assert(isEqual, IsTrue) +} + +var predefinedErr = ClassExecutor.New(ErrCode(123), "predefiend error") + +func example() error { + err := call() + return errors.Trace(err) +} + +func call() error { + return predefinedErr.GenWithStack("error message:%s", "abc") +} + +func (s *testTErrorSuite) TestTraceAndLocation(c *C) { + defer testleak.AfterTest(c)() + err := example() + stack := errors.ErrorStack(err) + lines := strings.Split(stack, "\n") + c.Assert(len(lines), Equals, 23) + var containTerr bool + for _, v := range lines { + if strings.Contains(v, "terror_test.go") { + containTerr = true + break + } + } + c.Assert(containTerr, IsTrue) +} + +func (s *testTErrorSuite) TestErrorEqual(c *C) { + defer testleak.AfterTest(c)() + e1 := errors.New("test error") + c.Assert(e1, NotNil) + + e2 := errors.Trace(e1) + c.Assert(e2, NotNil) + + e3 := errors.Trace(e2) + c.Assert(e3, NotNil) + + c.Assert(errors.Cause(e2), Equals, e1) + c.Assert(errors.Cause(e3), Equals, e1) + c.Assert(errors.Cause(e2), Equals, errors.Cause(e3)) + + e4 := errors.New("test error") + c.Assert(errors.Cause(e4), Not(Equals), e1) + + e5 := errors.Errorf("test error") + c.Assert(errors.Cause(e5), Not(Equals), e1) + + c.Assert(ErrorEqual(e1, e2), IsTrue) + c.Assert(ErrorEqual(e1, e3), IsTrue) + c.Assert(ErrorEqual(e1, e4), IsTrue) + c.Assert(ErrorEqual(e1, e5), IsTrue) + + var e6 error + + c.Assert(ErrorEqual(nil, nil), IsTrue) + c.Assert(ErrorNotEqual(e1, e6), IsTrue) + code1 := ErrCode(1) + code2 := ErrCode(2) + te1 := ClassParser.New(code1, "abc") + te2 := ClassParser.New(code1, "def") + te3 := ClassKV.New(code1, "abc") + te4 := ClassKV.New(code2, "abc") + c.Assert(ErrorEqual(te1, te2), IsTrue) + c.Assert(ErrorEqual(te1, te3), IsFalse) + c.Assert(ErrorEqual(te3, te4), IsFalse) +} diff --git a/types/etc.go b/types/etc.go new file mode 100644 index 000000000..84b2966c5 --- /dev/null +++ b/types/etc.go @@ -0,0 +1,112 @@ +// Copyright 2014 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "strings" + + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" +) + +// IsTypeBlob returns a boolean indicating whether the tp is a blob type. +func IsTypeBlob(tp byte) bool { + switch tp { + case mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeBlob, mysql.TypeLongBlob: + return true + default: + return false + } +} + +// IsTypeChar returns a boolean indicating +// whether the tp is the char type like a string type or a varchar type. +func IsTypeChar(tp byte) bool { + return tp == mysql.TypeString || tp == mysql.TypeVarchar +} + +var type2Str = map[byte]string{ + mysql.TypeBit: "bit", + mysql.TypeBlob: "text", + mysql.TypeDate: "date", + mysql.TypeDatetime: "datetime", + mysql.TypeDecimal: "unspecified", + mysql.TypeNewDecimal: "decimal", + mysql.TypeDouble: "double", + mysql.TypeEnum: "enum", + mysql.TypeFloat: "float", + mysql.TypeGeometry: "geometry", + mysql.TypeInt24: "mediumint", + mysql.TypeJSON: "json", + mysql.TypeLong: "int", + mysql.TypeLonglong: "bigint", + mysql.TypeLongBlob: "longtext", + mysql.TypeMediumBlob: "mediumtext", + mysql.TypeNull: "null", + mysql.TypeSet: "set", + mysql.TypeShort: "smallint", + mysql.TypeString: "char", + mysql.TypeDuration: "time", + mysql.TypeTimestamp: "timestamp", + mysql.TypeTiny: "tinyint", + mysql.TypeTinyBlob: "tinytext", + mysql.TypeVarchar: "varchar", + mysql.TypeVarString: "var_string", + mysql.TypeYear: "year", +} + +// TypeStr converts tp to a string. +func TypeStr(tp byte) (r string) { + return type2Str[tp] +} + +// TypeToStr converts a field to a string. +// It is used for converting Text to Blob, +// or converting Char to Binary. +// Args: +// tp: type enum +// cs: charset +func TypeToStr(tp byte, cs string) (r string) { + ts := type2Str[tp] + if cs != "binary" { + return ts + } + if IsTypeBlob(tp) { + ts = strings.Replace(ts, "text", "blob", 1) + } else if IsTypeChar(tp) { + ts = strings.Replace(ts, "char", "binary", 1) + } + return ts +} + +var ( + dig2bytes = [10]int{0, 1, 1, 2, 2, 3, 3, 4, 4, 4} +) + +// constant values. +const ( + digitsPerWord = 9 // A word holds 9 digits. + wordSize = 4 // A word is 4 bytes int32. +) + +const ( + codeInvalidDefault = terror.ErrCode(mysql.ErrInvalidDefault) +) + +// ErrInvalidDefault is returned when meet a invalid default value. +var ErrInvalidDefault = terror.ClassTypes.New(codeInvalidDefault, "Invalid default value for '%s'") diff --git a/types/eval_type.go b/types/eval_type.go new file mode 100644 index 000000000..47775953d --- /dev/null +++ b/types/eval_type.go @@ -0,0 +1,42 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +// EvalType indicates the specified types that arguments and result of a built-in function should be. +type EvalType byte + +const ( + // ETInt represents type INT in evaluation. + ETInt EvalType = iota + // ETReal represents type REAL in evaluation. + ETReal + // ETDecimal represents type DECIMAL in evaluation. + ETDecimal + // ETString represents type STRING in evaluation. + ETString + // ETDatetime represents type DATETIME in evaluation. + ETDatetime + // ETTimestamp represents type TIMESTAMP in evaluation. + ETTimestamp + // ETDuration represents type DURATION in evaluation. + ETDuration + // ETJson represents type JSON in evaluation. + ETJson +) + +// IsStringKind returns true for ETString, ETDatetime, ETTimestamp, ETDuration, ETJson EvalTypes. +func (et EvalType) IsStringKind() bool { + return et == ETString || et == ETDatetime || + et == ETTimestamp || et == ETDuration || et == ETJson +} diff --git a/types/field_type.go b/types/field_type.go new file mode 100644 index 000000000..4b299cdb6 --- /dev/null +++ b/types/field_type.go @@ -0,0 +1,258 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "fmt" + "io" + "strings" + + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/format" + "github.com/pingcap/parser/mysql" +) + +// UnspecifiedLength is unspecified length. +const ( + UnspecifiedLength = -1 +) + +// FieldType records field type information. +type FieldType struct { + Tp byte + Flag uint + Flen int + Decimal int + Charset string + Collate string + // Elems is the element list for enum and set type. + Elems []string +} + +// NewFieldType returns a FieldType, +// with a type and other information about field type. +func NewFieldType(tp byte) *FieldType { + return &FieldType{ + Tp: tp, + Flen: UnspecifiedLength, + Decimal: UnspecifiedLength, + } +} + +// Equal checks whether two FieldType objects are equal. +func (ft *FieldType) Equal(other *FieldType) bool { + // We do not need to compare whole `ft.Flag == other.Flag` when wrapping cast upon an Expression. + // but need compare unsigned_flag of ft.Flag. + partialEqual := ft.Tp == other.Tp && + ft.Flen == other.Flen && + ft.Decimal == other.Decimal && + ft.Charset == other.Charset && + ft.Collate == other.Collate && + mysql.HasUnsignedFlag(ft.Flag) == mysql.HasUnsignedFlag(other.Flag) + if !partialEqual || len(ft.Elems) != len(other.Elems) { + return false + } + for i := range ft.Elems { + if ft.Elems[i] != other.Elems[i] { + return false + } + } + return true +} + +// EvalType gets the type in evaluation. +func (ft *FieldType) EvalType() EvalType { + switch ft.Tp { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, + mysql.TypeBit, mysql.TypeYear: + return ETInt + case mysql.TypeFloat, mysql.TypeDouble: + return ETReal + case mysql.TypeNewDecimal: + return ETDecimal + case mysql.TypeDate, mysql.TypeDatetime: + return ETDatetime + case mysql.TypeTimestamp: + return ETTimestamp + case mysql.TypeDuration: + return ETDuration + case mysql.TypeJSON: + return ETJson + } + return ETString +} + +// Hybrid checks whether a type is a hybrid type, which can represent different types of value in specific context. +func (ft *FieldType) Hybrid() bool { + return ft.Tp == mysql.TypeEnum || ft.Tp == mysql.TypeBit || ft.Tp == mysql.TypeSet +} + +// Init initializes the FieldType data. +func (ft *FieldType) Init(tp byte) { + ft.Tp = tp + ft.Flen = UnspecifiedLength + ft.Decimal = UnspecifiedLength +} + +// CompactStr only considers Tp/CharsetBin/Flen/Deimal. +// This is used for showing column type in infoschema. +func (ft *FieldType) CompactStr() string { + ts := TypeToStr(ft.Tp, ft.Charset) + suffix := "" + + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimal(ft.Tp) + isDecimalNotDefault := ft.Decimal != defaultDecimal && ft.Decimal != 0 && ft.Decimal != UnspecifiedLength + + // displayFlen and displayDecimal are flen and decimal values with `-1` substituted with default value. + displayFlen, displayDecimal := ft.Flen, ft.Decimal + if displayFlen == 0 || displayFlen == UnspecifiedLength { + displayFlen = defaultFlen + } + if displayDecimal == 0 || displayDecimal == UnspecifiedLength { + displayDecimal = defaultDecimal + } + + switch ft.Tp { + case mysql.TypeEnum, mysql.TypeSet: + // Format is ENUM ('e1', 'e2') or SET ('e1', 'e2') + es := make([]string, 0, len(ft.Elems)) + for _, e := range ft.Elems { + e = format.OutputFormat(e) + es = append(es, e) + } + suffix = fmt.Sprintf("('%s')", strings.Join(es, "','")) + case mysql.TypeTimestamp, mysql.TypeDatetime, mysql.TypeDuration: + if isDecimalNotDefault { + suffix = fmt.Sprintf("(%d)", displayDecimal) + } + case mysql.TypeDouble, mysql.TypeFloat: + // 1. Flen Not Default, Decimal Not Default -> Valid + // 2. Flen Not Default, Decimal Default (-1) -> Invalid + // 3. Flen Default, Decimal Not Default -> Valid + // 4. Flen Default, Decimal Default -> Valid (hide) + if isDecimalNotDefault { + suffix = fmt.Sprintf("(%d,%d)", displayFlen, displayDecimal) + } + case mysql.TypeNewDecimal: + suffix = fmt.Sprintf("(%d,%d)", displayFlen, displayDecimal) + case mysql.TypeBit, mysql.TypeShort, mysql.TypeTiny, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeVarchar, mysql.TypeString, mysql.TypeVarString: + // Flen is always shown. + suffix = fmt.Sprintf("(%d)", displayFlen) + } + return ts + suffix +} + +// InfoSchemaStr joins the CompactStr with unsigned flag and +// returns a string. +func (ft *FieldType) InfoSchemaStr() string { + suffix := "" + if mysql.HasUnsignedFlag(ft.Flag) { + suffix = " unsigned" + } + return ft.CompactStr() + suffix +} + +// String joins the information of FieldType and returns a string. +// Note: when flen or decimal is unspecified, this function will use the default value instead of -1. +func (ft *FieldType) String() string { + strs := []string{ft.CompactStr()} + if mysql.HasUnsignedFlag(ft.Flag) { + strs = append(strs, "UNSIGNED") + } + if mysql.HasZerofillFlag(ft.Flag) { + strs = append(strs, "ZEROFILL") + } + if mysql.HasBinaryFlag(ft.Flag) && ft.Tp != mysql.TypeString { + strs = append(strs, "BINARY") + } + + if IsTypeChar(ft.Tp) || IsTypeBlob(ft.Tp) { + if ft.Charset != "" && ft.Charset != charset.CharsetBin { + strs = append(strs, fmt.Sprintf("CHARACTER SET %s", ft.Charset)) + } + if ft.Collate != "" && ft.Collate != charset.CharsetBin { + strs = append(strs, fmt.Sprintf("COLLATE %s", ft.Collate)) + } + } + + return strings.Join(strs, " ") +} + +// FormatAsCastType is used for write AST back to string. +func (ft *FieldType) FormatAsCastType(w io.Writer) { + switch ft.Tp { + case mysql.TypeVarString: + if ft.Charset == charset.CharsetBin && ft.Collate == charset.CollationBin { + fmt.Fprint(w, "BINARY") + } else { + fmt.Fprint(w, "CHAR") + } + if ft.Flen != UnspecifiedLength { + fmt.Fprintf(w, "(%d)", ft.Flen) + } + if ft.Flag&mysql.BinaryFlag != 0 { + fmt.Fprint(w, " BINARY") + } + if ft.Charset != charset.CharsetBin && ft.Charset != charset.CharsetUTF8 { + fmt.Fprintf(w, " %s", ft.Charset) + } + case mysql.TypeDate: + fmt.Fprint(w, "DATE") + case mysql.TypeDatetime: + fmt.Fprint(w, "DATETIME") + if ft.Decimal > 0 { + fmt.Fprintf(w, "(%d)", ft.Decimal) + } + case mysql.TypeNewDecimal: + fmt.Fprint(w, "DECIMAL") + if ft.Flen > 0 && ft.Decimal > 0 { + fmt.Fprintf(w, "(%d, %d)", ft.Flen, ft.Decimal) + } else if ft.Flen > 0 { + fmt.Fprintf(w, "(%d)", ft.Flen) + } + case mysql.TypeDuration: + fmt.Fprint(w, "TIME") + if ft.Decimal > 0 { + fmt.Fprintf(w, "(%d)", ft.Decimal) + } + case mysql.TypeLonglong: + if ft.Flag&mysql.UnsignedFlag != 0 { + fmt.Fprint(w, "UNSIGNED") + } else { + fmt.Fprint(w, "SIGNED") + } + case mysql.TypeJSON: + fmt.Fprint(w, "JSON") + } +} + +// VarStorageLen indicates this column is a variable length column. +const VarStorageLen = -1 + +// StorageLength is the length of stored value for the type. +func (ft *FieldType) StorageLength() int { + switch ft.Tp { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, + mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeFloat, mysql.TypeYear, mysql.TypeDuration, + mysql.TypeDate, mysql.TypeDatetime, mysql.TypeTimestamp, mysql.TypeEnum, mysql.TypeSet, + mysql.TypeBit: + // This may not be the accurate length, because we may encode them as varint. + return 8 + case mysql.TypeNewDecimal: + precision, frac := ft.Flen-ft.Decimal, ft.Decimal + return precision/digitsPerWord*wordSize + dig2bytes[precision%digitsPerWord] + frac/digitsPerWord*wordSize + dig2bytes[frac%digitsPerWord] + default: + return VarStorageLen + } +} diff --git a/yy_parser.go b/yy_parser.go new file mode 100644 index 000000000..0507d7d71 --- /dev/null +++ b/yy_parser.go @@ -0,0 +1,239 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "math" + "regexp" + "strconv" + "unicode" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" +) + +const ( + codeErrParse = terror.ErrCode(mysql.ErrParse) + codeErrSyntax = terror.ErrCode(mysql.ErrSyntax) +) + +var ( + // ErrSyntax returns for sql syntax error. + ErrSyntax = terror.ClassParser.New(codeErrSyntax, mysql.MySQLErrName[mysql.ErrSyntax]) + // ErrParse returns for sql parse error. + ErrParse = terror.ClassParser.New(codeErrParse, mysql.MySQLErrName[mysql.ErrParse]) + // SpecFieldPattern special result field pattern + SpecFieldPattern = regexp.MustCompile(`(\/\*!(M?[0-9]{5,6})?|\*\/)`) + specCodePattern = regexp.MustCompile(`\/\*!(M?[0-9]{5,6})?([^*]|\*+[^*/])*\*+\/`) + specCodeStart = regexp.MustCompile(`^\/\*!(M?[0-9]{5,6})?[ \t]*`) + specCodeEnd = regexp.MustCompile(`[ \t]*\*\/$`) +) + +func init() { + parserMySQLErrCodes := map[terror.ErrCode]uint16{ + codeErrSyntax: mysql.ErrSyntax, + codeErrParse: mysql.ErrParse, + } + terror.ErrClassToMySQLCodes[terror.ClassParser] = parserMySQLErrCodes +} + +// TrimComment trim comment for special comment code of MySQL. +func TrimComment(txt string) string { + txt = specCodeStart.ReplaceAllString(txt, "") + return specCodeEnd.ReplaceAllString(txt, "") +} + +// Parser represents a parser instance. Some temporary objects are stored in it to reduce object allocation during Parse function. +type Parser struct { + charset string + collation string + result []ast.StmtNode + src string + lexer Scanner + + // the following fields are used by yyParse to reduce allocation. + cache []yySymType + yylval yySymType + yyVAL yySymType +} + +type stmtTexter interface { + stmtText() string +} + +// New returns a Parser object. +func New() *Parser { + return &Parser{ + cache: make([]yySymType, 200), + } +} + +// Parse parses a query string to raw ast.StmtNode. +// If charset or collation is "", default charset and collation will be used. +func (parser *Parser) Parse(sql, charset, collation string) ([]ast.StmtNode, error) { + if charset == "" { + charset = mysql.DefaultCharset + } + if collation == "" { + collation = mysql.DefaultCollationName + } + parser.charset = charset + parser.collation = collation + parser.src = sql + parser.result = parser.result[:0] + + var l yyLexer + parser.lexer.reset(sql) + l = &parser.lexer + yyParse(l, parser) + + if len(l.Errors()) != 0 { + return nil, errors.Trace(l.Errors()[0]) + } + for _, stmt := range parser.result { + ast.SetFlag(stmt) + } + return parser.result, nil +} + +// ParseOneStmt parses a query and returns an ast.StmtNode. +// The query must have one statement, otherwise ErrSyntax is returned. +func (parser *Parser) ParseOneStmt(sql, charset, collation string) (ast.StmtNode, error) { + stmts, err := parser.Parse(sql, charset, collation) + if err != nil { + return nil, errors.Trace(err) + } + if len(stmts) != 1 { + return nil, ErrSyntax + } + ast.SetFlag(stmts[0]) + return stmts[0], nil +} + +// SetSQLMode sets the SQL mode for parser. +func (parser *Parser) SetSQLMode(mode mysql.SQLMode) { + parser.lexer.SetSQLMode(mode) +} + +// ParseErrorWith returns "You have a syntax error near..." error message compatible with mysql. +func ParseErrorWith(errstr string, lineno int) error { + if len(errstr) > mysql.ErrTextLength { + errstr = errstr[:mysql.ErrTextLength] + } + return ErrParse.GenWithStackByArgs(mysql.MySQLErrName[mysql.ErrSyntax], errstr, lineno) +} + +// The select statement is not at the end of the whole statement, if the last +// field text was set from its offset to the end of the src string, update +// the last field text. +func (parser *Parser) setLastSelectFieldText(st *ast.SelectStmt, lastEnd int) { + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Offset+len(lastField.Text()) >= len(parser.src)-1 { + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } +} + +func (parser *Parser) startOffset(v *yySymType) int { + return v.offset +} + +func (parser *Parser) endOffset(v *yySymType) int { + offset := v.offset + for offset > 0 && unicode.IsSpace(rune(parser.src[offset-1])) { + offset-- + } + return offset +} + +func toInt(l yyLexer, lval *yySymType, str string) int { + n, err := strconv.ParseUint(str, 10, 64) + if err != nil { + e := err.(*strconv.NumError) + if e.Err == strconv.ErrRange { + // TODO: toDecimal maybe out of range still. + // This kind of error should be throw to higher level, because truncated data maybe legal. + // For example, this SQL returns error: + // create table test (id decimal(30, 0)); + // insert into test values(123456789012345678901234567890123094839045793405723406801943850); + // While this SQL: + // select 1234567890123456789012345678901230948390457934057234068019438509023041874359081325875128590860234789847359871045943057; + // get value 99999999999999999999999999999999999999999999999999999999999999999 + return toDecimal(l, lval, str) + } + l.Errorf("integer literal: %v", err) + return int(unicode.ReplacementChar) + } + + switch { + case n < math.MaxInt64: + lval.item = int64(n) + default: + lval.item = n + } + return intLit +} + +func toDecimal(l yyLexer, lval *yySymType, str string) int { + dec, err := ast.NewDecimal(str) + if err != nil { + l.Errorf("decimal literal: %v", err) + } + lval.item = dec + return decLit +} + +func toFloat(l yyLexer, lval *yySymType, str string) int { + n, err := strconv.ParseFloat(str, 64) + if err != nil { + l.Errorf("float literal: %v", err) + return int(unicode.ReplacementChar) + } + + lval.item = n + return floatLit +} + +// See https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html +func toHex(l yyLexer, lval *yySymType, str string) int { + h, err := ast.NewHexLiteral(str) + if err != nil { + l.Errorf("hex literal: %v", err) + return int(unicode.ReplacementChar) + } + lval.item = h + return hexLit +} + +// See https://dev.mysql.com/doc/refman/5.7/en/bit-type.html +func toBit(l yyLexer, lval *yySymType, str string) int { + b, err := ast.NewBitLiteral(str) + if err != nil { + l.Errorf("bit literal: %v", err) + return int(unicode.ReplacementChar) + } + lval.item = b + return bitLit +} + +func getUint64FromNUM(num interface{}) uint64 { + switch v := num.(type) { + case int64: + return uint64(v) + case uint64: + return v + } + return 0 +}